36 #define foreach_nat44_handoff_error \ 37 _(CONGESTION_DROP, "congestion drop") \ 38 _(SAME_WORKER, "same worker") \ 39 _(DO_HANDOFF, "do handoff") 43 #define _(sym,str) NAT44_HANDOFF_ERROR_##sym, 50 #define _(sym,string) string, 64 tag = t->
in2out ?
"IN2OUT" :
"OUT2IN";
65 output = t->
output ?
"OUTPUT-FEATURE" :
"";
67 format (s,
"NAT44_%s_WORKER_HANDOFF %s: next-worker %d trace index %d",
79 u32 n_enq, n_left_from, *from, do_handoff = 0, same_worker = 0;
104 while (n_left_from >= 4)
106 u32 sw_if_index0, sw_if_index1, sw_if_index2, sw_if_index3;
107 u32 rx_fib_index0, rx_fib_index1, rx_fib_index2, rx_fib_index3;
108 u32 iph_offset0 = 0, iph_offset1 = 0, iph_offset2 = 0, iph_offset3 = 0;
125 iph_offset0 =
vnet_buffer (b[0])->ip.save_rewrite_length;
126 iph_offset1 =
vnet_buffer (b[1])->ip.save_rewrite_length;
127 iph_offset2 =
vnet_buffer (b[2])->ip.save_rewrite_length;
128 iph_offset3 =
vnet_buffer (b[3])->ip.save_rewrite_length;
150 ti[0] = get_worker (ip0, rx_fib_index0, is_output);
151 ti[1] = get_worker (ip1, rx_fib_index1, is_output);
152 ti[2] = get_worker (ip2, rx_fib_index2, is_output);
153 ti[3] = get_worker (ip3, rx_fib_index3, is_output);
155 if (ti[0] == thread_index)
160 if (ti[1] == thread_index)
165 if (ti[2] == thread_index)
170 if (ti[3] == thread_index)
180 while (n_left_from > 0)
189 iph_offset0 =
vnet_buffer (b[0])->ip.save_rewrite_length;
197 ti[0] = get_worker (ip0, rx_fib_index0, is_output);
199 if (ti[0] == thread_index)
217 if (b[0]->
flags & VLIB_BUFFER_IS_TRACED)
237 if (n_enq < frame->n_vectors)
240 NAT44_HANDOFF_ERROR_CONGESTION_DROP,
245 NAT44_HANDOFF_ERROR_SAME_WORKER, same_worker);
247 NAT44_HANDOFF_ERROR_DO_HANDOFF, do_handoff);
262 .name =
"nat44-in2out-worker-handoff",
263 .vector_size =
sizeof (
u32),
264 .sibling_of =
"nat-default",
282 .name =
"nat44-in2out-output-worker-handoff",
283 .vector_size =
sizeof (
u32),
284 .sibling_of =
"nat-default",
301 .name =
"nat44-out2in-worker-handoff",
302 .vector_size =
sizeof (
u32),
303 .sibling_of =
"nat-default",
static char * nat44_handoff_error_strings[]
#define foreach_nat44_handoff_error
static u32 vlib_buffer_get_trace_index(vlib_buffer_t *b)
Extract the trace (pool) index from a trace handle.
u32 fq_in2out_output_index
vlib_node_registration_t snat_in2out_worker_handoff_node
(constructor) VLIB_REGISTER_NODE (snat_in2out_worker_handoff_node)
#define VLIB_NODE_FN(node)
u32 ip4_fib_table_get_index_for_sw_if_index(u32 sw_if_index)
#define vlib_prefetch_buffer_header(b, type)
Prefetch buffer metadata.
vl_api_fib_path_type_t type
static void * vlib_buffer_get_current(vlib_buffer_t *b)
Get pointer to current data to process.
u32 node_index
Node index.
static void vlib_node_increment_counter(vlib_main_t *vm, u32 node_index, u32 counter_index, u64 increment)
#define VLIB_REGISTER_NODE(x,...)
#define CLIB_PREFETCH(addr, size, type)
snat_get_worker_function_t * worker_in2out_cb
snat_get_worker_function_t * worker_out2in_cb
u32() snat_get_worker_function_t(ip4_header_t *ip, u32 rx_fib_index, u8 is_output)
static uword nat44_worker_handoff_fn_inline(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame, u8 is_output, u8 is_in2out)
static void * vlib_add_trace(vlib_main_t *vm, vlib_node_runtime_t *r, vlib_buffer_t *b, u32 n_data_bytes)
VLIB buffer representation.
static void * vlib_frame_vector_args(vlib_frame_t *f)
Get pointer to frame vector data.
vlib_node_registration_t snat_out2in_worker_handoff_node
(constructor) VLIB_REGISTER_NODE (snat_out2in_worker_handoff_node)
static_always_inline u32 vlib_buffer_enqueue_to_thread(vlib_main_t *vm, u32 frame_queue_index, u32 *buffer_indices, u16 *thread_indices, u32 n_packets, int drop_on_congestion)
vlib_node_registration_t snat_in2out_output_worker_handoff_node
(constructor) VLIB_REGISTER_NODE (snat_in2out_output_worker_handoff_node)
u16 flags
Copy of main node flags.
static u8 * format_nat44_handoff_trace(u8 *s, va_list *args)
static_always_inline void vlib_get_buffers(vlib_main_t *vm, u32 *bi, vlib_buffer_t **b, int count)
Translate array of buffer indices into buffer pointers.
#define VLIB_NODE_FLAG_TRACE
#define CLIB_CACHE_LINE_BYTES