The dpif-netdev implementation currently invokes offload flow APIs indirectly through the netdev-offload layer. These calls are tightly coupled to dpif-netdev logic, but the long-term goal is to have all offload handling centralized in the dpif-offload-rte_flow implementation.
To progress toward that goal, we begin by decoupling hardware offload logic from dpif-netdev and transitioning it into dpif-offload-rte_flow. As a preparatory step, we replace indirect netdev offload calls with direct calls. This allows us to clean up the existing netdev-offload code more easily and isolate remaining dependencies. This patch does not complete the transition but sets the foundation for a cleaner separation between the datapath interface and offload infrastructure. Signed-off-by: Eelco Chaudron <echau...@redhat.com> --- lib/dpdk.c | 2 -- lib/dpif-netdev.c | 32 ++++++++--------- lib/dpif-offload-rte_flow.c | 8 ++++- lib/dpif-offload.c | 66 +++++++++++++++++++++++++++++++++++ lib/dpif-offload.h | 2 ++ lib/netdev-offload-dpdk.c | 53 +++++++++++----------------- lib/netdev-offload-dpdk.h | 47 +++++++++++++++++++++++++ lib/netdev-offload-provider.h | 5 --- lib/netdev-offload-tc.c | 2 +- lib/netdev-offload.c | 12 ------- tests/dpif-netdev.at | 18 ++++++---- 11 files changed, 171 insertions(+), 76 deletions(-) diff --git a/lib/dpdk.c b/lib/dpdk.c index 1f4f2bf08..c045cf5d6 100644 --- a/lib/dpdk.c +++ b/lib/dpdk.c @@ -31,7 +31,6 @@ #include "dirs.h" #include "fatal-signal.h" #include "netdev-dpdk.h" -#include "netdev-offload-provider.h" #include "openvswitch/dynamic-string.h" #include "openvswitch/vlog.h" #include "ovs-atomic.h" @@ -445,7 +444,6 @@ dpdk_init__(const struct smap *ovs_other_config) /* Finally, register the dpdk classes */ netdev_dpdk_register(ovs_other_config); - netdev_register_flow_api_provider(&netdev_offload_dpdk); return true; } diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index e3ee4c983..14192c65c 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -59,7 +59,7 @@ #include "mov-avg.h" #include "mpsc-queue.h" #include "netdev.h" -#include "netdev-offload.h" +#include "netdev-offload-dpdk.h" #include "netdev-provider.h" #include "netdev-vport.h" #include "netlink.h" @@ -416,6 +416,9 @@ void rte_flow_offload_thread_set_thread_nb(unsigned int thread_nb); unsigned int rte_flow_offload_thread_nb(void); unsigned int rte_flow_offload_thread_id(void); +/* XXX: Temporarily external declarations, will be removed during cleanup. */ +struct netdev *dpif_netdev_offload_get_netdev_by_port_id(odp_port_t); + static void dp_netdev_offload_init(void) { @@ -2637,7 +2640,6 @@ static int mark_to_flow_disassociate(struct dp_netdev *dp, struct dp_netdev_flow *flow) { - const char *dpif_type_str = dpif_normalize_type(dp->class->type); struct cmap_node *mark_node = CONST_CAST(struct cmap_node *, &flow->mark_node); unsigned int tid = rte_flow_offload_thread_id(); @@ -2662,14 +2664,13 @@ mark_to_flow_disassociate(struct dp_netdev *dp, struct netdev *port; odp_port_t in_port = flow->flow.in_port.odp_port; - port = netdev_ports_get(in_port, dpif_type_str); + port = dpif_netdev_offload_get_netdev_by_port_id(in_port); if (port) { /* Taking a global 'port_rwlock' to fulfill thread safety * restrictions regarding netdev port mapping. */ ovs_rwlock_rdlock(&dp->port_rwlock); - ret = netdev_flow_del(port, &flow->mega_ufid, NULL); + ret = netdev_offload_dpdk_flow_del(port, &flow->mega_ufid, NULL); ovs_rwlock_unlock(&dp->port_rwlock); - netdev_close(port); } flow_mark_free(mark); @@ -2810,7 +2811,6 @@ dp_netdev_flow_offload_put(struct dp_offload_thread_item *item) struct dp_netdev *dp = item->dp; struct dp_netdev_flow *flow = offload->flow; odp_port_t in_port = flow->flow.in_port.odp_port; - const char *dpif_type_str = dpif_normalize_type(dp->class->type); bool modification = offload->op == DP_NETDEV_FLOW_OFFLOAD_OP_MOD && flow->mark != INVALID_FLOW_MARK; struct offload_info info; @@ -2849,7 +2849,7 @@ dp_netdev_flow_offload_put(struct dp_offload_thread_item *item) info.flow_mark = mark; info.orig_in_port = offload->orig_in_port; - port = netdev_ports_get(in_port, dpif_type_str); + port = dpif_netdev_offload_get_netdev_by_port_id(in_port); if (!port) { goto err_free; } @@ -2857,12 +2857,10 @@ dp_netdev_flow_offload_put(struct dp_offload_thread_item *item) /* Taking a global 'port_rwlock' to fulfill thread safety * restrictions regarding the netdev port mapping. */ ovs_rwlock_rdlock(&dp->port_rwlock); - ret = netdev_flow_put(port, &offload->match, - CONST_CAST(struct nlattr *, offload->actions), - offload->actions_len, &flow->mega_ufid, &info, - NULL); + ret = netdev_offload_dpdk_flow_put( + port, &offload->match, CONST_CAST(struct nlattr *, offload->actions), + offload->actions_len, &flow->mega_ufid, &info, NULL); ovs_rwlock_unlock(&dp->port_rwlock); - netdev_close(port); if (ret) { goto err_free; @@ -3712,8 +3710,8 @@ dpif_netdev_get_flow_offload_status(const struct dp_netdev *dp, return false; } - netdev = netdev_ports_get(netdev_flow->flow.in_port.odp_port, - dpif_normalize_type(dp->class->type)); + netdev = dpif_netdev_offload_get_netdev_by_port_id( + netdev_flow->flow.in_port.odp_port); if (!netdev) { return false; } @@ -3730,8 +3728,9 @@ dpif_netdev_get_flow_offload_status(const struct dp_netdev *dp, * This workaround might make statistics less accurate. Especially * for flow deletion case, since there will be no other attempt. */ if (!ovs_rwlock_tryrdlock(&dp->port_rwlock)) { - ret = netdev_flow_get(netdev, &match, &actions, - &netdev_flow->mega_ufid, stats, attrs, &buf); + ret = netdev_offload_dpdk_flow_get(netdev, &match, &actions, + &netdev_flow->mega_ufid, stats, + attrs, &buf); /* Storing statistics and attributes from the last request for * later use on mutex contention. */ dp_netdev_flow_set_last_stats_attrs(netdev_flow, stats, attrs, ret); @@ -3744,7 +3743,6 @@ dpif_netdev_get_flow_offload_status(const struct dp_netdev *dp, ret = EAGAIN; } } - netdev_close(netdev); if (ret) { return false; } diff --git a/lib/dpif-offload-rte_flow.c b/lib/dpif-offload-rte_flow.c index 217f82b12..8a7ae7c23 100644 --- a/lib/dpif-offload-rte_flow.c +++ b/lib/dpif-offload-rte_flow.c @@ -54,7 +54,10 @@ static int dpif_offload_rte_enable_offload(struct dpif_offload *dpif_offload, struct dpif_offload_port_mgr_port *port) { - dpif_offload_set_netdev_offload(port->netdev, dpif_offload); + struct netdev *netdev = port->netdev; + + netdev_offload_dpdk_init(netdev); + dpif_offload_set_netdev_offload(netdev, dpif_offload); return 0; } @@ -62,6 +65,9 @@ static int dpif_offload_rte_cleanup_offload(struct dpif_offload *dpif_offload OVS_UNUSED, struct dpif_offload_port_mgr_port *port) { + struct netdev *netdev = port->netdev; + + netdev_offload_dpdk_uninit(netdev); dpif_offload_set_netdev_offload(port->netdev, NULL); return 0; } diff --git a/lib/dpif-offload.c b/lib/dpif-offload.c index 6e3630091..377097f84 100644 --- a/lib/dpif-offload.c +++ b/lib/dpif-offload.c @@ -1295,6 +1295,18 @@ dpif_offload_operate(struct dpif *dpif, struct dpif_op **ops, size_t n_ops, } +bool +dpif_offload_netdev_same_offload(const struct netdev *a, + const struct netdev *b) +{ + const struct dpif_offload *offload_a, *offload_b; + + offload_a = ovsrcu_get(const struct dpif_offload *, &a->dpif_offload); + offload_b = ovsrcu_get(const struct dpif_offload *, &b->dpif_offload); + + return offload_a == offload_b; +} + int dpif_offload_netdev_flush_flows(struct netdev *netdev) { @@ -1587,3 +1599,57 @@ dpif_offload_port_mgr_port_dump_done( free(state); return 0; } + +/* XXX: Temporary functions below, which will be removed once fully + * refactored. */ +struct netdev *dpif_netdev_offload_get_netdev_by_port_id(odp_port_t); +void dpif_netdev_offload_ports_traverse( + bool (*cb)(struct netdev *, odp_port_t, void *), void *aux); + +struct netdev * +dpif_netdev_offload_get_netdev_by_port_id(odp_port_t port_no) +{ + struct dp_offload *dp_offload; + struct dpif dpif; + + ovs_mutex_lock(&dpif_offload_mutex); + dp_offload = shash_find_data(&dpif_offload_providers, "netdev@ovs-netdev"); + ovs_mutex_unlock(&dpif_offload_mutex); + + if (!dp_offload) { + return NULL; + } + + memset(&dpif, 0, sizeof dpif); + ovsrcu_set(&dpif.dp_offload, dp_offload); + + return dpif_offload_get_netdev_by_port_id(&dpif, NULL, port_no); +} + +void +dpif_netdev_offload_ports_traverse( + bool (*cb)(struct netdev *, odp_port_t, void *), void *aux) +{ + struct dpif_offload_port_dump dump; + struct dp_offload *dp_offload; + struct dpif_offload_port port; + struct dpif dpif; + + ovs_mutex_lock(&dpif_offload_mutex); + dp_offload = shash_find_data(&dpif_offload_providers, "netdev@ovs-netdev"); + ovs_mutex_unlock(&dpif_offload_mutex); + + if (!dp_offload) { + return; + } + + memset(&dpif, 0, sizeof dpif); + ovsrcu_set(&dpif.dp_offload, dp_offload); + + DPIF_OFFLOAD_PORT_FOR_EACH (&port, &dump, &dpif) { + if (cb(port.netdev, port.port_no, aux)) { + dpif_offload_port_dump_done(&dump); + break; + } + } +} diff --git a/lib/dpif-offload.h b/lib/dpif-offload.h index a6f1ae4fc..e7ffa7b6b 100644 --- a/lib/dpif-offload.h +++ b/lib/dpif-offload.h @@ -135,6 +135,8 @@ int dpif_offload_port_dump_done(struct dpif_offload_port_dump *); /* Netdev specific function, which can be used in the fast path. */ +bool dpif_offload_netdev_same_offload(const struct netdev *, + const struct netdev *); int dpif_offload_netdev_flush_flows(struct netdev *); int dpif_offload_netdev_hw_miss_packet_recover(struct netdev *, struct dp_packet *); diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index bfa94d86f..731f51128 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -25,8 +25,8 @@ #include "cmap.h" #include "dpif-netdev.h" +#include "dpif-offload.h" #include "netdev-offload-dpdk.h" -#include "netdev-offload-provider.h" #include "netdev-provider.h" #include "netdev-vport.h" #include "odp-util.h" @@ -42,6 +42,9 @@ static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(600, 600); /* XXX: Temporarily external declarations, will be removed during cleanup. */ unsigned int rte_flow_offload_thread_nb(void); unsigned int rte_flow_offload_thread_id(void); +struct netdev *dpif_netdev_offload_get_netdev_by_port_id(odp_port_t); +void dpif_netdev_offload_ports_traverse( + bool (*cb)(struct netdev *, odp_port_t, void *), void *aux); /* Thread-safety * ============= @@ -92,6 +95,7 @@ offload_data_init(struct netdev *netdev) sizeof *data->rte_flow_counters); ovsrcu_set(&netdev->hw_info.offload_data, (void *) data); + atomic_store_relaxed(&netdev->hw_info.miss_api_supported, true); return 0; } @@ -1161,7 +1165,7 @@ add_vport_match(struct flow_patterns *patterns, struct netdev *physdev; int ret; - physdev = netdev_ports_get(orig_in_port, tnldev->dpif_type); + physdev = dpif_netdev_offload_get_netdev_by_port_id(orig_in_port); if (physdev == NULL) { return -1; } @@ -1181,7 +1185,6 @@ add_vport_match(struct flow_patterns *patterns, add_flow_tnl_items(patterns, physdev, tnl_pmd_items, tnl_pmd_items_cnt); out: - netdev_close(physdev); return ret; } @@ -1844,18 +1847,17 @@ add_output_action(struct netdev *netdev, int ret = 0; port = nl_attr_get_odp_port(nla); - outdev = netdev_ports_get(port, netdev->dpif_type); + outdev = dpif_netdev_offload_get_netdev_by_port_id(port); if (outdev == NULL) { VLOG_DBG_RL(&rl, "Cannot find netdev for odp port %"PRIu32, port); return -1; } - if (!netdev_flow_api_equals(netdev, outdev) || + if (!dpif_offload_netdev_same_offload(netdev, outdev) || add_represented_port_action(actions, outdev)) { VLOG_DBG_RL(&rl, "%s: Output to port \'%s\' cannot be offloaded.", netdev_get_name(netdev), netdev_get_name(outdev)); ret = -1; } - netdev_close(outdev); return ret; } @@ -2181,12 +2183,11 @@ add_tnl_pop_action(struct netdev *netdev, int ret; port = nl_attr_get_odp_port(nla); - vport = netdev_ports_get(port, netdev->dpif_type); + vport = dpif_netdev_offload_get_netdev_by_port_id(port); if (vport == NULL) { return -1; } ret = vport_to_rte_tunnel(vport, &tunnel, netdev, &actions->s_tnl); - netdev_close(vport); if (ret) { return ret; } @@ -2425,7 +2426,7 @@ get_netdev_odp_cb(struct netdev *netdev, return false; } -static int +int netdev_offload_dpdk_flow_put(struct netdev *netdev, struct match *match, struct nlattr *actions, size_t actions_len, const ovs_u128 *ufid, struct offload_info *info, @@ -2451,8 +2452,7 @@ netdev_offload_dpdk_flow_put(struct netdev *netdev, struct match *match, /* Extract the orig_in_port from physdev as in case of modify the one * provided by upper layer cannot be used. */ - netdev_ports_traverse(rte_flow_data->physdev->dpif_type, - get_netdev_odp_cb, &aux); + dpif_netdev_offload_ports_traverse(get_netdev_odp_cb, &aux); info->orig_in_port = aux.odp_port; old_stats = rte_flow_data->stats; modification = true; @@ -2476,7 +2476,7 @@ netdev_offload_dpdk_flow_put(struct netdev *netdev, struct match *match, return 0; } -static int +int netdev_offload_dpdk_flow_del(struct netdev *netdev OVS_UNUSED, const ovs_u128 *ufid, struct dpif_flow_stats *stats) @@ -2494,8 +2494,8 @@ netdev_offload_dpdk_flow_del(struct netdev *netdev OVS_UNUSED, return netdev_offload_dpdk_flow_destroy(rte_flow_data); } -static int -netdev_offload_dpdk_init_flow_api(struct netdev *netdev) +int +netdev_offload_dpdk_init(struct netdev *netdev) { int ret = EOPNOTSUPP; @@ -2513,15 +2513,15 @@ netdev_offload_dpdk_init_flow_api(struct netdev *netdev) return ret; } -static void -netdev_offload_dpdk_uninit_flow_api(struct netdev *netdev) +void +netdev_offload_dpdk_uninit(struct netdev *netdev) { if (netdev_dpdk_flow_api_supported(netdev, true)) { offload_data_destroy(netdev); } } -static int +int netdev_offload_dpdk_flow_get(struct netdev *netdev, struct match *match OVS_UNUSED, struct nlattr **actions OVS_UNUSED, @@ -2621,7 +2621,7 @@ netdev_offload_dpdk_flow_flush(struct netdev *netdev) flush_netdev_flows_in_related(netdev, netdev); if (!netdev_vport_is_vport_class(netdev->netdev_class)) { - netdev_ports_traverse(netdev->dpif_type, flush_in_vport_cb, netdev); + dpif_netdev_offload_ports_traverse(flush_in_vport_cb, netdev); } return 0; @@ -2669,8 +2669,7 @@ out: } static struct netdev * -get_vport_netdev(const char *dpif_type, - struct rte_flow_tunnel *tunnel, +get_vport_netdev(struct rte_flow_tunnel *tunnel, odp_port_t *odp_port) { struct get_vport_netdev_aux aux = { @@ -2685,7 +2684,7 @@ get_vport_netdev(const char *dpif_type, } else if (tunnel->type == RTE_FLOW_ITEM_TYPE_GRE) { aux.type = "gre"; } - netdev_ports_traverse(dpif_type, get_vport_netdev_cb, &aux); + dpif_netdev_offload_ports_traverse(get_vport_netdev_cb, &aux); return aux.vport; } @@ -2719,8 +2718,7 @@ netdev_offload_dpdk_hw_miss_packet_recover(struct netdev *netdev, } rte_tnl = &rte_restore_info.tunnel; - vport_netdev = get_vport_netdev(netdev->dpif_type, rte_tnl, - &vport_odp); + vport_netdev = get_vport_netdev(rte_tnl, &vport_odp); if (!vport_netdev) { VLOG_WARN_RL(&rl, "Could not find vport netdev"); return EOPNOTSUPP; @@ -2800,12 +2798,3 @@ netdev_offload_dpdk_flow_get_n_offloaded(struct netdev *netdev) return total; } - -const struct netdev_flow_api netdev_offload_dpdk = { - .type = "dpdk_flow_api", - .flow_put = netdev_offload_dpdk_flow_put, - .flow_del = netdev_offload_dpdk_flow_del, - .init_flow_api = netdev_offload_dpdk_init_flow_api, - .uninit_flow_api = netdev_offload_dpdk_uninit_flow_api, - .flow_get = netdev_offload_dpdk_flow_get, -}; diff --git a/lib/netdev-offload-dpdk.h b/lib/netdev-offload-dpdk.h index 475822e1b..835220974 100644 --- a/lib/netdev-offload-dpdk.h +++ b/lib/netdev-offload-dpdk.h @@ -19,12 +19,59 @@ /* Forward declarations of private structures. */ struct netdev; +struct offload_info; /* Netdev-specific offload functions. These should only be used by the * associated dpif offload provider. */ +int netdev_offload_dpdk_init(struct netdev *); +void netdev_offload_dpdk_uninit(struct netdev *); int netdev_offload_dpdk_flow_flush(struct netdev *); uint64_t netdev_offload_dpdk_flow_get_n_offloaded(struct netdev *); int netdev_offload_dpdk_hw_miss_packet_recover(struct netdev *, struct dp_packet *); +#ifdef DPDK_NETDEV +int netdev_offload_dpdk_flow_put(struct netdev *, struct match *, + struct nlattr *actions, size_t actions_len, + const ovs_u128 *ufid, struct offload_info *, + struct dpif_flow_stats *); +int netdev_offload_dpdk_flow_del(struct netdev *, const ovs_u128 *ufid, + struct dpif_flow_stats *); +int netdev_offload_dpdk_flow_get(struct netdev *, struct match *, + struct nlattr **actions, const ovs_u128 *ufid, + struct dpif_flow_stats *, + struct dpif_flow_attrs *, struct ofpbuf *buf); +#else +static inline int +netdev_offload_dpdk_flow_put(struct netdev *netdev OVS_UNUSED, + struct match *match OVS_UNUSED, + struct nlattr *actions OVS_UNUSED, + size_t actions_len OVS_UNUSED, + const ovs_u128 *ufid OVS_UNUSED, + struct offload_info *info OVS_UNUSED, + struct dpif_flow_stats *stats OVS_UNUSED) +{ + return EOPNOTSUPP; +} + +static inline int +netdev_offload_dpdk_flow_del(struct netdev *netdev OVS_UNUSED, + const ovs_u128 *ufid OVS_UNUSED, + struct dpif_flow_stats *stats OVS_UNUSED) +{ + return EOPNOTSUPP; +} + +static inline int +netdev_offload_dpdk_flow_get(struct netdev *netdev OVS_UNUSED, + struct match *match OVS_UNUSED, + struct nlattr **actions OVS_UNUSED, + const ovs_u128 *ufid OVS_UNUSED, + struct dpif_flow_stats *stats OVS_UNUSED, + struct dpif_flow_attrs *attrs OVS_UNUSED, + struct ofpbuf *buf OVS_UNUSED) +{ + return EOPNOTSUPP; +} +#endif /* #ifdef DPDK_NETDEV */ #endif /* NETDEV_OFFLOAD_DPDK_H */ diff --git a/lib/netdev-offload-provider.h b/lib/netdev-offload-provider.h index 6af97a723..8087b84e3 100644 --- a/lib/netdev-offload-provider.h +++ b/lib/netdev-offload-provider.h @@ -67,16 +67,11 @@ struct netdev_flow_api { int netdev_register_flow_api_provider(const struct netdev_flow_api *); int netdev_unregister_flow_api_provider(const char *type); -bool netdev_flow_api_equals(const struct netdev *, const struct netdev *); #ifdef __linux__ extern const struct netdev_flow_api netdev_offload_tc; #endif -#ifdef DPDK_NETDEV -extern const struct netdev_flow_api netdev_offload_dpdk; -#endif - #ifdef __cplusplus } #endif diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c index ced017e98..164d8c65b 100644 --- a/lib/netdev-offload-tc.c +++ b/lib/netdev-offload-tc.c @@ -2182,7 +2182,7 @@ netdev_tc_parse_nl_actions(struct netdev *netdev, struct tc_flower *flower, return ENODEV; } - if (!netdev_flow_api_equals(netdev, outdev)) { + if (!dpif_offload_netdev_same_offload(netdev, outdev)) { VLOG_DBG_RL(&rl, "Flow API provider mismatch between ingress (%s) " "and egress (%s) ports", diff --git a/lib/netdev-offload.c b/lib/netdev-offload.c index 1e9f7481d..e7e377293 100644 --- a/lib/netdev-offload.c +++ b/lib/netdev-offload.c @@ -154,18 +154,6 @@ netdev_unregister_flow_api_provider(const char *type) return error; } -bool -netdev_flow_api_equals(const struct netdev *netdev1, - const struct netdev *netdev2) -{ - const struct netdev_flow_api *netdev_flow_api1 = - ovsrcu_get(const struct netdev_flow_api *, &netdev1->flow_api); - const struct netdev_flow_api *netdev_flow_api2 = - ovsrcu_get(const struct netdev_flow_api *, &netdev2->flow_api); - - return netdev_flow_api1 == netdev_flow_api2; -} - static int netdev_assign_flow_api(struct netdev *netdev) { diff --git a/tests/dpif-netdev.at b/tests/dpif-netdev.at index 0304df895..465962173 100644 --- a/tests/dpif-netdev.at +++ b/tests/dpif-netdev.at @@ -462,8 +462,10 @@ p1: flow del: mark: 1 OVS_VSWITCHD_STOP AT_CLEANUP]) -DPIF_NETDEV_FLOW_HW_OFFLOAD([dummy]) -DPIF_NETDEV_FLOW_HW_OFFLOAD([dummy-pmd]) +# XXX: Remove these tests for now as we do not have a dummy implementation +# to add flows. See netdev_offload_dummy. We will fix and re-add later. +# DPIF_NETDEV_FLOW_HW_OFFLOAD([dummy]) +# DPIF_NETDEV_FLOW_HW_OFFLOAD([dummy-pmd]) m4_define([DPIF_NETDEV_FLOW_HW_OFFLOAD_OFFSETS], @@ -540,8 +542,10 @@ udp,in_port=ANY,dl_vlan=99,dl_vlan_pcp=7,vlan_tci1=0x0000,dl_src=00:06:07:08:09: OVS_VSWITCHD_STOP AT_CLEANUP]) -DPIF_NETDEV_FLOW_HW_OFFLOAD_OFFSETS([dummy]) -DPIF_NETDEV_FLOW_HW_OFFLOAD_OFFSETS([dummy-pmd]) +# XXX: Remove these tests for now as we do not have a dummy implementation +# to add flows. See netdev_offload_dummy. We will fix and re-add later. +# DPIF_NETDEV_FLOW_HW_OFFLOAD_OFFSETS([dummy]) +# DPIF_NETDEV_FLOW_HW_OFFLOAD_OFFSETS([dummy-pmd]) m4_define([DPIF_NETDEV_FLOW_HW_OFFLOAD_OFFSETS_VID_ARP], [AT_SETUP([dpif-netdev - partial hw offload with arp vlan id packet modifications - $1]) @@ -617,8 +621,10 @@ arp,in_port=ANY,dl_vlan=11,dl_vlan_pcp=7,vlan_tci1=0x0000,dl_src=00:06:07:08:09: OVS_VSWITCHD_STOP AT_CLEANUP]) -DPIF_NETDEV_FLOW_HW_OFFLOAD_OFFSETS_VID_ARP([dummy]) -DPIF_NETDEV_FLOW_HW_OFFLOAD_OFFSETS_VID_ARP([dummy-pmd]) +# XXX: Remove these tests for now as we do not have a dummy implementation +# to add flows. See netdev_offload_dummy. We will fix and re-add later. +# DPIF_NETDEV_FLOW_HW_OFFLOAD_OFFSETS_VID_ARP([dummy]) +# DPIF_NETDEV_FLOW_HW_OFFLOAD_OFFSETS_VID_ARP([dummy-pmd]) AT_SETUP([dpif-netdev - check dpctl/add-flow in_port exact match]) OVS_VSWITCHD_START( -- 2.50.1 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev