On 9/11/2020 12:39 PM, Florian Fainelli wrote:


On 9/11/2020 11:35 AM, Vladimir Oltean wrote:
On Fri, Sep 11, 2020 at 11:23:28AM -0700, Florian Fainelli wrote:
On 9/11/2020 8:43 AM, Vladimir Oltean wrote:
The slightly confusing part is that a vlan_filtering=1 bridge accepts the default_pvid either tagged or untagged whereas a vlan_filtering=0 bridge does not, except for DHCP for instance. I would have to add a br0.1 802.1Q upper to take care of the default_pvid being egress tagged on the CPU port.

We could solve this in the DSA receive path, or the Broadcom tag receive path as you say since that is dependent on the tagging format and switch
properties.

With Broadcom tags enabled now, all is well since we can differentiate
traffic from different source ports using that 4 bytes tag.

Where this broke was when using a 802.1Q separation because all frames that
egressed the CPU were egress tagged and it was no longer possible to
differentiate whether they came from the LAN group in VID 1 or the WAN group in VID 2. But all of this should be a thing of the past now, ok, all is
clear again now.

Or we could do this, what do you think?

Yes, this would be working, and I just tested it with the following delta on
top of my b53 patch:

diff --git a/drivers/net/dsa/b53/b53_common.c
b/drivers/net/dsa/b53/b53_common.c
index 46ac8875f870..73507cff3bc4 100644
--- a/drivers/net/dsa/b53/b53_common.c
+++ b/drivers/net/dsa/b53/b53_common.c
@@ -1427,7 +1427,7 @@ void b53_vlan_add(struct dsa_switch *ds, int port,
                         untagged = true;

                 vl->members |= BIT(port);
-               if (untagged)
+               if (untagged && !dsa_is_cpu_port(ds, port))
                         vl->untag |= BIT(port);
                 else
                         vl->untag &= ~BIT(port);
@@ -1465,7 +1465,7 @@ int b53_vlan_del(struct dsa_switch *ds, int port,
                 if (pvid == vid)
                         pvid = b53_default_pvid(dev);

-               if (untagged)
+               if (untagged && !dsa_is_cpu_port(ds, port))
                         vl->untag &= ~(BIT(port));

                 b53_set_vlan_entry(dev, vid, vl);

and it works, thanks!


I'm conflicted. So you prefer having the CPU port as egress-tagged?

I do, because I realized that some of the switches we support are still configured in DSA_TAG_NONE mode because the CPU port they chose is not Broadcom tag capable and there is an user out there who cares a lot about that case not to "break".


Also, I think I'll also experiment with a version of this patch that is
local to the DSA RX path. The bridge people may not like it, and as far
as I understand, only DSA has this situation where pvid-tagged traffic
may end up with a vlan tag on ingress.

OK so something along the lines of: port is bridged, and bridge has vlan_filtering=0 and switch does egress tagging and VID is bridge's default_pvid then pop the tag?

Should this be a helper function that is utilized by the relevant tagger drivers or do you want this in dsa_switch_rcv()?

The two drivers that appear to be untagging the CPU port unconditionally are b53 and kzs9477.
--
Florian

Reply via email to