devices: create dummy device-input node to keep nexts in sync 42/3742/3
authorDamjan Marion <[email protected]>
Wed, 9 Nov 2016 10:59:42 +0000 (11:59 +0100)
committerDave Barach <[email protected]>
Wed, 9 Nov 2016 14:03:25 +0000 (14:03 +0000)
device-input feature arc requires that all input-nodes have
nexts in sync. packet-generator tends to call vlib_node_add_next
when new stream is created and that puts nexts out of sync.

With this change all input node are siblings of device-input
node so call to vlib_node_add_next(...) will install same next
to the whole family.

Change-Id: I33d79492e5f30f348af19e527f36fe0222c524d7
Signed-off-by: Damjan Marion <[email protected]>
vnet/Makefile.am
vnet/vnet/devices/af_packet/node.c
vnet/vnet/devices/devices.c [moved from vnet/vnet/devices/feature.c with 74% similarity]
vnet/vnet/devices/devices.h
vnet/vnet/devices/dpdk/node.c
vnet/vnet/devices/netmap/node.c
vnet/vnet/devices/virtio/vhost-user.c
vnet/vnet/pg/input.c
vnet/vnet/pg/stream.c
vnet/vnet/unix/tapcli.c
vnet/vnet/unix/tuntap.c

index 185c08a..fef928a 100644 (file)
@@ -31,6 +31,7 @@ endif
 ########################################
 libvnet_la_SOURCES +=                                  \
   vnet/config.c                                                \
+  vnet/devices/devices.c                               \
   vnet/handoff.c                                       \
   vnet/interface.c                                     \
   vnet/interface_cli.c                                 \
@@ -721,7 +722,6 @@ nobase_include_HEADERS +=                   \
 ########################################
 
 libvnet_la_SOURCES +=                          \
-  vnet/devices/feature.c                       \
   vnet/feature/feature.c                       \
   vnet/feature/registration.c
 
index 29fdc71..083c558 100644 (file)
@@ -283,14 +283,12 @@ af_packet_input_fn (vlib_main_t * vm, vlib_node_runtime_t * node,
 VLIB_REGISTER_NODE (af_packet_input_node) = {
   .function = af_packet_input_fn,
   .name = "af-packet-input",
+  .sibling_of = "device-input",
   .format_trace = format_af_packet_input_trace,
   .type = VLIB_NODE_TYPE_INPUT,
   .state = VLIB_NODE_STATE_INTERRUPT,
   .n_errors = AF_PACKET_INPUT_N_ERROR,
   .error_strings = af_packet_input_error_strings,
-
-  .n_next_nodes = VNET_DEVICE_INPUT_N_NEXT_NODES,
-  .next_nodes = VNET_DEVICE_INPUT_NEXT_NODES,
 };
 
 VLIB_NODE_FUNCTION_MULTIARCH (af_packet_input_node, af_packet_input_fn)
similarity index 74%
rename from vnet/vnet/devices/feature.c
rename to vnet/vnet/devices/devices.c
index 5a31cd6..2675330 100644 (file)
  * limitations under the License.
  */
 
+#include <vnet/devices/devices.h>
 #include <vnet/feature/feature.h>
 
+static uword
+device_input_fn (vlib_main_t * vm, vlib_node_runtime_t * node,
+                vlib_frame_t * frame)
+{
+  return 0;
+}
+
 /* *INDENT-OFF* */
+VLIB_REGISTER_NODE (device_input_node) = {
+  .function = device_input_fn,
+  .name = "device-input",
+  .type = VLIB_NODE_TYPE_INPUT,
+  .state = VLIB_NODE_STATE_DISABLED,
+  .n_next_nodes = VNET_DEVICE_INPUT_N_NEXT_NODES,
+  .next_nodes = VNET_DEVICE_INPUT_NEXT_NODES,
+};
+
 VNET_FEATURE_ARC_INIT (device_input, static) =
 {
   .arc_name  = "device-input",
-  .start_nodes =
-  VNET_FEATURES (
-#if DPDK > 0
-                 "dpdk-input",
-#endif
-                 "vhost-user-input", "af-packet-input", "netmap-input",
-                 "tuntap-rx", "tapcli-rx", "pg-input"),
+  .start_nodes = VNET_FEATURES ("device-input"),
 };
 
 VNET_FEATURE_INIT (l2_patch, static) = {
index 9c74dc3..b9a8aaa 100644 (file)
@@ -37,6 +37,8 @@ typedef enum
     [VNET_DEVICE_INPUT_NEXT_MPLS_INPUT] = "mpls-input",                        \
 }
 
+extern vlib_node_registration_t device_input_node;
+
 #endif /* included_vnet_vnet_device_h */
 
 /*
index bd2355b..02c3118 100644 (file)
@@ -708,6 +708,7 @@ VLIB_REGISTER_NODE (dpdk_input_node) = {
   .function = dpdk_input,
   .type = VLIB_NODE_TYPE_INPUT,
   .name = "dpdk-input",
+  .sibling_of = "device-input",
 
   /* Will be enabled if/when hardware is detected. */
   .state = VLIB_NODE_STATE_DISABLED,
@@ -717,9 +718,6 @@ VLIB_REGISTER_NODE (dpdk_input_node) = {
 
   .n_errors = DPDK_N_ERROR,
   .error_strings = dpdk_error_strings,
-
-  .n_next_nodes = VNET_DEVICE_INPUT_N_NEXT_NODES,
-  .next_nodes = VNET_DEVICE_INPUT_NEXT_NODES,
 };
 
 
index 54d0aa1..b96bada 100644 (file)
@@ -294,15 +294,13 @@ netmap_input_fn (vlib_main_t * vm, vlib_node_runtime_t * node,
 VLIB_REGISTER_NODE (netmap_input_node) = {
   .function = netmap_input_fn,
   .name = "netmap-input",
+  .sibling_of = "device-input",
   .format_trace = format_netmap_input_trace,
   .type = VLIB_NODE_TYPE_INPUT,
   /* default state is INTERRUPT mode, switch to POLLING if worker threads are enabled */
   .state = VLIB_NODE_STATE_INTERRUPT,
   .n_errors = NETMAP_INPUT_N_ERROR,
   .error_strings = netmap_input_error_strings,
-
-  .n_next_nodes = VNET_DEVICE_INPUT_N_NEXT_NODES,
-  .next_nodes = VNET_DEVICE_INPUT_NEXT_NODES,
 };
 
 VLIB_NODE_FUNCTION_MULTIARCH (netmap_input_node, netmap_input_fn)
index d7256e2..b9e08a1 100644 (file)
@@ -1719,6 +1719,7 @@ VLIB_REGISTER_NODE (vhost_user_input_node) = {
   .function = vhost_user_input,
   .type = VLIB_NODE_TYPE_INPUT,
   .name = "vhost-user-input",
+  .sibling_of = "device-input",
 
   /* Will be enabled if/when hardware is detected. */
   .state = VLIB_NODE_STATE_DISABLED,
@@ -1728,9 +1729,6 @@ VLIB_REGISTER_NODE (vhost_user_input_node) = {
 
   .n_errors = VHOST_USER_INPUT_FUNC_N_ERROR,
   .error_strings = vhost_user_input_func_error_strings,
-
-  .n_next_nodes = VNET_DEVICE_INPUT_N_NEXT_NODES,
-  .next_nodes = VNET_DEVICE_INPUT_NEXT_NODES,
 };
 
 VLIB_NODE_FUNCTION_MULTIARCH (vhost_user_input_node, vhost_user_input)
index 735a85e..54687d5 100644 (file)
@@ -1702,14 +1702,13 @@ pg_input (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame)
 VLIB_REGISTER_NODE (pg_input_node) = {
   .function = pg_input,
   .name = "pg-input",
+  .sibling_of = "device-input",
   .type = VLIB_NODE_TYPE_INPUT,
 
   .format_trace = format_pg_input_trace,
 
   /* Input node will be left disabled until a stream is active. */
   .state = VLIB_NODE_STATE_DISABLED,
-  .n_next_nodes = VNET_DEVICE_INPUT_N_NEXT_NODES,
-  .next_nodes = VNET_DEVICE_INPUT_NEXT_NODES,
 };
 /* *INDENT-ON* */
 
index 7c865e1..4dd71d9 100644 (file)
@@ -42,6 +42,7 @@
 #include <vnet/ethernet/ethernet.h>
 #include <vnet/ip/ip.h>
 #include <vnet/mpls/mpls.h>
+#include <vnet/devices/devices.h>
 
 /* Mark stream active or inactive. */
 void
@@ -459,7 +460,8 @@ pg_stream_add (pg_main_t * pg, pg_stream_t * s_init)
   }
 
   /* Connect the graph. */
-  s->next_index = vlib_node_add_next (vm, pg_input_node.index, s->node_index);
+  s->next_index = vlib_node_add_next (vm, device_input_node.index,
+                                     s->node_index);
 }
 
 void
index a255e65..d23e6fe 100644 (file)
@@ -447,15 +447,13 @@ static char * tapcli_rx_error_strings[] = {
 VLIB_REGISTER_NODE (tapcli_rx_node, static) = {
   .function = tapcli_rx,
   .name = "tapcli-rx",
+  .sibling_of = "device-input",
   .type = VLIB_NODE_TYPE_INPUT,
   .state = VLIB_NODE_STATE_INTERRUPT,
   .vector_size = 4,
   .n_errors = TAPCLI_N_ERROR,
   .error_strings = tapcli_rx_error_strings,
   .format_trace = format_tapcli_rx_trace,
-
-  .n_next_nodes = VNET_DEVICE_INPUT_N_NEXT_NODES,
-  .next_nodes = VNET_DEVICE_INPUT_NEXT_NODES,
 };
 
 
index 4eab391..dbb6f30 100644 (file)
@@ -414,14 +414,12 @@ static char * tuntap_rx_error_strings[] = {
 VLIB_REGISTER_NODE (tuntap_rx_node,static) = {
   .function = tuntap_rx,
   .name = "tuntap-rx",
+  .sibling_of = "device-input",
   .type = VLIB_NODE_TYPE_INPUT,
   .state = VLIB_NODE_STATE_INTERRUPT,
   .vector_size = 4,
   .n_errors = 1,
   .error_strings = tuntap_rx_error_strings,
-
-  .n_next_nodes = VNET_DEVICE_INPUT_N_NEXT_NODES,
-  .next_nodes = VNET_DEVICE_INPUT_NEXT_NODES,
 };
 
 /**