@@ -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:
@@ -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)
@@ -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. */