VPP-521: Classify API enhancement to redirect traffic to pre-defined VRF
[vpp.git] / vnet / vnet / l2 / l2_input_acl.c
index de9f679..104fcd1 100644 (file)
@@ -137,11 +137,9 @@ l2_inacl_node_fn (vlib_main_t * vm,
 
       bi0 = from[0];
       b0 = vlib_get_buffer (vm, bi0);
-      h0 = b0->data;
 
       bi1 = from[1];
       b1 = vlib_get_buffer (vm, bi1);
-      h1 = b1->data;
 
       sw_if_index0 = vnet_buffer (b0)->sw_if_index[VLIB_RX];
       table_index0 =
@@ -155,11 +153,21 @@ l2_inacl_node_fn (vlib_main_t * vm,
 
       t1 = pool_elt_at_index (vcm->tables, table_index1);
 
+      if (t0->current_data_flag == CLASSIFY_FLAG_USE_CURR_DATA)
+       h0 = (void *) vlib_buffer_get_current (b0) + t0->current_data_offset;
+      else
+       h0 = b0->data;
+
       vnet_buffer (b0)->l2_classify.hash =
        vnet_classify_hash_packet (t0, (u8 *) h0);
 
       vnet_classify_prefetch_bucket (t0, vnet_buffer (b0)->l2_classify.hash);
 
+      if (t1->current_data_flag == CLASSIFY_FLAG_USE_CURR_DATA)
+       h1 = (void *) vlib_buffer_get_current (b1) + t1->current_data_offset;
+      else
+       h1 = b1->data;
+
       vnet_buffer (b1)->l2_classify.hash =
        vnet_classify_hash_packet (t1, (u8 *) h1);
 
@@ -184,13 +192,18 @@ l2_inacl_node_fn (vlib_main_t * vm,
 
       bi0 = from[0];
       b0 = vlib_get_buffer (vm, bi0);
-      h0 = b0->data;
 
       sw_if_index0 = vnet_buffer (b0)->sw_if_index[VLIB_RX];
       table_index0 =
        am->classify_table_index_by_sw_if_index[tid][sw_if_index0];
 
       t0 = pool_elt_at_index (vcm->tables, table_index0);
+
+      if (t0->current_data_flag == CLASSIFY_FLAG_USE_CURR_DATA)
+       h0 = (void *) vlib_buffer_get_current (b0) + t0->current_data_offset;
+      else
+       h0 = b0->data;
+
       vnet_buffer (b0)->l2_classify.hash =
        vnet_classify_hash_packet (t0, (u8 *) h0);
 
@@ -251,7 +264,7 @@ l2_inacl_node_fn (vlib_main_t * vm,
          n_left_to_next -= 1;
 
          b0 = vlib_get_buffer (vm, bi0);
-         h0 = b0->data;
+
          table_index0 = vnet_buffer (b0)->l2_classify.table_index;
          e0 = 0;
          t0 = 0;
@@ -270,6 +283,13 @@ l2_inacl_node_fn (vlib_main_t * vm,
              hash0 = vnet_buffer (b0)->l2_classify.hash;
              t0 = pool_elt_at_index (vcm->tables, table_index0);
 
+             if (t0->current_data_flag == CLASSIFY_FLAG_USE_CURR_DATA)
+               h0 =
+                 (void *) vlib_buffer_get_current (b0) +
+                 t0->current_data_offset;
+             else
+               h0 = b0->data;
+
              e0 = vnet_classify_find_entry (t0, (u8 *) h0, hash0, now);
              if (e0)
                {
@@ -308,6 +328,14 @@ l2_inacl_node_fn (vlib_main_t * vm,
                          break;
                        }
 
+                     if (t0->current_data_flag ==
+                         CLASSIFY_FLAG_USE_CURR_DATA)
+                       h0 =
+                         (void *) vlib_buffer_get_current (b0) +
+                         t0->current_data_offset;
+                     else
+                       h0 = b0->data;
+
                      hash0 = vnet_classify_hash_packet (t0, (u8 *) h0);
                      e0 = vnet_classify_find_entry
                        (t0, (u8 *) h0, hash0, now);