Received: by 2002:a05:6a10:f3d0:0:0:0:0 with SMTP id a16csp2836170pxv; Mon, 12 Jul 2021 03:08:38 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxkQpzFFnS4lJqhRkKRzStCLOGVwo+hdOB+DiEqpTlb3/dfIy6jHkP695OJjixWEcHSaO5U X-Received: by 2002:a05:6638:1316:: with SMTP id r22mr44110408jad.89.1626084518100; Mon, 12 Jul 2021 03:08:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626084518; cv=none; d=google.com; s=arc-20160816; b=zxmpKoPstm0ZrfZPtA6hr7QHsVB3QbzFcA8yNeTbPkIDsdIWDDvdvLxaJk/RYlM2NS t9vB71sBOSBHgyd4BTPEHrsiYQTY1hnqTyYounFZABh7y/e0I9YtT2FMbQEr8moRq6vq J/5L0pzYL0cS8qzGHTfDWSRYTqZF5iVyPF9jdlOWsGWgou7MsMxBWOycpjhTFxAsyyUW vUoM4QU2TP+tRRJkwVR5wx+b20cw+Qx9ZjP/yxy2NXW8Ml1ZU3f2yGkSzkH2aTtZtyuX F46kcbQ2wNgj2KizWApFjXQiUI2qM5/kFX0w8dbc4x5hAkOJmtIRH4qvdxe3zct8rqRc UaZQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=CwYzMyWoYx5nIVso0/8eDj7g4rmvj70j8F9GXjwbXyU=; b=E0iDxtGICJfXZ7+5hZ8qfqKiz0WprpUlUQFSwpsvMMW2Q9Drx43fUiduv1jc/FJbct y6uOA+D2K64aGaocrdmBlnE9801L81KBvTeX67vjiP1CtmgDaku69nFa0EX7UJIltH8n Lyvypty2XOh8uELbo9YSLehn3KjRXEEtX9WWUg5YZ23+zxYLh1bROcj5fn8qT1+b25XS /1/IHJ7s5rJM8GJI2O4Ae8AA1p/hnsZepYnviqmM1OKK/wPcDdHbjOtEPahaSde6T/JA yE1a+oqZbAe28HF0ZMON/heFFN8FNSBKFizPRPh6tepJS1AOTCC1bLfWsvA9pZPvHiZk 4C9g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=yLBHkiut; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id n12si17978622iob.27.2021.07.12.03.08.26; Mon, 12 Jul 2021 03:08:38 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=yLBHkiut; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243212AbhGLHtF (ORCPT + 99 others); Mon, 12 Jul 2021 03:49:05 -0400 Received: from mail.kernel.org ([198.145.29.99]:49166 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S241575AbhGLHOl (ORCPT ); Mon, 12 Jul 2021 03:14:41 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 7FB99613BE; Mon, 12 Jul 2021 07:11:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1626073890; bh=uqv8mcvuAL0IiTE5LBvoOhLWHQTLzapLqUNAu/erNP4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=yLBHkiuth972hxcKhwKIU6u40Ucl3VdwSMPvLSaAK/KzEYZCqXVdO9b7Ppf7AjnN/ t2LRE8d2xOflogYFaAM75tNuLYDQB77bwXWS9MDwHRL9un0agKfpEGJJ+K6dFnr9TC Jol72lts4BVB3h2ujnGEWdtKrTS9w+PQNW6P6nAE= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Boris Sukholitko , "David S. Miller" , Sasha Levin Subject: [PATCH 5.12 392/700] net/sched: act_vlan: Fix modify to allow 0 Date: Mon, 12 Jul 2021 08:07:55 +0200 Message-Id: <20210712061018.097314256@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210712060924.797321836@linuxfoundation.org> References: <20210712060924.797321836@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Boris Sukholitko [ Upstream commit 9c5eee0afca09cbde6bd00f77876754aaa552970 ] Currently vlan modification action checks existence of vlan priority by comparing it to 0. Therefore it is impossible to modify existing vlan tag to have priority 0. For example, the following tc command will change the vlan id but will not affect vlan priority: tc filter add dev eth1 ingress matchall action vlan modify id 300 \ priority 0 pipe mirred egress redirect dev eth2 The incoming packet on eth1: ethertype 802.1Q (0x8100), vlan 200, p 4, ethertype IPv4 will be changed to: ethertype 802.1Q (0x8100), vlan 300, p 4, ethertype IPv4 although the user has intended to have p == 0. The fix is to add tcfv_push_prio_exists flag to struct tcf_vlan_params and rely on it when deciding to set the priority. Fixes: 45a497f2d149a4a8061c (net/sched: act_vlan: Introduce TCA_VLAN_ACT_MODIFY vlan action) Signed-off-by: Boris Sukholitko Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- include/net/tc_act/tc_vlan.h | 1 + net/sched/act_vlan.c | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/include/net/tc_act/tc_vlan.h b/include/net/tc_act/tc_vlan.h index f051046ba034..f94b8bc26f9e 100644 --- a/include/net/tc_act/tc_vlan.h +++ b/include/net/tc_act/tc_vlan.h @@ -16,6 +16,7 @@ struct tcf_vlan_params { u16 tcfv_push_vid; __be16 tcfv_push_proto; u8 tcfv_push_prio; + bool tcfv_push_prio_exists; struct rcu_head rcu; }; diff --git a/net/sched/act_vlan.c b/net/sched/act_vlan.c index 1cac3c6fbb49..a108469c664f 100644 --- a/net/sched/act_vlan.c +++ b/net/sched/act_vlan.c @@ -70,7 +70,7 @@ static int tcf_vlan_act(struct sk_buff *skb, const struct tc_action *a, /* replace the vid */ tci = (tci & ~VLAN_VID_MASK) | p->tcfv_push_vid; /* replace prio bits, if tcfv_push_prio specified */ - if (p->tcfv_push_prio) { + if (p->tcfv_push_prio_exists) { tci &= ~VLAN_PRIO_MASK; tci |= p->tcfv_push_prio << VLAN_PRIO_SHIFT; } @@ -121,6 +121,7 @@ static int tcf_vlan_init(struct net *net, struct nlattr *nla, struct tc_action_net *tn = net_generic(net, vlan_net_id); struct nlattr *tb[TCA_VLAN_MAX + 1]; struct tcf_chain *goto_ch = NULL; + bool push_prio_exists = false; struct tcf_vlan_params *p; struct tc_vlan *parm; struct tcf_vlan *v; @@ -189,7 +190,8 @@ static int tcf_vlan_init(struct net *net, struct nlattr *nla, push_proto = htons(ETH_P_8021Q); } - if (tb[TCA_VLAN_PUSH_VLAN_PRIORITY]) + push_prio_exists = !!tb[TCA_VLAN_PUSH_VLAN_PRIORITY]; + if (push_prio_exists) push_prio = nla_get_u8(tb[TCA_VLAN_PUSH_VLAN_PRIORITY]); break; case TCA_VLAN_ACT_POP_ETH: @@ -241,6 +243,7 @@ static int tcf_vlan_init(struct net *net, struct nlattr *nla, p->tcfv_action = action; p->tcfv_push_vid = push_vid; p->tcfv_push_prio = push_prio; + p->tcfv_push_prio_exists = push_prio_exists || action == TCA_VLAN_ACT_PUSH; p->tcfv_push_proto = push_proto; if (action == TCA_VLAN_ACT_PUSH_ETH) { -- 2.30.2