| From 96faa0dcf0ceabee22f54482ba86fcda3120407c Mon Sep 17 00:00:00 2001 |
| From: Nicolas Dichtel <nicolas.dichtel@6wind.com> |
| Date: Thu, 28 Mar 2019 10:35:06 +0100 |
| Subject: net/sched: fix ->get helper of the matchall cls |
| |
| [ Upstream commit 0db6f8befc32c68bb13d7ffbb2e563c79e913e13 ] |
| |
| It returned always NULL, thus it was never possible to get the filter. |
| |
| Example: |
| $ ip link add foo type dummy |
| $ ip link add bar type dummy |
| $ tc qdisc add dev foo clsact |
| $ tc filter add dev foo protocol all pref 1 ingress handle 1234 \ |
| matchall action mirred ingress mirror dev bar |
| |
| Before the patch: |
| $ tc filter get dev foo protocol all pref 1 ingress handle 1234 matchall |
| Error: Specified filter handle not found. |
| We have an error talking to the kernel |
| |
| After: |
| $ tc filter get dev foo protocol all pref 1 ingress handle 1234 matchall |
| filter ingress protocol all pref 1 matchall chain 0 handle 0x4d2 |
| not_in_hw |
| action order 1: mirred (Ingress Mirror to device bar) pipe |
| index 1 ref 1 bind 1 |
| |
| CC: Yotam Gigi <yotamg@mellanox.com> |
| CC: Jiri Pirko <jiri@mellanox.com> |
| Fixes: fd62d9f5c575 ("net/sched: matchall: Fix configuration race") |
| Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| net/sched/cls_matchall.c | 5 +++++ |
| 1 file changed, 5 insertions(+) |
| |
| diff --git a/net/sched/cls_matchall.c b/net/sched/cls_matchall.c |
| index 0e408ee9dcec..5ba07cd11e31 100644 |
| --- a/net/sched/cls_matchall.c |
| +++ b/net/sched/cls_matchall.c |
| @@ -125,6 +125,11 @@ static void mall_destroy(struct tcf_proto *tp, struct netlink_ext_ack *extack) |
| |
| static void *mall_get(struct tcf_proto *tp, u32 handle) |
| { |
| + struct cls_mall_head *head = rtnl_dereference(tp->root); |
| + |
| + if (head && head->handle == handle) |
| + return head; |
| + |
| return NULL; |
| } |
| |
| -- |
| 2.19.1 |
| |