Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

net: dsa: tag_sja1105: fix source port decoding in vlan_filtering=0 bridge mode

There was a regression introduced by the blamed commit, where pinging to
a VLAN-unaware bridge would fail with the repeated message "Couldn't
decode source port" coming from the tagging protocol driver.

When receiving packets with a bridge_vid as determined by
dsa_tag_8021q_bridge_join(), dsa_8021q_rcv() will decode:
- source_port = 0 (which isn't really valid, more like "don't know")
- switch_id = 0 (which isn't really valid, more like "don't know")
- vbid = value in range 1-7

Since the blamed patch has reversed the order of the checks, we are now
going to believe that source_port != -1 and switch_id != -1, so they're
valid, but they aren't.

The minimal solution to the problem is to only populate source_port and
switch_id with what dsa_8021q_rcv() came up with, if the vbid is zero,
i.e. the source port information is trustworthy.

Fixes: c1ae02d87689 ("net: dsa: tag_sja1105: always prefer source port information from INCL_SRCPT")
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: Simon Horman <simon.horman@corigine.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Vladimir Oltean and committed by
David S. Miller
a398b9ea 6ca3c005

+6 -3
+6 -3
net/dsa/tag_sja1105.c
··· 573 573 * if available. This allows us to not overwrite a valid source 574 574 * port and switch ID with zeroes when receiving link-local 575 575 * frames from a VLAN-unaware bridged port (non-zero vbid) or a 576 - * VLAN-aware bridged port (non-zero vid). 576 + * VLAN-aware bridged port (non-zero vid). Furthermore, the 577 + * tag_8021q source port information is only of trust when the 578 + * vbid is 0 (precise port). Otherwise, tmp_source_port and 579 + * tmp_switch_id will be zeroes. 577 580 */ 578 - if (source_port == -1) 581 + if (vbid == 0 && source_port == -1) 579 582 source_port = tmp_source_port; 580 - if (switch_id == -1) 583 + if (vbid == 0 && switch_id == -1) 581 584 switch_id = tmp_switch_id; 582 585 } else if (source_port == -1 && switch_id == -1) { 583 586 /* Packets with no source information have no chance of