2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-31 22:35:15 +00:00

netdev-offload-tc: Flush rules on ingress block when init tc flow api

OVS can fail to attach ingress block on iface when init tc flow api,
if block already exist with rules on it and is shared with other iface.
Fix by flush all existing rules on the ingress block prior to deleting
it.

Fixes: 093c9458fb ("tc: allow offloading of block ids")
Signed-off-by: Dmytro Linkin <dmitrolin@mellanox.com>
Acked-by: Raed Salem <raeds@mellanox.com>
Acked-by: Roi Dayan <roid@mellanox.com>
Signed-off-by: Simon Horman <simon.horman@netronome.com>
This commit is contained in:
Dmytro Linkin
2020-02-27 17:22:32 +02:00
committed by Simon Horman
parent e99c53ee61
commit edc2055a2b

View File

@@ -1907,6 +1907,7 @@ netdev_tc_init_flow_api(struct netdev *netdev)
static struct ovsthread_once block_once = OVSTHREAD_ONCE_INITIALIZER;
enum tc_qdisc_hook hook = get_tc_qdisc_hook(netdev);
uint32_t block_id = 0;
struct tcf_id id;
int ifindex;
int error;
@@ -1917,6 +1918,14 @@ netdev_tc_init_flow_api(struct netdev *netdev)
return -ifindex;
}
block_id = get_block_id_from_netdev(netdev);
/* Flush rules explicitly needed when we work with ingress_block,
* so we will not fail with reattaching block to bond iface, for ex.
*/
id = tc_make_tcf_id(ifindex, block_id, 0, hook);
tc_del_filter(&id);
/* make sure there is no ingress/egress qdisc */
tc_add_del_qdisc(ifindex, false, 0, hook);
@@ -1930,7 +1939,6 @@ netdev_tc_init_flow_api(struct netdev *netdev)
ovsthread_once_done(&multi_mask_once);
}
block_id = get_block_id_from_netdev(netdev);
error = tc_add_del_qdisc(ifindex, true, block_id, hook);
if (error && error != EEXIST) {