summaryrefslogtreecommitdiffstats
path: root/plugins/acl-plugin/acl/l2sess_node.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/acl-plugin/acl/l2sess_node.c')
-rw-r--r--plugins/acl-plugin/acl/l2sess_node.c73
1 files changed, 10 insertions, 63 deletions
diff --git a/plugins/acl-plugin/acl/l2sess_node.c b/plugins/acl-plugin/acl/l2sess_node.c
index 520e5929b4b..689d216dea1 100644
--- a/plugins/acl-plugin/acl/l2sess_node.c
+++ b/plugins/acl-plugin/acl/l2sess_node.c
@@ -526,13 +526,13 @@ check_idle_sessions (l2sess_main_t * sm, u32 sw_if_index, u64 now)
static uword
l2sess_node_fn (vlib_main_t * vm,
- vlib_node_runtime_t * node, vlib_frame_t * frame)
+ vlib_node_runtime_t * node, vlib_frame_t * frame,
+ int node_is_out, int node_is_ip6, int node_is_track,
+ u32 *feat_next_node_index)
{
u32 n_left_from, *from, *to_next;
l2sess_next_t next_index;
u32 pkts_swapped = 0;
- u32 cached_sw_if_index = (u32) ~ 0;
- u32 cached_next_index = (u32) ~ 0;
u32 feature_bitmap0;
u32 trace_flags0;
@@ -570,45 +570,19 @@ l2sess_node_fn (vlib_main_t * vm,
//en0 = vlib_buffer_get_current (b0);
/*
- * The non-boilerplate is in the block below.
- * Note first a magic macro block that sets up the behavior qualifiers:
* node_is_out : 1 = is output, 0 = is input
* node_is_ip6 : 1 = is ip6, 0 = is ip4
* node_is_track : 1 = is a state tracking node, 0 - is a session addition node
*
- * Subsequently the code adjusts its behavior depending on these variables.
- * It's most probably not great performance wise but much easier to work with.
- *
+ * The below code adjust the behavior according to these parameters.
*/
{
- int node_is_out = -1;
- CLIB_UNUSED (int node_is_ip6) = -1;
- CLIB_UNUSED (int node_is_track) = -1;
- u32 node_index = 0;
u32 session_tables[2] = { ~0, ~0 };
u32 session_nexts[2] = { ~0, ~0 };
- l2_output_next_nodes_st *next_nodes = 0;
- u32 *input_feat_next_node_index;
u8 l4_proto;
u64 now = clib_cpu_time_now ();
-/*
- * Set the variables according to which of the 8 nodes we are.
- * Hopefully the compiler is smart enough to eliminate the extraneous.
- */
-#define _(node_name, node_var, is_out, is_ip6, is_track) \
-if(node_var.index == node->node_index) \
- { \
- node_is_out = is_out; \
- node_is_ip6 = is_ip6; \
- node_is_track = is_track; \
- node_index = node_var.index; \
- next_nodes = &sm->node_var ## _next_nodes; \
- input_feat_next_node_index = sm->node_var ## _input_next_node_index; \
- }
- foreach_l2sess_node
-#undef _
- trace_flags0 = 0;
+ trace_flags0 = 0;
if (node_is_out)
{
sw_if_index0 = vnet_buffer (b0)->sw_if_index[VLIB_TX];
@@ -715,38 +689,8 @@ if(node_var.index == node->node_index) \
check_idle_sessions (sm, sw_if_index0, now);
}
- if (node_is_out)
- {
- if (feature_bitmap0)
- {
- trace_flags0 |= 0x10;
- }
- if (sw_if_index0 == cached_sw_if_index)
- {
- trace_flags0 |= 0x20;
- }
- l2_output_dispatch (sm->vlib_main,
- sm->vnet_main,
- node,
- node_index,
- &cached_sw_if_index,
- &cached_next_index,
- next_nodes,
- b0, sw_if_index0, feature_bitmap0,
- &next0);
- trace_flags0 |= 2;
-
- }
- else
- {
- next0 =
- feat_bitmap_get_next_node_index (input_feat_next_node_index,
+ next0 = feat_bitmap_get_next_node_index (feat_next_node_index,
feature_bitmap0);
- trace_flags0 |= 4;
-
- }
-
-
if (next0 >= node->n_next_nodes)
{
@@ -795,7 +739,10 @@ node_var ## node_fn (vlib_main_t * vm, \
vlib_node_runtime_t * node, \
vlib_frame_t * frame) \
{ \
- return l2sess_node_fn(vm, node, frame); \
+ l2sess_main_t *sm = &l2sess_main; \
+ return l2sess_node_fn(vm, node, frame, \
+ is_out, is_ip6, is_track, \
+ sm->node_var ## _feat_next_node_index); \
} \
VLIB_REGISTER_NODE (node_var) = { \
.function = node_var ## node_fn, \