aboutsummaryrefslogtreecommitdiffstats
path: root/vcl-ldpreload/src/libvcl-ldpreload/vcom_socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'vcl-ldpreload/src/libvcl-ldpreload/vcom_socket.c')
-rw-r--r--vcl-ldpreload/src/libvcl-ldpreload/vcom_socket.c1262
1 files changed, 770 insertions, 492 deletions
diff --git a/vcl-ldpreload/src/libvcl-ldpreload/vcom_socket.c b/vcl-ldpreload/src/libvcl-ldpreload/vcom_socket.c
index 8430ab1..42dff9b 100644
--- a/vcl-ldpreload/src/libvcl-ldpreload/vcom_socket.c
+++ b/vcl-ldpreload/src/libvcl-ldpreload/vcom_socket.c
@@ -40,15 +40,26 @@ typedef struct vcom_socket_main_t_
/* Hash table for socketidx to fd mapping */
uword *sockidx_by_fd;
+ /* vcom_epoll pool */
+ vcom_epoll_t *vepolls;
+
+ /* Hash table for epollidx to epfd mapping */
+ uword *epollidx_by_epfd;
+
+ /* common epitem poll for all epfd */
+ /* TBD: epitem poll per epfd */
+ /* vcom_epitem pool */
+ vcom_epitem_t *vepitems;
+
+ /* Hash table for epitemidx to epfdfd mapping */
+ uword *epollidx_by_epfdfd;
+
} vcom_socket_main_t;
vcom_socket_main_t vcom_socket_main;
-/*
- * Public API functions
- */
-int
+static int
vcom_socket_open_socket (int domain, int type, int protocol)
{
int rv = -1;
@@ -61,22 +72,22 @@ vcom_socket_open_socket (int domain, int type, int protocol)
/* get socket type and
* handle the socket types supported by vpp */
switch (type & ~(SOCK_CLOEXEC | SOCK_NONBLOCK))
- {
- case SOCK_STREAM:
- case SOCK_DGRAM:
- /* the type argument serves a second purpose,
- * in addition to specifying a socket type,
- * it may include the bitwise OR of any of
- * SOCK_NONBLOCK and SOCK_CLOEXEC, to modify
- * the behavior of socket. */
- rv = libc_socket (domain, type, protocol);
- if (rv == -1)
- rv = -errno;
- break;
-
- default:
- break;
- }
+ {
+ case SOCK_STREAM:
+ case SOCK_DGRAM:
+ /* the type argument serves a second purpose,
+ * in addition to specifying a socket type,
+ * it may include the bitwise OR of any of
+ * SOCK_NONBLOCK and SOCK_CLOEXEC, to modify
+ * the behavior of socket. */
+ rv = libc_socket (domain, type, protocol);
+ if (rv == -1)
+ rv = -errno;
+ break;
+
+ default:
+ break;
+ }
break;
@@ -87,7 +98,29 @@ vcom_socket_open_socket (int domain, int type, int protocol)
return rv;
}
-int
+static int
+vcom_socket_open_epoll (int flags)
+{
+ int rv = -1;
+
+ if (flags < 0)
+ {
+ return -EINVAL;
+ }
+ if (flags && (flags & ~EPOLL_CLOEXEC))
+ {
+ return -EINVAL;
+ }
+
+ /* flags can be either zero or EPOLL_CLOEXEC */
+ rv = libc_epoll_create1 (flags);
+ if (rv == -1)
+ rv = -errno;
+
+ return rv;
+}
+
+static int
vcom_socket_close_socket (int fd)
{
int rv;
@@ -99,6 +132,22 @@ vcom_socket_close_socket (int fd)
return rv;
}
+static int
+vcom_socket_close_epoll (int epfd)
+{
+ int rv;
+
+ rv = libc_close (epfd);
+ if (rv == -1)
+ rv = -errno;
+
+ return rv;
+}
+
+/*
+ * Public API functions
+ */
+
int
vcom_socket_main_init (void)
{
@@ -112,6 +161,10 @@ vcom_socket_main_init (void)
/* TBD: define FD_MAXSIZE and use it here */
pool_alloc (vsm->vsockets, FD_SETSIZE);
vsm->sockidx_by_fd = hash_create (0, sizeof (i32));
+
+ pool_alloc (vsm->vepolls, FD_SETSIZE);
+ vsm->epollidx_by_epfd = hash_create (0, sizeof (i32));
+
vsm->init = 1;
}
@@ -124,6 +177,8 @@ vcom_socket_main_destroy (void)
vcom_socket_main_t *vsm = &vcom_socket_main;
vcom_socket_t *vsock;
+ vcom_epoll_t *vepoll;
+
if (VCOM_DEBUG > 0)
printf ("vcom_socket_main_destroy\n");
@@ -160,6 +215,39 @@ vcom_socket_main_destroy (void)
pool_free (vsm->vsockets);
hash_free (vsm->sockidx_by_fd);
+
+ /*
+ * from active list of vepolls,
+ * close epoll and vppcom_epoll
+ * */
+
+ /* *INDENT-OFF* */
+ pool_foreach (vepoll, vsm->vepolls,
+ ({
+ if (vepoll->type == EPOLL_TYPE_VPPCOM_BOUND)
+ {
+ vppcom_session_close (vepoll->vep_idx);
+ vcom_socket_close_epoll (vepoll->epfd); /* TBD: */
+ vepoll_init (vepoll);
+ }
+ }));
+ /* *INDENT-ON* */
+
+ /*
+ * return vepoll element to the pool
+ * */
+
+ /* *INDENT-OFF* */
+ pool_flush (vepoll, vsm->vepolls,
+ ({
+ // vepoll_init(vepoll);
+ ;
+ }));
+ /* *INDENT-ON* */
+
+ pool_free (vsm->vepolls);
+ hash_free (vsm->epollidx_by_epfd);
+
vsm->init = 0;
}
}
@@ -170,6 +258,8 @@ vcom_socket_main_show (void)
vcom_socket_main_t *vsm = &vcom_socket_main;
vcom_socket_t *vsock;
+ vcom_epoll_t *vepoll;
+
if (vsm->init)
{
/* from active list of vsockets,
@@ -184,10 +274,25 @@ vcom_socket_main_show (void)
vcom_socket_type_str (vsock->type));
}));
/* *INDENT-ON* */
+
+ /* from active list of vepolls,
+ * close epoll and vppcom session */
+
+ /* *INDENT-OFF* */
+ pool_foreach (vepoll, vsm->vepolls,
+ ({
+ printf(
+ "epfd='%04d', vep_idx='%08x', "
+ "type='%-30s', "
+ "flags='%d', count='%d', close='%d'\n",
+ vepoll->epfd, vepoll->vep_idx,
+ vcom_socket_epoll_type_str (vepoll->type),
+ vepoll->flags, vepoll->count, vepoll->close);
+ }));
+ /* *INDENT-ON* */
}
}
-
int
vcom_socket_is_vcom_fd (int fd)
{
@@ -201,7 +306,25 @@ vcom_socket_is_vcom_fd (int fd)
{
vsock = pool_elt_at_index (vsm->vsockets, p[0]);
if (vsock && vsock->type == SOCKET_TYPE_VPPCOM_BOUND)
- return 1;
+ return 1;
+ }
+ return 0;
+}
+
+int
+vcom_socket_is_vcom_epfd (int epfd)
+{
+ vcom_socket_main_t *vsm = &vcom_socket_main;
+ uword *p;
+ vcom_epoll_t *vepoll;
+
+ p = hash_get (vsm->epollidx_by_epfd, epfd);
+
+ if (p)
+ {
+ vepoll = pool_elt_at_index (vsm->vepolls, p[0]);
+ if (vepoll && vepoll->type == EPOLL_TYPE_VPPCOM_BOUND)
+ return 1;
}
return 0;
}
@@ -219,20 +342,38 @@ vcom_socket_get_sid (int fd)
{
vsock = pool_elt_at_index (vsm->vsockets, p[0]);
if (vsock && vsock->type == SOCKET_TYPE_VPPCOM_BOUND)
- return vsock->sid;
+ return vsock->sid;
}
return INVALID_SESSION_ID;
}
-int
-vcom_socket_close (int __fd)
+static inline int
+vcom_socket_get_vep_idx (int epfd)
+{
+ vcom_socket_main_t *vsm = &vcom_socket_main;
+ uword *p;
+ vcom_epoll_t *vepoll;
+
+ p = hash_get (vsm->epollidx_by_epfd, epfd);
+
+ if (p)
+ {
+ vepoll = pool_elt_at_index (vsm->vepolls, p[0]);
+ if (vepoll && vepoll->type == EPOLL_TYPE_VPPCOM_BOUND)
+ return vepoll->vep_idx;
+ }
+ return INVALID_VEP_IDX;
+}
+
+static int
+vcom_socket_close_vsock (int fd)
{
int rv = -1;
vcom_socket_main_t *vsm = &vcom_socket_main;
uword *p;
vcom_socket_t *vsock;
- p = hash_get (vsm->sockidx_by_fd, __fd);
+ p = hash_get (vsm->sockidx_by_fd, fd);
if (!p)
return -EBADF;
@@ -247,9 +388,79 @@ vcom_socket_close (int __fd)
rv = vcom_socket_close_socket (vsock->fd);
vsocket_init (vsock);
- hash_unset (vsm->sockidx_by_fd, __fd);
+ hash_unset (vsm->sockidx_by_fd, fd);
pool_put (vsm->vsockets, vsock);
+ /*
+ * TBD:
+ * close all epoll instances that are marked as "close"
+ * of which this fd is the last remaining member
+ * */
+
+ return rv;
+}
+
+int
+vcom_socket_close_vepoll (int epfd)
+{
+ int rv = -1;
+ vcom_socket_main_t *vsm = &vcom_socket_main;
+ uword *p;
+ vcom_epoll_t *vepoll;
+
+ p = hash_get (vsm->epollidx_by_epfd, epfd);
+ if (!p)
+ return -EBADF;
+
+ vepoll = pool_elt_at_index (vsm->vepolls, p[0]);
+ if (!vepoll)
+ return -EBADF;
+
+ if (vepoll->type != EPOLL_TYPE_VPPCOM_BOUND)
+ return -EINVAL;
+
+ if (vepoll->count)
+ {
+ if (!vepoll->close)
+ {
+ vepoll->close = 1;
+ return 0;
+ }
+ else
+ {
+ return -EBADF;
+ }
+ }
+
+ /* count is zero */
+ rv = vppcom_session_close (vepoll->vep_idx);
+ rv = vcom_socket_close_epoll (vepoll->epfd);
+
+ vepoll_init (vepoll);
+ hash_unset (vsm->epollidx_by_epfd, epfd);
+ pool_put (vsm->vepolls, vepoll);
+
+ return rv;
+}
+
+int
+vcom_socket_close (int __fd)
+{
+ int rv;
+
+ if (vcom_socket_is_vcom_fd (__fd))
+ {
+ rv = vcom_socket_close_vsock (__fd);
+ }
+ else if (vcom_socket_is_vcom_epfd (__fd))
+ {
+ rv = vcom_socket_close_vepoll (__fd);
+ }
+ else
+ {
+ rv = -EBADF;
+ }
+
return rv;
}
@@ -288,9 +499,9 @@ vcom_socket_read (int __fd, void *__buf, size_t __nbytes)
if (!(rv & O_NONBLOCK))
{
do
- {
- rv = vppcom_session_read (vsock->sid, __buf, __nbytes);
- }
+ {
+ rv = vppcom_session_read (vsock->sid, __buf, __nbytes);
+ }
while (rv == -EAGAIN || rv == -EWOULDBLOCK);
return rv;
}
@@ -433,16 +644,16 @@ vcom_socket_fcntl_va (int __fd, int __cmd, va_list __ap)
static inline int
vcom_socket_fds_2_sid_fds (
- /* dest */
- int *vcom_nsid_fds,
- fd_set * __restrict vcom_rd_sid_fds,
- fd_set * __restrict vcom_wr_sid_fds,
- fd_set * __restrict vcom_ex_sid_fds,
- /* src */
- int vcom_nfds,
- fd_set * __restrict vcom_readfds,
- fd_set * __restrict vcom_writefds,
- fd_set * __restrict vcom_exceptfds)
+ /* dest */
+ int *vcom_nsid_fds,
+ fd_set * __restrict vcom_rd_sid_fds,
+ fd_set * __restrict vcom_wr_sid_fds,
+ fd_set * __restrict vcom_ex_sid_fds,
+ /* src */
+ int vcom_nfds,
+ fd_set * __restrict vcom_readfds,
+ fd_set * __restrict vcom_writefds,
+ fd_set * __restrict vcom_exceptfds)
{
int rv = 0;
int fd;
@@ -507,17 +718,17 @@ done:
*/
static inline int
vcom_socket_sid_fds_2_fds (
- /* dest */
- int *new_vcom_nfds,
- int vcom_nfds,
- fd_set * __restrict vcom_readfds,
- fd_set * __restrict vcom_writefds,
- fd_set * __restrict vcom_exceptfds,
- /* src */
- int vcom_nsid_fds,
- fd_set * __restrict vcom_rd_sid_fds,
- fd_set * __restrict vcom_wr_sid_fds,
- fd_set * __restrict vcom_ex_sid_fds)
+ /* dest */
+ int *new_vcom_nfds,
+ int vcom_nfds,
+ fd_set * __restrict vcom_readfds,
+ fd_set * __restrict vcom_writefds,
+ fd_set * __restrict vcom_exceptfds,
+ /* src */
+ int vcom_nsid_fds,
+ fd_set * __restrict vcom_rd_sid_fds,
+ fd_set * __restrict vcom_wr_sid_fds,
+ fd_set * __restrict vcom_ex_sid_fds)
{
int rv = 0;
int fd;
@@ -604,9 +815,9 @@ done:
*/
int
vcom_socket_select (int vcom_nfds, fd_set * __restrict vcom_readfds,
- fd_set * __restrict vcom_writefds,
- fd_set * __restrict vcom_exceptfds,
- struct timeval *__restrict timeout)
+ fd_set * __restrict vcom_writefds,
+ fd_set * __restrict vcom_exceptfds,
+ struct timeval *__restrict timeout)
{
int rv = -EBADF;
pid_t pid = getpid ();
@@ -634,17 +845,17 @@ vcom_socket_select (int vcom_nfds, fd_set * __restrict vcom_readfds,
if (timeout)
{
if (timeout->tv_sec == 0 && timeout->tv_usec == 0)
- {
- /* polling: vppcom_select returns immediately */
- time_to_wait = (double) 0;
- }
+ {
+ /* polling: vppcom_select returns immediately */
+ time_to_wait = (double) 0;
+ }
else
- {
- /*TBD: use timeval api */
- time_to_wait = (double) timeout->tv_sec +
- (double) timeout->tv_usec / (double) 1000000 +
- (double) (timeout->tv_usec % 1000000) / (double) 1000000;
- }
+ {
+ /*TBD: use timeval api */
+ time_to_wait = (double) timeout->tv_sec +
+ (double) timeout->tv_usec / (double) 1000000 +
+ (double) (timeout->tv_usec % 1000000) / (double) 1000000;
+ }
}
else
{
@@ -675,20 +886,20 @@ vcom_socket_select (int vcom_nfds, fd_set * __restrict vcom_readfds,
/* populate read, write and except sid_sets */
vcom_nsid = vcom_socket_fds_2_sid_fds (
- /* dest */
- vcom_readfds || vcom_writefds
- || vcom_exceptfds ? (int *)
- &vcom_nsid_fds : NULL,
- vcom_readfds ? &vcom_rd_sid_fds :
- NULL,
- vcom_writefds ? &vcom_wr_sid_fds :
- NULL,
- vcom_exceptfds ? &vcom_ex_sid_fds :
- NULL,
- /* src */
- vcom_nfds,
- vcom_readfds,
- vcom_writefds, vcom_exceptfds);
+ /* dest */
+ vcom_readfds || vcom_writefds
+ || vcom_exceptfds ? (int *)
+ &vcom_nsid_fds : NULL,
+ vcom_readfds ? &vcom_rd_sid_fds :
+ NULL,
+ vcom_writefds ? &vcom_wr_sid_fds :
+ NULL,
+ vcom_exceptfds ? &vcom_ex_sid_fds :
+ NULL,
+ /* src */
+ vcom_nfds,
+ vcom_readfds,
+ vcom_writefds, vcom_exceptfds);
if (vcom_nsid < 0)
{
return vcom_nsid;
@@ -699,15 +910,15 @@ vcom_socket_select (int vcom_nfds, fd_set * __restrict vcom_readfds,
}
rv = vppcom_select (vcom_nsid_fds,
- vcom_readfds ? (unsigned long *) &vcom_rd_sid_fds :
- NULL,
- vcom_writefds ? (unsigned long *) &vcom_wr_sid_fds :
- NULL,
- vcom_exceptfds ? (unsigned long *) &vcom_ex_sid_fds :
- NULL, time_to_wait);
+ vcom_readfds ? (unsigned long *) &vcom_rd_sid_fds :
+ NULL,
+ vcom_writefds ? (unsigned long *) &vcom_wr_sid_fds :
+ NULL,
+ vcom_exceptfds ? (unsigned long *) &vcom_ex_sid_fds :
+ NULL, time_to_wait);
if (VCOM_DEBUG > 0)
fprintf (stderr, "[%d] vppcom_select: "
- "'%04d'='%04d'\n", pid, rv, (int) vcom_nsid_fds);
+ "'%04d'='%04d'\n", pid, rv, (int) vcom_nsid_fds);
/* check if any file descriptors changed status */
if (rv > 0)
@@ -723,28 +934,28 @@ vcom_socket_select (int vcom_nfds, fd_set * __restrict vcom_readfds,
* vcom_socket_sid_fds_2_fds
*/
new_vcom_nfd = vcom_socket_sid_fds_2_fds (
- /* dest */
- &new_vcom_nfds,
- vcom_nfds,
- vcom_readfds,
- vcom_writefds,
- vcom_exceptfds,
- /* src */
- vcom_nsid_fds,
- vcom_readfds ?
- &vcom_rd_sid_fds : NULL,
- vcom_writefds ?
- &vcom_wr_sid_fds : NULL,
- vcom_exceptfds ?
- &vcom_ex_sid_fds : NULL);
+ /* dest */
+ &new_vcom_nfds,
+ vcom_nfds,
+ vcom_readfds,
+ vcom_writefds,
+ vcom_exceptfds,
+ /* src */
+ vcom_nsid_fds,
+ vcom_readfds ?
+ &vcom_rd_sid_fds : NULL,
+ vcom_writefds ?
+ &vcom_wr_sid_fds : NULL,
+ vcom_exceptfds ?
+ &vcom_ex_sid_fds : NULL);
if (new_vcom_nfd < 0)
- {
- return new_vcom_nfd;
- }
+ {
+ return new_vcom_nfd;
+ }
if (new_vcom_nfds < 0)
- {
- return -EINVAL;
- }
+ {
+ return -EINVAL;
+ }
rv = new_vcom_nfd;
}
return rv;
@@ -772,9 +983,9 @@ vcom_socket_socket (int __domain, int __type, int __protocol)
}
sid = vppcom_session_create (VPPCOM_VRF_DEFAULT,
- (type == SOCK_DGRAM) ?
- VPPCOM_PROTO_UDP : VPPCOM_PROTO_TCP,
- is_nonblocking);
+ (type == SOCK_DGRAM) ?
+ VPPCOM_PROTO_UDP : VPPCOM_PROTO_TCP,
+ is_nonblocking);
if (sid < 0)
{
rv = sid;
@@ -782,6 +993,8 @@ vcom_socket_socket (int __domain, int __type, int __protocol)
}
pool_get (vsm->vsockets, vsock);
+ vsocket_init (vsock);
+
sockidx = vsock - vsm->vsockets;
hash_set (vsm->sockidx_by_fd, fd, sockidx);
@@ -796,7 +1009,7 @@ out:
int
vcom_socket_socketpair (int __domain, int __type, int __protocol,
- int __fds[2])
+ int __fds[2])
{
/* TBD: */
return 0;
@@ -833,9 +1046,9 @@ vcom_socket_bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len)
{
case AF_INET:
if (__len != sizeof (struct sockaddr_in))
- {
- return -EINVAL;
- }
+ {
+ return -EINVAL;
+ }
ep.is_ip4 = VPPCOM_IS_IP4;
ep.ip = (u8 *) & ((const struct sockaddr_in *) __addr)->sin_addr;
ep.port = (u16) ((const struct sockaddr_in *) __addr)->sin_port;
@@ -843,9 +1056,9 @@ vcom_socket_bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len)
case AF_INET6:
if (__len != sizeof (struct sockaddr_in6))
- {
- return -EINVAL;
- }
+ {
+ return -EINVAL;
+ }
ep.is_ip4 = VPPCOM_IS_IP6;
ep.ip = (u8 *) & ((const struct sockaddr_in6 *) __addr)->sin6_addr;
ep.port = (u16) ((const struct sockaddr_in6 *) __addr)->sin6_port;
@@ -863,9 +1076,9 @@ vcom_socket_bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len)
{
rv = libc_bind (__fd, __addr, __len);
if (rv != 0)
- {
- rv = -errno;
- }
+ {
+ rv = -errno;
+ }
}
return rv;
}
@@ -879,7 +1092,7 @@ vppcom_session_getsockname (int sid, vppcom_endpt_t * ep)
int
vcom_socket_getsockname (int __fd, __SOCKADDR_ARG __addr,
- socklen_t * __restrict __len)
+ socklen_t * __restrict __len)
{
int rv = -1;
vcom_socket_main_t *vsm = &vcom_socket_main;
@@ -924,24 +1137,24 @@ vcom_socket_getsockname (int __fd, __SOCKADDR_ARG __addr,
if (rv == 0)
{
if (ep.vrf == VPPCOM_VRF_DEFAULT)
- {
- __addr->sa_family = ep.is_ip4 == VPPCOM_IS_IP4 ? AF_INET : AF_INET6;
- switch (__addr->sa_family)
- {
- case AF_INET:
- ((struct sockaddr_in *) __addr)->sin_port = ep.port;
- *__len = sizeof (struct sockaddr_in);
- break;
-
- case AF_INET6:
- ((struct sockaddr_in6 *) __addr)->sin6_port = ep.port;
- *__len = sizeof (struct sockaddr_in6);
- break;
-
- default:
- break;
- }
- }
+ {
+ __addr->sa_family = ep.is_ip4 == VPPCOM_IS_IP4 ? AF_INET : AF_INET6;
+ switch (__addr->sa_family)
+ {
+ case AF_INET:
+ ((struct sockaddr_in *) __addr)->sin_port = ep.port;
+ *__len = sizeof (struct sockaddr_in);
+ break;
+
+ case AF_INET6:
+ ((struct sockaddr_in6 *) __addr)->sin6_port = ep.port;
+ *__len = sizeof (struct sockaddr_in6);
+ break;
+
+ default:
+ break;
+ }
+ }
}
#endif
@@ -965,27 +1178,27 @@ vcom_socket_connect (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len)
ep.vrf = VPPCOM_VRF_DEFAULT;
switch (__addr->sa_family)
- {
- case AF_INET:
- ep.is_ip4 = VPPCOM_IS_IP4;
- ep.ip =
- (uint8_t *) & ((const struct sockaddr_in *) __addr)->sin_addr;
- ep.port =
- (uint16_t) ((const struct sockaddr_in *) __addr)->sin_port;
- break;
-
- case AF_INET6:
- ep.is_ip4 = VPPCOM_IS_IP6;
- ep.ip =
- (uint8_t *) & ((const struct sockaddr_in6 *) __addr)->sin6_addr;
- ep.port =
- (uint16_t) ((const struct sockaddr_in6 *) __addr)->sin6_port;
- break;
-
- default:
- return -1;
- break;
- }
+ {
+ case AF_INET:
+ ep.is_ip4 = VPPCOM_IS_IP4;
+ ep.ip =
+ (uint8_t *) & ((const struct sockaddr_in *) __addr)->sin_addr;
+ ep.port =
+ (uint16_t) ((const struct sockaddr_in *) __addr)->sin_port;
+ break;
+
+ case AF_INET6:
+ ep.is_ip4 = VPPCOM_IS_IP6;
+ ep.ip =
+ (uint8_t *) & ((const struct sockaddr_in6 *) __addr)->sin6_addr;
+ ep.port =
+ (uint16_t) ((const struct sockaddr_in6 *) __addr)->sin6_port;
+ break;
+
+ default:
+ return -1;
+ break;
+ }
rv = vppcom_session_connect (vsock->sid, &ep);
}
@@ -1001,7 +1214,7 @@ vppcom_session_getpeername (int sid, vppcom_endpt_t * ep)
int
vcom_socket_getpeername (int __fd, __SOCKADDR_ARG __addr,
- socklen_t * __restrict __len)
+ socklen_t * __restrict __len)
{
int rv = -1;
vcom_socket_main_t *vsm = &vcom_socket_main;
@@ -1060,24 +1273,24 @@ vcom_socket_getpeername (int __fd, __SOCKADDR_ARG __addr,
if (rv == 0)
{
if (ep.vrf == VPPCOM_VRF_DEFAULT)
- {
- __addr->sa_family = ep.is_ip4 == VPPCOM_IS_IP4 ? AF_INET : AF_INET6;
- switch (__addr->sa_family)
- {
- case AF_INET:
- ((struct sockaddr_in *) __addr)->sin_port = ep.port;
- *__len = sizeof (struct sockaddr_in);
- break;
-
- case AF_INET6:
- ((struct sockaddr_in6 *) __addr)->sin6_port = ep.port;
- *__len = sizeof (struct sockaddr_in6);
- break;
-
- default:
- break;
- }
- }
+ {
+ __addr->sa_family = ep.is_ip4 == VPPCOM_IS_IP4 ? AF_INET : AF_INET6;
+ switch (__addr->sa_family)
+ {
+ case AF_INET:
+ ((struct sockaddr_in *) __addr)->sin_port = ep.port;
+ *__len = sizeof (struct sockaddr_in);
+ break;
+
+ case AF_INET6:
+ ((struct sockaddr_in6 *) __addr)->sin6_port = ep.port;
+ *__len = sizeof (struct sockaddr_in6);
+ break;
+
+ default:
+ break;
+ }
+ }
}
#endif
@@ -1120,34 +1333,34 @@ vcom_socket_is_connection_mode_socket (int __fd)
{
vsock = pool_elt_at_index (vsm->vsockets, p[0]);
if (vsock && vsock->type == SOCKET_TYPE_VPPCOM_BOUND)
- {
- optlen = sizeof (type);
- rv = libc_getsockopt (__fd, SOL_SOCKET, SO_TYPE, &type, &optlen);
- if (rv != 0)
- {
- return 0;
- }
- /* get socket type */
- switch (type & ~(SOCK_CLOEXEC | SOCK_NONBLOCK))
- {
- case SOCK_STREAM:
- case SOCK_SEQPACKET:
- return 1;
- break;
-
- default:
- return 0;
- break;
- }
- }
+ {
+ optlen = sizeof (type);
+ rv = libc_getsockopt (__fd, SOL_SOCKET, SO_TYPE, &type, &optlen);
+ if (rv != 0)
+ {
+ return 0;
+ }
+ /* get socket type */
+ switch (type & ~(SOCK_CLOEXEC | SOCK_NONBLOCK))
+ {
+ case SOCK_STREAM:
+ case SOCK_SEQPACKET:
+ return 1;
+ break;
+
+ default:
+ return 0;
+ break;
+ }
+ }
}
return 0;
}
ssize_t
vvppcom_session_sendto (int __sid, const void *__buf, size_t __n,
- int __flags, __CONST_SOCKADDR_ARG __addr,
- socklen_t __addr_len)
+ int __flags, __CONST_SOCKADDR_ARG __addr,
+ socklen_t __addr_len)
{
int rv = -1;
/* TBD add new vpp api */
@@ -1158,8 +1371,8 @@ vvppcom_session_sendto (int __sid, const void *__buf, size_t __n,
ssize_t
vcom_socket_sendto (int __fd, const void *__buf, size_t __n,
- int __flags, __CONST_SOCKADDR_ARG __addr,
- socklen_t __addr_len)
+ int __flags, __CONST_SOCKADDR_ARG __addr,
+ socklen_t __addr_len)
{
int rv = -1;
vcom_socket_main_t *vsm = &vcom_socket_main;
@@ -1187,33 +1400,33 @@ vcom_socket_sendto (int __fd, const void *__buf, size_t __n,
/* ignore __addr and _addr_len */
/* and EISCONN may be returned when they are not NULL and 0 */
if ((__addr != NULL) || (__addr_len != 0))
- {
- return -EISCONN;
- }
+ {
+ return -EISCONN;
+ }
}
else
{
if (!__addr || __addr_len < 0)
- {
- return -EDESTADDRREQ;
- }
+ {
+ return -EDESTADDRREQ;
+ }
/* not a vppcom supported address family */
if ((__addr->sa_family != AF_INET) || (__addr->sa_family != AF_INET6))
- {
- return -EINVAL;
- }
+ {
+ return -EINVAL;
+ }
}
rv = vvppcom_session_sendto (vsock->sid, (void *) __buf, (int) __n,
- __flags, __addr, __addr_len);
+ __flags, __addr, __addr_len);
return rv;
}
/* TBD: move it to vppcom */
static ssize_t
vppcom_session_recvfrom (int __sid, void *__restrict __buf, size_t __n,
- int __flags, __SOCKADDR_ARG __addr,
- socklen_t * __restrict __addr_len)
+ int __flags, __SOCKADDR_ARG __addr,
+ socklen_t * __restrict __addr_len)
{
int rv = -1;
@@ -1224,8 +1437,8 @@ vppcom_session_recvfrom (int __sid, void *__restrict __buf, size_t __n,
ssize_t
vcom_socket_recvfrom (int __fd, void *__restrict __buf, size_t __n,
- int __flags, __SOCKADDR_ARG __addr,
- socklen_t * __restrict __addr_len)
+ int __flags, __SOCKADDR_ARG __addr,
+ socklen_t * __restrict __addr_len)
{
int rv = -1;
vcom_socket_main_t *vsm = &vcom_socket_main;
@@ -1254,7 +1467,7 @@ vcom_socket_recvfrom (int __fd, void *__restrict __buf, size_t __n,
}
rv = vppcom_session_recvfrom (vsock->sid, __buf, __n,
- __flags, __addr, __addr_len);
+ __flags, __addr, __addr_len);
return rv;
}
@@ -1289,9 +1502,9 @@ vcom_socket_sendmsg (int __fd, const struct msghdr * __message, int __flags)
/* ignore __addr and _addr_len */
/* and EISCONN may be returned when they are not NULL and 0 */
if ((__message->msg_name != NULL) || (__message->msg_namelen != 0))
- {
- return -EISCONN;
- }
+ {
+ return -EISCONN;
+ }
}
else
{
@@ -1309,7 +1522,7 @@ vcom_socket_sendmsg (int __fd, const struct msghdr * __message, int __flags)
#ifdef __USE_GNU
int
vcom_socket_sendmmsg (int __fd, struct mmsghdr *__vmessages,
- unsigned int __vlen, int __flags)
+ unsigned int __vlen, int __flags)
{
/* TBD: define a new vppcom api */
@@ -1360,8 +1573,8 @@ vcom_socket_recvmsg (int __fd, struct msghdr * __message, int __flags)
#ifdef __USE_GNU
int
vcom_socket_recvmmsg (int __fd, struct mmsghdr *__vmessages,
- unsigned int __vlen, int __flags,
- struct timespec *__tmo)
+ unsigned int __vlen, int __flags,
+ struct timespec *__tmo)
{
/* TBD: define a new vppcom api */
return 0;
@@ -1371,7 +1584,7 @@ vcom_socket_recvmmsg (int __fd, struct mmsghdr *__vmessages,
/* TBD: move it to vppcom */
static int
vppcom_getsockopt (int __sid, int __level, int __optname,
- void *__restrict __optval, socklen_t * __restrict __optlen)
+ void *__restrict __optval, socklen_t * __restrict __optlen)
{
/* 1. for socket level options that are NOT socket attributes
* and that has corresponding vpp options get from vppcom */
@@ -1385,8 +1598,8 @@ vppcom_getsockopt (int __sid, int __level, int __optname,
int
vcom_socket_getsockopt (int __fd, int __level, int __optname,
- void *__restrict __optval,
- socklen_t * __restrict __optlen)
+ void *__restrict __optval,
+ socklen_t * __restrict __optlen)
{
int rv = -1;
vcom_socket_main_t *vsm = &vcom_socket_main;
@@ -1417,7 +1630,7 @@ vcom_socket_getsockopt (int __fd, int __level, int __optname,
/* handle options at socket level */
case SOL_SOCKET:
switch (__optname)
- {
+ {
/*
* 1. for socket level options that are socket attributes,
* get from libc_getsockopt.
@@ -1426,65 +1639,65 @@ vcom_socket_getsockopt (int __fd, int __level, int __optname,
* get from vppcom.
* 3. for socket level options unimplemented
* return -ENOPROTOOPT */
- case SO_DEBUG:
- case SO_DONTROUTE:
- case SO_BROADCAST:
- case SO_SNDBUF:
- case SO_RCVBUF:
- case SO_REUSEADDR:
- case SO_REUSEPORT:
- case SO_KEEPALIVE:
- case SO_TYPE:
- case SO_PROTOCOL:
- case SO_DOMAIN:
- case SO_ERROR:
- case SO_OOBINLINE:
- case SO_NO_CHECK:
- case SO_PRIORITY:
- case SO_LINGER:
- case SO_BSDCOMPAT:
- case SO_TIMESTAMP:
- case SO_TIMESTAMPNS:
- case SO_TIMESTAMPING:
- case SO_RCVTIMEO:
- case SO_SNDTIMEO:
- case SO_RCVLOWAT:
- case SO_SNDLOWAT:
- case SO_PASSCRED:
- case SO_PEERCRED:
- case SO_PEERNAME:
- case SO_ACCEPTCONN:
- case SO_PASSSEC:
- case SO_PEERSEC:
- case SO_MARK:
- case SO_RXQ_OVFL:
- case SO_WIFI_STATUS:
- case SO_PEEK_OFF:
- case SO_NOFCS:
- case SO_BINDTODEVICE:
- case SO_GET_FILTER:
- case SO_LOCK_FILTER:
- case SO_BPF_EXTENSIONS:
- case SO_SELECT_ERR_QUEUE:
+ case SO_DEBUG:
+ case SO_DONTROUTE:
+ case SO_BROADCAST:
+ case SO_SNDBUF:
+ case SO_RCVBUF:
+ case SO_REUSEADDR:
+ case SO_REUSEPORT:
+ case SO_KEEPALIVE:
+ case SO_TYPE:
+ case SO_PROTOCOL:
+ case SO_DOMAIN:
+ case SO_ERROR:
+ case SO_OOBINLINE:
+ case SO_NO_CHECK:
+ case SO_PRIORITY:
+ case SO_LINGER:
+ case SO_BSDCOMPAT:
+ case SO_TIMESTAMP:
+ case SO_TIMESTAMPNS:
+ case SO_TIMESTAMPING:
+ case SO_RCVTIMEO:
+ case SO_SNDTIMEO:
+ case SO_RCVLOWAT:
+ case SO_SNDLOWAT:
+ case SO_PASSCRED:
+ case SO_PEERCRED:
+ case SO_PEERNAME:
+ case SO_ACCEPTCONN:
+ case SO_PASSSEC:
+ case SO_PEERSEC:
+ case SO_MARK:
+ case SO_RXQ_OVFL:
+ case SO_WIFI_STATUS:
+ case SO_PEEK_OFF:
+ case SO_NOFCS:
+ case SO_BINDTODEVICE:
+ case SO_GET_FILTER:
+ case SO_LOCK_FILTER:
+ case SO_BPF_EXTENSIONS:
+ case SO_SELECT_ERR_QUEUE:
#ifdef CONFIG_NET_RX_BUSY_POLL
- case SO_BUSY_POLL:
+ case SO_BUSY_POLL:
#endif
- case SO_MAX_PACING_RATE:
- case SO_INCOMING_CPU:
- rv = libc_getsockopt (__fd, __level, __optname, __optval, __optlen);
- if (rv != 0)
- {
- rv = -errno;
- return rv;
- }
- break;
-
- default:
- /* We implement the SO_SNDLOWAT etc to not be settable
- * (1003.1g 7).
- */
- return -ENOPROTOOPT;
- }
+ case SO_MAX_PACING_RATE:
+ case SO_INCOMING_CPU:
+ rv = libc_getsockopt (__fd, __level, __optname, __optval, __optlen);
+ if (rv != 0)
+ {
+ rv = -errno;
+ return rv;
+ }
+ break;
+
+ default:
+ /* We implement the SO_SNDLOWAT etc to not be settable
+ * (1003.1g 7).
+ */
+ return -ENOPROTOOPT;
+ }
break;
@@ -1492,7 +1705,7 @@ vcom_socket_getsockopt (int __fd, int __level, int __optname,
/* 1. handle options that are NOT socket level options,
* but have corresponding vpp otions. */
rv = vppcom_getsockopt (vsock->sid, __level, __optname,
- __optval, __optlen);
+ __optval, __optlen);
return rv;
#if 0
@@ -1507,7 +1720,7 @@ vcom_socket_getsockopt (int __fd, int __level, int __optname,
/* TBD: move it to vppcom */
int
vppcom_setsockopt (int __fd, int __level, int __optname,
- const void *__optval, socklen_t __optlen)
+ const void *__optval, socklen_t __optlen)
{
/* 1. for socket level options that are NOT socket attributes
* and that has corresponding vpp options set it from vppcom */
@@ -1521,7 +1734,7 @@ vppcom_setsockopt (int __fd, int __level, int __optname,
int
vcom_socket_setsockopt (int __fd, int __level, int __optname,
- const void *__optval, socklen_t __optlen)
+ const void *__optval, socklen_t __optlen)
{
int rv = -1;
vcom_socket_main_t *vsm = &vcom_socket_main;
@@ -1547,9 +1760,9 @@ vcom_socket_setsockopt (int __fd, int __level, int __optname,
{
rv = libc_setsockopt (__fd, __level, __optname, __optval, __optlen);
if (rv != 0)
- {
- rv = -errno;
- }
+ {
+ rv = -errno;
+ }
return rv;
}
@@ -1564,77 +1777,77 @@ vcom_socket_setsockopt (int __fd, int __level, int __optname,
/* handle options at socket level */
case SOL_SOCKET:
switch (__optname)
- {
- /*
- * 1. for socket level options that are socket attributes,
- * set it from libc_getsockopt
- * 2. for socket level options that are NOT socket
- * attributes and that has corresponding vpp options
- * set it from vppcom
- * 3. for socket level options unimplemented
- * return -ENOPROTOOPT */
- case SO_DEBUG:
- case SO_DONTROUTE:
- case SO_BROADCAST:
- case SO_SNDBUF:
- case SO_RCVBUF:
- case SO_REUSEADDR:
- case SO_REUSEPORT:
- case SO_KEEPALIVE:
- case SO_TYPE:
- case SO_PROTOCOL:
- case SO_DOMAIN:
- case SO_ERROR:
- case SO_OOBINLINE:
- case SO_NO_CHECK:
- case SO_PRIORITY:
- case SO_LINGER:
- case SO_BSDCOMPAT:
- case SO_TIMESTAMP:
- case SO_TIMESTAMPNS:
- case SO_TIMESTAMPING:
- case SO_RCVTIMEO:
- case SO_SNDTIMEO:
- case SO_RCVLOWAT:
- case SO_SNDLOWAT:
- case SO_PASSCRED:
- case SO_PEERCRED:
- case SO_PEERNAME:
- case SO_ACCEPTCONN:
- case SO_PASSSEC:
- case SO_PEERSEC:
- case SO_MARK:
- case SO_RXQ_OVFL:
- case SO_WIFI_STATUS:
- case SO_PEEK_OFF:
- case SO_NOFCS:
- /*
- * SO_BINDTODEVICE already handled as
- * "Options without arguments" */
- /* case SO_BINDTODEVICE: */
- case SO_GET_FILTER:
- case SO_LOCK_FILTER:
- case SO_BPF_EXTENSIONS:
- case SO_SELECT_ERR_QUEUE:
+ {
+ /*
+ * 1. for socket level options that are socket attributes,
+ * set it from libc_getsockopt
+ * 2. for socket level options that are NOT socket
+ * attributes and that has corresponding vpp options
+ * set it from vppcom
+ * 3. for socket level options unimplemented
+ * return -ENOPROTOOPT */
+ case SO_DEBUG:
+ case SO_DONTROUTE:
+ case SO_BROADCAST:
+ case SO_SNDBUF:
+ case SO_RCVBUF:
+ case SO_REUSEADDR:
+ case SO_REUSEPORT:
+ case SO_KEEPALIVE:
+ case SO_TYPE:
+ case SO_PROTOCOL:
+ case SO_DOMAIN:
+ case SO_ERROR:
+ case SO_OOBINLINE:
+ case SO_NO_CHECK:
+ case SO_PRIORITY:
+ case SO_LINGER:
+ case SO_BSDCOMPAT:
+ case SO_TIMESTAMP:
+ case SO_TIMESTAMPNS:
+ case SO_TIMESTAMPING:
+ case SO_RCVTIMEO:
+ case SO_SNDTIMEO:
+ case SO_RCVLOWAT:
+ case SO_SNDLOWAT:
+ case SO_PASSCRED:
+ case SO_PEERCRED:
+ case SO_PEERNAME:
+ case SO_ACCEPTCONN:
+ case SO_PASSSEC:
+ case SO_PEERSEC:
+ case SO_MARK:
+ case SO_RXQ_OVFL:
+ case SO_WIFI_STATUS:
+ case SO_PEEK_OFF:
+ case SO_NOFCS:
+ /*
+ * SO_BINDTODEVICE already handled as
+ * "Options without arguments" */
+ /* case SO_BINDTODEVICE: */
+ case SO_GET_FILTER:
+ case SO_LOCK_FILTER:
+ case SO_BPF_EXTENSIONS:
+ case SO_SELECT_ERR_QUEUE:
#ifdef CONFIG_NET_RX_BUSY_POLL
- case SO_BUSY_POLL:
+ case SO_BUSY_POLL:
#endif
- case SO_MAX_PACING_RATE:
- case SO_INCOMING_CPU:
- rv = libc_setsockopt (__fd, __level, __optname, __optval, __optlen);
- if (rv != 0)
- {
- rv = -errno;
- return rv;
- }
- break;
-
- default:
- /* We implement the SO_SNDLOWAT etc to not be settable
- * (1003.1g 7).
- */
- return -ENOPROTOOPT;
- }
+ case SO_MAX_PACING_RATE:
+ case SO_INCOMING_CPU:
+ rv = libc_setsockopt (__fd, __level, __optname, __optval, __optlen);
+ if (rv != 0)
+ {
+ rv = -errno;
+ return rv;
+ }
+ break;
+
+ default:
+ /* We implement the SO_SNDLOWAT etc to not be settable
+ * (1003.1g 7).
+ */
+ return -ENOPROTOOPT;
+ }
break;
@@ -1642,7 +1855,7 @@ vcom_socket_setsockopt (int __fd, int __level, int __optname,
/* 1. handle options that are NOT socket level options,
* but have corresponding vpp otions. */
rv = vppcom_setsockopt (vsock->sid, __level, __optname,
- __optval, __optlen);
+ __optval, __optlen);
return rv;
#if 0
/* 2. unhandled options */
@@ -1675,8 +1888,8 @@ vcom_socket_listen (int __fd, int __n)
static int
vcom_socket_connected_socket (int __fd, int __sid,
- int *__domain,
- int *__type, int *__protocol, int flags)
+ int *__domain,
+ int *__type, int *__protocol, int flags)
{
int rv = -1;
vcom_socket_main_t *vsm = &vcom_socket_main;
@@ -1719,6 +1932,8 @@ vcom_socket_connected_socket (int __fd, int __sid,
}
pool_get (vsm->vsockets, vsock);
+ vsocket_init (vsock);
+
sockidx = vsock - vsm->vsockets;
hash_set (vsm->sockidx_by_fd, fd, sockidx);
@@ -1734,7 +1949,7 @@ out:
*/
static int
vcom_socket_accept_flags (int __fd, __SOCKADDR_ARG __addr,
- socklen_t * __restrict __addr_len, int flags)
+ socklen_t * __restrict __addr_len, int flags)
{
int rv = -1;
vcom_socket_main_t *vsm = &vcom_socket_main;
@@ -1792,43 +2007,43 @@ vcom_socket_accept_flags (int __fd, __SOCKADDR_ARG __addr,
rv = vcom_fcntl (vsock->fd, F_GETFL, 0);
if (rv < 0)
- {
- return rv;
- }
+ {
+ return rv;
+ }
/* is blocking */
if (!(rv & O_NONBLOCK))
- {
- /* socket is not marked as nonblocking
- * and no pending connections are present
- * on the queue, accept () blocks the caller
- * until a connection is present.
- */
- rv = vppcom_session_accept (vsock->sid, &ep,
- -1.0 /* wait forever */ );
- }
+ {
+ /* socket is not marked as nonblocking
+ * and no pending connections are present
+ * on the queue, accept () blocks the caller
+ * until a connection is present.
+ */
+ rv = vppcom_session_accept (vsock->sid, &ep,
+ -1.0 /* wait forever */ );
+ }
else
- {
- /* The file descriptor refers to a socket and has been
- * marked nonblocking(O_NONBLOCK) and the accept would
- * block.
- * */
- /* is non blocking */
- rv = vppcom_session_accept (vsock->sid, &ep, 0);
- /* If the socket is marked nonblocking and
- * no pending connections are present on the
- * queue, accept fails with the error
- * EAGAIN or EWOULDBLOCK
- */
- if (rv == VPPCOM_ETIMEDOUT)
- {
- rv = VPPCOM_EAGAIN;
- }
- }
+ {
+ /* The file descriptor refers to a socket and has been
+ * marked nonblocking(O_NONBLOCK) and the accept would
+ * block.
+ * */
+ /* is non blocking */
+ rv = vppcom_session_accept (vsock->sid, &ep, 0);
+ /* If the socket is marked nonblocking and
+ * no pending connections are present on the
+ * queue, accept fails with the error
+ * EAGAIN or EWOULDBLOCK
+ */
+ if (rv == VPPCOM_ETIMEDOUT)
+ {
+ rv = VPPCOM_EAGAIN;
+ }
+ }
if (rv < 0)
- {
- return rv;
- }
+ {
+ return rv;
+ }
sid = rv;
@@ -1837,11 +2052,11 @@ vcom_socket_accept_flags (int __fd, __SOCKADDR_ARG __addr,
* update vsockets and sockidx_by_fd table
* */
fd = vcom_socket_connected_socket (__fd, sid,
- &domain, &type, &protocol, flags);
+ &domain, &type, &protocol, flags);
if (fd < 0)
- {
- return fd;
- }
+ {
+ return fd;
+ }
rv = fd;
@@ -1850,87 +2065,87 @@ vcom_socket_accept_flags (int __fd, __SOCKADDR_ARG __addr,
* provided is too small, in this case, __addr_len will
* return a value greater than was supplied to the call.*/
if (__addr)
- {
- if (ep.is_cut_thru)
- {
- /* TBD populate __addr and __addr_len */
- switch (domain)
- {
- case AF_INET:
- ((struct sockaddr_in *) __addr)->sin_family = AF_INET;
- ((struct sockaddr_in *) __addr)->sin_port = ep.port;
- memcpy (&((struct sockaddr_in *) __addr)->sin_addr,
- addr8, sizeof (struct in_addr));
- /* TBD: populate __addr_len */
- if (__addr_len)
- {
- *__addr_len = sizeof (struct sockaddr_in);
- }
- break;
-
- case AF_INET6:
- ((struct sockaddr_in6 *) __addr)->sin6_family = AF_INET6;
- ((struct sockaddr_in6 *) __addr)->sin6_port = ep.port;
- memcpy (((struct sockaddr_in6 *) __addr)->sin6_addr.
- __in6_u.__u6_addr8, addr8,
- sizeof (struct in6_addr));
- /* TBD: populate __addr_len */
- if (__addr_len)
- {
- *__addr_len = sizeof (struct sockaddr_in6);
- }
- break;
-
- default:
- return -EAFNOSUPPORT;
- }
- }
- else
- {
- switch (ep.is_ip4)
- {
- case VPPCOM_IS_IP4:
- ((struct sockaddr_in *) __addr)->sin_family = AF_INET;
- ((struct sockaddr_in *) __addr)->sin_port = ep.port;
- memcpy (&((struct sockaddr_in *) __addr)->sin_addr,
- addr8, sizeof (struct in_addr));
- /* TBD: populate __addr_len */
- if (__addr_len)
- {
- *__addr_len = sizeof (struct sockaddr_in);
- }
- break;
-
- case VPPCOM_IS_IP6:
- ((struct sockaddr_in6 *) __addr)->sin6_family = AF_INET6;
- ((struct sockaddr_in6 *) __addr)->sin6_port = ep.port;
- memcpy (((struct sockaddr_in6 *) __addr)->sin6_addr.
- __in6_u.__u6_addr8, addr8,
- sizeof (struct in6_addr));
- /* TBD: populate __addr_len */
- if (__addr_len)
- {
- *__addr_len = sizeof (struct sockaddr_in6);
- }
- break;
-
- default:
- return -EAFNOSUPPORT;
- }
- }
- }
+ {
+ if (ep.is_cut_thru)
+ {
+ /* TBD populate __addr and __addr_len */
+ switch (domain)
+ {
+ case AF_INET:
+ ((struct sockaddr_in *) __addr)->sin_family = AF_INET;
+ ((struct sockaddr_in *) __addr)->sin_port = ep.port;
+ memcpy (&((struct sockaddr_in *) __addr)->sin_addr,
+ addr8, sizeof (struct in_addr));
+ /* TBD: populate __addr_len */
+ if (__addr_len)
+ {
+ *__addr_len = sizeof (struct sockaddr_in);
+ }
+ break;
+
+ case AF_INET6:
+ ((struct sockaddr_in6 *) __addr)->sin6_family = AF_INET6;
+ ((struct sockaddr_in6 *) __addr)->sin6_port = ep.port;
+ memcpy (((struct sockaddr_in6 *) __addr)->sin6_addr.
+ __in6_u.__u6_addr8, addr8,
+ sizeof (struct in6_addr));
+ /* TBD: populate __addr_len */
+ if (__addr_len)
+ {
+ *__addr_len = sizeof (struct sockaddr_in6);
+ }
+ break;
+
+ default:
+ return -EAFNOSUPPORT;
+ }
+ }
+ else
+ {
+ switch (ep.is_ip4)
+ {
+ case VPPCOM_IS_IP4:
+ ((struct sockaddr_in *) __addr)->sin_family = AF_INET;
+ ((struct sockaddr_in *) __addr)->sin_port = ep.port;
+ memcpy (&((struct sockaddr_in *) __addr)->sin_addr,
+ addr8, sizeof (struct in_addr));
+ /* TBD: populate __addr_len */
+ if (__addr_len)
+ {
+ *__addr_len = sizeof (struct sockaddr_in);
+ }
+ break;
+
+ case VPPCOM_IS_IP6:
+ ((struct sockaddr_in6 *) __addr)->sin6_family = AF_INET6;
+ ((struct sockaddr_in6 *) __addr)->sin6_port = ep.port;
+ memcpy (((struct sockaddr_in6 *) __addr)->sin6_addr.
+ __in6_u.__u6_addr8, addr8,
+ sizeof (struct in6_addr));
+ /* TBD: populate __addr_len */
+ if (__addr_len)
+ {
+ *__addr_len = sizeof (struct sockaddr_in6);
+ }
+ break;
+
+ default:
+ return -EAFNOSUPPORT;
+ }
+ }
+ }
else
- {
- /* when __addr is NULL, nothing is filled in,
- * in this case, __addr_len is not used,
- * and should also be null
- * */
- if (__addr_len)
- {
- /* TBD: return proper error code */
- return -1;
- }
- }
+ {
+ /* when __addr is NULL, nothing is filled in,
+ * in this case, __addr_len is not used,
+ * and should also be null
+ * */
+ if (__addr_len)
+ {
+ /* TBD: return proper error code */
+ return -1;
+ }
+ }
}
return rv;
@@ -1938,7 +2153,7 @@ vcom_socket_accept_flags (int __fd, __SOCKADDR_ARG __addr,
int
vcom_socket_accept (int __fd, __SOCKADDR_ARG __addr,
- socklen_t * __restrict __addr_len)
+ socklen_t * __restrict __addr_len)
{
/* set flags to 0 for accept() */
return vcom_socket_accept_flags (__fd, __addr, __addr_len, 0);
@@ -1947,7 +2162,7 @@ vcom_socket_accept (int __fd, __SOCKADDR_ARG __addr,
#ifdef __USE_GNU
int
vcom_socket_accept4 (int __fd, __SOCKADDR_ARG __addr,
- socklen_t * __restrict __addr_len, int __flags)
+ socklen_t * __restrict __addr_len, int __flags)
{
/* SOCK_NONBLOCK and SOCK_CLOEXEC can be bitwise ORed in flags */
return vcom_socket_accept_flags (__fd, __addr, __addr_len, __flags);
@@ -1974,23 +2189,86 @@ vcom_socket_shutdown (int __fd, int __how)
{
vsock = pool_elt_at_index (vsm->vsockets, p[0]);
switch (__how)
- {
- case SHUT_RD:
- case SHUT_WR:
- case SHUT_RDWR:
- rv = vppcom_session_shutdown (vsock->sid, __how);
- return rv;
- break;
+ {
+ case SHUT_RD:
+ case SHUT_WR:
+ case SHUT_RDWR:
+ rv = vppcom_session_shutdown (vsock->sid, __how);
+ return rv;
+ break;
+
+ default:
+ return -EINVAL;
+ break;
+ }
+ }
- default:
- return -EINVAL;
- break;
- }
+ return rv;
+}
+
+/*
+ * TBD: remove it once vppvom.h is committed.
+ */
+int vppcom_epoll_create (void)
+{
+ return -ENOSYS;
+}
+int
+vcom_socket_epoll_create1 (int __flags)
+{
+ int rv = -1;
+ vcom_socket_main_t *vsm = &vcom_socket_main;
+ vcom_epoll_t *vepoll;
+
+ i32 epfd;
+ i32 vep_idx;
+ i32 epollidx;
+
+ epfd = vcom_socket_open_epoll (__flags);
+ if (epfd < 0)
+ {
+ rv = epfd;
+ goto out;
+ }
+
+ vep_idx = vppcom_epoll_create ( );
+ if (vep_idx < 0)
+ {
+ rv = vep_idx;
+ goto out_close_epoll;
}
+ pool_get (vsm->vepolls, vepoll);
+ vepoll_init (vepoll);
+
+ epollidx = vepoll - vsm->vepolls;
+ hash_set (vsm->epollidx_by_epfd, epfd, epollidx);
+
+ vepoll_set (vepoll, epfd, vep_idx,
+ EPOLL_TYPE_VPPCOM_BOUND, __flags, 0, 0);
+ return epfd;
+
+out_close_epoll:
+ vcom_socket_close_epoll (epfd);
+out:
return rv;
}
+int
+vcom_socket_epoll_ctl (int __epfd, int __op, int __fd,
+ struct epoll_event *__event)
+{
+ return -ENOSYS;
+}
+
+int
+vcom_socket_epoll_pwait (int __epfd, struct epoll_event *__events,
+ int __maxevents, int __timeout,
+ const __sigset_t *__ss)
+{
+ return -ENOSYS;
+}
+
/*
* fd.io coding-style-patch-verification: ON
*