Update sample plugin and plugin skeletons: use driver feature arc 35/3735/2
authorDave Barach <dave@barachs.net>
Tue, 8 Nov 2016 21:47:34 +0000 (16:47 -0500)
committerDamjan Marion <dmarion.lists@gmail.com>
Wed, 9 Nov 2016 11:36:02 +0000 (11:36 +0000)
Change-Id: Ic0a1479e4a0408a4b93f47e50752d07c2bdccdde
Signed-off-by: Dave Barach <dave@barachs.net>
build-root/emacs-lisp/plugin-main-skel.el
build-root/emacs-lisp/plugin-makefile-skel.el
build-root/emacs-lisp/plugin-node-skel.el
plugins/sample-plugin/sample/node.c
plugins/sample-plugin/sample/sample.c

index 0c9cd51..196f865 100644 (file)
@@ -127,8 +127,7 @@ int " plugin-name "_enable_disable (" plugin-name "_main_t * sm, u32 sw_if_index
                                    int enable_disable)
 {
   vnet_sw_interface_t * sw;
-  int rv;
-  u32 node_index = enable_disable ? " plugin-name "_node.index : ~0;
+  int rv = 0;
 
   /* Utterly wrong? */
   if (pool_is_free_index (sm->vnet_main->interface_main.sw_interfaces, 
@@ -140,15 +139,9 @@ int " plugin-name "_enable_disable (" plugin-name "_main_t * sm, u32 sw_if_index
   if (sw->type != VNET_SW_INTERFACE_TYPE_HARDWARE)
     return VNET_API_ERROR_INVALID_SW_IF_INDEX;
   
-  /* 
-   * Redirect pkts from the driver to the macswap node.
-   * Returns VNET_API_ERROR_UNIMPLEMENTED if the h/w driver
-   * doesn't implement the API. 
-   *
-   * Node_index = ~0 => shut off redirection
-   */
-  rv = vnet_hw_interface_rx_redirect_to_node (sm->vnet_main, sw_if_index,
-                                              node_index);
+  vnet_feature_enable_disable (\"device-input\", \"" plugin-name "\",
+                               sw_if_index, enable_disable, 0, 0);
+
   return rv;
 }
 
@@ -258,5 +251,12 @@ static clib_error_t * " plugin-name "_init (vlib_main_t * vm)
 }
 
 VLIB_INIT_FUNCTION (" plugin-name "_init);
+
+VNET_FEATURE_INIT (" plugin-name ", static) = 
+{
+  .arc_name = \"device-input\",
+  .node_name = \"" plugin-name "\",
+  .runs_before = VNET_FEATURES (\"ethernet-input\"),
+};
 ")
 
index dc17ddb..7cb6cbf 100644 (file)
@@ -72,5 +72,4 @@ noinst_HEADERS =                      \\
 install-data-hook:
        @(cd $(vpppluginsdir) && $(RM) $(vppplugins_LTLIBRARIES))
        @(cd $(vppapitestpluginsdir) && $(RM) $(vppapitestplugins_LTLIBRARIES))
-endif
 ")
index 0d88a2e..ee745c3 100644 (file)
@@ -47,8 +47,18 @@ nil
 typedef struct {
   u32 next_index;
   u32 sw_if_index;
+  u8 new_src_mac[6];
+  u8 new_dst_mac[6];
 } " plugin-name "_trace_t;
 
+static u8 *
+format_mac_address (u8 * s, va_list * args)
+{
+  u8 *a = va_arg (*args, u8 *);
+  return format (s, \"%02x:%02x:%02x:%02x:%02x:%02x\",
+                a[0], a[1], a[2], a[3], a[4], a[5]);
+}
+
 /* packet trace format function */
 static u8 * format_" plugin-name "_trace (u8 * s, va_list * args)
 {
@@ -56,8 +66,11 @@ static u8 * format_" plugin-name "_trace (u8 * s, va_list * args)
   CLIB_UNUSED (vlib_node_t * node) = va_arg (*args, vlib_node_t *);
   " plugin-name "_trace_t * t = va_arg (*args, " plugin-name "_trace_t *);
   
-  s = format (s, \"" PLUGIN-NAME ": sw_if_index %d, next index %d\",
+  s = format (s, \"" PLUGIN-NAME ": sw_if_index %d, next index %d\\n\",
               t->sw_if_index, t->next_index);
+  s = format (s, \"  new src %U -> new dst %U\",
+              format_mac_address, t->new_src_mac, 
+              format_mac_address, t->new_dst_mac);
   return s;
 }
 
@@ -193,6 +206,10 @@ static uword
                       vlib_add_trace (vm, node, b0, sizeof (*t));
                     t->sw_if_index = sw_if_index0;
                     t->next_index = next0;
+                    clib_memcpy (t->new_src_mac, en0->src_address,
+                                 sizeof (t->new_src_mac));
+                    clib_memcpy (t->new_dst_mac, en0->dst_address,
+                                 sizeof (t->new_dst_mac));
                   }
                 if (b1->flags & VLIB_BUFFER_IS_TRACED) 
                   {
@@ -200,6 +217,10 @@ static uword
                       vlib_add_trace (vm, node, b1, sizeof (*t));
                     t->sw_if_index = sw_if_index1;
                     t->next_index = next1;
+                    clib_memcpy (t->new_src_mac, en1->src_address,
+                                 sizeof (t->new_src_mac));
+                    clib_memcpy (t->new_dst_mac, en1->dst_address,
+                                 sizeof (t->new_dst_mac));
                   }
               }
             
@@ -257,6 +278,10 @@ static uword
                vlib_add_trace (vm, node, b0, sizeof (*t));
             t->sw_if_index = sw_if_index0;
             t->next_index = next0;
+            clib_memcpy (t->new_src_mac, en0->src_address,
+                         sizeof (t->new_src_mac));
+            clib_memcpy (t->new_dst_mac, en0->dst_address,
+                         sizeof (t->new_dst_mac));
             }
             
           pkts_swapped += 1;
index 9f8ddc1..94c1706 100644 (file)
 typedef struct {
   u32 next_index;
   u32 sw_if_index;
+  u8 new_src_mac[6];
+  u8 new_dst_mac[6];
 } sample_trace_t;
 
+static u8 *
+format_mac_address (u8 * s, va_list * args)
+{
+  u8 *a = va_arg (*args, u8 *);
+  return format (s, "%02x:%02x:%02x:%02x:%02x:%02x",
+                a[0], a[1], a[2], a[3], a[4], a[5]);
+}
+
 /* packet trace format function */
 static u8 * format_sample_trace (u8 * s, va_list * args)
 {
@@ -30,8 +40,12 @@ static u8 * format_sample_trace (u8 * s, va_list * args)
   CLIB_UNUSED (vlib_node_t * node) = va_arg (*args, vlib_node_t *);
   sample_trace_t * t = va_arg (*args, sample_trace_t *);
   
-  s = format (s, "SAMPLE: sw_if_index %d, next index %d",
+  s = format (s, "SAMPLE: sw_if_index %d, next index %d\n",
               t->sw_if_index, t->next_index);
+  s = format (s, "  new src %U -> new dst %U",
+              format_mac_address, t->new_src_mac, 
+              format_mac_address, t->new_dst_mac);
+
   return s;
 }
 
@@ -167,6 +181,11 @@ sample_node_fn (vlib_main_t * vm,
                       vlib_add_trace (vm, node, b0, sizeof (*t));
                     t->sw_if_index = sw_if_index0;
                     t->next_index = next0;
+                    clib_memcpy (t->new_src_mac, en0->src_address,
+                                 sizeof (t->new_src_mac));
+                    clib_memcpy (t->new_dst_mac, en0->dst_address,
+                                 sizeof (t->new_dst_mac));
+                    
                   }
                 if (b1->flags & VLIB_BUFFER_IS_TRACED) 
                   {
@@ -174,6 +193,10 @@ sample_node_fn (vlib_main_t * vm,
                       vlib_add_trace (vm, node, b1, sizeof (*t));
                     t->sw_if_index = sw_if_index1;
                     t->next_index = next1;
+                    clib_memcpy (t->new_src_mac, en1->src_address,
+                                 sizeof (t->new_src_mac));
+                    clib_memcpy (t->new_dst_mac, en1->dst_address,
+                                 sizeof (t->new_dst_mac));
                   }
               }
             
@@ -231,6 +254,10 @@ sample_node_fn (vlib_main_t * vm,
                vlib_add_trace (vm, node, b0, sizeof (*t));
             t->sw_if_index = sw_if_index0;
             t->next_index = next0;
+            clib_memcpy (t->new_src_mac, en0->src_address,
+                         sizeof (t->new_src_mac));
+            clib_memcpy (t->new_dst_mac, en0->dst_address,
+                         sizeof (t->new_dst_mac));
             }
             
           pkts_swapped += 1;
index 155c845..321b66c 100644 (file)
@@ -106,8 +106,7 @@ int sample_macswap_enable_disable (sample_main_t * sm, u32 sw_if_index,
                                    int enable_disable)
 {
   vnet_sw_interface_t * sw;
-  int rv;
-  u32 node_index = enable_disable ? sample_node.index : ~0;
+  int rv = 0;
 
   /* Utterly wrong? */
   if (pool_is_free_index (sm->vnet_main->interface_main.sw_interfaces, 
@@ -119,15 +118,9 @@ int sample_macswap_enable_disable (sample_main_t * sm, u32 sw_if_index,
   if (sw->type != VNET_SW_INTERFACE_TYPE_HARDWARE)
     return VNET_API_ERROR_INVALID_SW_IF_INDEX;
   
-  /* 
-   * Redirect pkts from the driver to the macswap node.
-   * Returns VNET_API_ERROR_UNIMPLEMENTED if the h/w driver
-   * doesn't implement the API. 
-   *
-   * Node_index = ~0 => shut off redirection
-   */
-  rv = vnet_hw_interface_rx_redirect_to_node (sm->vnet_main, sw_if_index,
-                                              node_index);
+  vnet_feature_enable_disable ("device-input", "sample",
+                               sw_if_index, enable_disable, 0, 0);
+
   return rv;
 }
 
@@ -238,4 +231,9 @@ static clib_error_t * sample_init (vlib_main_t * vm)
 
 VLIB_INIT_FUNCTION (sample_init);
 
-
+VNET_FEATURE_INIT (sample, static) = 
+{
+  .arc_name = "device-input",
+  .node_name = "sample",
+  .runs_before = VNET_FEATURES ("ethernet-input"),
+};