Skip to content

Commit 96a91e6

Browse files
vladimirolteankuba-moo
authored andcommitted
net: dsa: lantiq_gswip: disallow changes to privately set up VID 0
User space can force the altering of VID 0 as it was privately set up by this driver. For example, when the port joins a VLAN-aware bridge, dsa_user_manage_vlan_filtering() will set NETIF_F_HW_VLAN_CTAG_FILTER. If the port is subsequently brought up and CONFIG_VLAN_8021Q is enabled, the vlan_vid0_add() function will want to make sure we are capable of accepting packets tagged with VID 0. Generally, DSA/switchdev drivers want to suppress that bit of help from the 8021q layer, and handle VID 0 filters themselves. The 8021q layer might actually be even detrimential, because VLANs added through vlan_vid_add() pass through dsa_user_vlan_rx_add_vid(), which is documented as this: /* This API only allows programming tagged, non-PVID VIDs */ .flags = 0, so it will force VID 0 to be reconfigured as egress-tagged, non-PVID. Whereas the driver configures it as PVID and egress-untagged, the exact opposite. Signed-off-by: Vladimir Oltean <[email protected]> Signed-off-by: Daniel Golle <[email protected]> Link: https://patch.msgid.link/9f68340c34b5312c3b8c6c7ecf3cfce574a3f65d.1760566491.git.daniel@makrotopia.org Signed-off-by: Jakub Kicinski <[email protected]>
1 parent ab3ce58 commit 96a91e6

File tree

1 file changed

+6
-0
lines changed

1 file changed

+6
-0
lines changed

drivers/net/dsa/lantiq/lantiq_gswip.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1000,6 +1000,9 @@ static int gswip_port_vlan_add(struct dsa_switch *ds, int port,
10001000
bool pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID;
10011001
int err;
10021002

1003+
if (vlan->vid == GSWIP_VLAN_UNAWARE_PVID)
1004+
return 0;
1005+
10031006
err = gswip_port_vlan_prepare(ds, port, vlan, extack);
10041007
if (err)
10051008
return err;
@@ -1023,6 +1026,9 @@ static int gswip_port_vlan_del(struct dsa_switch *ds, int port,
10231026
struct gswip_priv *priv = ds->priv;
10241027
bool pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID;
10251028

1029+
if (vlan->vid == GSWIP_VLAN_UNAWARE_PVID)
1030+
return 0;
1031+
10261032
/* We have to receive all packets on the CPU port and should not
10271033
* do any VLAN filtering here. This is also called with bridge
10281034
* NULL and then we do not know for which bridge to configure

0 commit comments

Comments
 (0)