feature: all input nodes must have same nexts

Change-Id: Ie4c820933114af2269c99531856c45b0271a4a3e
Signed-off-by: Damjan Marion <damarion@cisco.com>
This commit is contained in:
Damjan Marion
2016-11-02 14:48:21 +01:00
committed by Dave Barach
parent 3a8345f6e0
commit 8bdc63b603
10 changed files with 88 additions and 121 deletions

View File

@ -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 \

View File

@ -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)

View File

@ -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:
*/

View File

@ -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,

View File

@ -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,
};
@ -738,32 +733,6 @@ CLIB_MULTIARCH_SELECT_FN(dpdk_input);
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

View File

@ -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
};

View File

@ -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)

View File

@ -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

View File

@ -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)

View File

@ -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,
};
/**