ip: Punt node does not free iovecs
[vpp.git] / src / vnet / ip / punt_node.c
index 32a0884..65237aa 100644 (file)
@@ -248,13 +248,15 @@ punt_socket_inline (vlib_main_t * vm,
                    punt_type_t pt, ip_address_family_t af)
 {
   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;
 
-  u32 node_index = AF_IP4 == af ? udp4_punt_socket_node.index :
-    udp6_punt_socket_node.index;
+  punt_thread_data_t *ptd = &pm->thread_data[thread_index];
+  u32 node_index = (AF_IP4 == af ?
+                   udp4_punt_socket_node.index :
+                   udp6_punt_socket_node.index);
 
   for (i = 0; i < n_packets; i++)
     {
@@ -332,20 +334,19 @@ 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;
 
@@ -362,7 +363,7 @@ 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;
@@ -374,8 +375,8 @@ 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)