avoid using thread local storage for thread index
[vpp.git] / src / plugins / srv6-ad / node.c
index 73957f5..2985196 100644 (file)
@@ -27,6 +27,7 @@ typedef struct
 
 typedef struct
 {
+  u8 error;
   ip6_address_t src, dst;
 } srv6_ad_rewrite_trace_t;
 
@@ -47,6 +48,11 @@ format_srv6_ad_rewrite_trace (u8 * s, va_list * args)
   CLIB_UNUSED (vlib_node_t * node) = va_arg (*args, vlib_node_t *);
   srv6_ad_rewrite_trace_t *t = va_arg (*args, srv6_ad_rewrite_trace_t *);
 
+  if (PREDICT_FALSE (t->error != 0))
+    {
+      return format (s, "SRv6-AD-rewrite: cache is empty");
+    }
+
   return format (s, "SRv6-AD-rewrite: src %U dst %U",
                 format_ip6_address, &t->src, format_ip6_address, &t->dst);
 }
@@ -154,8 +160,12 @@ end_ad_processing (vlib_buffer_t * b0,
   ls0_mem = ls0->plugin_mem;
 
   /* Cache IP header and extensions */
-  vec_validate (ls0_mem->rewrite, total_size - 1);
+  if (PREDICT_FALSE (total_size > ls0_mem->rw_len))
+    {
+      vec_validate (ls0_mem->rewrite, total_size - 1);
+    }
   clib_memcpy (ls0_mem->rewrite, ip0, total_size);
+  ls0_mem->rw_len = total_size;
 
   /* Remove IP header and extensions */
   vlib_buffer_advance (b0, total_size);
@@ -184,7 +194,7 @@ srv6_ad_localsid_fn (vlib_main_t * vm,
   n_left_from = frame->n_vectors;
   next_index = node->cached_next_index;
 
-  u32 thread_index = vlib_get_thread_index ();
+  u32 thread_index = vm->thread_index;
 
   while (n_left_from > 0)
     {
@@ -326,11 +336,11 @@ srv6_ad4_rewrite_fn (vlib_main_t * vm,
          else
            {
              ASSERT (VLIB_BUFFER_PRE_DATA_SIZE >=
-                     (vec_len (ls0_mem->rewrite) + b0->current_data));
+                     (ls0_mem->rw_len + b0->current_data));
 
-             clib_memcpy (((u8 *) ip0_encap) - vec_len (ls0_mem->rewrite),
-                          ls0_mem->rewrite, vec_len (ls0_mem->rewrite));
-             vlib_buffer_advance (b0, -(word) vec_len (ls0_mem->rewrite));
+             clib_memcpy (((u8 *) ip0_encap) - ls0_mem->rw_len,
+                          ls0_mem->rewrite, ls0_mem->rw_len);
+             vlib_buffer_advance (b0, -(word) ls0_mem->rw_len);
 
              ip0 = vlib_buffer_get_current (b0);
 
@@ -342,7 +352,7 @@ srv6_ad4_rewrite_fn (vlib_main_t * vm,
              ip0_encap->checksum = checksum0;
 
              /* Update outer IPv6 length (in case it has changed) */
-             new_l0 = vec_len (ls0_mem->rewrite) - sizeof (ip6_header_t) +
+             new_l0 = ls0_mem->rw_len - sizeof (ip6_header_t) +
                clib_net_to_host_u16 (ip0_encap->length);
              ip0->payload_length = clib_host_to_net_u16 (new_l0);
            }
@@ -352,10 +362,19 @@ srv6_ad4_rewrite_fn (vlib_main_t * vm,
            {
              srv6_ad_rewrite_trace_t *tr =
                vlib_add_trace (vm, node, b0, sizeof *tr);
-             clib_memcpy (tr->src.as_u8, ip0->src_address.as_u8,
-                          sizeof tr->src.as_u8);
-             clib_memcpy (tr->dst.as_u8, ip0->dst_address.as_u8,
-                          sizeof tr->dst.as_u8);
+             tr->error = 0;
+
+             if (next0 == SRV6_AD_REWRITE_NEXT_ERROR)
+               {
+                 tr->error = 1;
+               }
+             else
+               {
+                 clib_memcpy (tr->src.as_u8, ip0->src_address.as_u8,
+                              sizeof tr->src.as_u8);
+                 clib_memcpy (tr->dst.as_u8, ip0->dst_address.as_u8,
+                              sizeof tr->dst.as_u8);
+               }
            }
 
          vlib_validate_buffer_enqueue_x1 (vm, node, next_index, to_next,
@@ -450,11 +469,11 @@ srv6_ad6_rewrite_fn (vlib_main_t * vm,
          else
            {
              ASSERT (VLIB_BUFFER_PRE_DATA_SIZE >=
-                     (vec_len (ls0_mem->rewrite) + b0->current_data));
+                     (ls0_mem->rw_len + b0->current_data));
 
-             clib_memcpy (((u8 *) ip0_encap) - vec_len (ls0_mem->rewrite),
-                          ls0_mem->rewrite, vec_len (ls0_mem->rewrite));
-             vlib_buffer_advance (b0, -(word) vec_len (ls0_mem->rewrite));
+             clib_memcpy (((u8 *) ip0_encap) - ls0_mem->rw_len,
+                          ls0_mem->rewrite, ls0_mem->rw_len);
+             vlib_buffer_advance (b0, -(word) ls0_mem->rw_len);
 
              ip0 = vlib_buffer_get_current (b0);
 
@@ -462,7 +481,7 @@ srv6_ad6_rewrite_fn (vlib_main_t * vm,
              ip0_encap->hop_limit -= 1;
 
              /* Update outer IPv6 length (in case it has changed) */
-             new_l0 = vec_len (ls0_mem->rewrite) +
+             new_l0 = ls0_mem->rw_len +
                clib_net_to_host_u16 (ip0_encap->payload_length);
              ip0->payload_length = clib_host_to_net_u16 (new_l0);
            }
@@ -472,10 +491,19 @@ srv6_ad6_rewrite_fn (vlib_main_t * vm,
            {
              srv6_ad_rewrite_trace_t *tr =
                vlib_add_trace (vm, node, b0, sizeof *tr);
-             clib_memcpy (tr->src.as_u8, ip0->src_address.as_u8,
-                          sizeof tr->src.as_u8);
-             clib_memcpy (tr->dst.as_u8, ip0->dst_address.as_u8,
-                          sizeof tr->dst.as_u8);
+             tr->error = 0;
+
+             if (next0 == SRV6_AD_REWRITE_NEXT_ERROR)
+               {
+                 tr->error = 1;
+               }
+             else
+               {
+                 clib_memcpy (tr->src.as_u8, ip0->src_address.as_u8,
+                              sizeof tr->src.as_u8);
+                 clib_memcpy (tr->dst.as_u8, ip0->dst_address.as_u8,
+                              sizeof tr->dst.as_u8);
+               }
            }
 
          vlib_validate_buffer_enqueue_x1 (vm, node, next_index, to_next,