bonding: support custom interface IDs
[vpp.git] / src / vppinfra / socket.c
index 87a9333..bcee3de 100644 (file)
@@ -73,7 +73,7 @@ find_free_port (word sock)
     {
       struct sockaddr_in a;
 
-      memset (&a, 0, sizeof (a));      /* Warnings be gone */
+      clib_memset (&a, 0, sizeof (a)); /* Warnings be gone */
 
       a.sin_family = PF_INET;
       a.sin_addr.s_addr = INADDR_ANY;
@@ -278,7 +278,7 @@ default_socket_sendmsg (clib_socket_t * s, void *msg, int msglen,
 {
   struct msghdr mh = { 0 };
   struct iovec iov[1];
-  char ctl[CMSG_SPACE (sizeof (int)) * num_fds];
+  char ctl[CMSG_SPACE (sizeof (int) * num_fds)];
   int rv;
 
   iov[0].iov_base = msg;
@@ -289,7 +289,7 @@ default_socket_sendmsg (clib_socket_t * s, void *msg, int msglen,
   if (num_fds > 0)
     {
       struct cmsghdr *cmsg;
-      memset (&ctl, 0, sizeof (ctl));
+      clib_memset (&ctl, 0, sizeof (ctl));
       mh.msg_control = ctl;
       mh.msg_controllen = sizeof (ctl);
       cmsg = CMSG_FIRSTHDR (&mh);
@@ -309,12 +309,16 @@ static clib_error_t *
 default_socket_recvmsg (clib_socket_t * s, void *msg, int msglen,
                        int fds[], int num_fds)
 {
+#ifdef __linux__
   char ctl[CMSG_SPACE (sizeof (int) * num_fds) +
           CMSG_SPACE (sizeof (struct ucred))];
+  struct ucred *cr = 0;
+#else
+  char ctl[CMSG_SPACE (sizeof (int) * num_fds)];
+#endif
   struct msghdr mh = { 0 };
   struct iovec iov[1];
   ssize_t size;
-  struct ucred *cr = 0;
   struct cmsghdr *cmsg;
 
   iov[0].iov_base = msg;
@@ -324,7 +328,7 @@ default_socket_recvmsg (clib_socket_t * s, void *msg, int msglen,
   mh.msg_control = ctl;
   mh.msg_controllen = sizeof (ctl);
 
-  memset (ctl, 0, sizeof (ctl));
+  clib_memset (ctl, 0, sizeof (ctl));
 
   /* receive the incoming message */
   size = recvmsg (s->fd, &mh, 0);
@@ -340,6 +344,7 @@ default_socket_recvmsg (clib_socket_t * s, void *msg, int msglen,
     {
       if (cmsg->cmsg_level == SOL_SOCKET)
        {
+#ifdef __linux__
          if (cmsg->cmsg_type == SCM_CREDENTIALS)
            {
              cr = (struct ucred *) CMSG_DATA (cmsg);
@@ -347,9 +352,12 @@ default_socket_recvmsg (clib_socket_t * s, void *msg, int msglen,
              s->gid = cr->gid;
              s->pid = cr->pid;
            }
-         else if (cmsg->cmsg_type == SCM_RIGHTS)
+         else
+#endif
+         if (cmsg->cmsg_type == SCM_RIGHTS)
            {
-             clib_memcpy (fds, CMSG_DATA (cmsg), num_fds * sizeof (int));
+             clib_memcpy_fast (fds, CMSG_DATA (cmsg),
+                               num_fds * sizeof (int));
            }
        }
       cmsg = CMSG_NXTHDR (&mh, cmsg);
@@ -436,6 +444,7 @@ clib_socket_init (clib_socket_t * s)
          clib_unix_warning ("setsockopt SO_REUSEADDR fails");
       }
 
+#if __linux__
       if (addr.sa.sa_family == PF_LOCAL && s->flags & CLIB_SOCKET_F_PASSCRED)
        {
          int x = 1;
@@ -447,6 +456,7 @@ clib_socket_init (clib_socket_t * s)
              goto done;
            }
        }
+#endif
 
       if (need_bind && bind (s->fd, &addr.sa, addr_len) < 0)
        {
@@ -516,7 +526,7 @@ clib_socket_accept (clib_socket_t * server, clib_socket_t * client)
   clib_error_t *err = 0;
   socklen_t len = 0;
 
-  memset (client, 0, sizeof (client[0]));
+  clib_memset (client, 0, sizeof (client[0]));
 
   /* Accept the new socket connection. */
   client->fd = accept (server->fd, 0, 0);