If a flow was offloaded to a netdev we delete it using netdev flow api. Signed-off-by: Paul Blakey <pa...@mellanox.com> Reviewed-by: Roi Dayan <r...@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 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev