summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Pfaff <blp@ovn.org>2018-08-15 10:38:09 -0700
committerIan Stokes <ian.stokes@intel.com>2018-08-27 17:48:23 +0100
commit89c09c1cd1f03506831105881ac29ffae74341f3 (patch)
tree3669dc12ab287e8fbecd31ef398d9addd0490815
parent74cd69a479cc0e6056538e9f412a89b13752d237 (diff)
downloadopenvswitch-89c09c1cd1f03506831105881ac29ffae74341f3.tar.gz
netdev: Clean up class initialization.
The macros are hard to read. This makes it a little more readable. Signed-off-by: Ben Pfaff <blp@ovn.org> Signed-off-by: Ian Stokes <ian.stokes@intel.com>
-rw-r--r--configure.ac1
-rw-r--r--lib/netdev-dpdk.c234
-rw-r--r--lib/netdev-dpdk.h4
-rw-r--r--lib/netdev-dummy.c134
-rw-r--r--lib/netdev-linux.c340
-rw-r--r--lib/netdev-linux.h18
-rw-r--r--lib/netdev-provider.h2
-rw-r--r--lib/netdev-vport.c223
8 files changed, 372 insertions, 584 deletions
diff --git a/configure.ac b/configure.ac
index 09464cab0..ba9e7d66d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -175,6 +175,7 @@ OVS_ENABLE_OPTION([-Wshadow])
OVS_ENABLE_OPTION([-Wmultistatement-macros])
OVS_ENABLE_OPTION([-Wcast-align=strict])
OVS_ENABLE_OPTION([-Wno-null-pointer-arithmetic])
+OVS_ENABLE_OPTION([-Warray-bounds-pointer-arithmetic])
OVS_CONDITIONAL_CC_OPTION([-Wno-unused], [HAVE_WNO_UNUSED])
OVS_CONDITIONAL_CC_OPTION([-Wno-unused-parameter], [HAVE_WNO_UNUSED_PARAMETER])
OVS_ENABLE_WERROR
diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index e4b6cedf4..f91aa27cd 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -4696,161 +4696,85 @@ netdev_dpdk_flow_del(struct netdev *netdev, const ovs_u128 *ufid,
ufid, rte_flow);
}
-#define DPDK_FLOW_OFFLOAD_API \
- NULL, /* flow_flush */ \
- NULL, /* flow_dump_create */ \
- NULL, /* flow_dump_destroy */ \
- NULL, /* flow_dump_next */ \
- netdev_dpdk_flow_put, \
- NULL, /* flow_get */ \
- netdev_dpdk_flow_del, \
- NULL /* init_flow_api */
-
-
-#define NETDEV_DPDK_CLASS(NAME, INIT, CONSTRUCT, DESTRUCT, \
- SET_CONFIG, SET_TX_MULTIQ, SEND, \
- GET_CARRIER, GET_STATS, \
- GET_CUSTOM_STATS, \
- GET_FEATURES, GET_STATUS, \
- RECONFIGURE, RXQ_RECV) \
-{ \
- NAME, \
- true, /* is_pmd */ \
- INIT, /* init */ \
- NULL, /* netdev_dpdk_run */ \
- NULL, /* netdev_dpdk_wait */ \
- \
- netdev_dpdk_alloc, \
- CONSTRUCT, \
- DESTRUCT, \
- netdev_dpdk_dealloc, \
- netdev_dpdk_get_config, \
- SET_CONFIG, \
- NULL, /* get_tunnel_config */ \
- NULL, /* build header */ \
- NULL, /* push header */ \
- NULL, /* pop header */ \
- netdev_dpdk_get_numa_id, /* get_numa_id */ \
- SET_TX_MULTIQ, \
- \
- SEND, /* send */ \
- NULL, /* send_wait */ \
- \
- netdev_dpdk_set_etheraddr, \
- netdev_dpdk_get_etheraddr, \
- netdev_dpdk_get_mtu, \
- netdev_dpdk_set_mtu, \
- netdev_dpdk_get_ifindex, \
- GET_CARRIER, \
- netdev_dpdk_get_carrier_resets, \
- netdev_dpdk_set_miimon, \
- GET_STATS, \
- GET_CUSTOM_STATS, \
- GET_FEATURES, \
- NULL, /* set_advertisements */ \
- NULL, /* get_pt_mode */ \
- \
- netdev_dpdk_set_policing, \
- netdev_dpdk_get_qos_types, \
- NULL, /* get_qos_capabilities */ \
- netdev_dpdk_get_qos, \
- netdev_dpdk_set_qos, \
- NULL, /* get_queue */ \
- NULL, /* set_queue */ \
- NULL, /* delete_queue */ \
- NULL, /* get_queue_stats */ \
- NULL, /* queue_dump_start */ \
- NULL, /* queue_dump_next */ \
- NULL, /* queue_dump_done */ \
- NULL, /* dump_queue_stats */ \
- \
- NULL, /* set_in4 */ \
- NULL, /* get_addr_list */ \
- NULL, /* add_router */ \
- NULL, /* get_next_hop */ \
- GET_STATUS, \
- NULL, /* arp_lookup */ \
- \
- netdev_dpdk_update_flags, \
- RECONFIGURE, \
- \
- netdev_dpdk_rxq_alloc, \
- netdev_dpdk_rxq_construct, \
- netdev_dpdk_rxq_destruct, \
- netdev_dpdk_rxq_dealloc, \
- RXQ_RECV, \
- NULL, /* rx_wait */ \
- NULL, /* rxq_drain */ \
- DPDK_FLOW_OFFLOAD_API, \
- NULL /* get_block_id */ \
-}
-
-static const struct netdev_class dpdk_class =
- NETDEV_DPDK_CLASS(
- "dpdk",
- netdev_dpdk_class_init,
- netdev_dpdk_construct,
- netdev_dpdk_destruct,
- netdev_dpdk_set_config,
- netdev_dpdk_set_tx_multiq,
- netdev_dpdk_eth_send,
- netdev_dpdk_get_carrier,
- netdev_dpdk_get_stats,
- netdev_dpdk_get_custom_stats,
- netdev_dpdk_get_features,
- netdev_dpdk_get_status,
- netdev_dpdk_reconfigure,
- netdev_dpdk_rxq_recv);
-
-static const struct netdev_class dpdk_ring_class =
- NETDEV_DPDK_CLASS(
- "dpdkr",
- netdev_dpdk_class_init,
- netdev_dpdk_ring_construct,
- netdev_dpdk_destruct,
- netdev_dpdk_ring_set_config,
- netdev_dpdk_set_tx_multiq,
- netdev_dpdk_ring_send,
- netdev_dpdk_get_carrier,
- netdev_dpdk_get_stats,
- netdev_dpdk_get_custom_stats,
- netdev_dpdk_get_features,
- netdev_dpdk_get_status,
- netdev_dpdk_reconfigure,
- netdev_dpdk_rxq_recv);
-
-static const struct netdev_class dpdk_vhost_class =
- NETDEV_DPDK_CLASS(
- "dpdkvhostuser",
- NULL,
- netdev_dpdk_vhost_construct,
- netdev_dpdk_vhost_destruct,
- NULL,
- NULL,
- netdev_dpdk_vhost_send,
- netdev_dpdk_vhost_get_carrier,
- netdev_dpdk_vhost_get_stats,
- NULL,
- NULL,
- netdev_dpdk_vhost_user_get_status,
- netdev_dpdk_vhost_reconfigure,
- netdev_dpdk_vhost_rxq_recv);
-static const struct netdev_class dpdk_vhost_client_class =
- NETDEV_DPDK_CLASS(
- "dpdkvhostuserclient",
- NULL,
- netdev_dpdk_vhost_client_construct,
- netdev_dpdk_vhost_destruct,
- netdev_dpdk_vhost_client_set_config,
- NULL,
- netdev_dpdk_vhost_send,
- netdev_dpdk_vhost_get_carrier,
- netdev_dpdk_vhost_get_stats,
- NULL,
- NULL,
- netdev_dpdk_vhost_user_get_status,
- netdev_dpdk_vhost_client_reconfigure,
- netdev_dpdk_vhost_rxq_recv);
+#define NETDEV_DPDK_CLASS_COMMON \
+ .is_pmd = true, \
+ .alloc = netdev_dpdk_alloc, \
+ .dealloc = netdev_dpdk_dealloc, \
+ .get_config = netdev_dpdk_get_config, \
+ .get_numa_id = netdev_dpdk_get_numa_id, \
+ .set_etheraddr = netdev_dpdk_set_etheraddr, \
+ .get_etheraddr = netdev_dpdk_get_etheraddr, \
+ .get_mtu = netdev_dpdk_get_mtu, \
+ .set_mtu = netdev_dpdk_set_mtu, \
+ .get_ifindex = netdev_dpdk_get_ifindex, \
+ .get_carrier_resets = netdev_dpdk_get_carrier_resets, \
+ .set_miimon_interval = netdev_dpdk_set_miimon, \
+ .set_policing = netdev_dpdk_set_policing, \
+ .get_qos_types = netdev_dpdk_get_qos_types, \
+ .get_qos = netdev_dpdk_get_qos, \
+ .set_qos = netdev_dpdk_set_qos, \
+ .update_flags = netdev_dpdk_update_flags, \
+ .rxq_alloc = netdev_dpdk_rxq_alloc, \
+ .rxq_construct = netdev_dpdk_rxq_construct, \
+ .rxq_destruct = netdev_dpdk_rxq_destruct, \
+ .rxq_dealloc = netdev_dpdk_rxq_dealloc, \
+ DPDK_FLOW_OFFLOAD_API
+
+#define NETDEV_DPDK_CLASS_BASE \
+ NETDEV_DPDK_CLASS_COMMON, \
+ .init = netdev_dpdk_class_init, \
+ .destruct = netdev_dpdk_destruct, \
+ .set_tx_multiq = netdev_dpdk_set_tx_multiq, \
+ .get_carrier = netdev_dpdk_get_carrier, \
+ .get_stats = netdev_dpdk_get_stats, \
+ .get_custom_stats = netdev_dpdk_get_custom_stats, \
+ .get_features = netdev_dpdk_get_features, \
+ .get_status = netdev_dpdk_get_status, \
+ .reconfigure = netdev_dpdk_reconfigure, \
+ .rxq_recv = netdev_dpdk_rxq_recv
+
+static const struct netdev_class dpdk_class = {
+ .type = "dpdk",
+ NETDEV_DPDK_CLASS_BASE,
+ .construct = netdev_dpdk_construct,
+ .set_config = netdev_dpdk_set_config,
+ .send = netdev_dpdk_eth_send,
+};
+
+static const struct netdev_class dpdk_ring_class = {
+ .type = "dpdkr",
+ NETDEV_DPDK_CLASS_BASE,
+ .construct = netdev_dpdk_ring_construct,
+ .set_config = netdev_dpdk_ring_set_config,
+ .send = netdev_dpdk_ring_send,
+};
+
+static const struct netdev_class dpdk_vhost_class = {
+ .type = "dpdkvhostuser",
+ NETDEV_DPDK_CLASS_COMMON,
+ .construct = netdev_dpdk_vhost_construct,
+ .destruct = netdev_dpdk_vhost_destruct,
+ .send = netdev_dpdk_vhost_send,
+ .get_carrier = netdev_dpdk_vhost_get_carrier,
+ .get_stats = netdev_dpdk_vhost_get_stats,
+ .get_status = netdev_dpdk_vhost_user_get_status,
+ .reconfigure = netdev_dpdk_vhost_reconfigure,
+ .rxq_recv = netdev_dpdk_vhost_rxq_recv
+};
+
+static const struct netdev_class dpdk_vhost_client_class = {
+ .type = "dpdkvhostuserclient",
+ NETDEV_DPDK_CLASS_COMMON,
+ .construct = netdev_dpdk_vhost_client_construct,
+ .destruct = netdev_dpdk_vhost_destruct,
+ .set_config = netdev_dpdk_vhost_client_set_config,
+ .send = netdev_dpdk_vhost_send,
+ .get_carrier = netdev_dpdk_vhost_get_carrier,
+ .get_stats = netdev_dpdk_vhost_get_stats,
+ .get_status = netdev_dpdk_vhost_user_get_status,
+ .reconfigure = netdev_dpdk_vhost_client_reconfigure,
+ .rxq_recv = netdev_dpdk_vhost_rxq_recv
+};
void
netdev_dpdk_register(void)
diff --git a/lib/netdev-dpdk.h b/lib/netdev-dpdk.h
index b7d02a77d..cc0501d68 100644
--- a/lib/netdev-dpdk.h
+++ b/lib/netdev-dpdk.h
@@ -25,6 +25,10 @@ struct dp_packet;
#ifdef DPDK_NETDEV
+#define DPDK_FLOW_OFFLOAD_API \
+ .flow_put = netdev_dpdk_flow_put, \
+ .flow_del = netdev_dpdk_flow_del
+
void netdev_dpdk_register(void);
void free_dpdk_buf(struct dp_packet *);
diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c
index d4984674f..2cf05634e 100644
--- a/lib/netdev-dummy.c
+++ b/lib/netdev-dummy.c
@@ -1393,90 +1393,56 @@ netdev_dummy_update_flags(struct netdev *netdev_,
/* Helper functions. */
-#define NETDEV_DUMMY_CLASS(NAME, PMD, RECOFIGURE) \
-{ \
- NAME, \
- PMD, /* is_pmd */ \
- NULL, /* init */ \
- netdev_dummy_run, \
- netdev_dummy_wait, \
- \
- netdev_dummy_alloc, \
- netdev_dummy_construct, \
- netdev_dummy_destruct, \
- netdev_dummy_dealloc, \
- netdev_dummy_get_config, \
- netdev_dummy_set_config, \
- NULL, /* get_tunnel_config */ \
- NULL, /* build header */ \
- NULL, /* push header */ \
- NULL, /* pop header */ \
- netdev_dummy_get_numa_id, \
- NULL, /* set_tx_multiq */ \
- \
- netdev_dummy_send, /* send */ \
- NULL, /* send_wait */ \
- \
- netdev_dummy_set_etheraddr, \
- netdev_dummy_get_etheraddr, \
- netdev_dummy_get_mtu, \
- netdev_dummy_set_mtu, \
- netdev_dummy_get_ifindex, \
- NULL, /* get_carrier */ \
- NULL, /* get_carrier_resets */ \
- NULL, /* get_miimon */ \
- netdev_dummy_get_stats, \
- netdev_dummy_get_custom_stats, \
- \
- NULL, /* get_features */ \
- NULL, /* set_advertisements */ \
- NULL, /* get_pt_mode */ \
- \
- NULL, /* set_policing */ \
- NULL, /* get_qos_types */ \
- NULL, /* get_qos_capabilities */ \
- NULL, /* get_qos */ \
- NULL, /* set_qos */ \
- netdev_dummy_get_queue, \
- NULL, /* set_queue */ \
- NULL, /* delete_queue */ \
- netdev_dummy_get_queue_stats, \
- netdev_dummy_queue_dump_start, \
- netdev_dummy_queue_dump_next, \
- netdev_dummy_queue_dump_done, \
- netdev_dummy_dump_queue_stats, \
- \
- NULL, /* set_in4 */ \
- netdev_dummy_get_addr_list, \
- NULL, /* add_router */ \
- NULL, /* get_next_hop */ \
- NULL, /* get_status */ \
- NULL, /* arp_lookup */ \
- \
- netdev_dummy_update_flags, \
- RECOFIGURE, \
- \
- netdev_dummy_rxq_alloc, \
- netdev_dummy_rxq_construct, \
- netdev_dummy_rxq_destruct, \
- netdev_dummy_rxq_dealloc, \
- netdev_dummy_rxq_recv, \
- netdev_dummy_rxq_wait, \
- netdev_dummy_rxq_drain, \
- \
- NO_OFFLOAD_API, \
- NULL /* get_block_id */ \
-}
-
-static const struct netdev_class dummy_class =
- NETDEV_DUMMY_CLASS("dummy", false, NULL);
-
-static const struct netdev_class dummy_internal_class =
- NETDEV_DUMMY_CLASS("dummy-internal", false, NULL);
-
-static const struct netdev_class dummy_pmd_class =
- NETDEV_DUMMY_CLASS("dummy-pmd", true,
- netdev_dummy_reconfigure);
+#define NETDEV_DUMMY_CLASS_COMMON \
+ .run = netdev_dummy_run, \
+ .wait = netdev_dummy_wait, \
+ .alloc = netdev_dummy_alloc, \
+ .construct = netdev_dummy_construct, \
+ .destruct = netdev_dummy_destruct, \
+ .dealloc = netdev_dummy_dealloc, \
+ .get_config = netdev_dummy_get_config, \
+ .set_config = netdev_dummy_set_config, \
+ .get_numa_id = netdev_dummy_get_numa_id, \
+ .send = netdev_dummy_send, \
+ .set_etheraddr = netdev_dummy_set_etheraddr, \
+ .get_etheraddr = netdev_dummy_get_etheraddr, \
+ .get_mtu = netdev_dummy_get_mtu, \
+ .set_mtu = netdev_dummy_set_mtu, \
+ .get_ifindex = netdev_dummy_get_ifindex, \
+ .get_stats = netdev_dummy_get_stats, \
+ .get_custom_stats = netdev_dummy_get_custom_stats, \
+ .get_queue = netdev_dummy_get_queue, \
+ .get_queue_stats = netdev_dummy_get_queue_stats, \
+ .queue_dump_start = netdev_dummy_queue_dump_start, \
+ .queue_dump_next = netdev_dummy_queue_dump_next, \
+ .queue_dump_done = netdev_dummy_queue_dump_done, \
+ .dump_queue_stats = netdev_dummy_dump_queue_stats, \
+ .get_addr_list = netdev_dummy_get_addr_list, \
+ .update_flags = netdev_dummy_update_flags, \
+ .rxq_alloc = netdev_dummy_rxq_alloc, \
+ .rxq_construct = netdev_dummy_rxq_construct, \
+ .rxq_destruct = netdev_dummy_rxq_destruct, \
+ .rxq_dealloc = netdev_dummy_rxq_dealloc, \
+ .rxq_recv = netdev_dummy_rxq_recv, \
+ .rxq_wait = netdev_dummy_rxq_wait, \
+ .rxq_drain = netdev_dummy_rxq_drain
+
+static const struct netdev_class dummy_class = {
+ NETDEV_DUMMY_CLASS_COMMON,
+ .type = "dummy"
+};
+
+static const struct netdev_class dummy_internal_class = {
+ NETDEV_DUMMY_CLASS_COMMON,
+ .type = "dummy-internal"
+};
+
+static const struct netdev_class dummy_pmd_class = {
+ NETDEV_DUMMY_CLASS_COMMON,
+ .type = "dummy-pmd",
+ .is_pmd = true,
+ .reconfigure = netdev_dummy_reconfigure
+};
static void
pkt_list_delete(struct ovs_list *l)
diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c
index e16ea58a0..c55aad8ab 100644
--- a/lib/netdev-linux.c
+++ b/lib/netdev-linux.c
@@ -3158,113 +3158,77 @@ exit:
return error;
}
-#define NETDEV_LINUX_CLASS(NAME, CONSTRUCT, GET_STATS, \
- GET_FEATURES, GET_STATUS, \
- FLOW_OFFLOAD_API, GET_BLOCK_ID) \
-{ \
- NAME, \
- false, /* is_pmd */ \
- \
- NULL, \
- netdev_linux_run, \
- netdev_linux_wait, \
- \
- netdev_linux_alloc, \
- CONSTRUCT, \
- netdev_linux_destruct, \
- netdev_linux_dealloc, \
- NULL, /* get_config */ \
- NULL, /* set_config */ \
- NULL, /* get_tunnel_config */ \
- NULL, /* build header */ \
- NULL, /* push header */ \
- NULL, /* pop header */ \
- NULL, /* get_numa_id */ \
- NULL, /* set_tx_multiq */ \
- \
- netdev_linux_send, \
- netdev_linux_send_wait, \
- \
- netdev_linux_set_etheraddr, \
- netdev_linux_get_etheraddr, \
- netdev_linux_get_mtu, \
- netdev_linux_set_mtu, \
- netdev_linux_get_ifindex, \
- netdev_linux_get_carrier, \
- netdev_linux_get_carrier_resets, \
- netdev_linux_set_miimon_interval, \
- GET_STATS, \
- NULL, \
- \
- GET_FEATURES, \
- netdev_linux_set_advertisements, \
- NULL, /* get_pt_mode */ \
- \
- netdev_linux_set_policing, \
- netdev_linux_get_qos_types, \
- netdev_linux_get_qos_capabilities, \
- netdev_linux_get_qos, \
- netdev_linux_set_qos, \
- netdev_linux_get_queue, \
- netdev_linux_set_queue, \
- netdev_linux_delete_queue, \
- netdev_linux_get_queue_stats, \
- netdev_linux_queue_dump_start, \
- netdev_linux_queue_dump_next, \
- netdev_linux_queue_dump_done, \
- netdev_linux_dump_queue_stats, \
- \
- netdev_linux_set_in4, \
- netdev_linux_get_addr_list, \
- netdev_linux_add_router, \
- netdev_linux_get_next_hop, \
- GET_STATUS, \
- netdev_linux_arp_lookup, \
- \
- netdev_linux_update_flags, \
- NULL, /* reconfigure */ \
- \
- netdev_linux_rxq_alloc, \
- netdev_linux_rxq_construct, \
- netdev_linux_rxq_destruct, \
- netdev_linux_rxq_dealloc, \
- netdev_linux_rxq_recv, \
- netdev_linux_rxq_wait, \
- netdev_linux_rxq_drain, \
- \
- FLOW_OFFLOAD_API, \
- GET_BLOCK_ID \
-}
-
-const struct netdev_class netdev_linux_class =
- NETDEV_LINUX_CLASS(
- "system",
- netdev_linux_construct,
- netdev_linux_get_stats,
- netdev_linux_get_features,
- netdev_linux_get_status,
- LINUX_FLOW_OFFLOAD_API,
- netdev_linux_get_block_id);
-
-const struct netdev_class netdev_tap_class =
- NETDEV_LINUX_CLASS(
- "tap",
- netdev_linux_construct_tap,
- netdev_tap_get_stats,
- netdev_linux_get_features,
- netdev_linux_get_status,
- NO_OFFLOAD_API,
- NULL);
-
-const struct netdev_class netdev_internal_class =
- NETDEV_LINUX_CLASS(
- "internal",
- netdev_linux_construct,
- netdev_internal_get_stats,
- NULL, /* get_features */
- netdev_internal_get_status,
- NO_OFFLOAD_API,
- NULL);
+#define NETDEV_LINUX_CLASS_COMMON \
+ .run = netdev_linux_run, \
+ .wait = netdev_linux_wait, \
+ .alloc = netdev_linux_alloc, \
+ .destruct = netdev_linux_destruct, \
+ .dealloc = netdev_linux_dealloc, \
+ .send = netdev_linux_send, \
+ .send_wait = netdev_linux_send_wait, \
+ .set_etheraddr = netdev_linux_set_etheraddr, \
+ .get_etheraddr = netdev_linux_get_etheraddr, \
+ .get_mtu = netdev_linux_get_mtu, \
+ .set_mtu = netdev_linux_set_mtu, \
+ .get_ifindex = netdev_linux_get_ifindex, \
+ .get_carrier = netdev_linux_get_carrier, \
+ .get_carrier_resets = netdev_linux_get_carrier_resets, \
+ .set_miimon_interval = netdev_linux_set_miimon_interval, \
+ .set_advertisements = netdev_linux_set_advertisements, \
+ .set_policing = netdev_linux_set_policing, \
+ .get_qos_types = netdev_linux_get_qos_types, \
+ .get_qos_capabilities = netdev_linux_get_qos_capabilities, \
+ .get_qos = netdev_linux_get_qos, \
+ .set_qos = netdev_linux_set_qos, \
+ .get_queue = netdev_linux_get_queue, \
+ .set_queue = netdev_linux_set_queue, \
+ .delete_queue = netdev_linux_delete_queue, \
+ .get_queue_stats = netdev_linux_get_queue_stats, \
+ .queue_dump_start = netdev_linux_queue_dump_start, \
+ .queue_dump_next = netdev_linux_queue_dump_next, \
+ .queue_dump_done = netdev_linux_queue_dump_done, \
+ .dump_queue_stats = netdev_linux_dump_queue_stats, \
+ .set_in4 = netdev_linux_set_in4, \
+ .get_addr_list = netdev_linux_get_addr_list, \
+ .add_router = netdev_linux_add_router, \
+ .get_next_hop = netdev_linux_get_next_hop, \
+ .arp_lookup = netdev_linux_arp_lookup, \
+ .update_flags = netdev_linux_update_flags, \
+ .rxq_alloc = netdev_linux_rxq_alloc, \
+ .rxq_construct = netdev_linux_rxq_construct, \
+ .rxq_destruct = netdev_linux_rxq_destruct, \
+ .rxq_dealloc = netdev_linux_rxq_dealloc, \
+ .rxq_recv = netdev_linux_rxq_recv, \
+ .rxq_wait = netdev_linux_rxq_wait, \
+ .rxq_drain = netdev_linux_rxq_drain
+
+const struct netdev_class netdev_linux_class = {
+ NETDEV_LINUX_CLASS_COMMON,
+ LINUX_FLOW_OFFLOAD_API,
+ .type = "system",
+ .construct = netdev_linux_construct,
+ .get_stats = netdev_linux_get_stats,
+ .get_features = netdev_linux_get_features,
+ .get_status = netdev_linux_get_status,
+ .get_block_id = netdev_linux_get_block_id
+};
+
+const struct netdev_class netdev_tap_class = {
+ NETDEV_LINUX_CLASS_COMMON,
+ .type = "tap",
+ .construct = netdev_linux_construct_tap,
+ .get_stats = netdev_tap_get_stats,
+ .get_features = netdev_linux_get_features,
+ .get_status = netdev_linux_get_status,
+};
+
+const struct netdev_class netdev_internal_class = {
+ NETDEV_LINUX_CLASS_COMMON,
+ .type = "internal",
+ .construct = netdev_linux_construct,
+ .get_stats = netdev_internal_get_stats,
+ .get_status = netdev_internal_get_status,
+};
#define CODEL_N_QUEUES 0x0000
@@ -3461,19 +3425,14 @@ codel_qdisc_set(struct netdev *netdev, const struct smap *details)
}
static const struct tc_ops tc_ops_codel = {
- "codel", /* linux_name */
- "linux-codel", /* ovs_name */
- CODEL_N_QUEUES, /* n_queues */
- codel_tc_install,
- codel_tc_load,
- codel_tc_destroy,
- codel_qdisc_get,
- codel_qdisc_set,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL
+ .linux_name = "codel",
+ .ovs_name = "linux-codel",
+ .n_queues = CODEL_N_QUEUES,
+ .tc_install = codel_tc_install,
+ .tc_load = codel_tc_load,
+ .tc_destroy = codel_tc_destroy,
+ .qdisc_get = codel_qdisc_get,
+ .qdisc_set = codel_qdisc_set,
};
/* FQ-CoDel traffic control class. */
@@ -3703,19 +3662,14 @@ fqcodel_qdisc_set(struct netdev *netdev, const struct smap *details)
}
static const struct tc_ops tc_ops_fqcodel = {
- "fq_codel", /* linux_name */
- "linux-fq_codel", /* ovs_name */
- FQCODEL_N_QUEUES, /* n_queues */
- fqcodel_tc_install,
- fqcodel_tc_load,
- fqcodel_tc_destroy,
- fqcodel_qdisc_get,
- fqcodel_qdisc_set,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL
+ .linux_name = "fq_codel",
+ .ovs_name = "linux-fq_codel",
+ .n_queues = FQCODEL_N_QUEUES,
+ .tc_install = fqcodel_tc_install,
+ .tc_load = fqcodel_tc_load,
+ .tc_destroy = fqcodel_tc_destroy,
+ .qdisc_get = fqcodel_qdisc_get,
+ .qdisc_set = fqcodel_qdisc_set,
};
/* SFQ traffic control class. */
@@ -3882,19 +3836,14 @@ sfq_qdisc_set(struct netdev *netdev, const struct smap *details)
}
static const struct tc_ops tc_ops_sfq = {
- "sfq", /* linux_name */
- "linux-sfq", /* ovs_name */
- SFQ_N_QUEUES, /* n_queues */
- sfq_tc_install,
- sfq_tc_load,
- sfq_tc_destroy,
- sfq_qdisc_get,
- sfq_qdisc_set,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL
+ .linux_name = "sfq",
+ .ovs_name = "linux-sfq",
+ .n_queues = SFQ_N_QUEUES,
+ .tc_install = sfq_tc_install,
+ .tc_load = sfq_tc_load,
+ .tc_destroy = sfq_tc_destroy,
+ .qdisc_get = sfq_qdisc_get,
+ .qdisc_set = sfq_qdisc_set,
};
/* HTB traffic control class. */
@@ -4364,19 +4313,19 @@ htb_class_dump_stats(const struct netdev *netdev OVS_UNUSED,
}
static const struct tc_ops tc_ops_htb = {
- "htb", /* linux_name */
- "linux-htb", /* ovs_name */
- HTB_N_QUEUES, /* n_queues */
- htb_tc_install,
- htb_tc_load,
- htb_tc_destroy,
- htb_qdisc_get,
- htb_qdisc_set,
- htb_class_get,
- htb_class_set,
- htb_class_delete,
- htb_class_get_stats,
- htb_class_dump_stats
+ .linux_name = "htb",
+ .ovs_name = "linux-htb",
+ .n_queues = HTB_N_QUEUES,
+ .tc_install = htb_tc_install,
+ .tc_load = htb_tc_load,
+ .tc_destroy = htb_tc_destroy,
+ .qdisc_get = htb_qdisc_get,
+ .qdisc_set = htb_qdisc_set,
+ .class_get = htb_class_get,
+ .class_set = htb_class_set,
+ .class_delete = htb_class_delete,
+ .class_get_stats = htb_class_get_stats,
+ .class_dump_stats = htb_class_dump_stats
};
/* "linux-hfsc" traffic control class. */
@@ -4861,19 +4810,19 @@ hfsc_class_dump_stats(const struct netdev *netdev OVS_UNUSED,
}
static const struct tc_ops tc_ops_hfsc = {
- "hfsc", /* linux_name */
- "linux-hfsc", /* ovs_name */
- HFSC_N_QUEUES, /* n_queues */
- hfsc_tc_install, /* tc_install */
- hfsc_tc_load, /* tc_load */
- hfsc_tc_destroy, /* tc_destroy */
- hfsc_qdisc_get, /* qdisc_get */
- hfsc_qdisc_set, /* qdisc_set */
- hfsc_class_get, /* class_get */
- hfsc_class_set, /* class_set */
- hfsc_class_delete, /* class_delete */
- hfsc_class_get_stats, /* class_get_stats */
- hfsc_class_dump_stats /* class_dump_stats */
+ .linux_name = "hfsc",
+ .ovs_name = "linux-hfsc",
+ .n_queues = HFSC_N_QUEUES, /* n_queues */
+ .tc_install = hfsc_tc_install,
+ .tc_load = hfsc_tc_load,
+ .tc_destroy = hfsc_tc_destroy,
+ .qdisc_get = hfsc_qdisc_get,
+ .qdisc_set = hfsc_qdisc_set,
+ .class_get = hfsc_class_get,
+ .class_set = hfsc_class_set,
+ .class_delete = hfsc_class_delete,
+ .class_get_stats = hfsc_class_get_stats,
+ .class_dump_stats = hfsc_class_dump_stats,
};
/* "linux-noop" traffic control class. */
@@ -4903,19 +4852,9 @@ noop_tc_load(struct netdev *netdev, struct ofpbuf *nlmsg OVS_UNUSED)
}
static const struct tc_ops tc_ops_noop = {
- NULL, /* linux_name */
- "linux-noop", /* ovs_name */
- 0, /* n_queues */
- noop_tc_install,
- noop_tc_load,
- NULL, /* tc_destroy */
- NULL, /* qdisc_get */
- NULL, /* qdisc_set */
- NULL, /* class_get */
- NULL, /* class_set */
- NULL, /* class_delete */
- NULL, /* class_get_stats */
- NULL /* class_dump_stats */
+ .ovs_name = "linux-noop", /* ovs_name */
+ .tc_install = noop_tc_install,
+ .tc_load = noop_tc_load,
};
/* "linux-default" traffic control class.
@@ -4950,19 +4889,9 @@ default_tc_load(struct netdev *netdev, struct ofpbuf *nlmsg OVS_UNUSED)
}
static const struct tc_ops tc_ops_default = {
- NULL, /* linux_name */
- "", /* ovs_name */
- 0, /* n_queues */
- default_tc_install,
- default_tc_load,
- NULL, /* tc_destroy */
- NULL, /* qdisc_get */
- NULL, /* qdisc_set */
- NULL, /* class_get */
- NULL, /* class_set */
- NULL, /* class_delete */
- NULL, /* class_get_stats */
- NULL /* class_dump_stats */
+ .ovs_name = "", /* ovs_name */
+ .tc_install = default_tc_install,
+ .tc_load = default_tc_load,
};
/* "linux-other" traffic control class.
@@ -4982,19 +4911,8 @@ other_tc_load(struct netdev *netdev_, struct ofpbuf *nlmsg OVS_UNUSED)
}
static const struct tc_ops tc_ops_other = {
- NULL, /* linux_name */
- "linux-other", /* ovs_name */
- 0, /* n_queues */
- NULL, /* tc_install */
- other_tc_load,
- NULL, /* tc_destroy */
- NULL, /* qdisc_get */
- NULL, /* qdisc_set */
- NULL, /* class_get */
- NULL, /* class_set */
- NULL, /* class_delete */
- NULL, /* class_get_stats */
- NULL /* class_dump_stats */
+ .ovs_name = "linux-other",
+ .tc_load = other_tc_load,
};
/* Traffic control. */
diff --git a/lib/netdev-linux.h b/lib/netdev-linux.h
index 880f86402..17ca91201 100644
--- a/lib/netdev-linux.h
+++ b/lib/netdev-linux.h
@@ -29,14 +29,14 @@ int netdev_linux_ethtool_set_flag(struct netdev *netdev, uint32_t flag,
const char *flag_name, bool enable);
int linux_get_ifindex(const char *netdev_name);
-#define LINUX_FLOW_OFFLOAD_API \
- netdev_tc_flow_flush, \
- netdev_tc_flow_dump_create, \
- netdev_tc_flow_dump_destroy, \
- netdev_tc_flow_dump_next, \
- netdev_tc_flow_put, \
- netdev_tc_flow_get, \
- netdev_tc_flow_del, \
- netdev_tc_init_flow_api
+#define LINUX_FLOW_OFFLOAD_API \
+ .flow_flush = netdev_tc_flow_flush, \
+ .flow_dump_create = netdev_tc_flow_dump_create, \
+ .flow_dump_destroy = netdev_tc_flow_dump_destroy, \
+ .flow_dump_next = netdev_tc_flow_dump_next, \
+ .flow_put = netdev_tc_flow_put, \
+ .flow_get = netdev_tc_flow_get, \
+ .flow_del = netdev_tc_flow_del, \
+ .init_flow_api = netdev_tc_init_flow_api
#endif /* netdev-linux.h */
diff --git a/lib/netdev-provider.h b/lib/netdev-provider.h
index 1a572f5b8..5a7947351 100644
--- a/lib/netdev-provider.h
+++ b/lib/netdev-provider.h
@@ -893,6 +893,4 @@ extern const struct netdev_class netdev_tap_class;
}
#endif
-#define NO_OFFLOAD_API NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
-
#endif /* netdev.h */
diff --git a/lib/netdev-vport.c b/lib/netdev-vport.c
index 2290de96c..8f8411c9c 100644
--- a/lib/netdev-vport.c
+++ b/lib/netdev-vport.c
@@ -936,7 +936,7 @@ set_patch_config(struct netdev *dev_, const struct smap *args, char **errp)
}
static int
-get_stats(const struct netdev *netdev, struct netdev_stats *stats)
+netdev_vport_get_stats(const struct netdev *netdev, struct netdev_stats *stats)
{
struct netdev_vport *dev = netdev_vport_cast(netdev);
@@ -952,7 +952,7 @@ get_stats(const struct netdev *netdev, struct netdev_stats *stats)
}
static enum netdev_pt_mode
-get_pt_mode(const struct netdev *netdev)
+netdev_vport_get_pt_mode(const struct netdev *netdev)
{
struct netdev_vport *dev = netdev_vport_cast(netdev);
@@ -972,98 +972,32 @@ netdev_vport_get_ifindex(const struct netdev *netdev_)
}
#define NETDEV_VPORT_GET_IFINDEX netdev_vport_get_ifindex
-#define NETDEV_FLOW_OFFLOAD_API LINUX_FLOW_OFFLOAD_API
+#define NETDEV_FLOW_OFFLOAD_API , LINUX_FLOW_OFFLOAD_API
#else /* !__linux__ */
#define NETDEV_VPORT_GET_IFINDEX NULL
-#define NETDEV_FLOW_OFFLOAD_API NO_OFFLOAD_API
+#define NETDEV_FLOW_OFFLOAD_API
#endif /* __linux__ */
-#define VPORT_FUNCTIONS(GET_CONFIG, SET_CONFIG, \
- GET_TUNNEL_CONFIG, GET_STATUS, \
- BUILD_HEADER, \
- PUSH_HEADER, POP_HEADER, \
- GET_IFINDEX) \
- NULL, \
- netdev_vport_run, \
- netdev_vport_wait, \
- \
- netdev_vport_alloc, \
- netdev_vport_construct, \
- netdev_vport_destruct, \
- netdev_vport_dealloc, \
- GET_CONFIG, \
- SET_CONFIG, \
- GET_TUNNEL_CONFIG, \
- BUILD_HEADER, \
- PUSH_HEADER, \
- POP_HEADER, \
- NULL, /* get_numa_id */ \
- NULL, /* set_tx_multiq */ \
- \
- NULL, /* send */ \
- NULL, /* send_wait */ \
- \
- netdev_vport_set_etheraddr, \
- netdev_vport_get_etheraddr, \
- NULL, /* get_mtu */ \
- NULL, /* set_mtu */ \
- GET_IFINDEX, \
- NULL, /* get_carrier */ \
- NULL, /* get_carrier_resets */ \
- NULL, /* get_miimon */ \
- get_stats, \
- NULL, /* get_custom_stats */ \
- \
- NULL, /* get_features */ \
- NULL, /* set_advertisements */ \
- get_pt_mode, \
- \
- NULL, /* set_policing */ \
- NULL, /* get_qos_types */ \
- NULL, /* get_qos_capabilities */ \
- NULL, /* get_qos */ \
- NULL, /* set_qos */ \
- NULL, /* get_queue */ \
- NULL, /* set_queue */ \
- NULL, /* delete_queue */ \
- NULL, /* get_queue_stats */ \
- NULL, /* queue_dump_start */ \
- NULL, /* queue_dump_next */ \
- NULL, /* queue_dump_done */ \
- NULL, /* dump_queue_stats */ \
- \
- NULL, /* set_in4 */ \
- NULL, /* get_addr_list */ \
- NULL, /* add_router */ \
- NULL, /* get_next_hop */ \
- GET_STATUS, \
- NULL, /* arp_lookup */ \
- \
- netdev_vport_update_flags, \
- NULL, /* reconfigure */ \
- \
- NULL, /* rx_alloc */ \
- NULL, /* rx_construct */ \
- NULL, /* rx_destruct */ \
- NULL, /* rx_dealloc */ \
- NULL, /* rx_recv */ \
- NULL, /* rx_wait */ \
- NULL, /* rx_drain */ \
- \
- NETDEV_FLOW_OFFLOAD_API, \
- NULL /* get_block_id */
-
-
-#define TUNNEL_CLASS(NAME, DPIF_PORT, BUILD_HEADER, PUSH_HEADER, POP_HEADER, \
- GET_IFINDEX) \
- { DPIF_PORT, \
- { NAME, false, \
- VPORT_FUNCTIONS(get_tunnel_config, \
- set_tunnel_config, \
- get_netdev_tunnel_config, \
- tunnel_get_status, \
- BUILD_HEADER, PUSH_HEADER, POP_HEADER, \
- GET_IFINDEX) }}
+#define VPORT_FUNCTIONS_COMMON \
+ .run = netdev_vport_run, \
+ .wait = netdev_vport_wait, \
+ .alloc = netdev_vport_alloc, \
+ .construct = netdev_vport_construct, \
+ .destruct = netdev_vport_destruct, \
+ .dealloc = netdev_vport_dealloc, \
+ .set_etheraddr = netdev_vport_set_etheraddr, \
+ .get_etheraddr = netdev_vport_get_etheraddr, \
+ .get_stats = netdev_vport_get_stats, \
+ .get_pt_mode = netdev_vport_get_pt_mode, \
+ .update_flags = netdev_vport_update_flags \
+ NETDEV_FLOW_OFFLOAD_API
+
+#define TUNNEL_FUNCTIONS_COMMON \
+ VPORT_FUNCTIONS_COMMON, \
+ .get_config = get_tunnel_config, \
+ .set_config = set_tunnel_config, \
+ .get_tunnel_config = get_netdev_tunnel_config, \
+ .get_status = tunnel_get_status
void
netdev_vport_tunnel_register(void)
@@ -1071,32 +1005,74 @@ netdev_vport_tunnel_register(void)
/* The name of the dpif_port should be short enough to accomodate adding
* a port number to the end if one is necessary. */
static const struct vport_class vport_classes[] = {
- TUNNEL_CLASS("geneve", "genev_sys", netdev_geneve_build_header,
- netdev_tnl_push_udp_header,
- netdev_geneve_pop_header,
- NETDEV_VPORT_GET_IFINDEX),
- TUNNEL_CLASS("gre", "gre_sys", netdev_gre_build_header,
- netdev_gre_push_header,
- netdev_gre_pop_header,
- NULL),
- TUNNEL_CLASS("vxlan", "vxlan_sys", netdev_vxlan_build_header,
- netdev_tnl_push_udp_header,
- netdev_vxlan_pop_header,
- NETDEV_VPORT_GET_IFINDEX),
- TUNNEL_CLASS("lisp", "lisp_sys", NULL, NULL, NULL, NULL),
- TUNNEL_CLASS("stt", "stt_sys", NULL, NULL, NULL, NULL),
- TUNNEL_CLASS("erspan", "erspan_sys", netdev_erspan_build_header,
- netdev_erspan_push_header,
- netdev_erspan_pop_header,
- NULL),
- TUNNEL_CLASS("ip6erspan", "ip6erspan_sys", netdev_erspan_build_header,
- netdev_erspan_push_header,
- netdev_erspan_pop_header,
- NULL),
- TUNNEL_CLASS("ip6gre", "ip6gre_sys", netdev_gre_build_header,
- netdev_gre_push_header,
- netdev_gre_pop_header,
- NULL),
+ { "genev_sys",
+ {
+ TUNNEL_FUNCTIONS_COMMON,
+ .type = "geneve",
+ .build_header = netdev_geneve_build_header,
+ .push_header = netdev_tnl_push_udp_header,
+ .pop_header = netdev_geneve_pop_header,
+ .get_ifindex = NETDEV_VPORT_GET_IFINDEX,
+ }
+ },
+ { "gre_sys",
+ {
+ TUNNEL_FUNCTIONS_COMMON,
+ .type = "gre",
+ .build_header = netdev_gre_build_header,
+ .push_header = netdev_gre_push_header,
+ .pop_header = netdev_gre_pop_header
+ }
+ },
+ { "vxlan_sys",
+ {
+ TUNNEL_FUNCTIONS_COMMON,
+ .type = "vxlan",
+ .build_header = netdev_vxlan_build_header,
+ .push_header = netdev_tnl_push_udp_header,
+ .pop_header = netdev_vxlan_pop_header,
+ .get_ifindex = NETDEV_VPORT_GET_IFINDEX
+ }
+ },
+ { "lisp_sys",
+ {
+ TUNNEL_FUNCTIONS_COMMON,
+ .type = "lisp"
+ }
+ },
+ { "stt_sys",
+ {
+ TUNNEL_FUNCTIONS_COMMON,
+ .type = "stt"
+ }
+ },
+ { "erspan_sys",
+ {
+ TUNNEL_FUNCTIONS_COMMON,
+ .type = "erspan",
+ .build_header = netdev_erspan_build_header,
+ .push_header = netdev_erspan_push_header,
+ .pop_header = netdev_erspan_pop_header
+ }
+ },
+ { "ip6erspan_sys",
+ {
+ TUNNEL_FUNCTIONS_COMMON,
+ .type = "ip6erspan",
+ .build_header = netdev_erspan_build_header,
+ .push_header = netdev_erspan_push_header,
+ .pop_header = netdev_erspan_pop_header
+ }
+ },
+ { "ip6gre_sys",
+ {
+ TUNNEL_FUNCTIONS_COMMON,
+ .type = "ip6gre",
+ .build_header = netdev_gre_build_header,
+ .push_header = netdev_gre_push_header,
+ .pop_header = netdev_gre_pop_header
+ }
+ },
};
static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER;
@@ -1117,12 +1093,13 @@ netdev_vport_tunnel_register(void)
void
netdev_vport_patch_register(void)
{
- static const struct vport_class patch_class =
- { NULL,
- { "patch", false,
- VPORT_FUNCTIONS(get_patch_config,
- set_patch_config,
- NULL,
- NULL, NULL, NULL, NULL, NULL) }};
+ static const struct vport_class patch_class = {
+ NULL,
+ { VPORT_FUNCTIONS_COMMON,
+ .type = "patch",
+ .get_config = get_patch_config,
+ .set_config = set_patch_config,
+ }
+ };
netdev_register_provider(&patch_class.netdev_class);
}