X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Fnat%2Fnat44_handoff.c;h=d221e5ba7cd558a8e09686d16a27be42d6272f65;hb=e5d34919b;hp=04590e409acaed5d4971830f5966f080345a8e1a;hpb=67eb4bb47739431bcb34bad8f1d6e3743a5e17ff;p=vpp.git diff --git a/src/plugins/nat/nat44_handoff.c b/src/plugins/nat/nat44_handoff.c index 04590e409ac..d221e5ba7cd 100644 --- a/src/plugins/nat/nat44_handoff.c +++ b/src/plugins/nat/nat44_handoff.c @@ -23,12 +23,14 @@ #include #include #include +#include typedef struct { u32 next_worker_index; u32 trace_index; u8 in2out; + u8 output; } nat44_handoff_trace_t; #define foreach_nat44_handoff_error \ @@ -57,12 +59,13 @@ format_nat44_handoff_trace (u8 * s, va_list * args) CLIB_UNUSED (vlib_main_t * vm) = va_arg (*args, vlib_main_t *); CLIB_UNUSED (vlib_node_t * node) = va_arg (*args, vlib_node_t *); nat44_handoff_trace_t *t = va_arg (*args, nat44_handoff_trace_t *); - char *tag; + char *tag, *output; tag = t->in2out ? "IN2OUT" : "OUT2IN"; + output = t->output ? "OUTPUT-FEATURE" : ""; s = - format (s, "NAT44_%s_WORKER_HANDOFF: next-worker %d trace index %d", tag, - t->next_worker_index, t->trace_index); + format (s, "NAT44_%s_WORKER_HANDOFF %s: next-worker %d trace index %d", + tag, output, t->next_worker_index, t->trace_index); return s; } @@ -79,7 +82,6 @@ nat44_worker_handoff_fn_inline (vlib_main_t * vm, vlib_buffer_t *bufs[VLIB_FRAME_SIZE], **b = bufs; snat_main_t *sm = &snat_main; - snat_get_worker_function_t *get_worker; u32 fq_index, thread_index = vm->thread_index; from = vlib_frame_vector_args (frame); @@ -90,19 +92,17 @@ nat44_worker_handoff_fn_inline (vlib_main_t * vm, if (is_in2out) { fq_index = is_output ? sm->fq_in2out_output_index : sm->fq_in2out_index; - get_worker = sm->worker_in2out_cb; } else { fq_index = sm->fq_out2in_index; - get_worker = sm->worker_out2in_cb; } while (n_left_from >= 4) { u32 sw_if_index0, sw_if_index1, sw_if_index2, sw_if_index3; - u32 rx_fib_index0 = 0, rx_fib_index1 = 0, - rx_fib_index2 = 0, rx_fib_index3 = 0; + u32 rx_fib_index0, rx_fib_index1, rx_fib_index2, rx_fib_index3; + u32 iph_offset0 = 0, iph_offset1 = 0, iph_offset2 = 0, iph_offset3 = 0; ip4_header_t *ip0, *ip1, *ip2, *ip3; if (PREDICT_TRUE (n_left_from >= 8)) @@ -117,32 +117,47 @@ nat44_worker_handoff_fn_inline (vlib_main_t * vm, CLIB_PREFETCH (&b[7]->data, CLIB_CACHE_LINE_BYTES, STORE); } - ip0 = vlib_buffer_get_current (b[0]); - ip1 = vlib_buffer_get_current (b[1]); - ip2 = vlib_buffer_get_current (b[2]); - ip3 = vlib_buffer_get_current (b[3]); - - if (PREDICT_FALSE (is_in2out)) + if (is_output) { - sw_if_index0 = vnet_buffer (b[0])->sw_if_index[VLIB_RX]; - sw_if_index1 = vnet_buffer (b[1])->sw_if_index[VLIB_RX]; - sw_if_index2 = vnet_buffer (b[2])->sw_if_index[VLIB_RX]; - sw_if_index3 = vnet_buffer (b[3])->sw_if_index[VLIB_RX]; - - rx_fib_index0 = - ip4_fib_table_get_index_for_sw_if_index (sw_if_index0); - rx_fib_index1 = - ip4_fib_table_get_index_for_sw_if_index (sw_if_index1); - rx_fib_index2 = - ip4_fib_table_get_index_for_sw_if_index (sw_if_index2); - rx_fib_index3 = - ip4_fib_table_get_index_for_sw_if_index (sw_if_index3); + iph_offset0 = vnet_buffer (b[0])->ip.save_rewrite_length; + iph_offset1 = vnet_buffer (b[1])->ip.save_rewrite_length; + iph_offset2 = vnet_buffer (b[2])->ip.save_rewrite_length; + iph_offset3 = vnet_buffer (b[3])->ip.save_rewrite_length; } - ti[0] = get_worker (ip0, rx_fib_index0); - ti[1] = get_worker (ip1, rx_fib_index1); - ti[2] = get_worker (ip2, rx_fib_index2); - ti[3] = get_worker (ip3, rx_fib_index3); + ip0 = (ip4_header_t *) ((u8 *) vlib_buffer_get_current (b[0]) + + iph_offset0); + ip1 = (ip4_header_t *) ((u8 *) vlib_buffer_get_current (b[1]) + + iph_offset1); + ip2 = (ip4_header_t *) ((u8 *) vlib_buffer_get_current (b[2]) + + iph_offset2); + ip3 = (ip4_header_t *) ((u8 *) vlib_buffer_get_current (b[3]) + + iph_offset3); + + sw_if_index0 = vnet_buffer (b[0])->sw_if_index[VLIB_RX]; + sw_if_index1 = vnet_buffer (b[1])->sw_if_index[VLIB_RX]; + sw_if_index2 = vnet_buffer (b[2])->sw_if_index[VLIB_RX]; + sw_if_index3 = vnet_buffer (b[3])->sw_if_index[VLIB_RX]; + + rx_fib_index0 = ip4_fib_table_get_index_for_sw_if_index (sw_if_index0); + rx_fib_index1 = ip4_fib_table_get_index_for_sw_if_index (sw_if_index1); + rx_fib_index2 = ip4_fib_table_get_index_for_sw_if_index (sw_if_index2); + rx_fib_index3 = ip4_fib_table_get_index_for_sw_if_index (sw_if_index3); + + if (is_in2out) + { + ti[0] = sm->worker_in2out_cb (ip0, rx_fib_index0, is_output); + ti[1] = sm->worker_in2out_cb (ip1, rx_fib_index1, is_output); + ti[2] = sm->worker_in2out_cb (ip2, rx_fib_index2, is_output); + ti[3] = sm->worker_in2out_cb (ip3, rx_fib_index3, is_output); + } + else + { + ti[0] = sm->worker_out2in_cb (b[0], ip0, rx_fib_index0, is_output); + ti[1] = sm->worker_out2in_cb (b[1], ip1, rx_fib_index1, is_output); + ti[2] = sm->worker_out2in_cb (b[2], ip2, rx_fib_index2, is_output); + ti[3] = sm->worker_out2in_cb (b[3], ip3, rx_fib_index3, is_output); + } if (ti[0] == thread_index) same_worker++; @@ -172,19 +187,28 @@ nat44_worker_handoff_fn_inline (vlib_main_t * vm, while (n_left_from > 0) { u32 sw_if_index0; - u32 rx_fib_index0 = 0; + u32 rx_fib_index0; + u32 iph_offset0 = 0; ip4_header_t *ip0; - ip0 = vlib_buffer_get_current (b[0]); - if (PREDICT_FALSE (is_in2out)) + if (is_output) + iph_offset0 = vnet_buffer (b[0])->ip.save_rewrite_length; + + ip0 = (ip4_header_t *) ((u8 *) vlib_buffer_get_current (b[0]) + + iph_offset0); + + sw_if_index0 = vnet_buffer (b[0])->sw_if_index[VLIB_RX]; + rx_fib_index0 = ip4_fib_table_get_index_for_sw_if_index (sw_if_index0); + + if (is_in2out) { - sw_if_index0 = vnet_buffer (b[0])->sw_if_index[VLIB_RX]; - rx_fib_index0 = - ip4_fib_table_get_index_for_sw_if_index (sw_if_index0); + ti[0] = sm->worker_in2out_cb (ip0, rx_fib_index0, is_output); + } + else + { + ti[0] = sm->worker_out2in_cb (b[0], ip0, rx_fib_index0, is_output); } - - ti[0] = get_worker (ip0, rx_fib_index0); if (ti[0] == thread_index) same_worker++; @@ -211,9 +235,10 @@ nat44_worker_handoff_fn_inline (vlib_main_t * vm, t->next_worker_index = ti[0]; t->trace_index = vlib_buffer_get_trace_index (b[0]); t->in2out = is_in2out; + t->output = is_output; - b++; - ti++; + b += 1; + ti += 1; } else break; @@ -250,14 +275,11 @@ VLIB_NODE_FN (snat_in2out_worker_handoff_node) (vlib_main_t * vm, VLIB_REGISTER_NODE (snat_in2out_worker_handoff_node) = { .name = "nat44-in2out-worker-handoff", .vector_size = sizeof (u32), + .sibling_of = "nat-default", .format_trace = format_nat44_handoff_trace, .type = VLIB_NODE_TYPE_INTERNAL, .n_errors = ARRAY_LEN(nat44_handoff_error_strings), .error_strings = nat44_handoff_error_strings, - .n_next_nodes = 1, - .next_nodes = { - [0] = "error-drop", - }, }; /* *INDENT-ON* */ @@ -273,14 +295,11 @@ VLIB_NODE_FN (snat_in2out_output_worker_handoff_node) (vlib_main_t * vm, VLIB_REGISTER_NODE (snat_in2out_output_worker_handoff_node) = { .name = "nat44-in2out-output-worker-handoff", .vector_size = sizeof (u32), + .sibling_of = "nat-default", .format_trace = format_nat44_handoff_trace, .type = VLIB_NODE_TYPE_INTERNAL, .n_errors = ARRAY_LEN(nat44_handoff_error_strings), .error_strings = nat44_handoff_error_strings, - .n_next_nodes = 1, - .next_nodes = { - [0] = "error-drop", - }, }; /* *INDENT-ON* */ @@ -295,14 +314,11 @@ VLIB_NODE_FN (snat_out2in_worker_handoff_node) (vlib_main_t * vm, VLIB_REGISTER_NODE (snat_out2in_worker_handoff_node) = { .name = "nat44-out2in-worker-handoff", .vector_size = sizeof (u32), + .sibling_of = "nat-default", .format_trace = format_nat44_handoff_trace, .type = VLIB_NODE_TYPE_INTERNAL, .n_errors = ARRAY_LEN(nat44_handoff_error_strings), .error_strings = nat44_handoff_error_strings, - .n_next_nodes = 1, - .next_nodes = { - [0] = "error-drop", - }, }; /* *INDENT-ON* */