History

net: dsa: sja1105: prepare tagger for handling DSA tags and VLAN simultaneously

In VLAN-unaware mode, sja1105 uses VLAN tags with a custom TPID of 0xdadb. While in the yet-to-be introduced best_effort_vlan_filtering mode, it needs to work with normal VLAN TPID values. A complication arises when we must transmit a VLAN-tagged packet to the switch when it's in VLAN-aware mode. We need to construct a packet with 2 VLAN tags, and the switch will use the outer header for routing and pop it on egress. But sadly, here the 2 hardware generations don't behave the same: - E/T switches won't pop an ETH_P_8021AD tag on egress, it seems (packets will remain double-tagged). - P/Q/R/S switches will drop a packet with 2 ETH_P_8021Q tags (it looks like it tries to prevent VLAN hopping). But looks like the reverse is also true: - E/T switches have no problem popping the outer tag from packets with 2 ETH_P_8021Q tags. - P/Q/R/S will have no problem popping a single tag even if that is ETH_P_8021AD. So it is clear that if we want the hardware to work with dsa_8021q tagging in VLAN-aware mode, we need to send different TPIDs depending on revision. Keep that information in priv->info->qinq_tpid. The per-port tagger structure will hold an xmit_tpid value that depends not only upon the qinq_tpid, but also upon the VLAN awareness state itself (in case we must transmit using 0xdadb).

Vladimir Oltean committed 6 years ago

Commit 38b5bee1 parent cfa36b15 files · +44 −11Browse files

Showing the changes to include/linux (1 of 5 files). Show all

Unified · Split

include/linux/dsa/sja1105.h+1−0
@@ -59,6 +59,7 @@ struct sja1105_port { · 58 unmodified lines
59 struct sja1105_tagger_data *data;59 struct sja1105_tagger_data *data;
60 struct dsa_port *dp;60 struct dsa_port *dp;
61 bool hwts_tx_en;61 bool hwts_tx_en;
62 u16 xmit_tpid;
62};63};
63 64
64#endif /* _NET_DSA_SJA1105_H */65#endif /* _NET_DSA_SJA1105_H */