From 20e5bc31904d25e44cda5ef675d4ab1e86795bdb Mon Sep 17 00:00:00 2001 From: "xiaolongx.jiang" Date: Mon, 29 Jun 2020 20:50:30 +0800 Subject: modify stable to tag, openssl alpha3->alpha4 and modify ldp patch add debug and openssl3_enable pack vpp and nginx ingredients together Signed-off-by: xiaolongx.jiang Change-Id: I6bd27f8d8ab6ecd8684692b1ef0433833868a19c --- vpp_patches/ldp/master/0001-LDP-remove-lock.patch | 855 ++++++++++++++++------ 1 file changed, 630 insertions(+), 225 deletions(-) (limited to 'vpp_patches/ldp/master/0001-LDP-remove-lock.patch') diff --git a/vpp_patches/ldp/master/0001-LDP-remove-lock.patch b/vpp_patches/ldp/master/0001-LDP-remove-lock.patch index feb3502..7bd55a6 100644 --- a/vpp_patches/ldp/master/0001-LDP-remove-lock.patch +++ b/vpp_patches/ldp/master/0001-LDP-remove-lock.patch @@ -1,17 +1,19 @@ -From d9fffb4761489abc5976df0eac82fa6280a187cc Mon Sep 17 00:00:00 2001 +From c893f77a90344f6390cef8b9930bae79103b6fc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Czsj=E2=80=9D?= <“reGliming@gmail.com”> -Date: Mon, 27 Apr 2020 15:00:15 +0800 +Date: Wed, 3 Jun 2020 15:46:49 +0800 Subject: [PATCH] LDP remove lock --- src/vcl/CMakeLists.txt | 5 +- - src/vcl/ldp.c | 740 +++++++---- - src/vcl/ldp.c.orig | 2520 ++++++++++++++++++++++++++++++++++++ + src/vcl/ldp.c | 774 ++++++---- + src/vcl/ldp.c.orig | 2720 ++++++++++++++++++++++++++++++++++++ + src/vcl/ldp.c.rej | 87 ++ src/vcl/ldp.h | 2 +- src/vcl/vcl_private.h | 7 +- - src/vcl/vcl_private.h.orig | 679 ++++++++++ - 6 files changed, 3693 insertions(+), 260 deletions(-) + src/vcl/vcl_private.h.orig | 679 +++++++++ + 7 files changed, 3997 insertions(+), 277 deletions(-) create mode 100644 src/vcl/ldp.c.orig + create mode 100644 src/vcl/ldp.c.rej create mode 100644 src/vcl/vcl_private.h.orig diff --git a/src/vcl/CMakeLists.txt b/src/vcl/CMakeLists.txt @@ -38,7 +40,7 @@ index ab0a6ad6a..0d30eb6af 100644 \ No newline at end of file +) diff --git a/src/vcl/ldp.c b/src/vcl/ldp.c -index c23f995d5..bbd8adff9 100644 +index cda4425e5..36aaf5d17 100644 --- a/src/vcl/ldp.c +++ b/src/vcl/ldp.c @@ -24,9 +24,10 @@ @@ -53,7 +55,7 @@ index c23f995d5..bbd8adff9 100644 #include #include #include -@@ -96,8 +97,8 @@ typedef struct +@@ -97,8 +98,8 @@ typedef struct ldp_worker_ctx_t *workers; int init; char app_name[LDP_APP_NAME_MAX]; @@ -64,7 +66,7 @@ index c23f995d5..bbd8adff9 100644 u32 debug; u8 transparent_tls; -@@ -116,8 +117,8 @@ typedef struct +@@ -117,8 +118,8 @@ typedef struct } static ldp_main_t ldp_main = { @@ -75,7 +77,7 @@ index c23f995d5..bbd8adff9 100644 .debug = LDP_DEBUG_INIT, .transparent_tls = 0, }; -@@ -150,18 +151,18 @@ ldp_get_app_name () +@@ -151,18 +152,18 @@ ldp_get_app_name () } static inline int @@ -101,7 +103,7 @@ index c23f995d5..bbd8adff9 100644 } static void -@@ -172,6 +173,194 @@ ldp_alloc_workers (void) +@@ -173,6 +174,194 @@ ldp_alloc_workers (void) pool_alloc (ldp->workers, LDP_MAX_NWORKERS); } @@ -296,7 +298,7 @@ index c23f995d5..bbd8adff9 100644 static inline int ldp_init (void) { -@@ -183,7 +372,9 @@ ldp_init (void) +@@ -184,7 +373,9 @@ ldp_init (void) ldp->init = 1; ldp->vcl_needs_real_epoll = 1; @@ -307,7 +309,7 @@ index c23f995d5..bbd8adff9 100644 if (rv != VPPCOM_OK) { ldp->vcl_needs_real_epoll = 0; -@@ -230,43 +421,43 @@ ldp_init (void) +@@ -231,43 +422,43 @@ ldp_init (void) { LDBG (0, "WARNING: Invalid LDP sid bit specified in the env var " LDP_ENV_SID_BIT " (%s)! sid bit value %d (0x%x)", env_var_str, @@ -364,7 +366,7 @@ index c23f995d5..bbd8adff9 100644 ldp->init = 0; return -1; } -@@ -291,16 +482,16 @@ ldp_init (void) +@@ -292,16 +483,16 @@ ldp_init (void) int close (int fd) { @@ -385,7 +387,7 @@ index c23f995d5..bbd8adff9 100644 if (epfd > 0) { LDBG (0, "fd %d: calling libc_close: epfd %u", fd, epfd); -@@ -311,7 +502,8 @@ close (int fd) +@@ -312,7 +503,8 @@ close (int fd) u32 size = sizeof (epfd); epfd = 0; @@ -395,7 +397,7 @@ index c23f995d5..bbd8adff9 100644 } } else if (PREDICT_FALSE (epfd < 0)) -@@ -321,9 +513,9 @@ close (int fd) +@@ -322,9 +514,9 @@ close (int fd) goto done; } @@ -407,7 +409,7 @@ index c23f995d5..bbd8adff9 100644 if (rv != VPPCOM_OK) { errno = -rv; -@@ -343,16 +535,16 @@ done: +@@ -344,16 +536,16 @@ done: ssize_t read (int fd, void *buf, size_t nbytes) { @@ -428,7 +430,7 @@ index c23f995d5..bbd8adff9 100644 if (size < 0) { errno = -size; -@@ -371,18 +563,18 @@ ssize_t +@@ -372,18 +564,18 @@ ssize_t readv (int fd, const struct iovec * iov, int iovcnt) { int rv = 0, i, total = 0; @@ -451,7 +453,7 @@ index c23f995d5..bbd8adff9 100644 if (rv <= 0) break; else -@@ -411,16 +603,16 @@ readv (int fd, const struct iovec * iov, int iovcnt) +@@ -412,16 +604,16 @@ readv (int fd, const struct iovec * iov, int iovcnt) ssize_t write (int fd, const void *buf, size_t nbytes) { @@ -472,7 +474,7 @@ index c23f995d5..bbd8adff9 100644 if (size < 0) { errno = -size; -@@ -439,18 +631,19 @@ ssize_t +@@ -440,18 +632,19 @@ ssize_t writev (int fd, const struct iovec * iov, int iovcnt) { ssize_t size = 0, total = 0; @@ -496,18 +498,13 @@ index c23f995d5..bbd8adff9 100644 if (rv < 0) break; else -@@ -485,7 +678,7 @@ int - fcntl (int fd, int cmd, ...) - #endif +@@ -481,12 +674,12 @@ writev (int fd, const struct iovec * iov, int iovcnt) + static int + fcntl_internal (int fd, int cmd, va_list ap) { - vls_handle_t vlsh; + vcl_session_handle_t vclsh; int rv = 0; - va_list ap; - -@@ -494,9 +687,9 @@ fcntl (int fd, int cmd, ...) - - va_start (ap, cmd); - vlsh = ldp_fd_to_vlsh (fd); - LDBG (0, "fd %u vlsh %d, cmd %u", fd, vlsh, cmd); @@ -518,7 +515,7 @@ index c23f995d5..bbd8adff9 100644 { int flags = va_arg (ap, int); u32 size; -@@ -506,11 +699,13 @@ fcntl (int fd, int cmd, ...) +@@ -496,11 +689,13 @@ fcntl_internal (int fd, int cmd, va_list ap) switch (cmd) { case F_SETFL: @@ -534,7 +531,7 @@ index c23f995d5..bbd8adff9 100644 if (rv == VPPCOM_OK) rv = flags; break; -@@ -546,7 +741,7 @@ fcntl (int fd, int cmd, ...) +@@ -565,7 +760,7 @@ fcntl64 (int fd, int cmd, ...) int ioctl (int fd, unsigned long int cmd, ...) { @@ -543,7 +540,7 @@ index c23f995d5..bbd8adff9 100644 va_list ap; int rv; -@@ -555,13 +750,13 @@ ioctl (int fd, unsigned long int cmd, ...) +@@ -574,13 +769,13 @@ ioctl (int fd, unsigned long int cmd, ...) va_start (ap, cmd); @@ -560,7 +557,7 @@ index c23f995d5..bbd8adff9 100644 break; case FIONBIO: -@@ -573,7 +768,9 @@ ioctl (int fd, unsigned long int cmd, ...) +@@ -592,7 +787,9 @@ ioctl (int fd, unsigned long int cmd, ...) * non-blocking, the flags should be read here and merged * with O_NONBLOCK. */ @@ -571,7 +568,7 @@ index c23f995d5..bbd8adff9 100644 } break; -@@ -603,7 +800,7 @@ ldp_select_init_maps (fd_set * __restrict original, +@@ -622,7 +819,7 @@ ldp_select_init_maps (fd_set * __restrict original, u32 n_bytes, uword * si_bits, uword * libc_bits) { uword si_bits_set, libc_bits_set; @@ -580,7 +577,7 @@ index c23f995d5..bbd8adff9 100644 int fd; clib_bitmap_validate (*vclb, minbits); -@@ -616,11 +813,11 @@ ldp_select_init_maps (fd_set * __restrict original, +@@ -635,11 +832,11 @@ ldp_select_init_maps (fd_set * __restrict original, clib_bitmap_foreach (fd, *resultb, ({ if (fd > nfds) break; @@ -595,7 +592,7 @@ index c23f995d5..bbd8adff9 100644 })); /* *INDENT-ON* */ -@@ -635,7 +832,7 @@ ldp_select_init_maps (fd_set * __restrict original, +@@ -654,7 +851,7 @@ ldp_select_init_maps (fd_set * __restrict original, always_inline int ldp_select_vcl_map_to_libc (clib_bitmap_t * vclb, fd_set * __restrict libcb) { @@ -604,7 +601,7 @@ index c23f995d5..bbd8adff9 100644 uword si; int fd; -@@ -644,9 +841,9 @@ ldp_select_vcl_map_to_libc (clib_bitmap_t * vclb, fd_set * __restrict libcb) +@@ -663,9 +860,9 @@ ldp_select_vcl_map_to_libc (clib_bitmap_t * vclb, fd_set * __restrict libcb) /* *INDENT-OFF* */ clib_bitmap_foreach (si, vclb, ({ @@ -617,7 +614,7 @@ index c23f995d5..bbd8adff9 100644 if (PREDICT_FALSE (fd < 0)) { errno = EBADFD; -@@ -719,7 +916,7 @@ ldp_pselect (int nfds, fd_set * __restrict readfds, +@@ -738,7 +935,7 @@ ldp_pselect (int nfds, fd_set * __restrict readfds, else time_out = -1; @@ -626,7 +623,7 @@ index c23f995d5..bbd8adff9 100644 { rv = libc_pselect (nfds, readfds, writefds, exceptfds, timeout, sigmask); -@@ -769,9 +966,10 @@ ldp_pselect (int nfds, fd_set * __restrict readfds, +@@ -788,9 +985,10 @@ ldp_pselect (int nfds, fd_set * __restrict readfds, vec_len (ldpw->si_ex_bitmap) * sizeof (clib_bitmap_t)); @@ -640,7 +637,7 @@ index c23f995d5..bbd8adff9 100644 if (rv < 0) { errno = -rv; -@@ -883,7 +1081,7 @@ pselect (int nfds, fd_set * __restrict readfds, +@@ -903,7 +1101,7 @@ pselect (int nfds, fd_set * __restrict readfds, /* If transparent TLS mode is turned on, then ldp will load key and cert. */ static int @@ -649,7 +646,7 @@ index c23f995d5..bbd8adff9 100644 { char *env_var_str = getenv (LDP_ENV_TLS_CERT); char inbuf[4096]; -@@ -901,7 +1099,7 @@ load_tls_cert (vls_handle_t vlsh) +@@ -921,7 +1119,7 @@ load_tls_cert (vls_handle_t vlsh) } cert_size = fread (inbuf, sizeof (char), sizeof (inbuf), fp); tls_cert = inbuf; @@ -658,7 +655,7 @@ index c23f995d5..bbd8adff9 100644 cert_size); fclose (fp); } -@@ -915,7 +1113,7 @@ load_tls_cert (vls_handle_t vlsh) +@@ -935,7 +1133,7 @@ load_tls_cert (vls_handle_t vlsh) } static int @@ -667,7 +664,7 @@ index c23f995d5..bbd8adff9 100644 { char *env_var_str = getenv (LDP_ENV_TLS_KEY); char inbuf[4096]; -@@ -933,7 +1131,7 @@ load_tls_key (vls_handle_t vlsh) +@@ -953,7 +1151,7 @@ load_tls_key (vls_handle_t vlsh) } key_size = fread (inbuf, sizeof (char), sizeof (inbuf), fp); tls_key = inbuf; @@ -676,7 +673,7 @@ index c23f995d5..bbd8adff9 100644 key_size); fclose (fp); } -@@ -950,7 +1148,7 @@ socket (int domain, int type, int protocol) +@@ -970,7 +1168,7 @@ socket (int domain, int type, int protocol) { int rv, sock_type = type & ~(SOCK_CLOEXEC | SOCK_NONBLOCK); u8 is_nonblocking = type & SOCK_NONBLOCK ? 1 : 0; @@ -685,7 +682,7 @@ index c23f995d5..bbd8adff9 100644 if ((errno = -ldp_init ())) return -1; -@@ -967,25 +1165,26 @@ socket (int domain, int type, int protocol) +@@ -987,25 +1185,26 @@ socket (int domain, int type, int protocol) proto = ((sock_type == SOCK_DGRAM) ? VPPCOM_PROTO_UDP : VPPCOM_PROTO_TCP); @@ -718,7 +715,7 @@ index c23f995d5..bbd8adff9 100644 } } else -@@ -1031,14 +1230,14 @@ socketpair (int domain, int type, int protocol, int fds[2]) +@@ -1051,14 +1250,14 @@ socketpair (int domain, int type, int protocol, int fds[2]) int bind (int fd, __CONST_SOCKADDR_ARG addr, socklen_t len) { @@ -736,7 +733,7 @@ index c23f995d5..bbd8adff9 100644 { vppcom_endpt_t ep; -@@ -1047,8 +1246,8 @@ bind (int fd, __CONST_SOCKADDR_ARG addr, socklen_t len) +@@ -1067,8 +1266,8 @@ bind (int fd, __CONST_SOCKADDR_ARG addr, socklen_t len) case AF_INET: if (len != sizeof (struct sockaddr_in)) { @@ -747,7 +744,7 @@ index c23f995d5..bbd8adff9 100644 errno = EINVAL; rv = -1; goto done; -@@ -1061,8 +1260,9 @@ bind (int fd, __CONST_SOCKADDR_ARG addr, socklen_t len) +@@ -1081,8 +1280,9 @@ bind (int fd, __CONST_SOCKADDR_ARG addr, socklen_t len) case AF_INET6: if (len != sizeof (struct sockaddr_in6)) { @@ -759,7 +756,7 @@ index c23f995d5..bbd8adff9 100644 errno = EINVAL; rv = -1; goto done; -@@ -1073,16 +1273,17 @@ bind (int fd, __CONST_SOCKADDR_ARG addr, socklen_t len) +@@ -1093,16 +1293,17 @@ bind (int fd, __CONST_SOCKADDR_ARG addr, socklen_t len) break; default: @@ -782,7 +779,7 @@ index c23f995d5..bbd8adff9 100644 if (rv != VPPCOM_OK) { errno = -rv; -@@ -1150,14 +1351,14 @@ ldp_copy_ep_to_sockaddr (__SOCKADDR_ARG addr, socklen_t * __restrict len, +@@ -1170,14 +1371,14 @@ ldp_copy_ep_to_sockaddr (__SOCKADDR_ARG addr, socklen_t * __restrict len, int getsockname (int fd, __SOCKADDR_ARG addr, socklen_t * __restrict len) { @@ -800,7 +797,7 @@ index c23f995d5..bbd8adff9 100644 { vppcom_endpt_t ep; u8 addr_buf[sizeof (struct in6_addr)]; -@@ -1165,7 +1366,7 @@ getsockname (int fd, __SOCKADDR_ARG addr, socklen_t * __restrict len) +@@ -1185,7 +1386,7 @@ getsockname (int fd, __SOCKADDR_ARG addr, socklen_t * __restrict len) ep.ip = addr_buf; @@ -809,7 +806,7 @@ index c23f995d5..bbd8adff9 100644 if (rv != VPPCOM_OK) { errno = -rv; -@@ -1192,7 +1393,7 @@ getsockname (int fd, __SOCKADDR_ARG addr, socklen_t * __restrict len) +@@ -1212,7 +1413,7 @@ getsockname (int fd, __SOCKADDR_ARG addr, socklen_t * __restrict len) int connect (int fd, __CONST_SOCKADDR_ARG addr, socklen_t len) { @@ -818,7 +815,7 @@ index c23f995d5..bbd8adff9 100644 int rv; if ((errno = -ldp_init ())) -@@ -1206,8 +1407,8 @@ connect (int fd, __CONST_SOCKADDR_ARG addr, socklen_t len) +@@ -1226,8 +1427,8 @@ connect (int fd, __CONST_SOCKADDR_ARG addr, socklen_t len) goto done; } @@ -829,7 +826,7 @@ index c23f995d5..bbd8adff9 100644 { vppcom_endpt_t ep; -@@ -1216,8 +1417,8 @@ connect (int fd, __CONST_SOCKADDR_ARG addr, socklen_t len) +@@ -1236,8 +1437,8 @@ connect (int fd, __CONST_SOCKADDR_ARG addr, socklen_t len) case AF_INET: if (len != sizeof (struct sockaddr_in)) { @@ -840,7 +837,7 @@ index c23f995d5..bbd8adff9 100644 errno = EINVAL; rv = -1; goto done; -@@ -1230,8 +1431,8 @@ connect (int fd, __CONST_SOCKADDR_ARG addr, socklen_t len) +@@ -1250,8 +1451,8 @@ connect (int fd, __CONST_SOCKADDR_ARG addr, socklen_t len) case AF_INET6: if (len != sizeof (struct sockaddr_in6)) { @@ -851,7 +848,7 @@ index c23f995d5..bbd8adff9 100644 errno = EINVAL; rv = -1; goto done; -@@ -1242,16 +1443,17 @@ connect (int fd, __CONST_SOCKADDR_ARG addr, socklen_t len) +@@ -1262,16 +1463,17 @@ connect (int fd, __CONST_SOCKADDR_ARG addr, socklen_t len) break; default: @@ -874,7 +871,7 @@ index c23f995d5..bbd8adff9 100644 if (rv != VPPCOM_OK) { errno = -rv; -@@ -1274,21 +1476,21 @@ done: +@@ -1294,21 +1496,21 @@ done: int getpeername (int fd, __SOCKADDR_ARG addr, socklen_t * __restrict len) { @@ -900,7 +897,7 @@ index c23f995d5..bbd8adff9 100644 if (rv != VPPCOM_OK) { errno = -rv; -@@ -1315,15 +1517,15 @@ getpeername (int fd, __SOCKADDR_ARG addr, socklen_t * __restrict len) +@@ -1335,15 +1537,15 @@ getpeername (int fd, __SOCKADDR_ARG addr, socklen_t * __restrict len) ssize_t send (int fd, const void *buf, size_t n, int flags) { @@ -919,7 +916,7 @@ index c23f995d5..bbd8adff9 100644 if (size < VPPCOM_OK) { errno = -size; -@@ -1342,14 +1544,14 @@ ssize_t +@@ -1362,14 +1564,14 @@ ssize_t sendfile (int out_fd, int in_fd, off_t * offset, size_t len) { ldp_worker_ctx_t *ldpw = ldp_worker_get_current (); @@ -937,7 +934,7 @@ index c23f995d5..bbd8adff9 100644 { int rv; ssize_t results = 0; -@@ -1359,11 +1561,14 @@ sendfile (int out_fd, int in_fd, off_t * offset, size_t len) +@@ -1379,11 +1581,14 @@ sendfile (int out_fd, int in_fd, off_t * offset, size_t len) u8 eagain = 0; u32 flags, flags_len = sizeof (flags); @@ -955,7 +952,7 @@ index c23f995d5..bbd8adff9 100644 vec_reset_length (ldpw->io_buffer); errno = -rv; -@@ -1385,11 +1590,12 @@ sendfile (int out_fd, int in_fd, off_t * offset, size_t len) +@@ -1405,11 +1610,12 @@ sendfile (int out_fd, int in_fd, off_t * offset, size_t len) do { @@ -971,7 +968,7 @@ index c23f995d5..bbd8adff9 100644 vec_reset_length (ldpw->io_buffer); errno = -size; size = -1; -@@ -1422,7 +1628,7 @@ sendfile (int out_fd, int in_fd, off_t * offset, size_t len) +@@ -1442,7 +1648,7 @@ sendfile (int out_fd, int in_fd, off_t * offset, size_t len) goto update_offset; } @@ -980,7 +977,7 @@ index c23f995d5..bbd8adff9 100644 if (size < 0) { if (size == VPPCOM_EAGAIN) -@@ -1492,16 +1698,16 @@ sendfile64 (int out_fd, int in_fd, off_t * offset, size_t len) +@@ -1512,16 +1718,16 @@ sendfile64 (int out_fd, int in_fd, off_t * offset, size_t len) ssize_t recv (int fd, void *buf, size_t n, int flags) { @@ -1001,7 +998,48 @@ index c23f995d5..bbd8adff9 100644 if (size < 0) { errno = -size; -@@ -1520,14 +1726,14 @@ ssize_t +@@ -1537,7 +1743,7 @@ recv (int fd, void *buf, size_t n, int flags) + } + + static int +-ldp_vls_sendo (vls_handle_t vlsh, const void *buf, size_t n, int flags, ++ldp_vls_sendo (vcl_session_handle_t vclsh, const void *buf, size_t n, int flags, + __CONST_SOCKADDR_ARG addr, socklen_t addr_len) + { + vppcom_endpt_t *ep = 0; +@@ -1568,11 +1774,11 @@ ldp_vls_sendo (vls_handle_t vlsh, const void *buf, size_t n, int flags, + } + } + +- return vls_sendto (vlsh, (void *) buf, n, flags, ep); ++ return vppcom_session_sendto (vclsh, (void *) buf, n, flags, ep); + } + + static int +-ldp_vls_recvfrom (vls_handle_t vlsh, void *__restrict buf, size_t n, ++ldp_vls_recvfrom (vcl_session_handle_t vclsh, void *__restrict buf, size_t n, + int flags, __SOCKADDR_ARG addr, + socklen_t * __restrict addr_len) + { +@@ -1584,7 +1790,7 @@ ldp_vls_recvfrom (vls_handle_t vlsh, void *__restrict buf, size_t n, + if (addr) + { + ep.ip = src_addr; +- size = vls_recvfrom (vlsh, buf, n, flags, &ep); ++ size = vppcom_session_recvfrom (vclsh, buf, n, flags, &ep); + + if (size > 0) + { +@@ -1594,7 +1800,7 @@ ldp_vls_recvfrom (vls_handle_t vlsh, void *__restrict buf, size_t n, + } + } + else +- size = vls_recvfrom (vlsh, buf, n, flags, NULL); ++ size = vppcom_session_recvfrom (vclsh, buf, n, flags, NULL); + + return size; + } +@@ -1603,16 +1809,16 @@ ssize_t sendto (int fd, const void *buf, size_t n, int flags, __CONST_SOCKADDR_ARG addr, socklen_t addr_len) { @@ -1017,56 +1055,35 @@ index c23f995d5..bbd8adff9 100644 + vclsh = ldp_fd_to_vclsh (fd); + if (vclsh != INVALID_SESSION_ID) { - vppcom_endpt_t *ep = 0; - vppcom_endpt_t _ep; -@@ -1560,7 +1766,7 @@ sendto (int fd, const void *buf, size_t n, int flags, - } - } - -- size = vls_sendto (vlsh, (void *) buf, n, flags, ep); -+ size = vppcom_session_sendto (vclsh, (void *) buf, n, flags, ep); +- size = ldp_vls_sendo (vlsh, buf, n, flags, addr, addr_len); ++ size = ldp_vls_sendo (vclsh, buf, n, flags, addr, addr_len); if (size < 0) { errno = -size; -@@ -1580,14 +1786,14 @@ ssize_t +@@ -1631,16 +1837,16 @@ ssize_t recvfrom (int fd, void *__restrict buf, size_t n, int flags, __SOCKADDR_ARG addr, socklen_t * __restrict addr_len) { -- vls_handle_t sid; -+ vcl_session_handle_t sid; - ssize_t size, rv; +- vls_handle_t vlsh; ++ vcl_session_handle_t vclsh; + ssize_t size; if ((errno = -ldp_init ())) return -1; -- sid = ldp_fd_to_vlsh (fd); -- if (sid != VLS_INVALID_HANDLE) -+ sid = ldp_fd_to_vclsh (fd); -+ if (sid != INVALID_SESSION_ID) +- vlsh = ldp_fd_to_vlsh (fd); +- if (vlsh != VLS_INVALID_HANDLE) ++ vclsh = ldp_fd_to_vclsh (fd); ++ if (vclsh != INVALID_SESSION_ID) { - vppcom_endpt_t ep; - u8 src_addr[sizeof (struct sockaddr_in6)]; -@@ -1595,7 +1801,7 @@ recvfrom (int fd, void *__restrict buf, size_t n, int flags, - if (addr) - { - ep.ip = src_addr; -- size = vls_recvfrom (sid, buf, n, flags, &ep); -+ size = vppcom_session_recvfrom (sid, buf, n, flags, &ep); - - if (size > 0) - { -@@ -1605,7 +1811,7 @@ recvfrom (int fd, void *__restrict buf, size_t n, int flags, - } - } - else -- size = vls_recvfrom (sid, buf, n, flags, NULL); -+ size = vppcom_session_recvfrom (sid, buf, n, flags, NULL); - +- size = ldp_vls_recvfrom (vlsh, buf, n, flags, addr, addr_len); ++ size = ldp_vls_recvfrom (vclsh, buf, n, flags, addr, addr_len); if (size < 0) { -@@ -1624,14 +1830,14 @@ recvfrom (int fd, void *__restrict buf, size_t n, int flags, + errno = -size; +@@ -1658,14 +1864,14 @@ recvfrom (int fd, void *__restrict buf, size_t n, int flags, ssize_t - sendmsg (int fd, const struct msghdr * message, int flags) + sendmsg (int fd, const struct msghdr * msg, int flags) { - vls_handle_t vlsh; + vcl_session_handle_t vclsh; @@ -1080,20 +1097,20 @@ index c23f995d5..bbd8adff9 100644 + vclsh = ldp_fd_to_vclsh (fd); + if (vclsh != INVALID_SESSION_ID) { - LDBG (0, "LDP-TBD"); - errno = ENOSYS; -@@ -1651,7 +1857,7 @@ sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags) - { - ssize_t size; - const char *func_str; -- u32 sh = ldp_fd_to_vlsh (fd); -+ u32 sh = ldp_fd_to_vclsh (fd); + struct iovec *iov = msg->msg_iov; + ssize_t total = 0; +@@ -1673,7 +1879,7 @@ sendmsg (int fd, const struct msghdr * msg, int flags) - if ((errno = -ldp_init ())) - return -1; -@@ -1696,14 +1902,14 @@ sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags) + for (i = 0; i < msg->msg_iovlen; ++i) + { +- rv = ldp_vls_sendo (vlsh, iov[i].iov_base, iov[i].iov_len, flags, ++ rv = ldp_vls_sendo (vclsh, iov[i].iov_base, iov[i].iov_len, flags, + msg->msg_name, msg->msg_namelen); + if (rv < 0) + break; +@@ -1752,26 +1958,26 @@ sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags) ssize_t - recvmsg (int fd, struct msghdr * message, int flags) + recvmsg (int fd, struct msghdr * msg, int flags) { - vls_handle_t vlsh; + vcl_session_handle_t vclsh; @@ -1107,9 +1124,23 @@ index c23f995d5..bbd8adff9 100644 + vclsh = ldp_fd_to_vclsh (fd); + if (vclsh != INVALID_SESSION_ID) { - LDBG (0, "LDP-TBD"); - errno = ENOSYS; -@@ -1724,7 +1930,7 @@ recvmmsg (int fd, struct mmsghdr *vmessages, + struct iovec *iov = msg->msg_iov; + ssize_t max_deq, total = 0; + int i, rv; + +- max_deq = vls_attr (vlsh, VPPCOM_ATTR_GET_NREAD, 0, 0); ++ max_deq = vppcom_session_attr (vclsh, VPPCOM_ATTR_GET_NREAD, 0, 0); + if (!max_deq) + return 0; + + for (i = 0; i < msg->msg_iovlen; i++) + { +- rv = ldp_vls_recvfrom (vlsh, iov[i].iov_base, iov[i].iov_len, flags, ++ rv = ldp_vls_recvfrom (vclsh, iov[i].iov_base, iov[i].iov_len, flags, + (i == 0 ? msg->msg_name : NULL), + (i == 0 ? &msg->msg_namelen : NULL)); + if (rv <= 0) +@@ -1809,7 +2015,7 @@ recvmmsg (int fd, struct mmsghdr *vmessages, { ssize_t size; const char *func_str; @@ -1118,7 +1149,7 @@ index c23f995d5..bbd8adff9 100644 if ((errno = -ldp_init ())) return -1; -@@ -1771,14 +1977,14 @@ int +@@ -1856,14 +2062,14 @@ int getsockopt (int fd, int level, int optname, void *__restrict optval, socklen_t * __restrict optlen) { @@ -1136,7 +1167,7 @@ index c23f995d5..bbd8adff9 100644 { rv = -EOPNOTSUPP; -@@ -1788,26 +1994,26 @@ getsockopt (int fd, int level, int optname, +@@ -1873,26 +2079,26 @@ getsockopt (int fd, int level, int optname, switch (optname) { case TCP_NODELAY: @@ -1173,7 +1204,7 @@ index c23f995d5..bbd8adff9 100644 memset (optval, 0, *optlen); rv = VPPCOM_OK; } -@@ -1821,7 +2027,7 @@ getsockopt (int fd, int level, int optname, +@@ -1906,7 +2112,7 @@ getsockopt (int fd, int level, int optname, break; default: LDBG (0, "ERROR: fd %d: getsockopt SOL_TCP: sid %u, " @@ -1182,7 +1213,7 @@ index c23f995d5..bbd8adff9 100644 break; } break; -@@ -1829,11 +2035,13 @@ getsockopt (int fd, int level, int optname, +@@ -1914,11 +2120,13 @@ getsockopt (int fd, int level, int optname, switch (optname) { case IPV6_V6ONLY: @@ -1199,7 +1230,7 @@ index c23f995d5..bbd8adff9 100644 break; } break; -@@ -1841,35 +2049,47 @@ getsockopt (int fd, int level, int optname, +@@ -1926,35 +2134,47 @@ getsockopt (int fd, int level, int optname, switch (optname) { case SO_ACCEPTCONN: @@ -1259,7 +1290,7 @@ index c23f995d5..bbd8adff9 100644 break; } break; -@@ -1895,14 +2115,14 @@ int +@@ -1980,14 +2200,14 @@ int setsockopt (int fd, int level, int optname, const void *optval, socklen_t optlen) { @@ -1277,7 +1308,7 @@ index c23f995d5..bbd8adff9 100644 { rv = -EOPNOTSUPP; -@@ -1912,20 +2132,20 @@ setsockopt (int fd, int level, int optname, +@@ -1997,20 +2217,20 @@ setsockopt (int fd, int level, int optname, switch (optname) { case TCP_NODELAY: @@ -1306,7 +1337,7 @@ index c23f995d5..bbd8adff9 100644 break; case TCP_CONGESTION: case TCP_CORK: -@@ -1933,8 +2153,8 @@ setsockopt (int fd, int level, int optname, +@@ -2018,8 +2238,8 @@ setsockopt (int fd, int level, int optname, rv = 0; break; default: @@ -1317,7 +1348,7 @@ index c23f995d5..bbd8adff9 100644 break; } break; -@@ -1942,12 +2162,12 @@ setsockopt (int fd, int level, int optname, +@@ -2027,12 +2247,12 @@ setsockopt (int fd, int level, int optname, switch (optname) { case IPV6_V6ONLY: @@ -1334,7 +1365,7 @@ index c23f995d5..bbd8adff9 100644 break; } break; -@@ -1955,20 +2175,20 @@ setsockopt (int fd, int level, int optname, +@@ -2040,20 +2260,20 @@ setsockopt (int fd, int level, int optname, switch (optname) { case SO_KEEPALIVE: @@ -1363,7 +1394,7 @@ index c23f995d5..bbd8adff9 100644 break; } break; -@@ -1993,18 +2213,20 @@ setsockopt (int fd, int level, int optname, +@@ -2078,18 +2298,20 @@ setsockopt (int fd, int level, int optname, int listen (int fd, int n) { @@ -1389,7 +1420,7 @@ index c23f995d5..bbd8adff9 100644 if (rv != VPPCOM_OK) { errno = -rv; -@@ -2018,6 +2240,10 @@ listen (int fd, int n) +@@ -2103,6 +2325,10 @@ listen (int fd, int n) } LDBG (1, "fd %d: returning %d", fd, rv); @@ -1400,7 +1431,7 @@ index c23f995d5..bbd8adff9 100644 return rv; } -@@ -2025,14 +2251,14 @@ static inline int +@@ -2110,14 +2336,14 @@ static inline int ldp_accept4 (int listen_fd, __SOCKADDR_ARG addr, socklen_t * __restrict addr_len, int flags) { @@ -1418,7 +1449,7 @@ index c23f995d5..bbd8adff9 100644 { vppcom_endpt_t ep; u8 src_addr[sizeof (struct sockaddr_in6)]; -@@ -2040,12 +2266,12 @@ ldp_accept4 (int listen_fd, __SOCKADDR_ARG addr, +@@ -2125,12 +2351,12 @@ ldp_accept4 (int listen_fd, __SOCKADDR_ARG addr, ep.ip = src_addr; LDBG (0, "listen fd %d: calling vppcom_session_accept: listen sid %u," @@ -1435,7 +1466,7 @@ index c23f995d5..bbd8adff9 100644 rv = -1; } else -@@ -2053,13 +2279,13 @@ ldp_accept4 (int listen_fd, __SOCKADDR_ARG addr, +@@ -2138,13 +2364,13 @@ ldp_accept4 (int listen_fd, __SOCKADDR_ARG addr, rv = ldp_copy_ep_to_sockaddr (addr, addr_len, &ep); if (rv != VPPCOM_OK) { @@ -1451,7 +1482,7 @@ index c23f995d5..bbd8adff9 100644 } } } -@@ -2092,25 +2318,26 @@ accept (int fd, __SOCKADDR_ARG addr, socklen_t * __restrict addr_len) +@@ -2177,25 +2403,26 @@ accept (int fd, __SOCKADDR_ARG addr, socklen_t * __restrict addr_len) int shutdown (int fd, int how) { @@ -1484,7 +1515,7 @@ index c23f995d5..bbd8adff9 100644 { close (fd); return -1; -@@ -2132,7 +2359,7 @@ int +@@ -2217,7 +2444,7 @@ int epoll_create1 (int flags) { ldp_worker_ctx_t *ldpw = ldp_worker_get_current (); @@ -1493,7 +1524,7 @@ index c23f995d5..bbd8adff9 100644 int rv; if ((errno = -ldp_init ())) -@@ -2153,17 +2380,17 @@ epoll_create1 (int flags) +@@ -2238,17 +2465,17 @@ epoll_create1 (int flags) return rv; } @@ -1516,7 +1547,7 @@ index c23f995d5..bbd8adff9 100644 return rv; } -@@ -2176,14 +2403,14 @@ epoll_create (int size) +@@ -2261,14 +2488,14 @@ epoll_create (int size) int epoll_ctl (int epfd, int op, int fd, struct epoll_event *event) { @@ -1534,7 +1565,7 @@ index c23f995d5..bbd8adff9 100644 { /* The LDP epoll_create1 always creates VCL epfd's. * The app should never have a kernel base epoll fd unless it -@@ -2197,17 +2424,18 @@ epoll_ctl (int epfd, int op, int fd, struct epoll_event *event) +@@ -2282,17 +2509,18 @@ epoll_ctl (int epfd, int op, int fd, struct epoll_event *event) goto done; } @@ -1560,7 +1591,7 @@ index c23f995d5..bbd8adff9 100644 if (rv != VPPCOM_OK) { errno = -rv; -@@ -2219,11 +2447,12 @@ epoll_ctl (int epfd, int op, int fd, struct epoll_event *event) +@@ -2304,11 +2532,12 @@ epoll_ctl (int epfd, int op, int fd, struct epoll_event *event) int libc_epfd; u32 size = sizeof (epfd); @@ -1576,7 +1607,7 @@ index c23f995d5..bbd8adff9 100644 libc_epfd = libc_epoll_create1 (EPOLL_CLOEXEC); if (libc_epfd < 0) -@@ -2232,8 +2461,9 @@ epoll_ctl (int epfd, int op, int fd, struct epoll_event *event) +@@ -2317,8 +2546,9 @@ epoll_ctl (int epfd, int op, int fd, struct epoll_event *event) goto done; } @@ -1588,7 +1619,7 @@ index c23f995d5..bbd8adff9 100644 if (rv < 0) { errno = -rv; -@@ -2265,7 +2495,7 @@ ldp_epoll_pwait (int epfd, struct epoll_event *events, int maxevents, +@@ -2350,7 +2580,7 @@ ldp_epoll_pwait (int epfd, struct epoll_event *events, int maxevents, ldp_worker_ctx_t *ldpw = ldp_worker_get_current (); double time_to_wait = (double) 0, max_time; int libc_epfd, rv = 0; @@ -1597,7 +1628,7 @@ index c23f995d5..bbd8adff9 100644 if ((errno = -ldp_init ())) return -1; -@@ -2279,10 +2509,10 @@ ldp_epoll_pwait (int epfd, struct epoll_event *events, int maxevents, +@@ -2364,10 +2594,10 @@ ldp_epoll_pwait (int epfd, struct epoll_event *events, int maxevents, if (epfd == ldpw->vcl_mq_epfd) return libc_epoll_pwait (epfd, events, maxevents, timeout, sigmask); @@ -1611,7 +1642,7 @@ index c23f995d5..bbd8adff9 100644 errno = EBADFD; return -1; } -@@ -2292,7 +2522,7 @@ ldp_epoll_pwait (int epfd, struct epoll_event *events, int maxevents, +@@ -2377,7 +2607,7 @@ ldp_epoll_pwait (int epfd, struct epoll_event *events, int maxevents, time_to_wait = ((timeout >= 0) ? (double) timeout / 1000 : 0); max_time = clib_time_now (&ldpw->clib_time) + time_to_wait; @@ -1620,7 +1651,7 @@ index c23f995d5..bbd8adff9 100644 if (PREDICT_FALSE (libc_epfd < 0)) { errno = -libc_epfd; -@@ -2301,13 +2531,13 @@ ldp_epoll_pwait (int epfd, struct epoll_event *events, int maxevents, +@@ -2386,13 +2616,13 @@ ldp_epoll_pwait (int epfd, struct epoll_event *events, int maxevents, } LDBG (2, "epfd %d: vep_idx %d, libc_epfd %d, events %p, maxevents %d, " @@ -1636,7 +1667,88 @@ index c23f995d5..bbd8adff9 100644 if (rv > 0) { ldpw->epoll_wait_vcl = 1; -@@ -2354,7 +2584,7 @@ poll (struct pollfd *fds, nfds_t nfds, int timeout) +@@ -2427,7 +2657,7 @@ ldp_epoll_pwait_eventfd (int epfd, struct epoll_event *events, + { + ldp_worker_ctx_t *ldpw = ldp_worker_get_current (); + int libc_epfd, rv = 0, num_ev; +- vls_handle_t ep_vlsh; ++ vcl_session_handle_t ep_vclsh; + + if ((errno = -ldp_init ())) + return -1; +@@ -2441,21 +2671,21 @@ ldp_epoll_pwait_eventfd (int epfd, struct epoll_event *events, + if (epfd == ldpw->vcl_mq_epfd) + return libc_epoll_pwait (epfd, events, maxevents, timeout, sigmask); + +- ep_vlsh = ldp_fd_to_vlsh (epfd); +- if (PREDICT_FALSE (ep_vlsh == VLS_INVALID_HANDLE)) ++ ep_vclsh = ldp_fd_to_vclsh (epfd); ++ if (PREDICT_FALSE (ep_vclsh == INVALID_SESSION_ID)) + { +- LDBG (0, "epfd %d: bad ep_vlsh %d!", epfd, ep_vlsh); ++ LDBG (0, "epfd %d: bad ep_vlsh %d!", epfd, ep_vclsh); + errno = EBADFD; + return -1; + } + +- libc_epfd = vls_attr (ep_vlsh, VPPCOM_ATTR_GET_LIBC_EPFD, 0, 0); ++ libc_epfd = vppcom_session_attr (ep_vclsh, VPPCOM_ATTR_GET_LIBC_EPFD, 0, 0); + if (PREDICT_FALSE (!libc_epfd)) + { + u32 size = sizeof (epfd); + + LDBG (1, "epfd %d, vep_vlsh %d calling libc_epoll_create1: " +- "EPOLL_CLOEXEC", epfd, ep_vlsh); ++ "EPOLL_CLOEXEC", epfd, ep_vclsh); + libc_epfd = libc_epoll_create1 (EPOLL_CLOEXEC); + if (libc_epfd < 0) + { +@@ -2463,7 +2693,7 @@ ldp_epoll_pwait_eventfd (int epfd, struct epoll_event *events, + goto done; + } + +- rv = vls_attr (ep_vlsh, VPPCOM_ATTR_SET_LIBC_EPFD, &libc_epfd, &size); ++ rv = vppcom_session_attr (ep_vclsh, VPPCOM_ATTR_SET_LIBC_EPFD, &libc_epfd, &size); + if (rv < 0) + { + errno = -rv; +@@ -2494,7 +2724,7 @@ ldp_epoll_pwait_eventfd (int epfd, struct epoll_event *events, + ldpw->mq_epfd_added = 1; + } + +- rv = vls_epoll_wait (ep_vlsh, events, maxevents, 0); ++ rv = vppcom_epoll_wait (ep_vclsh, events, maxevents, 0); + if (rv > 0) + goto done; + else if (rv < 0) +@@ -2518,7 +2748,7 @@ ldp_epoll_pwait_eventfd (int epfd, struct epoll_event *events, + events[i].events = events[rv].events; + events[i].data.u64 = events[rv].data.u64; + } +- num_ev = vls_epoll_wait (ep_vlsh, &events[rv], maxevents - rv, 0); ++ num_ev = vppcom_epoll_wait (ep_vclsh, &events[rv], maxevents - rv, 0); + if (PREDICT_TRUE (num_ev > 0)) + rv += num_ev; + break; +@@ -2533,7 +2763,7 @@ int + epoll_pwait (int epfd, struct epoll_event *events, + int maxevents, int timeout, const sigset_t * sigmask) + { +- if (vls_use_eventfd ()) ++ if (vcm->cfg.use_mq_eventfd) + return ldp_epoll_pwait_eventfd (epfd, events, maxevents, timeout, + sigmask); + else +@@ -2543,7 +2773,7 @@ epoll_pwait (int epfd, struct epoll_event *events, + int + epoll_wait (int epfd, struct epoll_event *events, int maxevents, int timeout) + { +- if (vls_use_eventfd ()) ++ if (vcm->cfg.use_mq_eventfd) + return ldp_epoll_pwait_eventfd (epfd, events, maxevents, timeout, NULL); + else + return ldp_epoll_pwait (epfd, events, maxevents, timeout, NULL); +@@ -2554,7 +2784,7 @@ poll (struct pollfd *fds, nfds_t nfds, int timeout) { ldp_worker_ctx_t *ldpw = ldp_worker_get_current (); int rv, i, n_revents = 0; @@ -1645,7 +1757,7 @@ index c23f995d5..bbd8adff9 100644 vcl_poll_t *vp; double max_time; -@@ -2371,13 +2601,13 @@ poll (struct pollfd *fds, nfds_t nfds, int timeout) +@@ -2571,13 +2801,13 @@ poll (struct pollfd *fds, nfds_t nfds, int timeout) if (fds[i].fd < 0) continue; @@ -1664,10 +1776,10 @@ index c23f995d5..bbd8adff9 100644 if (fds[i].events & POLLRDNORM) diff --git a/src/vcl/ldp.c.orig b/src/vcl/ldp.c.orig new file mode 100644 -index 000000000..c23f995d5 +index 000000000..cda4425e5 --- /dev/null +++ b/src/vcl/ldp.c.orig -@@ -0,0 +1,2520 @@ +@@ -0,0 +1,2720 @@ +/* + * Copyright (c) 2016-2019 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); @@ -1750,6 +1862,7 @@ index 000000000..c23f995d5 + * Epoll state + */ + u8 epoll_wait_vcl; ++ u8 mq_epfd_added; + int vcl_mq_epfd; + +} ldp_worker_ctx_t; @@ -2147,22 +2260,11 @@ index 000000000..c23f995d5 + return size; +} + -+#ifdef HAVE_FCNTL64 -+int -+fcntl64 (int fd, int cmd, ...) -+#else -+int -+fcntl (int fd, int cmd, ...) -+#endif ++static int ++fcntl_internal (int fd, int cmd, va_list ap) +{ + vls_handle_t vlsh; + int rv = 0; -+ va_list ap; -+ -+ if ((errno = -ldp_init ())) -+ return -1; -+ -+ va_start (ap, cmd); + + vlsh = ldp_fd_to_vlsh (fd); + LDBG (0, "fd %u vlsh %d, cmd %u", fd, vlsh, cmd); @@ -2208,12 +2310,41 @@ index 000000000..c23f995d5 +#endif + } + ++ return rv; ++} ++ ++int ++fcntl (int fd, int cmd, ...) ++{ ++ va_list ap; ++ int rv; ++ ++ if ((errno = -ldp_init ())) ++ return -1; ++ ++ va_start (ap, cmd); ++ rv = fcntl_internal (fd, cmd, ap); + va_end (ap); + + return rv; +} + +int ++fcntl64 (int fd, int cmd, ...) ++{ ++ va_list ap; ++ int rv; ++ ++ if ((errno = -ldp_init ())) ++ return -1; ++ ++ va_start (ap, cmd); ++ rv = fcntl_internal (fd, cmd, ap); ++ va_end (ap); ++ return rv; ++} ++ ++int +ioctl (int fd, unsigned long int cmd, ...) +{ + vls_handle_t vlsh; @@ -2446,6 +2577,7 @@ index 000000000..c23f995d5 + { + errno = -rv; + rv = -1; ++ goto done; + } + else if (rv > 0) + { @@ -3186,6 +3318,69 @@ index 000000000..c23f995d5 + return size; +} + ++static int ++ldp_vls_sendo (vls_handle_t vlsh, const void *buf, size_t n, int flags, ++ __CONST_SOCKADDR_ARG addr, socklen_t addr_len) ++{ ++ vppcom_endpt_t *ep = 0; ++ vppcom_endpt_t _ep; ++ ++ if (addr) ++ { ++ ep = &_ep; ++ 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 EAFNOSUPPORT; ++ } ++ } ++ ++ return vls_sendto (vlsh, (void *) buf, n, flags, ep); ++} ++ ++static int ++ldp_vls_recvfrom (vls_handle_t vlsh, void *__restrict buf, size_t n, ++ int flags, __SOCKADDR_ARG addr, ++ socklen_t * __restrict addr_len) ++{ ++ u8 src_addr[sizeof (struct sockaddr_in6)]; ++ vppcom_endpt_t ep; ++ ssize_t size; ++ int rv; ++ ++ if (addr) ++ { ++ ep.ip = src_addr; ++ size = vls_recvfrom (vlsh, buf, n, flags, &ep); ++ ++ if (size > 0) ++ { ++ rv = ldp_copy_ep_to_sockaddr (addr, addr_len, &ep); ++ if (rv < 0) ++ size = rv; ++ } ++ } ++ else ++ size = vls_recvfrom (vlsh, buf, n, flags, NULL); ++ ++ return size; ++} ++ +ssize_t +sendto (int fd, const void *buf, size_t n, int flags, + __CONST_SOCKADDR_ARG addr, socklen_t addr_len) @@ -3199,38 +3394,7 @@ index 000000000..c23f995d5 + vlsh = ldp_fd_to_vlsh (fd); + if (vlsh != INVALID_SESSION_ID) + { -+ vppcom_endpt_t *ep = 0; -+ vppcom_endpt_t _ep; -+ -+ if (addr) -+ { -+ ep = &_ep; -+ 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: -+ errno = EAFNOSUPPORT; -+ size = -1; -+ goto done; -+ } -+ } -+ -+ size = vls_sendto (vlsh, (void *) buf, n, flags, ep); ++ size = ldp_vls_sendo (vlsh, buf, n, flags, addr, addr_len); + if (size < 0) + { + errno = -size; @@ -3242,7 +3406,6 @@ index 000000000..c23f995d5 + size = libc_sendto (fd, buf, n, flags, addr, addr_len); + } + -+done: + return size; +} + @@ -3250,33 +3413,16 @@ index 000000000..c23f995d5 +recvfrom (int fd, void *__restrict buf, size_t n, int flags, + __SOCKADDR_ARG addr, socklen_t * __restrict addr_len) +{ -+ vls_handle_t sid; -+ ssize_t size, rv; ++ vls_handle_t vlsh; ++ ssize_t size; + + if ((errno = -ldp_init ())) + return -1; + -+ sid = ldp_fd_to_vlsh (fd); -+ if (sid != VLS_INVALID_HANDLE) ++ vlsh = ldp_fd_to_vlsh (fd); ++ if (vlsh != VLS_INVALID_HANDLE) + { -+ vppcom_endpt_t ep; -+ u8 src_addr[sizeof (struct sockaddr_in6)]; -+ -+ if (addr) -+ { -+ ep.ip = src_addr; -+ size = vls_recvfrom (sid, buf, n, flags, &ep); -+ -+ if (size > 0) -+ { -+ rv = ldp_copy_ep_to_sockaddr (addr, addr_len, &ep); -+ if (rv < 0) -+ size = rv; -+ } -+ } -+ else -+ size = vls_recvfrom (sid, buf, n, flags, NULL); -+ ++ size = ldp_vls_recvfrom (vlsh, buf, n, flags, addr, addr_len); + if (size < 0) + { + errno = -size; @@ -3292,7 +3438,7 @@ index 000000000..c23f995d5 +} + +ssize_t -+sendmsg (int fd, const struct msghdr * message, int flags) ++sendmsg (int fd, const struct msghdr * msg, int flags) +{ + vls_handle_t vlsh; + ssize_t size; @@ -3303,13 +3449,35 @@ index 000000000..c23f995d5 + vlsh = ldp_fd_to_vlsh (fd); + if (vlsh != VLS_INVALID_HANDLE) + { -+ LDBG (0, "LDP-TBD"); -+ errno = ENOSYS; -+ size = -1; ++ struct iovec *iov = msg->msg_iov; ++ ssize_t total = 0; ++ int i, rv; ++ ++ for (i = 0; i < msg->msg_iovlen; ++i) ++ { ++ rv = ldp_vls_sendo (vlsh, iov[i].iov_base, iov[i].iov_len, flags, ++ msg->msg_name, msg->msg_namelen); ++ if (rv < 0) ++ break; ++ else ++ { ++ total += rv; ++ if (rv < iov[i].iov_len) ++ break; ++ } ++ } ++ ++ if (rv < 0 && total == 0) ++ { ++ errno = -rv; ++ size = -1; ++ } ++ else ++ size = total; + } + else + { -+ size = libc_sendmsg (fd, message, flags); ++ size = libc_sendmsg (fd, msg, flags); + } + + return size; @@ -3364,7 +3532,7 @@ index 000000000..c23f995d5 +#endif + +ssize_t -+recvmsg (int fd, struct msghdr * message, int flags) ++recvmsg (int fd, struct msghdr * msg, int flags) +{ + vls_handle_t vlsh; + ssize_t size; @@ -3375,13 +3543,42 @@ index 000000000..c23f995d5 + vlsh = ldp_fd_to_vlsh (fd); + if (vlsh != VLS_INVALID_HANDLE) + { -+ LDBG (0, "LDP-TBD"); -+ errno = ENOSYS; -+ size = -1; ++ struct iovec *iov = msg->msg_iov; ++ ssize_t max_deq, total = 0; ++ int i, rv; ++ ++ max_deq = vls_attr (vlsh, VPPCOM_ATTR_GET_NREAD, 0, 0); ++ if (!max_deq) ++ return 0; ++ ++ for (i = 0; i < msg->msg_iovlen; i++) ++ { ++ rv = ldp_vls_recvfrom (vlsh, iov[i].iov_base, iov[i].iov_len, flags, ++ (i == 0 ? msg->msg_name : NULL), ++ (i == 0 ? &msg->msg_namelen : NULL)); ++ if (rv <= 0) ++ break; ++ else ++ { ++ total += rv; ++ if (rv < iov[i].iov_len) ++ break; ++ } ++ if (total >= max_deq) ++ break; ++ } ++ ++ if (rv < 0 && total == 0) ++ { ++ errno = -rv; ++ size = -1; ++ } ++ else ++ size = total; + } + else + { -+ size = libc_recvmsg (fd, message, flags); ++ size = libc_recvmsg (fd, msg, flags); + } + + return size; @@ -4006,17 +4203,132 @@ index 000000000..c23f995d5 + return rv; +} + ++static inline int ++ldp_epoll_pwait_eventfd (int epfd, struct epoll_event *events, ++ int maxevents, int timeout, const sigset_t * sigmask) ++{ ++ ldp_worker_ctx_t *ldpw = ldp_worker_get_current (); ++ int libc_epfd, rv = 0, num_ev; ++ vls_handle_t ep_vlsh; ++ ++ if ((errno = -ldp_init ())) ++ return -1; ++ ++ if (PREDICT_FALSE (!events || (timeout < -1))) ++ { ++ errno = EFAULT; ++ return -1; ++ } ++ ++ if (epfd == ldpw->vcl_mq_epfd) ++ return libc_epoll_pwait (epfd, events, maxevents, timeout, sigmask); ++ ++ ep_vlsh = ldp_fd_to_vlsh (epfd); ++ if (PREDICT_FALSE (ep_vlsh == VLS_INVALID_HANDLE)) ++ { ++ LDBG (0, "epfd %d: bad ep_vlsh %d!", epfd, ep_vlsh); ++ errno = EBADFD; ++ return -1; ++ } ++ ++ libc_epfd = vls_attr (ep_vlsh, VPPCOM_ATTR_GET_LIBC_EPFD, 0, 0); ++ if (PREDICT_FALSE (!libc_epfd)) ++ { ++ u32 size = sizeof (epfd); ++ ++ LDBG (1, "epfd %d, vep_vlsh %d calling libc_epoll_create1: " ++ "EPOLL_CLOEXEC", epfd, ep_vlsh); ++ libc_epfd = libc_epoll_create1 (EPOLL_CLOEXEC); ++ if (libc_epfd < 0) ++ { ++ rv = libc_epfd; ++ goto done; ++ } ++ ++ rv = vls_attr (ep_vlsh, VPPCOM_ATTR_SET_LIBC_EPFD, &libc_epfd, &size); ++ if (rv < 0) ++ { ++ errno = -rv; ++ rv = -1; ++ goto done; ++ } ++ } ++ if (PREDICT_FALSE (libc_epfd <= 0)) ++ { ++ errno = -libc_epfd; ++ rv = -1; ++ goto done; ++ } ++ ++ if (PREDICT_FALSE (!ldpw->mq_epfd_added)) ++ { ++ struct epoll_event e = { 0 }; ++ e.events = EPOLLIN; ++ e.data.fd = ldpw->vcl_mq_epfd; ++ if (libc_epoll_ctl (libc_epfd, EPOLL_CTL_ADD, ldpw->vcl_mq_epfd, &e) < ++ 0) ++ { ++ LDBG (0, "epfd %d, add libc mq epoll fd %d to libc epoll fd %d", ++ epfd, ldpw->vcl_mq_epfd, libc_epfd); ++ rv = -1; ++ goto done; ++ } ++ ldpw->mq_epfd_added = 1; ++ } ++ ++ rv = vls_epoll_wait (ep_vlsh, events, maxevents, 0); ++ if (rv > 0) ++ goto done; ++ else if (rv < 0) ++ { ++ errno = -rv; ++ rv = -1; ++ goto done; ++ } ++ ++ rv = libc_epoll_pwait (libc_epfd, events, maxevents, timeout, sigmask); ++ if (rv <= 0) ++ goto done; ++ for (int i = 0; i < rv; i++) ++ { ++ if (events[i].data.fd == ldpw->vcl_mq_epfd) ++ { ++ /* We should remove mq epoll fd from events. */ ++ rv--; ++ if (i != rv) ++ { ++ events[i].events = events[rv].events; ++ events[i].data.u64 = events[rv].data.u64; ++ } ++ num_ev = vls_epoll_wait (ep_vlsh, &events[rv], maxevents - rv, 0); ++ if (PREDICT_TRUE (num_ev > 0)) ++ rv += num_ev; ++ break; ++ } ++ } ++ ++done: ++ return rv; ++} ++ +int +epoll_pwait (int epfd, struct epoll_event *events, + int maxevents, int timeout, const sigset_t * sigmask) +{ -+ return ldp_epoll_pwait (epfd, events, maxevents, timeout, sigmask); ++ if (vls_use_eventfd ()) ++ return ldp_epoll_pwait_eventfd (epfd, events, maxevents, timeout, ++ sigmask); ++ else ++ return ldp_epoll_pwait (epfd, events, maxevents, timeout, sigmask); +} + +int +epoll_wait (int epfd, struct epoll_event *events, int maxevents, int timeout) +{ -+ return ldp_epoll_pwait (epfd, events, maxevents, timeout, NULL); ++ if (vls_use_eventfd ()) ++ return ldp_epoll_pwait_eventfd (epfd, events, maxevents, timeout, NULL); ++ else ++ return ldp_epoll_pwait (epfd, events, maxevents, timeout, NULL); +} + +int @@ -4188,6 +4500,99 @@ index 000000000..c23f995d5 + * eval: (c-set-style "gnu") + * End: + */ +diff --git a/src/vcl/ldp.c.rej b/src/vcl/ldp.c.rej +new file mode 100644 +index 000000000..0ce81dba2 +--- /dev/null ++++ b/src/vcl/ldp.c.rej +@@ -0,0 +1,87 @@ ++--- src/vcl/ldp.c +++++ src/vcl/ldp.c ++@@ -687,9 +880,9 @@ fcntl (int fd, int cmd, ...) ++ ++ va_start (ap, cmd); ++ ++- vlsh = ldp_fd_to_vlsh (fd); ++- LDBG (0, "fd %u vlsh %d, cmd %u", fd, vlsh, cmd); ++- if (vlsh != VLS_INVALID_HANDLE) +++ vclsh = ldp_fd_to_vclsh (fd); +++ LDBG (0, "fd %u vclsh %d, cmd %u", fd, vclsh, cmd); +++ if (vclsh != INVALID_SESSION_ID) ++ { ++ int flags = va_arg (ap, int); ++ u32 size; ++@@ -1766,7 +1972,7 @@ sendto (int fd, const void *buf, size_t n, int flags, ++ } ++ } ++ ++- size = vls_sendto (vlsh, (void *) buf, n, flags, ep); +++ size = vppcom_session_sendto (vclsh, (void *) buf, n, flags, ep); ++ if (size < 0) ++ { ++ errno = -size; ++@@ -1786,14 +1992,14 @@ ssize_t ++ recvfrom (int fd, void *__restrict buf, size_t n, int flags, ++ __SOCKADDR_ARG addr, socklen_t * __restrict addr_len) ++ { ++- vls_handle_t sid; +++ vcl_session_handle_t sid; ++ ssize_t size, rv; ++ ++ if ((errno = -ldp_init ())) ++ return -1; ++ ++- sid = ldp_fd_to_vlsh (fd); ++- if (sid != VLS_INVALID_HANDLE) +++ sid = ldp_fd_to_vclsh (fd); +++ if (sid != INVALID_SESSION_ID) ++ { ++ vppcom_endpt_t ep; ++ u8 src_addr[sizeof (struct sockaddr_in6)]; ++@@ -1801,7 +2007,7 @@ recvfrom (int fd, void *__restrict buf, size_t n, int flags, ++ if (addr) ++ { ++ ep.ip = src_addr; ++- size = vls_recvfrom (sid, buf, n, flags, &ep); +++ size = vppcom_session_recvfrom (sid, buf, n, flags, &ep); ++ ++ if (size > 0) ++ { ++@@ -1811,7 +2017,7 @@ recvfrom (int fd, void *__restrict buf, size_t n, int flags, ++ } ++ } ++ else ++- size = vls_recvfrom (sid, buf, n, flags, NULL); +++ size = vppcom_session_recvfrom (sid, buf, n, flags, NULL); ++ ++ if (size < 0) ++ { ++@@ -1902,14 +2108,14 @@ sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags) ++ ssize_t ++ recvmsg (int fd, struct msghdr * message, int flags) ++ { ++- vls_handle_t vlsh; +++ vcl_session_handle_t vclsh; ++ ssize_t size; ++ ++ if ((errno = -ldp_init ())) ++ return -1; ++ ++- vlsh = ldp_fd_to_vlsh (fd); ++- if (vlsh != VLS_INVALID_HANDLE) +++ vclsh = ldp_fd_to_vclsh (fd); +++ if (vclsh != INVALID_SESSION_ID) ++ { ++ LDBG (0, "LDP-TBD"); ++ errno = ENOSYS; ++@@ -1930,7 +2136,7 @@ recvmmsg (int fd, struct mmsghdr *vmessages, ++ { ++ ssize_t size; ++ const char *func_str; ++- u32 sh = ldp_fd_to_vlsh (fd); +++ u32 sh = ldp_fd_to_vclsh (fd); ++ ++ if ((errno = -ldp_init ())) ++ return -1; diff --git a/src/vcl/ldp.h b/src/vcl/ldp.h index 8d78ead08..0a03f442d 100644 --- a/src/vcl/ldp.h @@ -4202,7 +4607,7 @@ index 8d78ead08..0a03f442d 100644 #define LDP_APP_NAME_MAX 256 diff --git a/src/vcl/vcl_private.h b/src/vcl/vcl_private.h -index c4ec02e83..c90b982bb 100644 +index 593e63f3b..818c03f9a 100644 --- a/src/vcl/vcl_private.h +++ b/src/vcl/vcl_private.h @@ -244,7 +244,12 @@ typedef struct vcl_worker_ -- cgit 1.2.3-korg