feature: all input nodes must have same nexts 62/3662/3
authorDamjan Marion <[email protected]>
Wed, 2 Nov 2016 13:48:21 +0000 (14:48 +0100)
committerDave Barach <[email protected]>
Wed, 2 Nov 2016 19:28:08 +0000 (19:28 +0000)
Change-Id: Ie4c820933114af2269c99531856c45b0271a4a3e
Signed-off-by: Damjan Marion <[email protected]>
vnet/Makefile.am
vnet/vnet/devices/af_packet/node.c
vnet/vnet/devices/devices.h [new file with mode: 0644]
vnet/vnet/devices/dpdk/dpdk.h
vnet/vnet/devices/dpdk/node.c
vnet/vnet/devices/feature.c
vnet/vnet/devices/netmap/node.c
vnet/vnet/devices/ssvm/node.c
vnet/vnet/devices/virtio/vhost-user.c
vnet/vnet/unix/tuntap.c

index 96306dd..f53a61b 100644 (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                             \
index f086b8d..8c0d645 100644 (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)
diff --git a/vnet/vnet/devices/devices.h b/vnet/vnet/devices/devices.h
new file mode 100644 (file)
index 0000000..9c74dc3
--- /dev/null
@@ -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:
+ */
index dfbfce5..1d2b4b7 100644 (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,
index 01a6094..bcb4fea 100644 (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
index 8de7817..f55d186 100644 (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
 };
 
index d13fa1b..fb60fbd 100644 (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)
index e613cc9..5ecccd3 100644 (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
index bdac7c2..b55547c 100644 (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)
index e4d0544..13520d2 100644 (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,
 };
 
 /**