ip: Punt node does not free iovecs 20/20620/1
authorNeale Ranns <[email protected]>
Wed, 10 Jul 2019 08:47:15 +0000 (01:47 -0700)
committerNeale Ranns <[email protected]>
Fri, 12 Jul 2019 06:54:27 +0000 (06:54 +0000)
Type: fix
Fixes: f7a55ad74c

Change-Id: Ic3474e746887f880a8f6246bebc399715bac8e80
Signed-off-by: Neale Ranns <[email protected]>
(cherry picked from commit 13a6ddf353261fd0439646b71c832f4f44c9de71)

src/vnet/ip/punt.c
src/vnet/ip/punt.h

index 65e62c0..5d6ea54 100644 (file)
@@ -317,11 +317,12 @@ udp46_punt_socket_inline (vlib_main_t * vm,
                          vlib_frame_t * frame, bool is_ip4)
 {
   u32 *buffers = vlib_frame_vector_args (frame);
+  u32 thread_index = vm->thread_index;
   uword n_packets = frame->n_vectors;
-  struct iovec *iovecs = 0;
   punt_main_t *pm = &punt_main;
   int i;
 
+  punt_thread_data_t *ptd = &pm->thread_data[thread_index];
   u32 node_index = is_ip4 ? udp4_punt_socket_node.index :
     udp6_punt_socket_node.index;
 
@@ -375,20 +376,19 @@ udp46_punt_socket_inline (vlib_main_t * vm,
          clib_memcpy_fast (&t->client, c, sizeof (t->client));
        }
 
-      /* Re-set iovecs if present. */
-      if (iovecs)
-       _vec_len (iovecs) = 0;
+      /* Re-set iovecs */
+      vec_reset_length (ptd->iovecs);
 
       /* Add packet descriptor */
       packetdesc.sw_if_index = vnet_buffer (b)->sw_if_index[VLIB_RX];
       packetdesc.action = 0;
-      vec_add2 (iovecs, iov, 1);
+      vec_add2 (ptd->iovecs, iov, 1);
       iov->iov_base = &packetdesc;
       iov->iov_len = sizeof (packetdesc);
 
       /** VLIB buffer chain -> Unix iovec(s). */
       vlib_buffer_advance (b, -(sizeof (ethernet_header_t)));
-      vec_add2 (iovecs, iov, 1);
+      vec_add2 (ptd->iovecs, iov, 1);
       iov->iov_base = b->data + b->current_data;
       iov->iov_len = l = b->current_length;
 
@@ -409,7 +409,7 @@ udp46_punt_socket_inline (vlib_main_t * vm,
                  t->is_midchain = 1;
                }
 
-             vec_add2 (iovecs, iov, 1);
+             vec_add2 (ptd->iovecs, iov, 1);
 
              iov->iov_base = b->data + b->current_data;
              iov->iov_len = b->current_length;
@@ -421,8 +421,8 @@ udp46_punt_socket_inline (vlib_main_t * vm,
       struct msghdr msg = {
        .msg_name = caddr,
        .msg_namelen = sizeof (*caddr),
-       .msg_iov = iovecs,
-       .msg_iovlen = vec_len (iovecs),
+       .msg_iov = ptd->iovecs,
+       .msg_iovlen = vec_len (ptd->iovecs),
       };
 
       if (sendmsg (pm->socket_fd, &msg, 0) < (ssize_t) l)
@@ -1068,6 +1068,7 @@ clib_error_t *
 punt_init (vlib_main_t * vm)
 {
   punt_main_t *pm = &punt_main;
+  vlib_thread_main_t *tm = vlib_get_thread_main ();
 
   pm->clients_by_dst_port6 = sparse_vec_new
     (sizeof (pm->clients_by_dst_port6[0]),
@@ -1080,6 +1081,9 @@ punt_init (vlib_main_t * vm)
   pm->interface_output_node = vlib_get_node_by_name (vm,
                                                     (u8 *)
                                                     "interface-output");
+
+  vec_validate_aligned (pm->thread_data, tm->n_vlib_mains,
+                       CLIB_CACHE_LINE_BYTES);
   return 0;
 }
 
index 0518b2b..2d7a0f8 100644 (file)
@@ -69,6 +69,11 @@ typedef struct
   struct sockaddr_un caddr;
 } punt_client_t;
 
+typedef struct punt_thread_data_t_
+{
+  struct iovec *iovecs;
+} punt_thread_data_t;
+
 typedef struct
 {
   int socket_fd;
@@ -80,6 +85,7 @@ typedef struct
   vlib_node_t *interface_output_node;
   u32 *ready_fds;
   u32 *rx_buffers;
+  punt_thread_data_t *thread_data;
 } punt_main_t;
 extern punt_main_t punt_main;