net/sched: cls_u32: fix cls_u32 on filter replace

"Linux Kernel Mailing List" <[email protected]>
Newsgroups gmane.linux.kernel.commits.head
Message-ID <[email protected]>
Web:        https://git.kernel.org/torvalds/c/eb53f7af6f15285e2f6ada97285395343ce9f433
Commit:     eb53f7af6f15285e2f6ada97285395343ce9f433
Parent:     3968523f855050b8195134da951b87c20bd66130
Refname:    refs/heads/master
Author:     Ivan Vecera <[email protected]>
AuthorDate: Thu Feb 8 16:10:39 2018 +0100
Committer:  David S. Miller <[email protected]>
CommitDate: Thu Feb 8 15:27:58 2018 -0500

    net/sched: cls_u32: fix cls_u32 on filter replace
    
    The following sequence is currently broken:
    
     # tc qdisc add dev foo ingress
     # tc filter replace dev foo protocol all ingress \
       u32 match u8 0 0 action mirred egress mirror dev bar1
     # tc filter replace dev foo protocol all ingress \
       handle 800::800 pref 49152 \
       u32 match u8 0 0 action mirred egress mirror dev bar2
     Error: cls_u32: Key node flags do not match passed flags.
     We have an error talking to the kernel, -1
    
    The error comes from u32_change() when comparing new and
    existing flags. The existing ones always contains one of
    TCA_CLS_FLAGS_{,NOT}_IN_HW flag depending on offloading state.
    These flags cannot be passed from userspace so the condition
    (n->flags != flags) in u32_change() always fails.
    
    Fix the condition so the flags TCA_CLS_FLAGS_NOT_IN_HW and
    TCA_CLS_FLAGS_IN_HW are not taken into account.
    
    Fixes: 24d3dc6d27ea ("net/sched: cls_u32: Reflect HW offload status")
    Signed-off-by: Ivan Vecera <[email protected]>
    Signed-off-by: David S. Miller <[email protected]>
---
 net/sched/cls_u32.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/net/sched/cls_u32.c b/net/sched/cls_u32.c
index 6311a548046b..c75e68e839c7 100644
--- a/net/sched/cls_u32.c
+++ b/net/sched/cls_u32.c
@@ -955,7 +955,8 @@ static int u32_change(struct net *net, struct sk_buff *in_skb,
 			return -EINVAL;
 		}
 
-		if (n->flags != flags) {
+		if ((n->flags ^ flags) &
+		    ~(TCA_CLS_FLAGS_IN_HW | TCA_CLS_FLAGS_NOT_IN_HW)) {
 			NL_SET_ERR_MSG_MOD(extack, "Key node flags do not match passed flags");
 			return -EINVAL;
 		}
--
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.