session: cleanup use of api_client_index
[vpp.git] / src / vcl / ldp.c
index b7b6b3c..beaa988 100644 (file)
@@ -65,6 +65,8 @@ typedef struct
   clib_bitmap_t *libc_wr_bitmap;
   clib_bitmap_t *libc_ex_bitmap;
   vcl_poll_t *vcl_poll;
+  struct pollfd *libc_poll;
+  u16 *libc_poll_idxs;
   u8 select_vcl;
   u8 epoll_wait_vcl;
   u8 vcl_needs_real_epoll;     /*< vcl needs next epoll_create to
@@ -245,10 +247,8 @@ close (int fd)
        {
          func_str = "libc_close";
 
-         if (LDP_DEBUG > 0)
-           clib_warning
-             ("LDP<%d>: fd %d (0x%x): calling %s(): epfd %u (0x%x)",
-              getpid (), fd, fd, func_str, epfd, epfd);
+         LDBG (0, "LDP<%d>: fd %d (0x%x): calling %s(): epfd %u (0x%x)",
+               getpid (), fd, fd, func_str, epfd, epfd);
 
          rv = libc_close (epfd);
          if (rv < 0)
@@ -269,9 +269,8 @@ close (int fd)
 
       func_str = "vppcom_session_close";
 
-      if (LDP_DEBUG > 0)
-       clib_warning ("LDP<%d>: fd %d (0x%x): calling %s(): sid %u (0x%x)",
-                     getpid (), fd, fd, func_str, sid, sid);
+      LDBG (0, "LDP<%d>: fd %d (0x%x): calling %s(): sid %u (0x%x)",
+           getpid (), fd, fd, func_str, sid, sid);
 
       rv = vppcom_session_close (sid);
       if (rv != VPPCOM_OK)
@@ -284,9 +283,8 @@ close (int fd)
     {
       func_str = "libc_close";
 
-      if (LDP_DEBUG > 0)
-       clib_warning ("LDP<%d>: fd %d (0x%x): calling %s()",
-                     getpid (), fd, fd, func_str);
+      LDBG (0, "LDP<%d>: fd %d (0x%x): calling %s()", getpid (), fd, fd,
+           func_str);
 
       rv = libc_close (fd);
     }
@@ -614,36 +612,35 @@ fcntl (int fd, int cmd, ...)
        {
        case F_SETFL:
          func_str = "vppcom_session_attr[SET_FLAGS]";
-         if (LDP_DEBUG > 2)
-           clib_warning ("LDP<%d>: fd %d (0x%x): calling %s(): "
-                         "sid %u (0x%x) flags %d (0x%x), size %d",
-                         getpid (), fd, fd, func_str, sid, sid,
-                         flags, flags, size);
+         LDBG (2, "LDP<%d>: fd %d (0x%x): calling %s(): sid %u (0x%x) "
+               "flags %d (0x%x), size %d", getpid (), fd, fd, func_str, sid,
+               sid, flags, flags, size);
 
-         rv =
-           vppcom_session_attr (sid, VPPCOM_ATTR_SET_FLAGS, &flags, &size);
+         rv = vppcom_session_attr (sid, VPPCOM_ATTR_SET_FLAGS, &flags,
+                                   &size);
          break;
 
        case F_GETFL:
          func_str = "vppcom_session_attr[GET_FLAGS]";
-         if (LDP_DEBUG > 2)
-           clib_warning
-             ("LDP<%d>: fd %d (0x%x): calling %s(): sid %u (0x%x), "
-              "flags %d (0x%x), size %d", getpid (), fd, fd, func_str, sid,
-              sid, flags, flags, size);
+         LDBG (2, "LDP<%d>: fd %d (0x%x): calling %s(): sid %u (0x%x), "
+               "flags %d (0x%x), size %d", getpid (), fd, fd, func_str, sid,
+               sid, flags, flags, size);
 
-         rv =
-           vppcom_session_attr (sid, VPPCOM_ATTR_GET_FLAGS, &flags, &size);
+         rv = vppcom_session_attr (sid, VPPCOM_ATTR_GET_FLAGS, &flags,
+                                   &size);
          if (rv == VPPCOM_OK)
            {
-             if (LDP_DEBUG > 2)
-               clib_warning ("LDP<%d>: fd %d (0x%x), cmd %d (F_GETFL): "
-                             "%s() returned flags %d (0x%x)",
-                             getpid (), fd, fd, cmd, func_str, flags, flags);
+             LDBG (2, "LDP<%d>: fd %d (0x%x), cmd %d (F_GETFL): %s() "
+                   "returned flags %d (0x%x)", getpid (), fd, fd, cmd,
+                   func_str, flags, flags);
              rv = flags;
            }
          break;
-
+       case F_SETFD:
+         /* TODO handle this */
+         LDBG (0, "F_SETFD ignored flags %u", flags);
+         rv = 0;
+         break;
        default:
          rv = -EOPNOTSUPP;
          break;
@@ -802,9 +799,8 @@ ldp_pselect (int nfds, fd_set * __restrict readfds,
       /* select as fine grained sleep */
       if (!nfds)
        {
-         if (LDP_DEBUG > 3)
-           clib_warning ("LDP<%d>: sleeping for %.02f seconds",
-                         getpid (), time_out);
+         LDBG (3, "LDP<%d>: sleeping for %.02f seconds", getpid (),
+               time_out);
 
          time_out += clib_time_now (&ldp->clib_time);
          while (clib_time_now (&ldp->clib_time) < time_out)
@@ -825,11 +821,9 @@ ldp_pselect (int nfds, fd_set * __restrict readfds,
     {
       func_str = "libc_pselect";
 
-      if (LDP_DEBUG > 3)
-       clib_warning
-         ("LDP<%d>: calling %s(): nfds %d, readfds %p, writefds %p, "
-          "exceptfds %p, timeout %p, sigmask %p", getpid (), func_str, nfds,
-          readfds, writefds, exceptfds, timeout, sigmask);
+      LDBG (3, "LDP<%d>: calling %s(): nfds %d, readfds %p, writefds %p, "
+           "exceptfds %p, timeout %p, sigmask %p", getpid (), func_str, nfds,
+           readfds, writefds, exceptfds, timeout, sigmask);
 
       rv = libc_pselect (nfds, readfds, writefds, exceptfds,
                         timeout, sigmask);
@@ -847,27 +841,27 @@ ldp_pselect (int nfds, fd_set * __restrict readfds,
     }
 
   sid_bits = libc_bits = 0;
+  u32 n_bytes = nfds / 8 + ((nfds % 8) ? 1 : 0);
   if (readfds)
     {
       clib_bitmap_validate (ldp->sid_rd_bitmap, minbits);
       clib_bitmap_validate (ldp->libc_rd_bitmap, minbits);
       clib_bitmap_validate (ldp->rd_bitmap, minbits);
-      clib_memcpy (ldp->rd_bitmap, readfds,
-                  vec_len (ldp->rd_bitmap) * sizeof (clib_bitmap_t));
-      FD_ZERO (readfds);
+      clib_memcpy_fast (ldp->rd_bitmap, readfds, n_bytes);
+      memset (readfds, 0, n_bytes);
 
       /* *INDENT-OFF* */
-      clib_bitmap_foreach (fd, ldp->rd_bitmap,
-        ({
-          sid = ldp_sid_from_fd (fd);
-          if (LDP_DEBUG > 3)
-            clib_warning ("LDP<%d>: readfds: fd %d (0x%x), sid %u (0x%x)",
-                          getpid (), fd, fd, sid, sid);
-          if (sid == INVALID_SESSION_ID)
-            clib_bitmap_set_no_check (ldp->libc_rd_bitmap, fd, 1);
-          else
-            clib_bitmap_set_no_check (ldp->sid_rd_bitmap, sid, 1);
-        }));
+      clib_bitmap_foreach (fd, ldp->rd_bitmap, ({
+       if (fd > nfds)
+         break;
+        sid = ldp_sid_from_fd (fd);
+        LDBG (3, "LDP<%d>: readfds: fd %d (0x%x), sid %u (0x%x)",
+              getpid (), fd, fd, sid, sid);
+        if (sid == INVALID_SESSION_ID)
+          clib_bitmap_set_no_check (ldp->libc_rd_bitmap, fd, 1);
+        else
+          clib_bitmap_set_no_check (ldp->sid_rd_bitmap, sid, 1);
+      }));
       /* *INDENT-ON* */
 
       sid_bits_set = clib_bitmap_last_set (ldp->sid_rd_bitmap) + 1;
@@ -876,32 +870,30 @@ ldp_pselect (int nfds, fd_set * __restrict readfds,
       libc_bits_set = clib_bitmap_last_set (ldp->libc_rd_bitmap) + 1;
       libc_bits = (libc_bits_set > libc_bits) ? libc_bits_set : libc_bits;
 
-      if (LDP_DEBUG > 3)
-       clib_warning ("LDP<%d>: readfds: sid_bits_set %d, sid_bits %d, "
-                     "libc_bits_set %d, libc_bits %d", getpid (),
-                     sid_bits_set, sid_bits, libc_bits_set, libc_bits);
+      LDBG (3, "LDP<%d>: readfds: sid_bits_set %d, sid_bits %d, "
+           "libc_bits_set %d, libc_bits %d", getpid (), sid_bits_set,
+           sid_bits, libc_bits_set, libc_bits);
     }
   if (writefds)
     {
       clib_bitmap_validate (ldp->sid_wr_bitmap, minbits);
       clib_bitmap_validate (ldp->libc_wr_bitmap, minbits);
       clib_bitmap_validate (ldp->wr_bitmap, minbits);
-      clib_memcpy (ldp->wr_bitmap, writefds,
-                  vec_len (ldp->wr_bitmap) * sizeof (clib_bitmap_t));
-      FD_ZERO (writefds);
+      clib_memcpy_fast (ldp->wr_bitmap, writefds, n_bytes);
+      memset (writefds, 0, n_bytes);
 
       /* *INDENT-OFF* */
-      clib_bitmap_foreach (fd, ldp->wr_bitmap,
-        ({
-          sid = ldp_sid_from_fd (fd);
-          if (LDP_DEBUG > 3)
-            clib_warning ("LDP<%d>: writefds: fd %d (0x%x), sid %u (0x%x)",
-                          getpid (), fd, fd, sid, sid);
-          if (sid == INVALID_SESSION_ID)
-            clib_bitmap_set_no_check (ldp->libc_wr_bitmap, fd, 1);
-          else
-            clib_bitmap_set_no_check (ldp->sid_wr_bitmap, sid, 1);
-        }));
+      clib_bitmap_foreach (fd, ldp->wr_bitmap, ({
+       if (fd > nfds)
+         break;
+        sid = ldp_sid_from_fd (fd);
+        LDBG (3, "LDP<%d>: writefds: fd %d (0x%x), sid %u (0x%x)",
+                        getpid (), fd, fd, sid, sid);
+        if (sid == INVALID_SESSION_ID)
+          clib_bitmap_set_no_check (ldp->libc_wr_bitmap, fd, 1);
+        else
+          clib_bitmap_set_no_check (ldp->sid_wr_bitmap, sid, 1);
+      }));
       /* *INDENT-ON* */
 
       sid_bits_set = clib_bitmap_last_set (ldp->sid_wr_bitmap) + 1;
@@ -910,32 +902,30 @@ ldp_pselect (int nfds, fd_set * __restrict readfds,
       libc_bits_set = clib_bitmap_last_set (ldp->libc_wr_bitmap) + 1;
       libc_bits = (libc_bits_set > libc_bits) ? libc_bits_set : libc_bits;
 
-      if (LDP_DEBUG > 3)
-       clib_warning ("LDP<%d>: writefds: sid_bits_set %d, sid_bits %d, "
-                     "libc_bits_set %d, libc_bits %d", getpid (),
-                     sid_bits_set, sid_bits, libc_bits_set, libc_bits);
+      LDBG (3, "LDP<%d>: writefds: sid_bits_set %d, sid_bits %d, "
+           "libc_bits_set %d, libc_bits %d", getpid (),
+           sid_bits_set, sid_bits, libc_bits_set, libc_bits);
     }
   if (exceptfds)
     {
       clib_bitmap_validate (ldp->sid_ex_bitmap, minbits);
       clib_bitmap_validate (ldp->libc_ex_bitmap, minbits);
       clib_bitmap_validate (ldp->ex_bitmap, minbits);
-      clib_memcpy (ldp->ex_bitmap, exceptfds,
-                  vec_len (ldp->ex_bitmap) * sizeof (clib_bitmap_t));
-      FD_ZERO (exceptfds);
+      clib_memcpy_fast (ldp->ex_bitmap, exceptfds, n_bytes);
+      memset (exceptfds, 0, n_bytes);
 
       /* *INDENT-OFF* */
-      clib_bitmap_foreach (fd, ldp->ex_bitmap,
-        ({
-          sid = ldp_sid_from_fd (fd);
-          if (LDP_DEBUG > 3)
-            clib_warning ("LDP<%d>: exceptfds: fd %d (0x%x), sid %u (0x%x)",
-                          getpid (), fd, fd, sid, sid);
-          if (sid == INVALID_SESSION_ID)
-            clib_bitmap_set_no_check (ldp->libc_ex_bitmap, fd, 1);
-          else
-            clib_bitmap_set_no_check (ldp->sid_ex_bitmap, sid, 1);
-        }));
+      clib_bitmap_foreach (fd, ldp->ex_bitmap, ({
+       if (fd > nfds)
+         break;
+        sid = ldp_sid_from_fd (fd);
+        LDBG (3, "LDP<%d>: exceptfds: fd %d (0x%x), sid %u (0x%x)",
+                        getpid (), fd, fd, sid, sid);
+        if (sid == INVALID_SESSION_ID)
+          clib_bitmap_set_no_check (ldp->libc_ex_bitmap, fd, 1);
+        else
+          clib_bitmap_set_no_check (ldp->sid_ex_bitmap, sid, 1);
+      }));
       /* *INDENT-ON* */
 
       sid_bits_set = clib_bitmap_last_set (ldp->sid_ex_bitmap) + 1;
@@ -944,10 +934,9 @@ ldp_pselect (int nfds, fd_set * __restrict readfds,
       libc_bits_set = clib_bitmap_last_set (ldp->libc_ex_bitmap) + 1;
       libc_bits = (libc_bits_set > libc_bits) ? libc_bits_set : libc_bits;
 
-      if (LDP_DEBUG > 3)
-       clib_warning ("LDP<%d>: exceptfds: sid_bits_set %d, sid_bits %d, "
-                     "libc_bits_set %d, libc_bits %d", getpid (),
-                     sid_bits_set, sid_bits, libc_bits_set, libc_bits);
+      LDBG (3, "LDP<%d>: exceptfds: sid_bits_set %d, sid_bits %d, "
+           "libc_bits_set %d, libc_bits %d", getpid (),
+           sid_bits_set, sid_bits, libc_bits_set, libc_bits);
     }
 
   if (PREDICT_FALSE (!sid_bits && !libc_bits))
@@ -966,17 +955,17 @@ ldp_pselect (int nfds, fd_set * __restrict readfds,
              func_str = "vppcom_select";
 
              if (readfds)
-               clib_memcpy (ldp->rd_bitmap, ldp->sid_rd_bitmap,
-                            vec_len (ldp->rd_bitmap) *
-                            sizeof (clib_bitmap_t));
+               clib_memcpy_fast (ldp->rd_bitmap, ldp->sid_rd_bitmap,
+                                 vec_len (ldp->rd_bitmap) *
+                                 sizeof (clib_bitmap_t));
              if (writefds)
-               clib_memcpy (ldp->wr_bitmap, ldp->sid_wr_bitmap,
-                            vec_len (ldp->wr_bitmap) *
-                            sizeof (clib_bitmap_t));
+               clib_memcpy_fast (ldp->wr_bitmap, ldp->sid_wr_bitmap,
+                                 vec_len (ldp->wr_bitmap) *
+                                 sizeof (clib_bitmap_t));
              if (exceptfds)
-               clib_memcpy (ldp->ex_bitmap, ldp->sid_ex_bitmap,
-                            vec_len (ldp->ex_bitmap) *
-                            sizeof (clib_bitmap_t));
+               clib_memcpy_fast (ldp->ex_bitmap, ldp->sid_ex_bitmap,
+                                 vec_len (ldp->ex_bitmap) *
+                                 sizeof (clib_bitmap_t));
 
              rv = vppcom_select (sid_bits,
                                  readfds ? ldp->rd_bitmap : NULL,
@@ -1051,14 +1040,17 @@ ldp_pselect (int nfds, fd_set * __restrict readfds,
          func_str = "libc_pselect";
 
          if (readfds)
-           clib_memcpy (readfds, ldp->libc_rd_bitmap,
-                        vec_len (ldp->rd_bitmap) * sizeof (clib_bitmap_t));
+           clib_memcpy_fast (readfds, ldp->libc_rd_bitmap,
+                             vec_len (ldp->rd_bitmap) *
+                             sizeof (clib_bitmap_t));
          if (writefds)
-           clib_memcpy (writefds, ldp->libc_wr_bitmap,
-                        vec_len (ldp->wr_bitmap) * sizeof (clib_bitmap_t));
+           clib_memcpy_fast (writefds, ldp->libc_wr_bitmap,
+                             vec_len (ldp->wr_bitmap) *
+                             sizeof (clib_bitmap_t));
          if (exceptfds)
-           clib_memcpy (exceptfds, ldp->libc_ex_bitmap,
-                        vec_len (ldp->ex_bitmap) * sizeof (clib_bitmap_t));
+           clib_memcpy_fast (exceptfds, ldp->libc_ex_bitmap,
+                             vec_len (ldp->ex_bitmap) *
+                             sizeof (clib_bitmap_t));
          tspec.tv_sec = tspec.tv_nsec = 0;
          rv = libc_pselect (libc_bits,
                             readfds ? readfds : NULL,
@@ -1073,15 +1065,15 @@ ldp_pselect (int nfds, fd_set * __restrict readfds,
 
 done:
   /* TBD: set timeout to amount of time left */
-  vec_reset_length (ldp->rd_bitmap);
-  vec_reset_length (ldp->sid_rd_bitmap);
-  vec_reset_length (ldp->libc_rd_bitmap);
-  vec_reset_length (ldp->wr_bitmap);
-  vec_reset_length (ldp->sid_wr_bitmap);
-  vec_reset_length (ldp->libc_wr_bitmap);
-  vec_reset_length (ldp->ex_bitmap);
-  vec_reset_length (ldp->sid_ex_bitmap);
-  vec_reset_length (ldp->libc_ex_bitmap);
+  clib_bitmap_zero (ldp->rd_bitmap);
+  clib_bitmap_zero (ldp->sid_rd_bitmap);
+  clib_bitmap_zero (ldp->libc_rd_bitmap);
+  clib_bitmap_zero (ldp->wr_bitmap);
+  clib_bitmap_zero (ldp->sid_wr_bitmap);
+  clib_bitmap_zero (ldp->libc_wr_bitmap);
+  clib_bitmap_zero (ldp->ex_bitmap);
+  clib_bitmap_zero (ldp->sid_ex_bitmap);
+  clib_bitmap_zero (ldp->libc_ex_bitmap);
 
   if (LDP_DEBUG > 3)
     {
@@ -1226,10 +1218,9 @@ socketpair (int domain, int type, int protocol, int fds[2])
     {
       func_str = "libc_socket";
 
-      if (LDP_DEBUG > 1)
-       clib_warning ("LDP<%d>: : calling %s()", getpid (), func_str);
+      LDBG (1, "LDP<%d>: : calling %s()", getpid (), func_str);
 
-      rv = libc_socket (domain, type, protocol);
+      rv = libc_socketpair (domain, type, protocol, fds);
     }
 
   if (LDP_DEBUG > 1)
@@ -2913,11 +2904,8 @@ shutdown (int fd, int how)
 
   if (sid != INVALID_SESSION_ID)
     {
-      func_str = __func__;
-
-      clib_warning ("LDP<%d>: LDP-TBD", getpid ());
-      errno = ENOSYS;
-      rv = -1;
+      func_str = "vppcom_session_close[TODO]";
+      rv = close (fd);
     }
   else
     {
@@ -3253,65 +3241,61 @@ int
 poll (struct pollfd *fds, nfds_t nfds, int timeout)
 {
   const char *func_str = __func__;
-  int rv, i, n_libc_fds, n_revents;
+  int rv, i, n_revents = 0;
   u32 sid;
   vcl_poll_t *vp;
   double wait_for_time;
 
-  if (LDP_DEBUG > 3)
-    clib_warning ("LDP<%d>: fds %p, nfds %d, timeout %d",
-                 getpid (), fds, nfds, timeout);
+  LDBG (3, "LDP<%d>: fds %p, nfds %d, timeout %d", getpid (), fds, nfds,
+       timeout);
 
   if (timeout >= 0)
     wait_for_time = (f64) timeout / 1000;
   else
     wait_for_time = -1;
 
-  n_libc_fds = 0;
   for (i = 0; i < nfds; i++)
     {
-      if (fds[i].fd >= 0)
-       {
-         if (LDP_DEBUG > 3)
-           clib_warning ("LDP<%d>: fds[%d].fd %d (0x%0x), .events = 0x%x, "
-                         ".revents = 0x%x", getpid (), i, fds[i].fd,
-                         fds[i].fd, fds[i].events, fds[i].revents);
+      if (fds[i].fd < 0)
+       continue;
 
-         sid = ldp_sid_from_fd (fds[i].fd);
-         if (sid != INVALID_SESSION_ID)
-           {
-             fds[i].fd = -fds[i].fd;
-             vec_add2 (ldp->vcl_poll, vp, 1);
-             vp->fds_ndx = i;
-             vp->sid = sid;
-             vp->events = fds[i].events;
+      LDBG (3, "LDP<%d>: fds[%d] fd %d (0x%0x) events = 0x%x revents = 0x%x",
+           getpid (), i, fds[i].fd, fds[i].fd, fds[i].events,
+           fds[i].revents);
+
+      sid = ldp_sid_from_fd (fds[i].fd);
+      if (sid != INVALID_SESSION_ID)
+       {
+         fds[i].fd = -fds[i].fd;
+         vec_add2 (ldp->vcl_poll, vp, 1);
+         vp->fds_ndx = i;
+         vp->sid = sid;
+         vp->events = fds[i].events;
 #ifdef __USE_XOPEN2K
-             if (fds[i].events & POLLRDNORM)
-               vp->events |= POLLIN;
-             if (fds[i].events & POLLWRNORM)
-               vp->events |= POLLOUT;
+         if (fds[i].events & POLLRDNORM)
+           vp->events |= POLLIN;
+         if (fds[i].events & POLLWRNORM)
+           vp->events |= POLLOUT;
 #endif
-             vp->revents = &fds[i].revents;
-           }
-         else
-           n_libc_fds++;
+         vp->revents = fds[i].revents;
+       }
+      else
+       {
+         vec_add1 (ldp->libc_poll, fds[i]);
+         vec_add1 (ldp->libc_poll_idxs, i);
        }
     }
 
-  n_revents = 0;
   do
     {
       if (vec_len (ldp->vcl_poll))
        {
          func_str = "vppcom_poll";
 
-         if (LDP_DEBUG > 3)
-           clib_warning ("LDP<%d>: calling %s(): "
-                         "vcl_poll %p, n_sids %u (0x%x): "
-                         "n_libc_fds %u",
-                         getpid (), func_str, ldp->vcl_poll,
-                         vec_len (ldp->vcl_poll), vec_len (ldp->vcl_poll),
-                         n_libc_fds);
+         LDBG (3, "LDP<%d>: calling %s(): vcl_poll %p, n_sids %u (0x%x): "
+               "n_libc_fds %u", getpid (), func_str, ldp->vcl_poll,
+               vec_len (ldp->vcl_poll), vec_len (ldp->vcl_poll),
+               vec_len (ldp->libc_poll));
 
          rv = vppcom_poll (ldp->vcl_poll, vec_len (ldp->vcl_poll), 0);
          if (rv < 0)
@@ -3324,15 +3308,14 @@ poll (struct pollfd *fds, nfds_t nfds, int timeout)
            n_revents += rv;
        }
 
-      if (n_libc_fds)
+      if (vec_len (ldp->libc_poll))
        {
          func_str = "libc_poll";
 
-         if (LDP_DEBUG > 3)
-           clib_warning ("LDP<%d>: calling %s(): fds %p, nfds %u: n_sids %u",
-                         getpid (), fds, nfds, vec_len (ldp->vcl_poll));
+         LDBG (3, "LDP<%d>: calling %s(): fds %p, nfds %u: n_sids %u",
+               getpid (), fds, nfds, vec_len (ldp->vcl_poll));
 
-         rv = libc_poll (fds, nfds, 0);
+         rv = libc_poll (ldp->libc_poll, vec_len (ldp->libc_poll), 0);
          if (rv < 0)
            goto done;
          else
@@ -3353,6 +3336,7 @@ done:
   vec_foreach (vp, ldp->vcl_poll)
   {
     fds[vp->fds_ndx].fd = -fds[vp->fds_ndx].fd;
+    fds[vp->fds_ndx].revents = vp->revents;
 #ifdef __USE_XOPEN2K
     if ((fds[vp->fds_ndx].revents & POLLIN) &&
        (fds[vp->fds_ndx].events & POLLRDNORM))
@@ -3364,6 +3348,13 @@ done:
   }
   vec_reset_length (ldp->vcl_poll);
 
+  for (i = 0; i < vec_len (ldp->libc_poll); i++)
+    {
+      fds[ldp->libc_poll_idxs[i]].revents = ldp->libc_poll[i].revents;
+    }
+  vec_reset_length (ldp->libc_poll_idxs);
+  vec_reset_length (ldp->libc_poll);
+
   if (LDP_DEBUG > 3)
     {
       if (rv < 0)
@@ -3379,7 +3370,7 @@ done:
        {
          clib_warning ("LDP<%d>: returning %d (0x%x): n_sids %u, "
                        "n_libc_fds %d", getpid (), rv, rv,
-                       vec_len (ldp->vcl_poll), n_libc_fds);
+                       vec_len (ldp->vcl_poll), vec_len (ldp->libc_poll));
 
          for (i = 0; i < nfds; i++)
            {