mirror of
https://github.com/torvalds/linux.git
synced 2024-12-13 22:53:20 +00:00
Merge branch 'sja1105-fixes'
Vladimir Oltean says:
====================
Fix VLAN checks for SJA1105 DSA tc-flower filters
This fixes a ridiculous situation where the driver, in VLAN-unaware
mode, would refuse accepting any tc filter:
tc filter replace dev sw1p3 ingress flower skip_sw \
dst_mac 42:be:24:9b:76:20 \
action gate (...)
Error: sja1105: Can only gate based on {DMAC, VID, PCP}.
tc filter replace dev sw1p3 ingress protocol 802.1Q flower skip_sw \
vlan_id 1 vlan_prio 0 dst_mac 42:be:24:9b:76:20 \
action gate (...)
Error: sja1105: Can only gate based on DMAC.
So, without changing the VLAN awareness state, it says it doesn't want
VLAN-aware rules, and it doesn't want VLAN-unaware rules either. One
would say it's in Schrodinger's state...
Now, the situation has been made worse by commit 7f14937fac
("net:
dsa: sja1105: keep the VLAN awareness state in a driver variable"),
which made VLAN awareness a ternary attribute, but after inspecting the
code from before that patch with a truth table, it looks like the
logical bug was there even before.
While attempting to fix this, I also noticed some leftover debugging
code in one of the places that needed to be fixed. It would have
appeared in the context of patch 3/3 anyway, so I decided to create a
patch that removes it.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
ad103e03bd
@ -342,7 +342,9 @@ int sja1105_vl_redirect(struct sja1105_private *priv, int port,
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"Can only redirect based on DMAC");
|
||||
return -EOPNOTSUPP;
|
||||
} else if (key->type != SJA1105_KEY_VLAN_AWARE_VL) {
|
||||
} else if ((priv->vlan_state == SJA1105_VLAN_BEST_EFFORT ||
|
||||
priv->vlan_state == SJA1105_VLAN_FILTERING_FULL) &&
|
||||
key->type != SJA1105_KEY_VLAN_AWARE_VL) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"Can only redirect based on {DMAC, VID, PCP}");
|
||||
return -EOPNOTSUPP;
|
||||
@ -588,14 +590,12 @@ int sja1105_vl_gate(struct sja1105_private *priv, int port,
|
||||
|
||||
if (priv->vlan_state == SJA1105_VLAN_UNAWARE &&
|
||||
key->type != SJA1105_KEY_VLAN_UNAWARE_VL) {
|
||||
dev_err(priv->ds->dev, "1: vlan state %d key type %d\n",
|
||||
priv->vlan_state, key->type);
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"Can only gate based on DMAC");
|
||||
return -EOPNOTSUPP;
|
||||
} else if (key->type != SJA1105_KEY_VLAN_AWARE_VL) {
|
||||
dev_err(priv->ds->dev, "2: vlan state %d key type %d\n",
|
||||
priv->vlan_state, key->type);
|
||||
} else if ((priv->vlan_state == SJA1105_VLAN_BEST_EFFORT ||
|
||||
priv->vlan_state == SJA1105_VLAN_FILTERING_FULL) &&
|
||||
key->type != SJA1105_KEY_VLAN_AWARE_VL) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"Can only gate based on {DMAC, VID, PCP}");
|
||||
return -EOPNOTSUPP;
|
||||
|
Loading…
Reference in New Issue
Block a user