mirror_ubuntu-kernels/drivers/net/ethernet/mscc
Vladimir Oltean 276d37eb44 net: mscc: ocelot: fix tagged VLAN refusal while under a VLAN-unaware bridge
Currently the following set of commands fails:

$ ip link add br0 type bridge # vlan_filtering 0
$ ip link set swp0 master br0
$ bridge vlan
port              vlan-id
swp0              1 PVID Egress Untagged
$ bridge vlan add dev swp0 vid 10
Error: mscc_ocelot_switch_lib: Port with more than one egress-untagged VLAN cannot have egress-tagged VLANs.

Dumping ocelot->vlans, one can see that the 2 egress-untagged VLANs on swp0 are
vid 1 (the bridge PVID) and vid 4094, a PVID used privately by the driver for
VLAN-unaware bridging. So this is why bridge vid 10 is refused, despite
'bridge vlan' showing a single egress untagged VLAN.

As mentioned in the comment added, having this private VLAN does not impose
restrictions to the hardware configuration, yet it is a bookkeeping problem.

There are 2 possible solutions.

One is to make the functions that operate on VLAN-unaware pvids:
- ocelot_add_vlan_unaware_pvid()
- ocelot_del_vlan_unaware_pvid()
- ocelot_port_setup_dsa_8021q_cpu()
- ocelot_port_teardown_dsa_8021q_cpu()
call something different than ocelot_vlan_member_(add|del)(), the latter being
the real problem, because it allocates a struct ocelot_bridge_vlan *vlan which
it adds to ocelot->vlans. We don't really *need* the private VLANs in
ocelot->vlans, it's just that we have the extra convenience of having the
vlan->portmask cached in software (whereas without these structures, we'd have
to create a raw ocelot_vlant_rmw_mask() procedure which reads back the current
port mask from hardware).

The other solution is to filter out the private VLANs from
ocelot_port_num_untagged_vlans(), since they aren't what callers care about.
We only need to do this to the mentioned function and not to
ocelot_port_num_tagged_vlans(), because private VLANs are never egress-tagged.

Nothing else seems to be broken in either solution, but the first one requires
more rework which will conflict with the net-next change  36a0bf4435 ("net:
mscc: ocelot: set up tag_8021q CPU ports independent of user port affinity"),
and I'd like to avoid that. So go with the other one.

Fixes: 54c3198460 ("net: mscc: ocelot: enforce FDB isolation when VLAN-unaware")
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Link: https://lore.kernel.org/r/20220927122042.1100231-1-vladimir.oltean@nxp.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2022-09-28 19:03:28 -07:00
..
Kconfig of: net: move of_net under net/ 2021-10-07 13:39:51 +01:00
Makefile net: ocelot: add FDMA support 2021-12-10 20:56:58 -08:00
ocelot_devlink.c net: update NXP copyright text 2021-09-17 13:52:17 +01:00
ocelot_fdma.c net: ocelot: fix wrong time_after usage 2022-07-07 18:05:36 -07:00
ocelot_fdma.h net: ocelot: add FDMA support 2021-12-10 20:56:58 -08:00
ocelot_flower.c net: mscc: ocelot: offload tc action "ok" using an empty action vector 2022-05-22 22:15:19 +01:00
ocelot_io.c net: mscc: ocelot: add ability to perform bulk reads 2022-02-14 13:24:29 +00:00
ocelot_mrp.c net: mscc: ocelot: enforce FDB isolation when VLAN-unaware 2022-02-27 11:06:14 +00:00
ocelot_net.c net: mscc: ocelot: report ndo_get_stats64 from the wraparound-resistant ocelot->stats 2022-08-17 21:58:33 -07:00
ocelot_police.c net: mscc: ocelot: drop port argument from qos_policer_conf_set 2022-05-04 20:42:15 -07:00
ocelot_police.h net: mscc: ocelot: drop port argument from qos_policer_conf_set 2022-05-04 20:42:15 -07:00
ocelot_ptp.c net: dsa: felix: update base time of time-aware shaper when adjusting PTP time 2022-06-19 09:53:59 +01:00
ocelot_qs.h
ocelot_rew.h
ocelot_vcap.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2022-05-12 16:15:30 -07:00
ocelot_vcap.h net: dsa: felix: perform switch setup for tag_8021q 2021-01-29 21:25:27 -08:00
ocelot_vsc7514.c net: mscc: ocelot: keep ocelot_stat_layout by reg address, not offset 2022-08-17 21:58:32 -07:00
ocelot.c net: mscc: ocelot: fix tagged VLAN refusal while under a VLAN-unaware bridge 2022-09-28 19:03:28 -07:00
ocelot.h net: mscc: ocelot: move ocelot_port_private :: chip_port to ocelot_port :: index 2022-05-12 16:39:18 -07:00
vsc7514_regs.c net: mscc: ocelot: keep ocelot_stat_layout by reg address, not offset 2022-08-17 21:58:32 -07:00