VPP-651: Ensure sw_if_index to node mapping for L2 output path is only done via l2out...
[vpp.git] / src / plugins / acl / l2sess_node.c
index 520e592..689d216 100644 (file)
@@ -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,                       \