vcl: ldp placeholder for SO_LINGER
[vpp.git] / src / vcl / ldp.c
index a10d4d0..4d62a73 100644 (file)
@@ -2067,6 +2067,9 @@ setsockopt (int fd, int level, int optname,
              rv = vls_attr (vlsh, VPPCOM_ATTR_SET_BROADCAST,
                             (void *) optval, &optlen);
              break;
+           case SO_LINGER:
+             rv = 0;
+             break;
            default:
              LDBG (0, "ERROR: fd %d: setsockopt SOL_SOCKET: vlsh %u "
                    "optname %d unsupported!", fd, vlsh, optname);
@@ -2219,6 +2222,8 @@ shutdown (int fd, int how)
 
       if (flags == SHUT_RDWR)
        rv = close (fd);
+      else if (flags == SHUT_WR)
+       rv = vls_shutdown (vlsh);
     }
   else
     {
@@ -2516,7 +2521,8 @@ ldp_epoll_pwait_eventfd (int epfd, struct epoll_event *events,
       ldpw->mq_epfd_added = 1;
     }
 
-  rv = vls_epoll_wait (ep_vlsh, events, maxevents, 0);
+  /* Request to only drain unhandled to prevent libc_epoll_wait starved */
+  rv = vls_epoll_wait (ep_vlsh, events, maxevents, -2);
   if (rv > 0)
     goto done;
   else if (PREDICT_FALSE (rv < 0))