• Vladimir Oltean's avatar
    net: dsa: felix: perform switch setup for tag_8021q · e21268ef
    Vladimir Oltean authored
    Unlike sja1105, the only other user of the software-defined tag_8021q.c
    tagger format, the implementation we choose for the Felix DSA switch
    driver preserves full functionality under a vlan_filtering bridge
    (i.e. IP termination works through the DSA user ports under all
    circumstances).
    
    The tag_8021q protocol just wants:
    - Identifying the ingress switch port based on the RX VLAN ID, as seen
      by the CPU. We achieve this by using the TCAM engines (which are also
      used for tc-flower offload) to push the RX VLAN as a second, outer
      tag, on egress towards the CPU port.
    - Steering traffic injected into the switch from the network stack
      towards the correct front port based on the TX VLAN, and consuming
      (popping) that header on the switch's egress.
    
    A tc-flower pseudocode of the static configuration done by the driver
    would look like this:
    
    $ tc qdisc add dev <cpu-port> clsact
    $ for eth in swp0 swp1 swp2 swp3; do \
    	tc filter add dev <cpu-port> egress flower indev ${eth} \
    		action vlan push id <rxvlan> protocol 802.1ad; \
    	tc filter add dev <cpu-port> ingress protocol 802.1Q flower
    		vlan_id <txvlan> action vlan pop \
    		action mirred egress redirect dev ${eth}; \
    done
    
    but of course since DSA does not register network interfaces for the CPU
    port, this configuration would be impossible for the user to do. Also,
    due to the same reason, it is impossible for the user to inadvertently
    delete these rules using tc. These rules do not collide in any way with
    tc-flower, they just consume some TCAM space, which is something we can
    live with.
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    e21268ef
felix.c 37.8 KB