[ovs-dev] [PATCH 5/5] netdev: Clean up class initialization.

Yifeng Sun pkusunyifeng at gmail.com
Mon Jul 16 18:08:26 UTC 2018


Thanks. Looks good to me.

Reviewed-by: Yifeng Sun <pkusunyifeng at gmail.com>

On Thu, Jul 12, 2018 at 2:55 PM, Ben Pfaff <blp at ovn.org> wrote:

> The macros are hard to read.  This makes it a little more readable.
>
> Signed-off-by: Ben Pfaff <blp at 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 at openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>


More information about the dev mailing list