[ovs-dev] [PATCH ovs V2 15/21] dpif-netlink: delete a flow from netdev

Paul Blakey paulb at mellanox.com
Sun Dec 25 11:39:43 UTC 2016


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>
---
 lib/dpif-netlink.c | 30 +++++++++++++++++++++++++++++-
 1 file changed, 29 insertions(+), 1 deletion(-)

diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c
index 717af90..f8cc59d 100644
--- a/lib/dpif-netlink.c
+++ b/lib/dpif-netlink.c
@@ -2056,6 +2056,25 @@ parse_flow_put(struct dpif_netlink *dpif, struct dpif_flow_put *put)
     return false;
 }
 
+static bool
+parse_flow_del(struct dpif_netlink *dpif, struct dpif_flow_del *del)
+{
+    bool ret = false;
+    struct ovs_list port_list;
+    struct netdev_list_element *element;
+
+    netdev_hmap_port_get_list(dpif->dpif.dpif_class, &port_list);
+    LIST_FOR_EACH(element, node, &port_list) {
+        if (!netdev_flow_del(element->netdev, del->stats,
+                             CONST_CAST(ovs_u128 *, del->ufid))) {
+            ret = true;
+            break;
+        }
+    }
+    netdev_port_list_del(&port_list);
+    return ret;
+}
+
 static void
 dbg_print_flow(const struct nlattr *key, size_t key_len,
                const struct nlattr *mask, size_t mask_len,
@@ -2098,7 +2117,16 @@ try_send_to_netdev(struct dpif_netlink *dpif, struct dpif_op *op)
                        put->actions, put->actions_len, put->ufid, "PUT");
         return parse_flow_put(dpif, put);
     }
-    case DPIF_OP_FLOW_DEL:
+    case DPIF_OP_FLOW_DEL: {
+        struct dpif_flow_del *del = &op->u.flow_del;
+
+        if (!del->ufid) {
+            return false;
+        }
+        dbg_print_flow(del->key, del->key_len, NULL, 0, NULL, 0,
+                       del->ufid, "DEL");
+        return parse_flow_del(dpif, del);
+    }
     case DPIF_OP_FLOW_GET:
     case DPIF_OP_EXECUTE:
     default:
-- 
1.8.3.1



More information about the dev mailing list