On 02/12/2025 16:04, Eelco Chaudron wrote:
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-dpdk implementation.

To progress toward that goal, we begin by decoupling hardware offload
logic from dpif-netdev and transitioning it into dpif-offload-dpdk.
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.
Can we avoid the "temporary" functions that will be refactored later and have more "complete" commits?

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 <[email protected]>
---
  lib/dpdk.c                    |  2 --
  lib/dpif-netdev.c             | 32 ++++++++---------
  lib/dpif-offload-dpdk.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 077bdfc09..4dd5e9789 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"
@@ -508,7 +507,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 272294daa..fa265b8fc 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 dpdk_offload_thread_set_thread_nb(unsigned int 
thread_nb);
  unsigned int dpdk_offload_thread_nb(void);
  unsigned int dpdk_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 = dpdk_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-dpdk.c b/lib/dpif-offload-dpdk.c
index 211978f16..5c3e7f041 100644
--- a/lib/dpif-offload-dpdk.c
+++ b/lib/dpif-offload-dpdk.c
@@ -54,7 +54,10 @@ static int
  dpif_offload_dpdk_enable_offload(struct dpif_offload *offload_,
                                   struct dpif_offload_port_mgr_port *port)
  {
-    dpif_offload_set_netdev_offload(port->netdev, offload_);
+    struct netdev *netdev = port->netdev;
+
+    netdev_offload_dpdk_init(netdev);
+    dpif_offload_set_netdev_offload(netdev, offload_);
      return 0;
  }
@@ -62,6 +65,9 @@ static int
  dpif_offload_dpdk_cleanup_offload(struct dpif_offload *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 e20283af2..6c2f9ff7a 100644
--- a/lib/dpif-offload.c
+++ b/lib/dpif-offload.c
@@ -1308,6 +1308,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)
  {
@@ -1603,3 +1615,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 97a4029e9..5bde3373d 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_postprocess(struct netdev *,
                                                     struct dp_packet *);
diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c
index 7f7bd4448..cda5f3dbb 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 dpdk_offload_thread_nb(void);
  unsigned int dpdk_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.postprocess_api_supported, true);
return 0;
  }
@@ -1160,7 +1164,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;
      }
@@ -1180,7 +1184,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;
  }
@@ -1843,18 +1846,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;
  }
@@ -2180,12 +2182,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;
      }
@@ -2424,7 +2425,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,
@@ -2450,8 +2451,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;
@@ -2475,7 +2475,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)
@@ -2493,8 +2493,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;
@@ -2512,15 +2512,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,
@@ -2620,7 +2620,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;
@@ -2668,8 +2668,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 = {
@@ -2684,7 +2683,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;
  }
@@ -2718,8 +2717,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;
@@ -2799,12 +2797,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 77bee628e..5c9c16bbc 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 0852e2536..a939f0fcb 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 6596af810..839648d96 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(
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to