X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Fioam%2Fip6%2Fioam_cache.h;h=e75deba73f7a98e3f056275e64984e15f12b1cd1;hb=178cf493d009995b28fdf220f04c98860ff79a9b;hp=aa88d58d8a83c480fe7ac0a0c74e7680d382c3a2;hpb=78372a9a55098ad43c4d6d941b640cce4ff24226;p=vpp.git diff --git a/src/plugins/ioam/ip6/ioam_cache.h b/src/plugins/ioam/ip6/ioam_cache.h index aa88d58d8a8..e75deba73f7 100644 --- a/src/plugins/ioam/ip6/ioam_cache.h +++ b/src/plugins/ioam/ip6/ioam_cache.h @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include #include @@ -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; @@ -201,10 +207,10 @@ typedef struct 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. @@ -276,17 +282,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 +299,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 +371,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 +395,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 +436,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); } @@ -484,16 +484,21 @@ format_ioam_cache_entry (u8 * s, va_list * args) { 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; } @@ -527,8 +532,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; @@ -536,7 +540,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 @@ -588,7 +592,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)); } } @@ -650,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; @@ -795,7 +799,10 @@ format_ioam_cache_ts_entry (u8 * s, va_list * args) 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, @@ -826,6 +833,8 @@ format_ioam_cache_ts_entry (u8 * s, va_list * args) vm->cpu_time_main_loop_start) * ct->seconds_per_clock, e->response_received); } + +end: return s; }