@@ -1154,6 +1154,11 @@ dpif_netlink_flow_flush(struct dpif *dpif_)
dpif_netlink_flow_init(&flow);
flow.cmd = OVS_FLOW_CMD_DEL;
flow.dp_ifindex = dpif->dp_ifindex;
+
+ if (netdev_is_flow_api_enabled()) {
+ netdev_ports_flow_flush(DPIF_HMAP_KEY(dpif_));
+ }
+
return dpif_netlink_flow_transact(&flow, NULL, NULL);
}
@@ -2259,6 +2259,20 @@ netdev_ifindex_to_odp_port(int ifindex)
return ret;
}
+void
+netdev_ports_flow_flush(const void *obj)
+{
+ 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_flush(data->netdev);
+ }
+ }
+ ovs_mutex_unlock(&netdev_hmap_mutex);
+}
+
#ifdef __linux__
void
netdev_set_flow_api_enabled(const struct smap *ovs_other_config)
@@ -187,6 +187,7 @@ int netdev_ports_insert(struct netdev *, const void *obj, struct dpif_port *);
struct netdev *netdev_ports_get(odp_port_t port, const void *obj);
int netdev_ports_remove(odp_port_t port, const void *obj);
odp_port_t netdev_ifindex_to_odp_port(int ifindex);
+void netdev_ports_flow_flush(const void *obj);
/* native tunnel APIs */
/* Structure to pass parameters required to build a tunnel header. */