Message ID | 20180712215545.21410-5-blp@ovn.org |
---|---|
State | Superseded |
Headers | show |
Series | [ovs-dev,1/5] netdev-dpdk: Fix incorrect byte order conversion in log message. | expand |
Thanks. Looks good to me. Reviewed-by: Yifeng Sun <pkusunyifeng@gmail.com> On Thu, Jul 12, 2018 at 2:55 PM, Ben Pfaff <blp@ovn.org> wrote: > The macros are hard to read. This makes it a little more readable. > > Signed-off-by: Ben Pfaff <blp@ovn.org> > --- > configure.ac | 1 + > lib/netdev-dpdk.c | 235 ++++++++++++---------------------- > lib/netdev-dummy.c | 134 ++++++++------------ > lib/netdev-linux.c | 340 +++++++++++++++++++----------- > -------------------- > lib/netdev-linux.h | 18 +-- > lib/netdev-provider.h | 2 - > lib/netdev-vport.c | 223 +++++++++++++++------------------ > 7 files changed, 369 insertions(+), 584 deletions(-) > > diff --git a/configure.ac b/configure.ac > index c89c607c7124..66281c4d6811 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -172,6 +172,7 @@ OVS_ENABLE_OPTION([-Wduplicated-cond]) > OVS_ENABLE_OPTION([-Qunused-arguments]) > OVS_ENABLE_OPTION([-Wshadow]) > 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 9bf21856075b..4de4cf116e92 100644 > --- a/lib/netdev-dpdk.c > +++ b/lib/netdev-dpdk.c > @@ -4695,161 +4695,86 @@ 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, \ > + .flow_put = netdev_dpdk_flow_put, \ > + .flow_del = netdev_dpdk_flow_del > + > +#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-dummy.c b/lib/netdev-dummy.c > index d4984674fb53..2cf05634eae9 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 0c42268d9d6c..32e75d6fe98f 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 880f86402a1e..17ca9120168a 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 1a572f5b8fdc..5a79473511cb 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 2290de96c278..8f8411c9c519 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); > } > -- > 2.16.1 > > _______________________________________________ > dev mailing list > dev@openvswitch.org > https://mail.openvswitch.org/mailman/listinfo/ovs-dev >
On 7/12/2018 10:55 PM, Ben Pfaff wrote: > The macros are hard to read. This makes it a little more readable. > Thanks for this Ben, one minor comment below. > Signed-off-by: Ben Pfaff <blp@ovn.org> > --- > configure.ac | 1 + > lib/netdev-dpdk.c | 235 ++++++++++++---------------------- > lib/netdev-dummy.c | 134 ++++++++------------ > lib/netdev-linux.c | 340 +++++++++++++++++++------------------------------- > lib/netdev-linux.h | 18 +-- > lib/netdev-provider.h | 2 - > lib/netdev-vport.c | 223 +++++++++++++++------------------ > 7 files changed, 369 insertions(+), 584 deletions(-) > > diff --git a/configure.ac b/configure.ac > index c89c607c7124..66281c4d6811 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -172,6 +172,7 @@ OVS_ENABLE_OPTION([-Wduplicated-cond]) > OVS_ENABLE_OPTION([-Qunused-arguments]) > OVS_ENABLE_OPTION([-Wshadow]) > 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 9bf21856075b..4de4cf116e92 100644 > --- a/lib/netdev-dpdk.c > +++ b/lib/netdev-dpdk.c > @@ -4695,161 +4695,86 @@ 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 */ Not sure if DPDK_FLOW_OFFLOAD_API should be completely removed, as I understand it the remaining offload functionality is currently being worked on with a view to enable full HW offload so they will be re-introduced in the future. The macro could be moved from here to netdev-dpdk.h and then added to the NETDEV_DPDK_CLASS_BASE macro you introduce below (this would be similar to what is implemented for netdev-linux, and a more uniform approach across the netdevs). Sugesh, you've been involved in the HW full offload work, do you have an opinion on this? Ian > - > - > -#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, \ > + .flow_put = netdev_dpdk_flow_put, \ > + .flow_del = netdev_dpdk_flow_del > + > +#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-dummy.c b/lib/netdev-dummy.c > index d4984674fb53..2cf05634eae9 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 0c42268d9d6c..32e75d6fe98f 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 880f86402a1e..17ca9120168a 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 1a572f5b8fdc..5a79473511cb 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 2290de96c278..8f8411c9c519 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); > } >
Hi Ian/Ben , Please find my comments below. Regards _Sugesh > -----Original Message----- > From: Stokes, Ian > Sent: Wednesday, August 1, 2018 3:24 PM > To: Ben Pfaff <blp@ovn.org>; dev@openvswitch.org > Cc: Chandran, Sugesh <sugesh.chandran@intel.com> > Subject: Re: [ovs-dev] [PATCH 5/5] netdev: Clean up class initialization. > > On 7/12/2018 10:55 PM, Ben Pfaff wrote: > > The macros are hard to read. This makes it a little more readable. > > > > Thanks for this Ben, one minor comment below. > > > Signed-off-by: Ben Pfaff <blp@ovn.org> > > --- > > > > -#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 */ > > Not sure if DPDK_FLOW_OFFLOAD_API should be completely removed, as I > understand it the remaining offload functionality is currently being > worked on with a view to enable full HW offload so they will be > re-introduced in the future. > > The macro could be moved from here to netdev-dpdk.h and then added to > the NETDEV_DPDK_CLASS_BASE macro you introduce below (this would be > similar to what is implemented for netdev-linux, and a more uniform > approach across the netdevs). > > Sugesh, you've been involved in the HW full offload work, do you have an > opinion on this? > > Ian [Sugesh] I agree with Ian here, We are looking at full offload solutions in DPDK Datapath which need to use the remaining flow related APIs for the flow management in the hardware. So I think it make sense to keep it uniform across different netdevs. > > - > > - > > -#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) \ > > -{ \
On Wed, Aug 01, 2018 at 03:23:38PM +0100, Ian Stokes wrote: > On 7/12/2018 10:55 PM, Ben Pfaff wrote: > >The macros are hard to read. This makes it a little more readable. > > > > Thanks for this Ben, one minor comment below. > > >Signed-off-by: Ben Pfaff <blp@ovn.org> > >--- > > configure.ac | 1 + > > lib/netdev-dpdk.c | 235 ++++++++++++---------------------- > > lib/netdev-dummy.c | 134 ++++++++------------ > > lib/netdev-linux.c | 340 +++++++++++++++++++------------------------------- > > lib/netdev-linux.h | 18 +-- > > lib/netdev-provider.h | 2 - > > lib/netdev-vport.c | 223 +++++++++++++++------------------ > > 7 files changed, 369 insertions(+), 584 deletions(-) > > > >diff --git a/configure.ac b/configure.ac > >index c89c607c7124..66281c4d6811 100644 > >--- a/configure.ac > >+++ b/configure.ac > >@@ -172,6 +172,7 @@ OVS_ENABLE_OPTION([-Wduplicated-cond]) > > OVS_ENABLE_OPTION([-Qunused-arguments]) > > OVS_ENABLE_OPTION([-Wshadow]) > > 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 9bf21856075b..4de4cf116e92 100644 > >--- a/lib/netdev-dpdk.c > >+++ b/lib/netdev-dpdk.c > >@@ -4695,161 +4695,86 @@ 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 */ > > Not sure if DPDK_FLOW_OFFLOAD_API should be completely removed, as I > understand it the remaining offload functionality is currently being worked > on with a view to enable full HW offload so they will be re-introduced in > the future. > > The macro could be moved from here to netdev-dpdk.h and then added to the > NETDEV_DPDK_CLASS_BASE macro you introduce below (this would be similar to > what is implemented for netdev-linux, and a more uniform approach across the > netdevs). > > Sugesh, you've been involved in the HW full offload work, do you have an > opinion on this? OK. I folded in the following and reposted v2 as: https://patchwork.ozlabs.org/patch/957990/ diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index 917b3b82c88e..628d75a75024 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -4715,8 +4715,7 @@ netdev_dpdk_flow_del(struct netdev *netdev, const ovs_u128 *ufid, .rxq_construct = netdev_dpdk_rxq_construct, \ .rxq_destruct = netdev_dpdk_rxq_destruct, \ .rxq_dealloc = netdev_dpdk_rxq_dealloc, \ - .flow_put = netdev_dpdk_flow_put, \ - .flow_del = netdev_dpdk_flow_del + DPDK_FLOW_OFFLOAD_API #define NETDEV_DPDK_CLASS_BASE \ NETDEV_DPDK_CLASS_COMMON, \ diff --git a/lib/netdev-dpdk.h b/lib/netdev-dpdk.h index b7d02a77dc72..cc0501d6879a 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/configure.ac b/configure.ac index c89c607c7124..66281c4d6811 100644 --- a/configure.ac +++ b/configure.ac @@ -172,6 +172,7 @@ OVS_ENABLE_OPTION([-Wduplicated-cond]) OVS_ENABLE_OPTION([-Qunused-arguments]) OVS_ENABLE_OPTION([-Wshadow]) 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 9bf21856075b..4de4cf116e92 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -4695,161 +4695,86 @@ 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, \ + .flow_put = netdev_dpdk_flow_put, \ + .flow_del = netdev_dpdk_flow_del + +#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-dummy.c b/lib/netdev-dummy.c index d4984674fb53..2cf05634eae9 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 0c42268d9d6c..32e75d6fe98f 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 880f86402a1e..17ca9120168a 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 1a572f5b8fdc..5a79473511cb 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 2290de96c278..8f8411c9c519 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); }
The macros are hard to read. This makes it a little more readable. Signed-off-by: Ben Pfaff <blp@ovn.org> --- configure.ac | 1 + lib/netdev-dpdk.c | 235 ++++++++++++---------------------- lib/netdev-dummy.c | 134 ++++++++------------ lib/netdev-linux.c | 340 +++++++++++++++++++------------------------------- lib/netdev-linux.h | 18 +-- lib/netdev-provider.h | 2 - lib/netdev-vport.c | 223 +++++++++++++++------------------ 7 files changed, 369 insertions(+), 584 deletions(-)