[ovs-dev] [PATCH V10 19/33] dpif-netlink: Use netdev flow del api to delete a flow

Roi Dayan roid at mellanox.com
Thu Jun 8 11:46:36 UTC 2017


From: Paul Blakey <paulb at mellanox.com>

If a flow was offloaded to a netdev we delete it using netdev
flow api.

Signed-off-by: Paul Blakey <paulb at mellanox.com>
Reviewed-by: Roi Dayan <roid at mellanox.com>
Reviewed-by: Simon Horman <simon.horman at netronome.com>
---
 lib/dpif-netlink.c | 13 ++++++++++++-
 lib/netdev.c       | 18 ++++++++++++++++++
 lib/netdev.h       |  2 ++
 3 files changed, 32 insertions(+), 1 deletion(-)

diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c
index fc8bf20..f959ed9 100644
--- a/lib/dpif-netlink.c
+++ b/lib/dpif-netlink.c
@@ -2145,7 +2145,18 @@ try_send_to_netdev(struct dpif_netlink *dpif, struct dpif_op *op)
         err = parse_flow_put(dpif, put);
         break;
     }
-    case DPIF_OP_FLOW_DEL:
+    case DPIF_OP_FLOW_DEL: {
+        struct dpif_flow_del *del = &op->u.flow_del;
+
+        if (!del->ufid) {
+            break;
+        }
+        dbg_print_flow(del->key, del->key_len, NULL, 0, NULL, 0,
+                       del->ufid, "DEL");
+        err = netdev_ports_flow_del(DPIF_HMAP_KEY(&dpif->dpif), del->ufid,
+                                    del->stats);
+        break;
+    }
     case DPIF_OP_FLOW_GET:
     case DPIF_OP_EXECUTE:
     default:
diff --git a/lib/netdev.c b/lib/netdev.c
index 41960b6..4311c21 100644
--- a/lib/netdev.c
+++ b/lib/netdev.c
@@ -2306,6 +2306,24 @@ netdev_ports_flow_dump_create(const void *obj, int *ports)
     return dumps;
 }
 
+int
+netdev_ports_flow_del(const void *obj, const ovs_u128 *ufid,
+                      struct dpif_flow_stats *stats)
+{
+    struct port_to_netdev_data *data;
+
+    ovs_mutex_lock(&netdev_hmap_mutex);
+    HMAP_FOR_EACH(data, node, &port_to_netdev) {
+        if (data->obj == obj && !netdev_flow_del(data->netdev, ufid, stats)) {
+            ovs_mutex_unlock(&netdev_hmap_mutex);
+            return 0;
+        }
+    }
+    ovs_mutex_unlock(&netdev_hmap_mutex);
+
+    return ENOENT;
+}
+
 #ifdef __linux__
 void
 netdev_set_flow_api_enabled(const struct smap *ovs_other_config)
diff --git a/lib/netdev.h b/lib/netdev.h
index 0b2e674..2ddc595 100644
--- a/lib/netdev.h
+++ b/lib/netdev.h
@@ -190,6 +190,8 @@ odp_port_t netdev_ifindex_to_odp_port(int ifindex);
 struct netdev_flow_dump **netdev_ports_flow_dump_create(const void *obj,
                                                         int *ports);
 void netdev_ports_flow_flush(const void *obj);
+int netdev_ports_flow_del(const void *obj, const ovs_u128 *ufid,
+                          struct dpif_flow_stats *stats);
 
 /* native tunnel APIs */
 /* Structure to pass parameters required to build a tunnel header. */
-- 
2.7.4



More information about the dev mailing list