Re: [RFC net-next 2/2] net: dsa: mt7530: trap packets from standalone ports to the CPU
flat view
From: Vladimir Oltean <olteanv@gmail.com>
Date: 2021-07-30 16:19:05
Also in:
linux-arm-kernel, linux-mediatek, lkml
On Fri, Jul 30, 2021 at 11:45:41PM +0800, DENG Qingfang wrote:
On Fri, Jul 30, 2021 at 12:50 AM Vladimir Oltean [off-list ref] wrote:quoted
I have the MT7621 GSW, and sadly this reference manual isn't the best in explaining what is and what is not possible. For example, I am still not clear what is meant by "VID1" and "VID0". Is "VID1" the inner (customer) VLAN tag, and "VID0" the outer (service) VLAN tag, or "VID1" means the actual VLAN ID 1? And the bits 3:1 of VAWD1 (VLAN table access register) indicate a FID field per VLAN. I cannot find the piece that you quoted in this manual. But what I expect to happen for a Transparent Port is that the packets are always classified to that port's PVID, and the VLAN Table is looked up with that PVID. There, it will find the FID, which this driver currently always configures as zero. In my manual's description, in the "Transparent Port" chapter, it does explicitly say: VID0 and VID1 will store PVID as the default VID which is used to look up the VLAN table. So I get the impression that the phrase "the VLAN table is not applicable" is not quite correct, but I might be wrong...Alright, I think I've made some progress. In the current code, we only use two combinations to toggle user ports' VLAN awareness: one is PCR.PORT_VLAN set to port matrix mode with PVC.VLAN_ATTR set to transparent port, the other is PCR.PORT_VLAN set to security mode with PVC.VLAN_ATTR set to user port. It turns out that only PVC.VLAN_ATTR contributes to VLAN awareness. Port matrix mode just skips the VLAN table lookup. The reference manual is somehow misleading when describing PORT_VLAN modes (See Page 17 of MT7531 Reference Manual, available at http://wiki.banana-pi.org/Banana_Pi_BPI-R64#Resources). It states that PORT_MEM (VLAN port member) is used for destination if the VLAN table lookup hits, but actually it uses **PORT_MEM & PORT_MATRIX** (bitwise AND of VLAN port member and port matrix) instead, which means we can have two or more separate VLAN-aware bridges with the same PVID and traffic won't leak between them.
Ah, but it's not completely misleading. It does say: 2'b01: Fallback mode Enable 802.1Q function for all the received frames. Do not discard received frames due to ingress membership violation. **Frames whose VID is missed on the VLAN table will be filtered by the Port Matrix Member**. (emphasis mine on the last paragraph)
So I came up with a solution: Set PORT_VLAN to fallback mode when in VLAN-unaware mode, this way, even VLAN-unaware bridges will use independent VLAN filtering.
If you did indeed test that the Port Matrix is still used to enforce
separation between ports if the VLAN table _does_ match and we're in
fallback mode, then we should be okay.
Then assign all standalone ports to a reserved VLAN.
You mean all standalone ports to the same VLAN ID, like 4095, or each
standalone port to a separate reserved VLAN ID? As long as address
learning is disabled on the standalone ports, I guess using a single
VLAN ID like 4095 for all of them is just fine, the Port Matrix will
take care of the rest.