Fix u32_change() to pass proper variable to u32_replace_hw_knode(). When trying to offload u32 cmd by adding skip_sw attributes it gets ignored and it cannot be correctly processed by HW and tc_cls_u32_offload struct which is then passed to driver lacks skip_sw var enabled. u32_replace_hw_knode is fed with the TCA_ACT_* flags (bits 16+) instead of TCA_CLS_* flags (bits 0-4) which actually stores the flags parsed by tc, so tc_skip_sw() always returns false. This leads to ignoring some of the attibutes which are meant to be configured on filter setup. None of the TCA_ACT_FLAGS_* is actually used within u32_replace_hw_knode(), so there is no point in passing them. Looks like commit 695176bfe5de ("net_sched: refactor TC action init API") shadowed the local flags variable which used to be set with nla_get_u32(tb[TCA_U32_FLAGS]) with the flags as the new function param while not replacing for none of the u32_replace_hw_knode() calls. Cc: Fixes: 695176bfe5de ("net_sched: refactor TC action init API") Reviewed-by: Przemek Kitszel Reviewed-by: Marcin Szycik Reviewed-by: Aleksandr Loktionov Signed-off-by: Jedrzej Jagielski --- net/sched/cls_u32.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/net/sched/cls_u32.c b/net/sched/cls_u32.c index 8f30cc82181d..dc6e455e64ec 100644 --- a/net/sched/cls_u32.c +++ b/net/sched/cls_u32.c @@ -935,7 +935,7 @@ static int u32_change(struct net *net, struct sk_buff *in_skb, u32_bind_filter(tp, new, base, tb); - err = u32_replace_hw_knode(tp, new, flags, extack); + err = u32_replace_hw_knode(tp, new, userflags, extack); if (err) { u32_unbind_filter(tp, new, tb); @@ -1161,7 +1161,7 @@ static int u32_change(struct net *net, struct sk_buff *in_skb, struct tc_u_knode __rcu **ins; struct tc_u_knode *pins; - err = u32_replace_hw_knode(tp, n, flags, extack); + err = u32_replace_hw_knode(tp, n, userflags, extack); if (err) goto errunbind; -- 2.31.1