misc: move to new pool_foreach macros
[vpp.git] / src / plugins / ioam / ip6 / ioam_cache.h
index 75ec784..b85172e 100644 (file)
@@ -20,7 +20,7 @@
 #include <vnet/ip/ip_packet.h>
 #include <vnet/ip/ip4_packet.h>
 #include <vnet/ip/ip6_packet.h>
-#include <vnet/sr/sr.h>
+#include <vnet/srv6/sr.h>
 
 #include <vppinfra/pool.h>
 #include <vppinfra/hash.h>
@@ -98,6 +98,8 @@
  */
 typedef struct
 {
+  /** Required for pool_get_aligned */
+  CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
   ip6_address_t src_address;
   ip6_address_t dst_address;
   u16 src_port;
@@ -122,6 +124,8 @@ typedef struct
  */
 typedef struct
 {
+  /** Required for pool_get_aligned */
+  CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
   u32 pool_id;
   u32 pool_index;
   ip6_address_t src_address;
@@ -173,6 +177,7 @@ typedef struct
   /* The current rewrite string being used */
   u8 *rewrite;
   u8 rewrite_pool_index_offset;
+  ip6_address_t sr_localsid_cache;
 
   u64 lookup_table_nbuckets;
   u64 lookup_table_size;
@@ -190,6 +195,7 @@ typedef struct
    */
   bool criteria_oneway;
   u8 wait_for_responses;
+  ip6_address_t sr_localsid_ts;
 
   /* convenience */
   vlib_main_t *vlib_main;
@@ -199,9 +205,12 @@ typedef struct
   u32 ip6_hbh_pop_node_index;
   u32 error_node_index;
   u32 cleanup_process_node_index;
+
+  u32 ip6_add_from_cache_hbh_node_index;
+  u32 ip6_reset_ts_hbh_node_index;
 } ioam_cache_main_t;
 
-ioam_cache_main_t ioam_cache_main;
+extern ioam_cache_main_t ioam_cache_main;
 
 extern vlib_node_registration_t ioam_cache_node;
 extern vlib_node_registration_t ioam_cache_ts_node;
@@ -276,17 +285,11 @@ typedef CLIB_PACKED (struct
 
 static inline void
 ioam_e2e_id_rewrite_handler (ioam_e2e_id_option_t * e2e_option,
-                            vlib_buffer_t * b0)
+                            ip6_address_t * address)
 {
-  ip6_main_t *im = &ip6_main;
-  ip6_address_t *my_address = 0;
-  my_address =
-    ip6_interface_first_address (im, vnet_buffer (b0)->sw_if_index[VLIB_RX]);
-  if (my_address)
-    {
-      e2e_option->id.as_u64[0] = my_address->as_u64[0];
-      e2e_option->id.as_u64[1] = my_address->as_u64[1];
-    }
+  e2e_option->id.as_u64[0] = address->as_u64[0];
+  e2e_option->id.as_u64[1] = address->as_u64[1];
+
 }
 
 /* Following functions are for the caching of ioam header
@@ -299,7 +302,7 @@ ioam_cache_entry_free (ioam_cache_entry_t * entry)
   if (entry)
     {
       vec_free (entry->ioam_rewrite_string);
-      memset (entry, 0, sizeof (*entry));
+      clib_memset (entry, 0, sizeof (*entry));
       pool_put (cm->ioam_rewrite_pool, entry);
     }
 }
@@ -371,13 +374,13 @@ ioam_cache_add (vlib_buffer_t * b0,
   ioam_e2e_id_option_t *e2e = 0;
 
   pool_get_aligned (cm->ioam_rewrite_pool, entry, CLIB_CACHE_LINE_BYTES);
-  memset (entry, 0, sizeof (*entry));
+  clib_memset (entry, 0, sizeof (*entry));
   pool_index = entry - cm->ioam_rewrite_pool;
 
-  clib_memcpy (entry->dst_address.as_u64, ip0->dst_address.as_u64,
-              sizeof (ip6_address_t));
-  clib_memcpy (entry->src_address.as_u64, ip0->src_address.as_u64,
-              sizeof (ip6_address_t));
+  clib_memcpy_fast (entry->dst_address.as_u64, ip0->dst_address.as_u64,
+                   sizeof (ip6_address_t));
+  clib_memcpy_fast (entry->src_address.as_u64, ip0->src_address.as_u64,
+                   sizeof (ip6_address_t));
   entry->src_port = src_port;
   entry->dst_port = dst_port;
   entry->seq_no = seq_no;
@@ -395,12 +398,12 @@ ioam_cache_add (vlib_buffer_t * b0,
     }
   e2e_id_offset = (u8 *) e2e - (u8 *) hbh0;
   /* setup e2e id option to insert v6 address of the node caching it */
-  clib_memcpy (entry->ioam_rewrite_string, hbh0, rewrite_len);
+  clib_memcpy_fast (entry->ioam_rewrite_string, hbh0, rewrite_len);
   hbh0 = (ip6_hop_by_hop_header_t *) entry->ioam_rewrite_string;
 
   /* suffix rewrite string with e2e ID option */
   e2e = (ioam_e2e_id_option_t *) (entry->ioam_rewrite_string + e2e_id_offset);
-  ioam_e2e_id_rewrite_handler (e2e, b0);
+  ioam_e2e_id_rewrite_handler (e2e, &cm->sr_localsid_cache);
   entry->my_address_offset = (u8 *) (&e2e->id) - (u8 *) hbh0;
 
   /* add it to hash, replacing and freeing any collision for now */
@@ -436,9 +439,9 @@ ioam_cache_sr_rewrite_template_create (void)
 
   /* This nodes address and the original dest will be
    * filled when the packet is processed */
-  vec_add2 (segments, this_seg, 2);
-  memset (this_seg, 0xfe, 2 * sizeof (ip6_address_t));
-  cm->sr_rewrite_template = ip6_compute_rewrite_string_insert (segments);
+  vec_add2 (segments, this_seg, 1);
+  clib_memset (this_seg, 0xfe, sizeof (ip6_address_t));
+  cm->sr_rewrite_template = ip6_sr_compute_rewrite_string_insert (segments);
   vec_free (segments);
 }
 
@@ -468,10 +471,10 @@ ioam_cache_table_destroy (vlib_main_t * vm)
   ioam_cache_entry_t *entry = 0;
   /* free pool and hash table */
   clib_bihash_free_8_8 (&cm->ioam_rewrite_cache_table);
-  pool_foreach (entry, cm->ioam_rewrite_pool, (
-                                               {
-                                               ioam_cache_entry_free (entry);
-                                               }));
+  pool_foreach (entry, cm->ioam_rewrite_pool)
+  {
+    ioam_cache_entry_free (entry);
+  }
   pool_free (cm->ioam_rewrite_pool);
   cm->ioam_rewrite_pool = 0;
   vec_free (cm->sr_rewrite_template);
@@ -532,8 +535,7 @@ ioam_cache_ts_table_init (vlib_main_t * vm)
                        CLIB_CACHE_LINE_BYTES);
   vec_validate_aligned (cm->ts_stats, no_of_threads - 1,
                        CLIB_CACHE_LINE_BYTES);
-  vec_validate_aligned (cm->timer_wheels, no_of_threads - 1,
-                       CLIB_CACHE_LINE_BYTES);
+  vec_validate (cm->timer_wheels, no_of_threads - 1);
   cm->lookup_table_nbuckets = IOAM_CACHE_TABLE_DEFAULT_HASH_NUM_BUCKETS;
   cm->lookup_table_nbuckets = 1 << max_log2 (cm->lookup_table_nbuckets);
   cm->lookup_table_size = IOAM_CACHE_TABLE_DEFAULT_HASH_MEMORY_SIZE;
@@ -541,7 +543,7 @@ ioam_cache_ts_table_init (vlib_main_t * vm)
     {
       pool_alloc_aligned (cm->ioam_ts_pool[i],
                          MAX_CACHE_TS_ENTRIES, CLIB_CACHE_LINE_BYTES);
-      memset (&cm->ts_stats[i], 0, sizeof (ioam_cache_ts_pool_stats_t));
+      clib_memset (&cm->ts_stats[i], 0, sizeof (ioam_cache_ts_pool_stats_t));
       tw_timer_wheel_init_16t_2w_512sl (&cm->timer_wheels[i],
                                        expired_cache_ts_timer_callback,
                                        IOAM_CACHE_TS_TICK
@@ -593,7 +595,7 @@ ioam_cache_ts_entry_free (u32 thread_id,
        }
       pool_put (cm->ioam_ts_pool[thread_id], entry);
       cm->ts_stats[thread_id].inuse--;
-      memset (entry, 0, sizeof (*entry));
+      clib_memset (entry, 0, sizeof (*entry));
     }
 }
 
@@ -608,13 +610,10 @@ ioam_cache_ts_table_destroy (vlib_main_t * vm)
   /* free pool and hash table */
   for (i = 0; i < no_of_threads; i++)
     {
-      pool_foreach (entry, cm->ioam_ts_pool[i], (
-                                                 {
-                                                 ioam_cache_ts_entry_free (i,
-                                                                           entry,
-                                                                           cm->error_node_index);
-                                                 }
-                   ));
+      pool_foreach (entry, cm->ioam_ts_pool[i])
+      {
+       ioam_cache_ts_entry_free (i, entry, cm->error_node_index);
+      }
       pool_free (cm->ioam_ts_pool[i]);
       cm->ioam_ts_pool = 0;
       tw_timer_wheel_free_16t_2w_512sl (&cm->timer_wheels[i]);
@@ -655,13 +654,13 @@ ioam_cache_ts_add (ip6_header_t * ip0,
 
   pool_get_aligned (cm->ioam_ts_pool[thread_id], entry,
                    CLIB_CACHE_LINE_BYTES);
-  memset (entry, 0, sizeof (*entry));
+  clib_memset (entry, 0, sizeof (*entry));
   *pool_index = entry - cm->ioam_ts_pool[thread_id];
 
-  clib_memcpy (entry->dst_address.as_u64, ip0->dst_address.as_u64,
-              sizeof (ip6_address_t));
-  clib_memcpy (entry->src_address.as_u64, ip0->src_address.as_u64,
-              sizeof (ip6_address_t));
+  clib_memcpy_fast (entry->dst_address.as_u64, ip0->dst_address.as_u64,
+                   sizeof (ip6_address_t));
+  clib_memcpy_fast (entry->src_address.as_u64, ip0->src_address.as_u64,
+                   sizeof (ip6_address_t));
   entry->src_port = src_port;
   entry->dst_port = dst_port;
   entry->seq_no = seq_no;