[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20220323105602.30072-6-boris.sukholitko@broadcom.com>
Date: Wed, 23 Mar 2022 12:56:02 +0200
From: Boris Sukholitko <boris.sukholitko@...adcom.com>
To: netdev@...r.kernel.org, "David S . Miller" <davem@...emloft.net>,
Jakub Kicinski <kuba@...nel.org>,
Jamal Hadi Salim <jhs@...atatu.com>,
Cong Wang <xiyou.wangcong@...il.com>,
Jiri Pirko <jiri@...nulli.us>,
"Gustavo A . R . Silva" <gustavoars@...nel.org>,
Vladimir Oltean <vladimir.oltean@....com>,
Eric Dumazet <edumazet@...gle.com>,
zhang kai <zhangkaiheb@....com>,
Yoshiki Komachi <komachi.yoshiki@...il.com>
Cc: Ilya Lifshits <ilya.lifshits@...adcom.com>,
Boris Sukholitko <boris.sukholitko@...adcom.com>
Subject: [PATCH net-next 5/5] Consider the number of vlan tags for vlan filters
Currently the existence of vlan filters is conditional on the vlan
protocol being matched in the tc rule. I.e. the following rule:
tc filter add dev eth1 ingress flower vlan_prio 5
is illegal because we lack protocol 802.1q in the rule.
Having the num_of_vlans filter configured removes this restriction. The
following rule becomes ok:
tc filter add dev eth1 ingress flower num_of_vlans 1 vlan_prio 5
because we know that the packet is single tagged.
Signed-off-by: Boris Sukholitko <boris.sukholitko@...adcom.com>
---
net/sched/cls_flower.c | 24 ++++++++++++++++--------
1 file changed, 16 insertions(+), 8 deletions(-)
diff --git a/net/sched/cls_flower.c b/net/sched/cls_flower.c
index 42dd84f5a037..464a91e64b5f 100644
--- a/net/sched/cls_flower.c
+++ b/net/sched/cls_flower.c
@@ -1023,8 +1023,10 @@ static void fl_set_key_vlan(struct nlattr **tb,
VLAN_PRIORITY_MASK;
key_mask->vlan_priority = VLAN_PRIORITY_MASK;
}
- key_val->vlan_tpid = ethertype;
- key_mask->vlan_tpid = cpu_to_be16(~0);
+ if (ethertype) {
+ key_val->vlan_tpid = ethertype;
+ key_mask->vlan_tpid = cpu_to_be16(~0);
+ }
}
static void fl_set_key_flag(u32 flower_key, u32 flower_mask,
@@ -1495,13 +1497,18 @@ static int fl_set_key_ct(struct nlattr **tb,
}
static bool is_vlan_key(struct nlattr *tb, __be16 *ethertype,
- struct fl_flow_key *key, struct fl_flow_key *mask)
+ struct fl_flow_key *key, struct fl_flow_key *mask,
+ int vthresh)
{
- if (!tb)
- return false;
+ const bool good_num_of_vlans = key->num_of_vlans.num_of_vlans > vthresh;
+
+ if (!tb) {
+ *ethertype = 0;
+ return good_num_of_vlans;
+ }
*ethertype = nla_get_be16(tb);
- if (eth_type_vlan(*ethertype))
+ if (good_num_of_vlans || eth_type_vlan(*ethertype))
return true;
key->basic.n_proto = *ethertype;
@@ -1536,12 +1543,13 @@ static int fl_set_key(struct net *net, struct nlattr **tb,
TCA_FLOWER_UNSPEC,
sizeof(key->num_of_vlans));
- if (is_vlan_key(tb[TCA_FLOWER_KEY_ETH_TYPE], ðertype, key, mask)) {
+ if (is_vlan_key(tb[TCA_FLOWER_KEY_ETH_TYPE], ðertype, key, mask, 0)) {
fl_set_key_vlan(tb, ethertype, TCA_FLOWER_KEY_VLAN_ID,
TCA_FLOWER_KEY_VLAN_PRIO, &key->vlan,
&mask->vlan);
- if (is_vlan_key(tb[TCA_FLOWER_KEY_VLAN_ETH_TYPE], ðertype, key, mask)) {
+ if (is_vlan_key(tb[TCA_FLOWER_KEY_VLAN_ETH_TYPE],
+ ðertype, key, mask, 1)) {
fl_set_key_vlan(tb, ethertype,
TCA_FLOWER_KEY_CVLAN_ID,
TCA_FLOWER_KEY_CVLAN_PRIO,
--
2.29.2
Download attachment "smime.p7s" of type "application/pkcs7-signature" (4221 bytes)
Powered by blists - more mailing lists