diff options
Diffstat (limited to 'plugins/ioam-plugin/ioam/export/node.c')
-rw-r--r-- | plugins/ioam-plugin/ioam/export/node.c | 209 |
1 files changed, 4 insertions, 205 deletions
diff --git a/plugins/ioam-plugin/ioam/export/node.c b/plugins/ioam-plugin/ioam/export/node.c index 484bcb5d265..19f143dfbf3 100644 --- a/plugins/ioam-plugin/ioam/export/node.c +++ b/plugins/ioam-plugin/ioam/export/node.c @@ -17,7 +17,7 @@ #include <vnet/pg/pg.h> #include <vppinfra/error.h> #include <vnet/ip/ip.h> -#include <ioam/export/ioam_export.h> +#include <ioam/export-common/ioam_export.h> typedef struct { @@ -124,210 +124,9 @@ ip6_export_node_fn (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) { ioam_export_main_t *em = &ioam_export_main; - u32 n_left_from, *from, *to_next; - export_next_t next_index; - u32 pkts_recorded = 0; - ioam_export_buffer_t *my_buf = 0; - vlib_buffer_t *eb0 = 0; - u32 ebi0 = 0; - from = vlib_frame_vector_args (frame); - n_left_from = frame->n_vectors; - next_index = node->cached_next_index; - - while (__sync_lock_test_and_set (em->lockp[vm->cpu_index], 1)) - ; - my_buf = ioam_export_get_my_buffer (vm->cpu_index); - my_buf->touched_at = vlib_time_now (vm); - while (n_left_from > 0) - { - u32 n_left_to_next; - - vlib_get_next_frame (vm, node, next_index, to_next, n_left_to_next); - while (n_left_from >= 4 && n_left_to_next >= 2) - { - u32 next0 = EXPORT_NEXT_POP_HBYH; - u32 next1 = EXPORT_NEXT_POP_HBYH; - u32 bi0, bi1; - ip6_header_t *ip60, *ip61; - vlib_buffer_t *p0, *p1; - u32 ip_len0, ip_len1; - - /* Prefetch next iteration. */ - { - vlib_buffer_t *p2, *p3; - - p2 = vlib_get_buffer (vm, from[2]); - p3 = vlib_get_buffer (vm, from[3]); - - vlib_prefetch_buffer_header (p2, LOAD); - vlib_prefetch_buffer_header (p3, LOAD); - - /* IPv6 + HbyH header + Trace option */ - /* 40 + 2 + [4 hdr] + [16]* no_of_nodes */ - /* 3 cache lines can get v6 hdr + trace option with upto 9 node trace */ - CLIB_PREFETCH (p2->data, 3 * CLIB_CACHE_LINE_BYTES, LOAD); - CLIB_PREFETCH (p3->data, 3 * CLIB_CACHE_LINE_BYTES, LOAD); - } - - /* speculatively enqueue p0 and p1 to the current next frame */ - to_next[0] = bi0 = from[0]; - to_next[1] = bi1 = from[1]; - from += 2; - to_next += 2; - n_left_from -= 2; - n_left_to_next -= 2; - - p0 = vlib_get_buffer (vm, bi0); - p1 = vlib_get_buffer (vm, bi1); - - ip60 = vlib_buffer_get_current (p0); - ip61 = vlib_buffer_get_current (p1); - - ip_len0 = - clib_net_to_host_u16 (ip60->payload_length) + - sizeof (ip6_header_t); - ip_len1 = - clib_net_to_host_u16 (ip61->payload_length) + - sizeof (ip6_header_t); - - ebi0 = my_buf->buffer_index; - eb0 = vlib_get_buffer (vm, ebi0); - if (PREDICT_FALSE (eb0 == 0)) - goto NO_BUFFER1; - - ip_len0 = - ip_len0 > DEFAULT_EXPORT_SIZE ? DEFAULT_EXPORT_SIZE : ip_len0; - ip_len1 = - ip_len1 > DEFAULT_EXPORT_SIZE ? DEFAULT_EXPORT_SIZE : ip_len1; - - copy3cachelines (eb0->data + eb0->current_length, ip60, ip_len0); - eb0->current_length += DEFAULT_EXPORT_SIZE; - /* To maintain uniform size per export, each - * record is default size, ip6 hdr can be - * used to parse the record correctly - */ - my_buf->records_in_this_buffer++; - /* if number of buf exceeds max that fits in a MTU sized buffer - * ship it to the queue and pick new one - */ - if (my_buf->records_in_this_buffer >= DEFAULT_EXPORT_RECORDS) - { - ioam_export_send_buffer (vm, my_buf); - ioam_export_init_buffer (vm, my_buf); - } - - ebi0 = my_buf->buffer_index; - eb0 = vlib_get_buffer (vm, ebi0); - if (PREDICT_FALSE (eb0 == 0)) - goto NO_BUFFER1; - - copy3cachelines (eb0->data + eb0->current_length, ip61, ip_len1); - eb0->current_length += DEFAULT_EXPORT_SIZE; - my_buf->records_in_this_buffer++; - if (my_buf->records_in_this_buffer >= DEFAULT_EXPORT_RECORDS) - { - ioam_export_send_buffer (vm, my_buf); - ioam_export_init_buffer (vm, my_buf); - } - - pkts_recorded += 2; - - if (PREDICT_FALSE ((node->flags & VLIB_NODE_FLAG_TRACE))) - { - if (p0->flags & VLIB_BUFFER_IS_TRACED) - { - export_trace_t *t = - vlib_add_trace (vm, node, p0, sizeof (*t)); - t->flow_label = - clib_net_to_host_u32 (ip60-> - ip_version_traffic_class_and_flow_label); - t->next_index = next0; - } - if (p1->flags & VLIB_BUFFER_IS_TRACED) - { - export_trace_t *t = - vlib_add_trace (vm, node, p1, sizeof (*t)); - t->flow_label = - clib_net_to_host_u32 (ip61-> - ip_version_traffic_class_and_flow_label); - t->next_index = next1; - } - } - NO_BUFFER1: - /* verify speculative enqueues, maybe switch current next frame */ - vlib_validate_buffer_enqueue_x2 (vm, node, next_index, - to_next, n_left_to_next, - bi0, bi1, next0, next1); - } - - while (n_left_from > 0 && n_left_to_next > 0) - { - u32 bi0; - vlib_buffer_t *p0; - u32 next0 = EXPORT_NEXT_POP_HBYH; - ip6_header_t *ip60; - u32 ip_len0; - - /* speculatively enqueue p0 to the current next frame */ - bi0 = from[0]; - to_next[0] = bi0; - from += 1; - to_next += 1; - n_left_from -= 1; - n_left_to_next -= 1; - - p0 = vlib_get_buffer (vm, bi0); - ip60 = vlib_buffer_get_current (p0); - ip_len0 = - clib_net_to_host_u16 (ip60->payload_length) + - sizeof (ip6_header_t); - - ebi0 = my_buf->buffer_index; - eb0 = vlib_get_buffer (vm, ebi0); - if (PREDICT_FALSE (eb0 == 0)) - goto NO_BUFFER; - - ip_len0 = - ip_len0 > DEFAULT_EXPORT_SIZE ? DEFAULT_EXPORT_SIZE : ip_len0; - copy3cachelines (eb0->data + eb0->current_length, ip60, ip_len0); - eb0->current_length += DEFAULT_EXPORT_SIZE; - /* To maintain uniform size per export, each - * record is default size, ip6 hdr can be - * used to parse the record correctly - */ - my_buf->records_in_this_buffer++; - /* if number of buf exceeds max that fits in a MTU sized buffer - * ship it to the queue and pick new one - */ - if (my_buf->records_in_this_buffer >= DEFAULT_EXPORT_RECORDS) - { - ioam_export_send_buffer (vm, my_buf); - ioam_export_init_buffer (vm, my_buf); - } - if (PREDICT_FALSE ((node->flags & VLIB_NODE_FLAG_TRACE) - && (p0->flags & VLIB_BUFFER_IS_TRACED))) - { - export_trace_t *t = vlib_add_trace (vm, node, p0, sizeof (*t)); - t->flow_label = - clib_net_to_host_u32 (ip60-> - ip_version_traffic_class_and_flow_label); - t->next_index = next0; - } - - pkts_recorded += 1; - NO_BUFFER: - /* verify speculative enqueue, maybe switch current next frame */ - vlib_validate_buffer_enqueue_x1 (vm, node, next_index, - to_next, n_left_to_next, - bi0, next0); - } - - vlib_put_next_frame (vm, node, next_index, n_left_to_next); - } - - vlib_node_increment_counter (vm, export_node.index, - EXPORT_ERROR_RECORDED, pkts_recorded); - *em->lockp[vm->cpu_index] = 0; + ioam_export_node_common(em, vm, node, frame, ip6_header_t, payload_length, + ip_version_traffic_class_and_flow_label, + EXPORT_NEXT_POP_HBYH); return frame->n_vectors; } |