#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>
*/
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;
*/
typedef struct
{
+ /** Required for pool_get_aligned */
+ CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
u32 pool_id;
u32 pool_index;
ip6_address_t src_address;
/* 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;
*/
bool criteria_oneway;
u8 wait_for_responses;
+ ip6_address_t sr_localsid_ts;
/* convenience */
vlib_main_t *vlib_main;
u32 cleanup_process_node_index;
} ioam_cache_main_t;
-ioam_cache_main_t ioam_cache_main;
+extern ioam_cache_main_t ioam_cache_main;
-vlib_node_registration_t ioam_cache_node;
-vlib_node_registration_t ioam_cache_ts_node;
+extern vlib_node_registration_t ioam_cache_node;
+extern vlib_node_registration_t ioam_cache_ts_node;
/* Compute flow hash. We'll use it to select which Sponge to use for this
* flow. And other things.
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
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);
}
}
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,
/* 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 */
/* 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);
}
{
ioam_cache_entry_t *e = va_arg (*args, ioam_cache_entry_t *);
ioam_cache_main_t *cm = &ioam_cache_main;
+ int rewrite_len = vec_len (e->ioam_rewrite_string);
s = format (s, "%d: %U:%d to %U:%d seq_no %lu\n",
(e - cm->ioam_rewrite_pool),
format_ip6_address, &e->src_address,
e->src_port,
format_ip6_address, &e->dst_address, e->dst_port, e->seq_no);
- s = format (s, " %U",
- format_ip6_hop_by_hop_ext_hdr,
- (ip6_hop_by_hop_header_t *) e->ioam_rewrite_string,
- vec_len (e->ioam_rewrite_string) - 1);
+
+ if (rewrite_len)
+ {
+ s = format (s, " %U",
+ format_ip6_hop_by_hop_ext_hdr,
+ (ip6_hop_by_hop_header_t *) e->ioam_rewrite_string,
+ rewrite_len - 1);
+ }
return s;
}
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;
{
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
}
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));
}
}
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,
vlib_main_t *vm = cm->vlib_main;
clib_time_t *ct = &vm->clib_time;
- if (e && e->hbh)
+ if (!e)
+ goto end;
+
+ if (e->hbh)
{
e2e =
ip6_ioam_find_hbh_option (e->hbh,
vm->cpu_time_main_loop_start) * ct->seconds_per_clock,
e->response_received);
}
+
+end:
return s;
}