From 34956cc3d34d6e7b9c7ed5a27d9eebd6fe404280 Mon Sep 17 00:00:00 2001 From: shrinivasan ganapathy Date: Wed, 4 Oct 2017 02:48:31 -0700 Subject: VCL_LDPRELOAD epoll implementation -epoll_create implementation Change-Id: If05b5f44e48455f5a6f7a8096c1d020e7f3cd9cc Signed-off-by: shrinivasan ganapathy --- vcl-ldpreload/src/libvcl-ldpreload/vcom_socket.c | 1262 +++++++++++++--------- 1 file changed, 770 insertions(+), 492 deletions(-) (limited to 'vcl-ldpreload/src/libvcl-ldpreload/vcom_socket.c') 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 * -- cgit 1.2.3-korg