diff options
author | Damjan Marion <damarion@cisco.com> | 2016-11-02 14:48:21 +0100 |
---|---|---|
committer | Dave Barach <openvpp@barachs.net> | 2016-11-02 19:28:08 +0000 |
commit | 8bdc63b6036167e080b6501c17e7691033b64319 (patch) | |
tree | 24bc069f81fa87cc442266ef02a66c06de803f16 | |
parent | 3a8345f6e0b66bf165b11b767d1f6da4b35bc280 (diff) |
feature: all input nodes must have same nexts
Change-Id: Ie4c820933114af2269c99531856c45b0271a4a3e
Signed-off-by: Damjan Marion <damarion@cisco.com>
-rw-r--r-- | vnet/Makefile.am | 1 | ||||
-rw-r--r-- | vnet/vnet/devices/af_packet/node.c | 17 | ||||
-rw-r--r-- | vnet/vnet/devices/devices.h | 48 | ||||
-rw-r--r-- | vnet/vnet/devices/dpdk/dpdk.h | 13 | ||||
-rw-r--r-- | vnet/vnet/devices/dpdk/node.c | 57 | ||||
-rw-r--r-- | vnet/vnet/devices/feature.c | 4 | ||||
-rw-r--r-- | vnet/vnet/devices/netmap/node.c | 17 | ||||
-rw-r--r-- | vnet/vnet/devices/ssvm/node.c | 2 | ||||
-rw-r--r-- | vnet/vnet/devices/virtio/vhost-user.c | 22 | ||||
-rw-r--r-- | vnet/vnet/unix/tuntap.c | 28 |
10 files changed, 88 insertions, 121 deletions
diff --git a/vnet/Makefile.am b/vnet/Makefile.am index 96306dd3ccd..f53a61bfd44 100644 --- a/vnet/Makefile.am +++ b/vnet/Makefile.am @@ -44,6 +44,7 @@ nobase_include_HEADERS += \ vnet/api_errno.h \ vnet/buffer.h \ vnet/config.h \ + vnet/devices/devices.h \ vnet/global_funcs.h \ vnet/handoff.h \ vnet/interface.h \ diff --git a/vnet/vnet/devices/af_packet/node.c b/vnet/vnet/devices/af_packet/node.c index f086b8da1df..8c0d645596a 100644 --- a/vnet/vnet/devices/af_packet/node.c +++ b/vnet/vnet/devices/af_packet/node.c @@ -23,6 +23,7 @@ #include <vlib/unix/unix.h> #include <vnet/ip/ip.h> #include <vnet/ethernet/ethernet.h> +#include <vnet/devices/devices.h> #include <vnet/feature/feature.h> #include <vnet/devices/af_packet/af_packet.h> @@ -43,13 +44,6 @@ static char *af_packet_input_error_strings[] = { #undef _ }; -enum -{ - AF_PACKET_INPUT_NEXT_DROP, - AF_PACKET_INPUT_NEXT_ETHERNET_INPUT, - AF_PACKET_INPUT_N_NEXT, -}; - typedef struct { u32 next_index; @@ -130,7 +124,7 @@ af_packet_device_input_fn (vlib_main_t * vm, vlib_node_runtime_t * node, af_packet_main_t *apm = &af_packet_main; af_packet_if_t *apif = pool_elt_at_index (apm->interfaces, device_idx); struct tpacket2_hdr *tph; - u32 next_index = AF_PACKET_INPUT_NEXT_ETHERNET_INPUT; + u32 next_index = VNET_DEVICE_INPUT_NEXT_ETHERNET_INPUT; u32 block = 0; u32 rx_frame; u32 n_free_bufs; @@ -295,11 +289,8 @@ VLIB_REGISTER_NODE (af_packet_input_node) = { .n_errors = AF_PACKET_INPUT_N_ERROR, .error_strings = af_packet_input_error_strings, - .n_next_nodes = AF_PACKET_INPUT_N_NEXT, - .next_nodes = { - [AF_PACKET_INPUT_NEXT_DROP] = "error-drop", - [AF_PACKET_INPUT_NEXT_ETHERNET_INPUT] = "ethernet-input", - }, + .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/devices.h b/vnet/vnet/devices/devices.h new file mode 100644 index 00000000000..9c74dc314fe --- /dev/null +++ b/vnet/vnet/devices/devices.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2016 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef included_vnet_vnet_device_h +#define included_vnet_vnet_device_h + +#include <vnet/unix/pcap.h> +#include <vnet/l3_types.h> + +typedef enum +{ + VNET_DEVICE_INPUT_NEXT_IP4_INPUT, + VNET_DEVICE_INPUT_NEXT_IP6_INPUT, + VNET_DEVICE_INPUT_NEXT_MPLS_INPUT, + VNET_DEVICE_INPUT_NEXT_ETHERNET_INPUT, + VNET_DEVICE_INPUT_NEXT_DROP, + VNET_DEVICE_INPUT_N_NEXT_NODES, +} vnet_device_input_next_t; + +#define VNET_DEVICE_INPUT_NEXT_NODES { \ + [VNET_DEVICE_INPUT_NEXT_DROP] = "error-drop", \ + [VNET_DEVICE_INPUT_NEXT_ETHERNET_INPUT] = "ethernet-input", \ + [VNET_DEVICE_INPUT_NEXT_IP4_INPUT] = "ip4-input-no-checksum", \ + [VNET_DEVICE_INPUT_NEXT_IP6_INPUT] = "ip6-input", \ + [VNET_DEVICE_INPUT_NEXT_MPLS_INPUT] = "mpls-input", \ +} + +#endif /* included_vnet_vnet_device_h */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vnet/vnet/devices/dpdk/dpdk.h b/vnet/vnet/devices/dpdk/dpdk.h index dfbfce5066b..1d2b4b7655e 100644 --- a/vnet/vnet/devices/dpdk/dpdk.h +++ b/vnet/vnet/devices/dpdk/dpdk.h @@ -50,6 +50,7 @@ #include <rte_sched.h> #include <vnet/unix/pcap.h> +#include <vnet/devices/devices.h> #if CLIB_DEBUG > 0 #define always_inline static inline @@ -474,16 +475,6 @@ typedef struct dpdk_main_t dpdk_main; -typedef enum -{ - DPDK_RX_NEXT_IP4_INPUT, - DPDK_RX_NEXT_IP6_INPUT, - DPDK_RX_NEXT_MPLS_INPUT, - DPDK_RX_NEXT_ETHERNET_INPUT, - DPDK_RX_NEXT_DROP, - DPDK_RX_N_NEXT, -} dpdk_rx_next_t; - typedef struct { u32 buffer_index; @@ -506,8 +497,6 @@ typedef struct void vnet_buffer_needs_dpdk_mb (vlib_buffer_t * b); -void dpdk_set_next_node (dpdk_rx_next_t, char *); - clib_error_t *dpdk_set_mac_address (vnet_hw_interface_t * hi, char *address); clib_error_t *dpdk_set_mc_filter (vnet_hw_interface_t * hi, diff --git a/vnet/vnet/devices/dpdk/node.c b/vnet/vnet/devices/dpdk/node.c index 01a6094e589..bcb4feac315 100644 --- a/vnet/vnet/devices/dpdk/node.c +++ b/vnet/vnet/devices/dpdk/node.c @@ -23,6 +23,7 @@ #include <vnet/classify/vnet_classify.h> #include <vnet/mpls/packet.h> #include <vnet/handoff.h> +#include <vnet/devices/devices.h> #include <vnet/feature/feature.h> #include "dpdk_priv.h" @@ -91,7 +92,7 @@ dpdk_rx_next_and_error_from_mb_flags_x1 (dpdk_device_t * xd, PKT_RX_IP_CKSUM_BAD | PKT_RX_L4_CKSUM_BAD))) { /* some error was flagged. determine the drop reason */ - n0 = DPDK_RX_NEXT_DROP; + n0 = VNET_DEVICE_INPUT_NEXT_DROP; *error0 = #ifdef RTE_LIBRTE_MBUF_EXT_RX_OLFLAGS (mb_flags & PKT_EXT_RX_PKT_ERROR) ? DPDK_ERROR_RX_PACKET_ERROR : @@ -124,17 +125,17 @@ dpdk_rx_next_and_error_from_mb_flags_x1 (dpdk_device_t * xd, else if (PREDICT_FALSE ((xd->flags & DPDK_DEVICE_FLAG_HAVE_SUBIF) || (mb_flags & PKT_RX_VLAN_PKT))) - n0 = DPDK_RX_NEXT_ETHERNET_INPUT; + n0 = VNET_DEVICE_INPUT_NEXT_ETHERNET_INPUT; else { if (PREDICT_TRUE (dpdk_mbuf_is_ip4 (mb))) - n0 = DPDK_RX_NEXT_IP4_INPUT; + n0 = VNET_DEVICE_INPUT_NEXT_IP4_INPUT; else if (PREDICT_TRUE (dpdk_mbuf_is_ip6 (mb))) - n0 = DPDK_RX_NEXT_IP6_INPUT; + n0 = VNET_DEVICE_INPUT_NEXT_IP6_INPUT; else if (PREDICT_TRUE (vlib_buffer_is_mpls (b0))) - n0 = DPDK_RX_NEXT_MPLS_INPUT; + n0 = VNET_DEVICE_INPUT_NEXT_MPLS_INPUT; else - n0 = DPDK_RX_NEXT_ETHERNET_INPUT; + n0 = VNET_DEVICE_INPUT_NEXT_ETHERNET_INPUT; } } *next0 = n0; @@ -323,7 +324,7 @@ dpdk_device_input (dpdk_main_t * dm, u32 cpu_index, u16 queue_id, int use_efd) { u32 n_buffers; - u32 next_index = DPDK_RX_NEXT_ETHERNET_INPUT; + u32 next_index = VNET_DEVICE_INPUT_NEXT_ETHERNET_INPUT; u32 n_left_to_next, *to_next; u32 mb_index; vlib_main_t *vm = vlib_get_main (); @@ -475,9 +476,9 @@ dpdk_device_input (dpdk_main_t * dm, b0->error = node->errors[error0]; - l3_offset0 = ((next0 == DPDK_RX_NEXT_IP4_INPUT || - next0 == DPDK_RX_NEXT_IP6_INPUT || - next0 == DPDK_RX_NEXT_MPLS_INPUT) ? + l3_offset0 = ((next0 == VNET_DEVICE_INPUT_NEXT_IP4_INPUT || + next0 == VNET_DEVICE_INPUT_NEXT_IP6_INPUT || + next0 == VNET_DEVICE_INPUT_NEXT_MPLS_INPUT) ? sizeof (ethernet_header_t) : 0); b0->current_data = l3_offset0; @@ -717,14 +718,8 @@ VLIB_REGISTER_NODE (dpdk_input_node) = { .n_errors = DPDK_N_ERROR, .error_strings = dpdk_error_strings, - .n_next_nodes = DPDK_RX_N_NEXT, - .next_nodes = { - [DPDK_RX_NEXT_DROP] = "error-drop", - [DPDK_RX_NEXT_ETHERNET_INPUT] = "ethernet-input", - [DPDK_RX_NEXT_IP4_INPUT] = "ip4-input-no-checksum", - [DPDK_RX_NEXT_IP6_INPUT] = "ip6-input", - [DPDK_RX_NEXT_MPLS_INPUT] = "mpls-input", - }, + .n_next_nodes = VNET_DEVICE_INPUT_N_NEXT_NODES, + .next_nodes = VNET_DEVICE_INPUT_NEXT_NODES, }; @@ -739,32 +734,6 @@ CLIB_MULTIARCH_SELECT_FN(dpdk_input_rss); CLIB_MULTIARCH_SELECT_FN(dpdk_input_efd); /* - * Override the next nodes for the dpdk input nodes. - * Must be invoked prior to VLIB_INIT_FUNCTION calls. - */ -void -dpdk_set_next_node (dpdk_rx_next_t next, char *name) -{ - vlib_node_registration_t *r = &dpdk_input_node; - vlib_node_registration_t *r_handoff = &handoff_dispatch_node; - - switch (next) - { - case DPDK_RX_NEXT_IP4_INPUT: - case DPDK_RX_NEXT_IP6_INPUT: - case DPDK_RX_NEXT_MPLS_INPUT: - case DPDK_RX_NEXT_ETHERNET_INPUT: - r->next_nodes[next] = name; - r_handoff->next_nodes[next] = name; - break; - - default: - clib_warning ("%s: illegal next %d\n", __FUNCTION__, next); - break; - } -} - -/* * set_efd_bitmap() * Based on the operation type, set lower/upper bits for the given index value */ diff --git a/vnet/vnet/devices/feature.c b/vnet/vnet/devices/feature.c index 8de78178b26..f55d1860c14 100644 --- a/vnet/vnet/devices/feature.c +++ b/vnet/vnet/devices/feature.c @@ -19,9 +19,9 @@ VNET_FEATURE_ARC_INIT (device_input, static) = { .arc_name = "device-input", #if DPDK > 0 - .start_nodes = VNET_FEATURES ("dpdk-input", "vhost-user-input", "af-packet-input", "netmap-input"), + .start_nodes = VNET_FEATURES ("dpdk-input", "vhost-user-input", "af-packet-input", "netmap-input", "tuntap-rx"), #else - .start_nodes = VNET_FEATURES ("vhost-user-input", "af-packet-input", "netmap-input"), + .start_nodes = VNET_FEATURES ("vhost-user-input", "af-packet-input", "netmap-input", "tuntap-rx"), #endif }; diff --git a/vnet/vnet/devices/netmap/node.c b/vnet/vnet/devices/netmap/node.c index d13fa1bc7b5..fb60fbd6cce 100644 --- a/vnet/vnet/devices/netmap/node.c +++ b/vnet/vnet/devices/netmap/node.c @@ -22,6 +22,7 @@ #include <vlib/vlib.h> #include <vlib/unix/unix.h> #include <vnet/ethernet/ethernet.h> +#include <vnet/devices/devices.h> #include <vnet/feature/feature.h> #include <vnet/devices/netmap/net_netmap.h> @@ -43,13 +44,6 @@ static char *netmap_input_error_strings[] = { #undef _ }; -enum -{ - NETMAP_INPUT_NEXT_DROP, - NETMAP_INPUT_NEXT_ETHERNET_INPUT, - NETMAP_INPUT_N_NEXT, -}; - typedef struct { u32 next_index; @@ -106,7 +100,7 @@ always_inline uword netmap_device_input_fn (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame, netmap_if_t * nif) { - u32 next_index = NETMAP_INPUT_NEXT_ETHERNET_INPUT; + u32 next_index = VNET_DEVICE_INPUT_NEXT_ETHERNET_INPUT; uword n_trace = vlib_get_trace_count (vm, node); netmap_main_t *nm = &netmap_main; u32 n_rx_packets = 0; @@ -306,11 +300,8 @@ VLIB_REGISTER_NODE (netmap_input_node) = { .n_errors = NETMAP_INPUT_N_ERROR, .error_strings = netmap_input_error_strings, - .n_next_nodes = NETMAP_INPUT_N_NEXT, - .next_nodes = { - [NETMAP_INPUT_NEXT_DROP] = "error-drop", - [NETMAP_INPUT_NEXT_ETHERNET_INPUT] = "ethernet-input", - }, + .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/ssvm/node.c b/vnet/vnet/devices/ssvm/node.c index e613cc9cb01..5ecccd376c0 100644 --- a/vnet/vnet/devices/ssvm/node.c +++ b/vnet/vnet/devices/ssvm/node.c @@ -78,7 +78,7 @@ ssvm_eth_device_input (ssvm_eth_main_t * em, u32 n_to_alloc = VLIB_FRAME_SIZE * 2; u32 n_allocated, n_present_in_cache; #if DPDK > 0 - u32 next_index = DPDK_RX_NEXT_ETHERNET_INPUT; + u32 next_index = VNET_DEVICE_INPUT_NEXT_ETHERNET_INPUT; #else u32 next_index = 0; #endif diff --git a/vnet/vnet/devices/virtio/vhost-user.c b/vnet/vnet/devices/virtio/vhost-user.c index bdac7c24861..b55547cd16c 100644 --- a/vnet/vnet/devices/virtio/vhost-user.c +++ b/vnet/vnet/devices/virtio/vhost-user.c @@ -36,6 +36,7 @@ #include <vnet/ip/ip.h> #include <vnet/ethernet/ethernet.h> +#include <vnet/devices/devices.h> #include <vnet/feature/feature.h> #include <vnet/devices/virtio/vhost-user.h> @@ -918,14 +919,6 @@ vhost_user_exit (vlib_main_t * vm) VLIB_MAIN_LOOP_EXIT_FUNCTION (vhost_user_exit); -enum -{ - VHOST_USER_RX_NEXT_ETHERNET_INPUT, - VHOST_USER_RX_NEXT_DROP, - VHOST_USER_RX_N_NEXT, -}; - - typedef struct { u16 virtqueue; @@ -972,7 +965,7 @@ vhost_user_rx_trace (vlib_main_t * vm, u32 *b, n_left; vhost_user_main_t *vum = &vhost_user_main; - u32 next_index = VHOST_USER_RX_NEXT_ETHERNET_INPUT; + u32 next_index = VNET_DEVICE_INPUT_NEXT_ETHERNET_INPUT; n_left = vec_len (vui->d_trace_buffers); b = vui->d_trace_buffers; @@ -1277,7 +1270,7 @@ vhost_user_if_input (vlib_main_t * vm, if (PREDICT_FALSE (error)) { drops++; - next0 = VHOST_USER_RX_NEXT_DROP; + next0 = VNET_DEVICE_INPUT_NEXT_DROP; } else { @@ -1285,7 +1278,7 @@ vhost_user_if_input (vlib_main_t * vm, b_head->current_length + b_head->total_length_not_including_first_buffer; n_rx_packets++; - next0 = VHOST_USER_RX_NEXT_ETHERNET_INPUT; + next0 = VNET_DEVICE_INPUT_NEXT_ETHERNET_INPUT; } to_next[0] = bi_head; @@ -1385,11 +1378,8 @@ 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 = VHOST_USER_RX_N_NEXT, - .next_nodes = { - [VHOST_USER_RX_NEXT_DROP] = "error-drop", - [VHOST_USER_RX_NEXT_ETHERNET_INPUT] = "ethernet-input", - }, + .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) diff --git a/vnet/vnet/unix/tuntap.c b/vnet/vnet/unix/tuntap.c index e4d05446e36..13520d2781a 100644 --- a/vnet/vnet/unix/tuntap.c +++ b/vnet/vnet/unix/tuntap.c @@ -47,6 +47,7 @@ #include <vnet/ip/ip.h> #include <vnet/ethernet/ethernet.h> +#include <vnet/devices/devices.h> #include <vnet/feature/feature.h> #if DPDK == 1 @@ -212,14 +213,6 @@ VLIB_REGISTER_NODE (tuntap_tx_node,static) = { .vector_size = 4, }; -enum { - TUNTAP_RX_NEXT_IP4_INPUT, - TUNTAP_RX_NEXT_IP6_INPUT, - TUNTAP_RX_NEXT_ETHERNET_INPUT, - TUNTAP_RX_NEXT_DROP, - TUNTAP_RX_N_NEXT, -}; - /** * @brief TUNTAP receive node * @node tuntap-rx @@ -370,19 +363,19 @@ tuntap_rx (vlib_main_t * vm, if (tm->is_ether) { - next_index = TUNTAP_RX_NEXT_ETHERNET_INPUT; + next_index = VNET_DEVICE_INPUT_NEXT_ETHERNET_INPUT; } else switch (b->data[0] & 0xf0) { case 0x40: - next_index = TUNTAP_RX_NEXT_IP4_INPUT; + next_index = VNET_DEVICE_INPUT_NEXT_IP4_INPUT; break; case 0x60: - next_index = TUNTAP_RX_NEXT_IP6_INPUT; + next_index = VNET_DEVICE_INPUT_NEXT_IP6_INPUT; break; default: - next_index = TUNTAP_RX_NEXT_DROP; + next_index = VNET_DEVICE_INPUT_NEXT_DROP; break; } @@ -393,7 +386,7 @@ tuntap_rx (vlib_main_t * vm, vnet_sw_interface_t * si; si = vnet_get_sw_interface (vnm, tm->sw_if_index); if (!(si->flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP)) - next_index = TUNTAP_RX_NEXT_DROP; + next_index = VNET_DEVICE_INPUT_NEXT_DROP; } vnet_feature_device_input_redirect_x1 (node, tm->hw_if_index, &next_index, b, 0); @@ -427,13 +420,8 @@ VLIB_REGISTER_NODE (tuntap_rx_node,static) = { .n_errors = 1, .error_strings = tuntap_rx_error_strings, - .n_next_nodes = TUNTAP_RX_N_NEXT, - .next_nodes = { - [TUNTAP_RX_NEXT_IP4_INPUT] = "ip4-input-no-checksum", - [TUNTAP_RX_NEXT_IP6_INPUT] = "ip6-input", - [TUNTAP_RX_NEXT_DROP] = "error-drop", - [TUNTAP_RX_NEXT_ETHERNET_INPUT] = "ethernet-input", - }, + .n_next_nodes = VNET_DEVICE_INPUT_N_NEXT_NODES, + .next_nodes = VNET_DEVICE_INPUT_NEXT_NODES, }; /** |