session: cleanup use of api_client_index
[vpp.git] / src / vnet / qos / qos_mark.c
index cec7192..3b69bf5 100644 (file)
@@ -36,7 +36,15 @@ qos_mark_ip_enable_disable (u32 sw_if_index, u8 enable)
 void
 qos_mark_vlan_enable_disable (u32 sw_if_index, u8 enable)
 {
-  vnet_feature_enable_disable ("interface-output", "vlan-qos-mark",
+  /*
+   * one cannot run a feature on a sub-interface, so we need
+   * to enable a feature on all the L3 output paths
+   */
+  vnet_feature_enable_disable ("ip6-output", "vlan-ip6-qos-mark",
+                              sw_if_index, enable, NULL, 0);
+  vnet_feature_enable_disable ("ip4-output", "vlan-ip4-qos-mark",
+                              sw_if_index, enable, NULL, 0);
+  vnet_feature_enable_disable ("mpls-output", "vlan-mpls-qos-mark",
                               sw_if_index, enable, NULL, 0);
 }
 
@@ -180,7 +188,7 @@ qos_mark_inline (vlib_main_t * vm,
                  ethernet_vlan_header_set_priority_net_order (vlan0, qos0);
                }
            }
-         vnet_feature_next (sw_if_index0, &next0, b0);
+         vnet_feature_next (&next0, b0);
 
          if (PREDICT_FALSE (b0->flags & VLIB_BUFFER_IS_TRACED))
            {
@@ -239,8 +247,22 @@ mpls_qos_mark (vlib_main_t * vm, vlib_node_runtime_t * node,
 }
 
 static inline uword
-vlan_qos_mark (vlib_main_t * vm, vlib_node_runtime_t * node,
-              vlib_frame_t * frame)
+vlan_mpls_qos_mark (vlib_main_t * vm, vlib_node_runtime_t * node,
+                   vlib_frame_t * frame)
+{
+  return (qos_mark_inline (vm, node, frame, QOS_SOURCE_VLAN, 0));
+}
+
+static inline uword
+vlan_ip4_qos_mark (vlib_main_t * vm, vlib_node_runtime_t * node,
+                  vlib_frame_t * frame)
+{
+  return (qos_mark_inline (vm, node, frame, QOS_SOURCE_VLAN, 0));
+}
+
+static inline uword
+vlan_ip6_qos_mark (vlib_main_t * vm, vlib_node_runtime_t * node,
+                  vlib_frame_t * frame)
 {
   return (qos_mark_inline (vm, node, frame, QOS_SOURCE_VLAN, 0));
 }
@@ -311,9 +333,10 @@ VNET_FEATURE_INIT (mpls_qos_mark_node, static) = {
     .arc_name = "mpls-output",
     .node_name = "mpls-qos-mark",
 };
-VLIB_REGISTER_NODE (vlan_qos_mark_node) = {
-  .function = vlan_qos_mark,
-  .name = "vlan-qos-mark",
+
+VLIB_REGISTER_NODE (vlan_ip4_qos_mark_node) = {
+  .function = vlan_ip4_qos_mark,
+  .name = "vlan-ip4-qos-mark",
   .vector_size = sizeof (u32),
   .format_trace = format_qos_mark_trace,
   .type = VLIB_NODE_TYPE_INTERNAL,
@@ -326,11 +349,58 @@ VLIB_REGISTER_NODE (vlan_qos_mark_node) = {
   },
 };
 
-VLIB_NODE_FUNCTION_MULTIARCH (vlan_qos_mark_node, vlan_qos_mark);
+VLIB_NODE_FUNCTION_MULTIARCH (vlan_ip4_qos_mark_node, vlan_ip4_qos_mark);
+
+VNET_FEATURE_INIT (vlan_ip4_qos_mark_node, static) = {
+    .arc_name = "ip4-output",
+    .node_name = "vlan-ip4-qos-mark",
+    .runs_after = VNET_FEATURES ("ip4-qos-mark"),
+};
+
+VLIB_REGISTER_NODE (vlan_ip6_qos_mark_node) = {
+  .function = vlan_ip6_qos_mark,
+  .name = "vlan-ip6-qos-mark",
+  .vector_size = sizeof (u32),
+  .format_trace = format_qos_mark_trace,
+  .type = VLIB_NODE_TYPE_INTERNAL,
+
+  .n_errors = 0,
+  .n_next_nodes = 1,
 
-VNET_FEATURE_INIT (vlan_qos_mark_node, static) = {
-    .arc_name = "interface-output",
-    .node_name = "vlan-qos-mark",
+  .next_nodes = {
+    [0] = "error-drop",
+  },
+};
+
+VLIB_NODE_FUNCTION_MULTIARCH (vlan_ip6_qos_mark_node, vlan_ip6_qos_mark);
+
+VNET_FEATURE_INIT (vlan_ip6_qos_mark_node, static) = {
+    .arc_name = "ip6-output",
+    .node_name = "vlan-ip6-qos-mark",
+    .runs_after = VNET_FEATURES ("ip6-qos-mark"),
+};
+
+VLIB_REGISTER_NODE (vlan_mpls_qos_mark_node) = {
+  .function = vlan_mpls_qos_mark,
+  .name = "vlan-mpls-qos-mark",
+  .vector_size = sizeof (u32),
+  .format_trace = format_qos_mark_trace,
+  .type = VLIB_NODE_TYPE_INTERNAL,
+
+  .n_errors = 0,
+  .n_next_nodes = 1,
+
+  .next_nodes = {
+    [0] = "error-drop",
+  },
+};
+
+VLIB_NODE_FUNCTION_MULTIARCH (vlan_mpls_qos_mark_node, vlan_mpls_qos_mark);
+
+VNET_FEATURE_INIT (vlan_mpls_qos_mark_node, static) = {
+    .arc_name = "mpls-output",
+    .node_name = "vlan-mpls-qos-mark",
+    .runs_after = VNET_FEATURES ("mpls-qos-mark"),
 };
 /* *INDENT-ON* */
 
@@ -361,7 +431,7 @@ qos_mark_enable (u32 sw_if_index,
 int
 qos_mark_disable (u32 sw_if_index, qos_source_t output_source)
 {
-  if (vec_len (qos_mark_configs[output_source]) < sw_if_index)
+  if (vec_len (qos_mark_configs[output_source]) <= sw_if_index)
     return VNET_API_ERROR_NO_MATCHING_INTERFACE;
   if (INDEX_INVALID == qos_mark_configs[output_source][sw_if_index])
     return VNET_API_ERROR_VALUE_EXIST;