summaryrefslogtreecommitdiffstats
path: root/vnet/vnet/devices
diff options
context:
space:
mode:
authorDamjan Marion <damarion@cisco.com>2016-11-09 11:59:42 +0100
committerDave Barach <openvpp@barachs.net>2016-11-09 14:03:25 +0000
commit51327ac5f9ffbe74eb32f26697c563b92eadc3ce (patch)
tree164fbf4e4448553900a232b13334e3a9ef01b142 /vnet/vnet/devices
parent66bcab2fff54531a126ddabe3b377df3fc536731 (diff)
devices: create dummy device-input node to keep nexts in sync
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 <damarion@cisco.com>
Diffstat (limited to 'vnet/vnet/devices')
-rw-r--r--vnet/vnet/devices/af_packet/node.c4
-rw-r--r--vnet/vnet/devices/devices.c (renamed from vnet/vnet/devices/feature.c)25
-rw-r--r--vnet/vnet/devices/devices.h2
-rw-r--r--vnet/vnet/devices/dpdk/node.c4
-rw-r--r--vnet/vnet/devices/netmap/node.c4
-rw-r--r--vnet/vnet/devices/virtio/vhost-user.c4
6 files changed, 24 insertions, 19 deletions
diff --git a/vnet/vnet/devices/af_packet/node.c b/vnet/vnet/devices/af_packet/node.c
index 29fdc7142e8..083c5581c2d 100644
--- a/vnet/vnet/devices/af_packet/node.c
+++ b/vnet/vnet/devices/af_packet/node.c
@@ -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)
diff --git a/vnet/vnet/devices/feature.c b/vnet/vnet/devices/devices.c
index 5a31cd64d61..26753305db2 100644
--- a/vnet/vnet/devices/feature.c
+++ b/vnet/vnet/devices/devices.c
@@ -13,19 +13,30 @@
* 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) = {
diff --git a/vnet/vnet/devices/devices.h b/vnet/vnet/devices/devices.h
index 9c74dc314fe..b9a8aaa3cbc 100644
--- a/vnet/vnet/devices/devices.h
+++ b/vnet/vnet/devices/devices.h
@@ -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 */
/*
diff --git a/vnet/vnet/devices/dpdk/node.c b/vnet/vnet/devices/dpdk/node.c
index bd2355b2a6a..02c311863fc 100644
--- a/vnet/vnet/devices/dpdk/node.c
+++ b/vnet/vnet/devices/dpdk/node.c
@@ -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,
};
diff --git a/vnet/vnet/devices/netmap/node.c b/vnet/vnet/devices/netmap/node.c
index 54d0aa15c22..b96bada5f37 100644
--- a/vnet/vnet/devices/netmap/node.c
+++ b/vnet/vnet/devices/netmap/node.c
@@ -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)
diff --git a/vnet/vnet/devices/virtio/vhost-user.c b/vnet/vnet/devices/virtio/vhost-user.c
index d7256e223f0..b9e08a147c1 100644
--- a/vnet/vnet/devices/virtio/vhost-user.c
+++ b/vnet/vnet/devices/virtio/vhost-user.c
@@ -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)