ipsec: add insecure option for format of SA
[vpp.git] / src / vlibmemory / socket_api.c
index f3cd169..868298c 100644 (file)
@@ -282,8 +282,8 @@ vl_socket_read_ready (clib_file_t * uf)
            {
              ASSERT (vec_len (rp->unprocessed_input) == 0);
              vec_validate (rp->unprocessed_input, vec_len (msg_buffer) - 1);
-             clib_memcpy (rp->unprocessed_input, msg_buffer,
-                          vec_len (msg_buffer));
+             clib_memcpy_fast (rp->unprocessed_input, msg_buffer,
+                               vec_len (msg_buffer));
              _vec_len (rp->unprocessed_input) = vec_len (msg_buffer);
            }
          _vec_len (socket_main.input_buffer) = save_input_buffer_length;
@@ -381,7 +381,7 @@ socksvr_file_add (clib_file_main_t * fm, int fd)
   clib_file_t template = { 0 };
 
   pool_get (socket_main.registration_pool, rp);
-  memset (rp, 0, sizeof (*rp));
+  clib_memset (rp, 0, sizeof (*rp));
 
   template.read_function = vl_socket_read_ready;
   template.write_function = vl_socket_write_ready;
@@ -439,7 +439,7 @@ vl_api_sockclnt_create_t_handler (vl_api_sockclnt_create_t * mp)
   regp->name = format (0, "%s%c", mp->name, 0);
 
   u32 size = sizeof (*rp) + (nmsg * sizeof (vl_api_message_table_entry_t));
-  rp = vl_msg_api_alloc (size);
+  rp = vl_msg_api_alloc_zero (size);
   rp->_vl_msg_id = htons (VL_API_SOCKCLNT_CREATE_REPLY);
   rp->index = htonl (sock_api_registration_handle (regp));
   rp->context = mp->context;
@@ -450,7 +450,8 @@ vl_api_sockclnt_create_t_handler (vl_api_sockclnt_create_t * mp)
   hash_foreach_pair (hp, am->msg_index_by_name_and_crc,
   ({
     rp->message_table[i].index = htons(hp->value[0]);
-    strncpy((char *)rp->message_table[i].name, (char *)hp->key, 64-1);
+    strncpy_s((char *)rp->message_table[i].name, 64 /* bytes of space at dst */,
+              (char *)hp->key, 64-1 /* chars to copy, without zero byte. */);
     i++;
   }));
   /* *INDENT-ON* */
@@ -470,7 +471,7 @@ vl_api_sockclnt_delete_t_handler (vl_api_sockclnt_delete_t * mp)
   if (!regp)
     return;
 
-  u32 reg_index = ntohl (mp->index);
+  u32 reg_index = socket_api_registration_handle_to_index (ntohl (mp->index));
   rp = vl_msg_api_alloc (sizeof (*rp));
   rp->_vl_msg_id = htons (VL_API_SOCKCLNT_DELETE_REPLY);
   rp->context = mp->context;
@@ -506,14 +507,14 @@ vl_sock_api_send_fd_msg (int socket_fd, int fds[], int n_fds)
   mh.msg_iov = iov;
   mh.msg_iovlen = 1;
 
-  memset (&ctl, 0, sizeof (ctl));
+  clib_memset (&ctl, 0, sizeof (ctl));
   mh.msg_control = ctl;
   mh.msg_controllen = sizeof (ctl);
   cmsg = CMSG_FIRSTHDR (&mh);
   cmsg->cmsg_len = CMSG_LEN (sizeof (int) * n_fds);
   cmsg->cmsg_level = SOL_SOCKET;
   cmsg->cmsg_type = SCM_RIGHTS;
-  clib_memcpy (CMSG_DATA (cmsg), fds, sizeof (int) * n_fds);
+  clib_memcpy_fast (CMSG_DATA (cmsg), fds, sizeof (int) * n_fds);
 
   rv = sendmsg (socket_fd, &mh, 0);
   if (rv < 0)
@@ -591,7 +592,7 @@ vl_api_sock_init_shm_t_handler (vl_api_sock_init_shm_t * mp)
   clib_file_t *cf;
   vl_api_shm_elem_config_t *config = 0;
   vl_shmem_hdr_t *shmem_hdr;
-  int rv;
+  int rv, tries = 1000;
 
   regp = vl_api_client_index_to_registration (mp->client_index);
   if (regp == 0)
@@ -609,7 +610,7 @@ vl_api_sock_init_shm_t_handler (vl_api_sock_init_shm_t * mp)
    * Set up a memfd segment of the requested size wherein the
    * shmem data structures will be initialized
    */
-  memset (memfd, 0, sizeof (*memfd));
+  clib_memset (memfd, 0, sizeof (*memfd));
   memfd->ssvm_size = mp->requested_size;
   memfd->requested_va = 0ULL;
   memfd->i_am_master = 1;
@@ -624,7 +625,7 @@ vl_api_sock_init_shm_t_handler (vl_api_sock_init_shm_t * mp)
   /*
    * Create a plausible svm_region in the memfd backed segment
    */
-  memset (a, 0, sizeof (*a));
+  clib_memset (a, 0, sizeof (*a));
   a->baseva = memfd->sh->ssvm_va + MMAP_PAGESIZE;
   a->size = memfd->ssvm_size - MMAP_PAGESIZE;
   /* $$$$ might want a different config parameter */
@@ -671,13 +672,29 @@ reply:
 
   /* Send the magic "here's your sign (aka fd)" socket message */
   cf = vl_api_registration_file (regp);
+
+  /* Wait for reply to be consumed before sending the fd */
+  while (tries-- > 0)
+    {
+      int bytes;
+      rv = ioctl (cf->file_descriptor, TIOCOUTQ, &bytes);
+      if (rv < 0)
+       {
+         clib_unix_warning ("ioctl returned");
+         break;
+       }
+      if (bytes == 0)
+       break;
+      usleep (1e3);
+    }
+
   vl_sock_api_send_fd_msg (cf->file_descriptor, &memfd->fd, 1);
 }
 
 #define foreach_vlib_api_msg                           \
-_(SOCKCLNT_CREATE, sockclnt_create)                    \
-_(SOCKCLNT_DELETE, sockclnt_delete)                    \
-_(SOCK_INIT_SHM, sock_init_shm)
+  _(SOCKCLNT_CREATE, sockclnt_create, 1)               \
+  _(SOCKCLNT_DELETE, sockclnt_delete, 1)               \
+  _(SOCK_INIT_SHM, sock_init_shm, 1)
 
 clib_error_t *
 vl_sock_api_init (vlib_main_t * vm)
@@ -693,43 +710,26 @@ vl_sock_api_init (vlib_main_t * vm)
   if (sm->socket_name == 0)
     return 0;
 
-#define _(N,n)                                                  \
+#define _(N,n,t)                                               \
     vl_msg_api_set_handlers(VL_API_##N, #n,                     \
                            vl_api_##n##_t_handler,              \
                            vl_noop_handler,                     \
                            vl_api_##n##_t_endian,               \
                            vl_api_##n##_t_print,                \
-                           sizeof(vl_api_##n##_t), 1);
+                           sizeof(vl_api_##n##_t), t);
   foreach_vlib_api_msg;
 #undef _
 
   vec_resize (sm->input_buffer, 4096);
 
   sock->config = (char *) sm->socket_name;
-
-  /* mkdir of file socket, only under /run  */
-  if (strncmp (sock->config, "/run", 4) == 0)
-    {
-      u8 *tmp = format (0, "%s", sock->config);
-      int i = vec_len (tmp);
-      while (i && tmp[--i] != '/')
-       ;
-
-      tmp[i] = 0;
-
-      if (i)
-       vlib_unix_recursive_mkdir ((char *) tmp);
-      vec_free (tmp);
-    }
-
-  sock->flags = CLIB_SOCKET_F_IS_SERVER | CLIB_SOCKET_F_SEQPACKET |
-    CLIB_SOCKET_F_ALLOW_GROUP_WRITE;
+  sock->flags = CLIB_SOCKET_F_IS_SERVER | CLIB_SOCKET_F_ALLOW_GROUP_WRITE;
   error = clib_socket_init (sock);
   if (error)
     return error;
 
   pool_get (sm->registration_pool, rp);
-  memset (rp, 0, sizeof (*rp));
+  clib_memset (rp, 0, sizeof (*rp));
 
   rp->registration_type = REGISTRATION_TYPE_SOCKET_LISTEN;
 
@@ -775,29 +775,31 @@ socksvr_config (vlib_main_t * vm, unformat_input_t * input)
     {
       if (unformat (input, "socket-name %s", &sm->socket_name))
        ;
+      /* DEPRECATE: default keyword is ignored */
       else if (unformat (input, "default"))
-       {
-         sm->socket_name = format (0, "%s%c", API_SOCKET_FILE, 0);
-       }
+       ;
       else
        {
          return clib_error_return (0, "unknown input '%U'",
                                    format_unformat_error, input);
        }
     }
+
+  if (!vec_len (sm->socket_name))
+    sm->socket_name = format (0, "%s/%s", vlib_unix_get_runtime_dir (),
+                             API_SOCKET_FILENAME);
+  vec_terminate_c_string (sm->socket_name);
+
   return 0;
 }
 
 VLIB_CONFIG_FUNCTION (socksvr_config, "socksvr");
 
-clib_error_t *
-vlibsocket_init (vlib_main_t * vm)
+void
+vlibsocket_reference ()
 {
-  return 0;
 }
 
-VLIB_INIT_FUNCTION (vlibsocket_init);
-
 /*
  * fd.io coding-style-patch-verification: ON
  *