tcp: avoid fr segments less than mss if possible
[vpp.git] / src / vnet / feature / feature.h
index 6e34018..b1917e8 100644 (file)
@@ -219,6 +219,13 @@ vnet_feature_enable_disable (const char *arc_name, const char *node_name,
                             void *feature_config,
                             u32 n_feature_config_bytes);
 
+u32
+vnet_feature_modify_end_node (u8 arc_index, u32 sw_if_index, u32 node_index);
+
+u32 vnet_feature_get_end_node (u8 arc_index, u32 sw_if_index);
+
+u32 vnet_feature_reset_end_node (u8 arc_index, u32 sw_if_index);
+
 static_always_inline u32
 vnet_get_feature_count (u8 arc, u32 sw_if_index)
 {
@@ -278,6 +285,23 @@ vnet_feature_arc_start_with_data (u8 arc, u32 sw_if_index, u32 * next,
   return 0;
 }
 
+static_always_inline void *
+vnet_feature_arc_start_w_cfg_index (u8 arc,
+                                   u32 sw_if_index,
+                                   u32 * next,
+                                   vlib_buffer_t * b, u32 cfg_index)
+{
+  vnet_feature_main_t *fm = &feature_main;
+  vnet_feature_config_main_t *cm;
+  cm = &fm->feature_config_mains[arc];
+
+  vnet_buffer (b)->feature_arc_index = arc;
+  b->current_config_index = cfg_index;
+
+  return vnet_get_config_data (&cm->config_main, &b->current_config_index,
+                              next, 0);
+}
+
 static_always_inline void
 vnet_feature_arc_start (u8 arc, u32 sw_if_index, u32 * next0,
                        vlib_buffer_t * b0)
@@ -304,91 +328,24 @@ vnet_feature_next (u32 * next0, vlib_buffer_t * b0)
   vnet_feature_next_with_data (next0, b0, 0);
 }
 
-static_always_inline int
-vnet_device_input_have_features (u32 sw_if_index)
-{
-  vnet_feature_main_t *fm = &feature_main;
-  return vnet_have_features (fm->device_input_feature_arc_index, sw_if_index);
-}
-
 static_always_inline void
-vnet_feature_start_device_input_x1 (u32 sw_if_index, u32 * next0,
-                                   vlib_buffer_t * b0)
+vnet_feature_next_u16 (u16 * next0, vlib_buffer_t * b0)
 {
-  vnet_feature_main_t *fm = &feature_main;
-  vnet_feature_config_main_t *cm;
-  u8 feature_arc_index = fm->device_input_feature_arc_index;
-  cm = &fm->feature_config_mains[feature_arc_index];
-
-  if (PREDICT_FALSE
-      (clib_bitmap_get
-       (fm->sw_if_index_has_features[feature_arc_index], sw_if_index)))
-    {
-      /*
-       * Save next0 so that the last feature in the chain
-       * can skip ethernet-input if indicated...
-       */
-      u16 adv;
-
-      adv = device_input_next_node_advance[*next0];
-      vlib_buffer_advance (b0, -adv);
-
-      vnet_buffer (b0)->feature_arc_index = feature_arc_index;
-      b0->current_config_index =
-       vec_elt (cm->config_index_by_sw_if_index, sw_if_index);
-      vnet_get_config_data (&cm->config_main, &b0->current_config_index,
-                           next0, /* # bytes of config data */ 0);
-    }
+  u32 next32;
+  vnet_feature_next_with_data (&next32, b0, 0);
+  *next0 = next32;
 }
 
-static_always_inline void
-vnet_feature_start_device_input_x2 (u32 sw_if_index,
-                                   u32 * next0,
-                                   u32 * next1,
-                                   vlib_buffer_t * b0, vlib_buffer_t * b1)
+static_always_inline int
+vnet_device_input_have_features (u32 sw_if_index)
 {
   vnet_feature_main_t *fm = &feature_main;
-  vnet_feature_config_main_t *cm;
-  u8 feature_arc_index = fm->device_input_feature_arc_index;
-  cm = &fm->feature_config_mains[feature_arc_index];
-
-  if (PREDICT_FALSE
-      (clib_bitmap_get
-       (fm->sw_if_index_has_features[feature_arc_index], sw_if_index)))
-    {
-      /*
-       * Save next0 so that the last feature in the chain
-       * can skip ethernet-input if indicated...
-       */
-      u16 adv;
-
-      adv = device_input_next_node_advance[*next0];
-      vlib_buffer_advance (b0, -adv);
-
-      adv = device_input_next_node_advance[*next1];
-      vlib_buffer_advance (b1, -adv);
-
-      vnet_buffer (b0)->feature_arc_index = feature_arc_index;
-      vnet_buffer (b1)->feature_arc_index = feature_arc_index;
-      b0->current_config_index =
-       vec_elt (cm->config_index_by_sw_if_index, sw_if_index);
-      b1->current_config_index = b0->current_config_index;
-      vnet_get_config_data (&cm->config_main, &b0->current_config_index,
-                           next0, /* # bytes of config data */ 0);
-      vnet_get_config_data (&cm->config_main, &b1->current_config_index,
-                           next1, /* # bytes of config data */ 0);
-    }
+  return vnet_have_features (fm->device_input_feature_arc_index, sw_if_index);
 }
 
 static_always_inline void
-vnet_feature_start_device_input_x4 (u32 sw_if_index,
-                                   u32 * next0,
-                                   u32 * next1,
-                                   u32 * next2,
-                                   u32 * next3,
-                                   vlib_buffer_t * b0,
-                                   vlib_buffer_t * b1,
-                                   vlib_buffer_t * b2, vlib_buffer_t * b3)
+vnet_feature_start_device_input (u32 sw_if_index, u32 *next0,
+                                vlib_buffer_t *b0)
 {
   vnet_feature_main_t *fm = &feature_main;
   vnet_feature_config_main_t *cm;
@@ -399,43 +356,11 @@ vnet_feature_start_device_input_x4 (u32 sw_if_index,
       (clib_bitmap_get
        (fm->sw_if_index_has_features[feature_arc_index], sw_if_index)))
     {
-      /*
-       * Save next0 so that the last feature in the chain
-       * can skip ethernet-input if indicated...
-       */
-      u16 adv;
-
-      adv = device_input_next_node_advance[*next0];
-      vlib_buffer_advance (b0, -adv);
-
-      adv = device_input_next_node_advance[*next1];
-      vlib_buffer_advance (b1, -adv);
-
-      adv = device_input_next_node_advance[*next2];
-      vlib_buffer_advance (b2, -adv);
-
-      adv = device_input_next_node_advance[*next3];
-      vlib_buffer_advance (b3, -adv);
-
       vnet_buffer (b0)->feature_arc_index = feature_arc_index;
-      vnet_buffer (b1)->feature_arc_index = feature_arc_index;
-      vnet_buffer (b2)->feature_arc_index = feature_arc_index;
-      vnet_buffer (b3)->feature_arc_index = feature_arc_index;
-
       b0->current_config_index =
        vec_elt (cm->config_index_by_sw_if_index, sw_if_index);
-      b1->current_config_index = b0->current_config_index;
-      b2->current_config_index = b0->current_config_index;
-      b3->current_config_index = b0->current_config_index;
-
       vnet_get_config_data (&cm->config_main, &b0->current_config_index,
                            next0, /* # bytes of config data */ 0);
-      vnet_get_config_data (&cm->config_main, &b1->current_config_index,
-                           next1, /* # bytes of config data */ 0);
-      vnet_get_config_data (&cm->config_main, &b2->current_config_index,
-                           next2, /* # bytes of config data */ 0);
-      vnet_get_config_data (&cm->config_main, &b3->current_config_index,
-                           next3, /* # bytes of config data */ 0);
     }
 }
 
@@ -446,6 +371,7 @@ clib_error_t *vnet_feature_arc_init
    vnet_config_main_t * vcm,
    char **feature_start_nodes,
    int num_feature_start_nodes,
+   char *last_in_arc,
    vnet_feature_registration_t * first_reg,
    vnet_feature_constraint_registration_t * first_const_set,
    char ***in_feature_nodes);
@@ -453,6 +379,16 @@ clib_error_t *vnet_feature_arc_init
 void vnet_interface_features_show (vlib_main_t * vm, u32 sw_if_index,
                                   int verbose);
 
+typedef void (*vnet_feature_update_cb_t) (u32 sw_if_index,
+                                         u8 arc_index,
+                                         u8 is_enable, void *cb);
+
+extern void vnet_feature_register (vnet_feature_update_cb_t cb, void *data);
+
+int
+vnet_feature_is_enabled (const char *arc_name, const char *feature_node_name,
+                        u32 sw_if_index);
+
 #endif /* included_feature_h */
 
 /*