aboutsummaryrefslogtreecommitdiffstats
path: root/vpp_patches/ldp/master/0001-LDP-remove-lock.patch
diff options
context:
space:
mode:
Diffstat (limited to 'vpp_patches/ldp/master/0001-LDP-remove-lock.patch')
-rw-r--r--vpp_patches/ldp/master/0001-LDP-remove-lock.patch855
1 files changed, 630 insertions, 225 deletions
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 <vppinfra/time.h>
#include <vppinfra/bitmap.h>
#include <vppinfra/lock.h>
-@@ -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_