[ovs-dev] [ovs-dev 2/7] netdev-offload: Pass dpif as an argument to flow_put

xiangxia.m.yue at gmail.com xiangxia.m.yue at gmail.com
Sat Dec 28 07:11:11 UTC 2019


From: Tonghao Zhang <xiangxia.m.yue at gmail.com>

When offloading the meter action, we may access the
"datapath" resource, such as the meter[] of struct
dp_netdev. We will store meter offload info to it.

Signed-off-by: Tonghao Zhang <xiangxia.m.yue at gmail.com>
---
 lib/dpif-netdev.c             |  2 +-
 lib/dpif-netlink.c            |  2 +-
 lib/netdev-dummy.c            |  8 ++++----
 lib/netdev-offload-dpdk.c     |  7 ++++---
 lib/netdev-offload-provider.h |  7 ++++---
 lib/netdev-offload-tc.c       |  7 ++++---
 lib/netdev-offload.c          | 11 ++++++-----
 lib/netdev-offload.h          |  4 +++-
 8 files changed, 27 insertions(+), 21 deletions(-)

diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index 7fcd8cb..c92d9aa 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -2416,7 +2416,7 @@ dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload)
     /* Taking a global 'port_mutex' to fulfill thread safety restrictions for
      * the netdev-offload-dpdk module. */
     ovs_mutex_lock(&pmd->dp->port_mutex);
-    ret = netdev_flow_put(port, &offload->match,
+    ret = netdev_flow_put(NULL, port, &offload->match,
                           CONST_CAST(struct nlattr *, offload->actions),
                           offload->actions_len, &flow->mega_ufid, &info,
                           NULL);
diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c
index e9a6887..a31da55 100644
--- a/lib/dpif-netlink.c
+++ b/lib/dpif-netlink.c
@@ -2044,7 +2044,7 @@ parse_flow_put(struct dpif_netlink *dpif, struct dpif_flow_put *put)
     info.dpif_class = dpif_class;
     info.tp_dst_port = dst_port;
     info.tunnel_csum_on = csum_on;
-    err = netdev_flow_put(dev, &match,
+    err = netdev_flow_put(NULL, dev, &match,
                           CONST_CAST(struct nlattr *, put->actions),
                           put->actions_len,
                           CONST_CAST(ovs_u128 *, put->ufid),
diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c
index 71df291..1d203c7 100644
--- a/lib/netdev-dummy.c
+++ b/lib/netdev-dummy.c
@@ -1430,10 +1430,10 @@ find_offloaded_flow(const struct hmap *offloaded_flows, const ovs_u128 *ufid)
 }
 
 static int
-netdev_dummy_flow_put(struct netdev *netdev, struct match *match,
-                      struct nlattr *actions OVS_UNUSED,
-                      size_t actions_len OVS_UNUSED,
-                      const ovs_u128 *ufid, struct offload_info *info,
+netdev_dummy_flow_put(struct dpif *dpif OVS_UNUSED, struct netdev *netdev,
+                      struct match *match, struct nlattr *actions OVS_UNUSED,
+                      size_t actions_len OVS_UNUSED, const ovs_u128 *ufid,
+                      struct offload_info *info,
                       struct dpif_flow_stats *stats)
 {
     struct netdev_dummy *dev = netdev_dummy_cast(netdev);
diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c
index 96794dc..1aa40a1 100644
--- a/lib/netdev-offload-dpdk.c
+++ b/lib/netdev-offload-dpdk.c
@@ -707,9 +707,10 @@ netdev_offload_dpdk_destroy_flow(struct netdev *netdev,
 }
 
 static 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,
+netdev_offload_dpdk_flow_put(struct dpif *dpif OVS_UNUSED, struct netdev *netdev,
+                             struct match *match, struct nlattr *actions,
+                             size_t actions_len, const ovs_u128 *ufid,
+                             struct offload_info *info,
                              struct dpif_flow_stats *stats)
 {
     struct rte_flow *rte_flow;
diff --git a/lib/netdev-offload-provider.h b/lib/netdev-offload-provider.h
index 4e1c425..d0d3fb2 100644
--- a/lib/netdev-offload-provider.h
+++ b/lib/netdev-offload-provider.h
@@ -63,9 +63,10 @@ struct netdev_flow_api {
      * 'stats' is populated according to the rules set out in the description
      * above 'struct dpif_flow_put'.
      * Return 0 if successful, otherwise returns a positive errno value. */
-    int (*flow_put)(struct netdev *, struct match *, struct nlattr *actions,
-                    size_t actions_len, const ovs_u128 *ufid,
-                    struct offload_info *info, struct dpif_flow_stats *);
+    int (*flow_put)(struct dpif *, struct netdev *, struct match *,
+                    struct nlattr *actions, size_t actions_len,
+                    const ovs_u128 *ufid, struct offload_info *info,
+                    struct dpif_flow_stats *);
 
     /* Queries a flow specified by ufid on netdev.
      * Fills output buffer as 'wbuffer' in flow_dump_next, which
diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c
index 1adbb32..815105f 100644
--- a/lib/netdev-offload-tc.c
+++ b/lib/netdev-offload-tc.c
@@ -1141,9 +1141,10 @@ flower_match_to_tun_opt(struct tc_flower *flower, const struct flow_tnl *tnl,
 }
 
 static int
-netdev_tc_flow_put(struct netdev *netdev, struct match *match,
-                   struct nlattr *actions, size_t actions_len,
-                   const ovs_u128 *ufid, struct offload_info *info,
+netdev_tc_flow_put(struct dpif *dpif OVS_UNUSED, struct netdev *netdev,
+                   struct match *match, struct nlattr *actions,
+                   size_t actions_len, const ovs_u128 *ufid,
+                   struct offload_info *info,
                    struct dpif_flow_stats *stats)
 {
     static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 20);
diff --git a/lib/netdev-offload.c b/lib/netdev-offload.c
index ae01acd..71b20f3 100644
--- a/lib/netdev-offload.c
+++ b/lib/netdev-offload.c
@@ -226,17 +226,18 @@ netdev_flow_dump_next(struct netdev_flow_dump *dump, struct match *match,
 }
 
 int
-netdev_flow_put(struct netdev *netdev, struct match *match,
-                struct nlattr *actions, size_t act_len,
-                const ovs_u128 *ufid, struct offload_info *info,
+netdev_flow_put(struct dpif *dpif, struct netdev *netdev,
+                struct match *match, struct nlattr *actions,
+                size_t act_len, const ovs_u128 *ufid,
+                struct offload_info *info,
                 struct dpif_flow_stats *stats)
 {
     const struct netdev_flow_api *flow_api =
         ovsrcu_get(const struct netdev_flow_api *, &netdev->flow_api);
 
     return (flow_api && flow_api->flow_put)
-           ? flow_api->flow_put(netdev, match, actions, act_len, ufid,
-                                info, stats)
+           ? flow_api->flow_put(dpif, netdev, match, actions,
+                                act_len, ufid, info, stats)
            : EOPNOTSUPP;
 }
 
diff --git a/lib/netdev-offload.h b/lib/netdev-offload.h
index 97a5006..d9a08b2 100644
--- a/lib/netdev-offload.h
+++ b/lib/netdev-offload.h
@@ -20,6 +20,7 @@
 
 #include "openvswitch/netdev.h"
 #include "openvswitch/types.h"
+#include "dpif-provider.h"
 #include "packets.h"
 #include "flow.h"
 
@@ -80,7 +81,8 @@ bool netdev_flow_dump_next(struct netdev_flow_dump *, struct match *,
                           struct nlattr **actions, struct dpif_flow_stats *,
                           struct dpif_flow_attrs *, ovs_u128 *ufid,
                           struct ofpbuf *rbuffer, struct ofpbuf *wbuffer);
-int netdev_flow_put(struct netdev *, struct match *, struct nlattr *actions,
+int netdev_flow_put(struct dpif *, struct netdev *,
+                    struct match *, struct nlattr *actions,
                     size_t actions_len, const ovs_u128 *,
                     struct offload_info *, struct dpif_flow_stats *);
 int netdev_flow_get(struct netdev *, struct match *, struct nlattr **actions,
-- 
1.8.3.1



More information about the dev mailing list