vcl: ldp placeholder for SO_LINGER
[vpp.git] / src / vcl / ldp.c
index b72c0c5..4d62a73 100644 (file)
@@ -1952,9 +1952,15 @@ getsockopt (int fd, int level, int optname,
            case SO_REUSEADDR:
              rv = vls_attr (vlsh, VPPCOM_ATTR_GET_REUSEADDR, optval, optlen);
              break;
+           case SO_REUSEPORT:
+             rv = vls_attr (vlsh, VPPCOM_ATTR_GET_REUSEPORT, optval, optlen);
+             break;
            case SO_BROADCAST:
              rv = vls_attr (vlsh, VPPCOM_ATTR_GET_BROADCAST, optval, optlen);
              break;
+           case SO_DOMAIN:
+             rv = vls_attr (vlsh, VPPCOM_ATTR_GET_DOMAIN, optval, optlen);
+             break;
            case SO_ERROR:
              rv = vls_attr (vlsh, VPPCOM_ATTR_GET_ERROR, optval, optlen);
              break;
@@ -2053,10 +2059,17 @@ setsockopt (int fd, int level, int optname,
              rv = vls_attr (vlsh, VPPCOM_ATTR_SET_REUSEADDR,
                             (void *) optval, &optlen);
              break;
+           case SO_REUSEPORT:
+             rv = vls_attr (vlsh, VPPCOM_ATTR_SET_REUSEPORT, (void *) optval,
+                            &optlen);
+             break;
            case SO_BROADCAST:
              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);
@@ -2209,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
     {
@@ -2506,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))