flow-hash: Add symmetric flag for flow hashing
[vpp.git] / src / vnet / policer / node_funcs.c
index 1f4997f..594afca 100644 (file)
 #include <vlib/vlib.h>
 #include <vnet/vnet.h>
 #include <vnet/policer/policer.h>
+#include <vnet/policer/police_inlines.h>
 #include <vnet/ip/ip.h>
 #include <vnet/classify/policer_classify.h>
 #include <vnet/classify/vnet_classify.h>
+#include <vnet/l2/feat_bitmap.h>
+#include <vnet/l2/l2_input.h>
 
-#define IP4_NON_DSCP_BITS 0x03
-#define IP4_DSCP_SHIFT    2
-#define IP6_NON_DSCP_BITS 0xf03fffff
-#define IP6_DSCP_SHIFT    22
 
 /* Dispatch functions meant to be instantiated elsewhere */
 
@@ -67,60 +66,6 @@ static char *vnet_policer_error_strings[] = {
 #undef _
 };
 
-static_always_inline void
-vnet_policer_mark (vlib_buffer_t * b, u8 dscp)
-{
-  ethernet_header_t *eh;
-  ip4_header_t *ip4h;
-  ip6_header_t *ip6h;
-  u16 type;
-
-  eh = (ethernet_header_t *) b->data;
-  type = clib_net_to_host_u16 (eh->type);
-
-  if (PREDICT_TRUE (type == ETHERNET_TYPE_IP4))
-    {
-      ip4h = (ip4_header_t *) & (b->data[sizeof (ethernet_header_t)]);;
-      ip4h->tos &= IP4_NON_DSCP_BITS;
-      ip4h->tos |= dscp << IP4_DSCP_SHIFT;
-      ip4h->checksum = ip4_header_checksum (ip4h);
-    }
-  else
-    {
-      if (PREDICT_TRUE (type == ETHERNET_TYPE_IP6))
-       {
-         ip6h = (ip6_header_t *) & (b->data[sizeof (ethernet_header_t)]);
-         ip6h->ip_version_traffic_class_and_flow_label &=
-           clib_host_to_net_u32 (IP6_NON_DSCP_BITS);
-         ip6h->ip_version_traffic_class_and_flow_label |=
-           clib_host_to_net_u32 (dscp << IP6_DSCP_SHIFT);
-       }
-    }
-}
-
-static_always_inline
-  u8 vnet_policer_police (vlib_main_t * vm,
-                         vlib_buffer_t * b,
-                         u32 policer_index,
-                         u64 time_in_policer_periods,
-                         policer_result_e packet_color)
-{
-  u8 act;
-  u32 len;
-  u32 col;
-  policer_read_response_type_st *pol;
-  vnet_policer_main_t *pm = &vnet_policer_main;
-
-  len = vlib_buffer_length_in_chain (vm, b);
-  pol = &pm->policers[policer_index];
-  col = vnet_police_packet (pol, len, packet_color, time_in_policer_periods);
-  act = pol->action[col];
-  if (PREDICT_TRUE (act == SSE2_QOS_ACTION_MARK_AND_TRANSMIT))
-    vnet_policer_mark (b, pol->mark_dscp[col]);
-
-  return act;
-}
-
 static inline uword
 vnet_policer_inline (vlib_main_t * vm,
                     vlib_node_runtime_t * node,
@@ -447,6 +392,7 @@ test_policer_command_fn (vlib_main_t * vm,
   int rx_set = 0;
   int is_add = 1;
   int is_show = 0;
+  clib_error_t *error = NULL;
 
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, line_input))
@@ -468,7 +414,10 @@ test_policer_command_fn (vlib_main_t * vm,
     }
 
   if (rx_set == 0)
-    return clib_error_return (0, "interface not set");
+    {
+      error = clib_error_return (0, "interface not set");
+      goto done;
+    }
 
   if (is_show)
     {
@@ -477,12 +426,13 @@ test_policer_command_fn (vlib_main_t * vm,
       policer = pool_elt_at_index (pm->policers, pi);
 
       vlib_cli_output (vm, "%U", format_policer_instance, policer);
-      return 0;
+      goto done;
     }
 
   if (is_add && config_name == 0)
     {
-      return clib_error_return (0, "policer config name required");
+      error = clib_error_return (0, "policer config name required");
+      goto done;
     }
 
   rv = test_policer_add_del (rx_sw_if_index, config_name, is_add);
@@ -493,11 +443,15 @@ test_policer_command_fn (vlib_main_t * vm,
       break;
 
     default:
-      return clib_error_return
+      error = clib_error_return
        (0, "WARNING: vnet_vnet_policer_add_del returned %d", rv);
+      goto done;
     }
 
-  return 0;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /* *INDENT-OFF* */
@@ -538,7 +492,7 @@ format_policer_classify_trace (u8 * s, va_list * args)
 #define foreach_policer_classify_error                 \
 _(MISS, "Policer classify misses")                     \
 _(HIT, "Policer classify hits")                        \
-_(CHAIN_HIT, "Polcier classify hits after chain walk") \
+_(CHAIN_HIT, "Policer classify hits after chain walk") \
 _(DROP, "Policer classify action drop")
 
 typedef enum
@@ -727,14 +681,9 @@ policer_classify_inline (vlib_main_t * vm,
 
          if (tid == POLICER_CLASSIFY_TABLE_L2)
            {
-             /* Feature bitmap update */
-             vnet_buffer (b0)->l2.feature_bitmap &=
-               ~L2INPUT_FEAT_POLICER_CLAS;
-             /* Determine the next node */
-             next0 =
-               feat_bitmap_get_next_node_index (pcm->feat_next_node_index,
-                                                vnet_buffer (b0)->
-                                                l2.feature_bitmap);
+             /* Feature bitmap update and determine the next node */
+             next0 = vnet_l2_feature_next (b0, pcm->feat_next_node_index,
+                                           L2INPUT_FEAT_POLICER_CLAS);
            }
          else
            vnet_get_config_data (pcm->vnet_config_main[tid],
@@ -894,19 +843,22 @@ l2_policer_classify (vlib_main_t * vm,
   return policer_classify_inline (vm, node, frame, POLICER_CLASSIFY_TABLE_L2);
 }
 
-VLIB_REGISTER_NODE (l2_policer_classify_node) =
-{
-  .function = l2_policer_classify,.name = "l2-policer-classify",.vector_size =
-    sizeof (u32),.format_trace = format_policer_classify_trace,.n_errors =
-    ARRAY_LEN (policer_classify_error_strings),.error_strings =
-    policer_classify_error_strings,.n_next_nodes =
-    POLICER_CLASSIFY_NEXT_INDEX_N_NEXT,.next_nodes =
-  {
-  [POLICER_CLASSIFY_NEXT_INDEX_DROP] = "error-drop",}
-,};
+/* *INDENT-OFF* */
+VLIB_REGISTER_NODE (l2_policer_classify_node) = {
+  .function = l2_policer_classify,
+  .name = "l2-policer-classify",
+  .vector_size = sizeof (u32),
+  .format_trace = format_policer_classify_trace,
+  .n_errors = ARRAY_LEN (policer_classify_error_strings),
+  .error_strings = policer_classify_error_strings,
+  .n_next_nodes = POLICER_CLASSIFY_NEXT_INDEX_N_NEXT,
+  .next_nodes = {
+    [POLICER_CLASSIFY_NEXT_INDEX_DROP] = "error-drop",
+  },
+};
 
 VLIB_NODE_FUNCTION_MULTIARCH (l2_policer_classify_node, l2_policer_classify);
-
+/* *INDENT-ON* */
 
 static clib_error_t *
 policer_classify_init (vlib_main_t * vm)