• Vladimir Oltean's avatar
    net: mscc: ocelot: support egress VLAN rewriting via VCAP ES0 · de5bbb6f
    Vladimir Oltean authored
    Currently the ocelot driver does support the 'vlan modify' action, but
    in the ingress chain, and it is offloaded to VCAP IS1. This action
    changes the classified VLAN before the packet enters the bridging
    service, and the bridging works with the classified VLAN modified by
    VCAP IS1.
    
    That is good for some use cases, but there are others where the VLAN
    must be modified at the stage of the egress port, after the packet has
    exited the bridging service. One example is simulating IEEE 802.1CB
    active stream identification filters ("active" means that not only the
    rule matches on a packet flow, but it is also able to change some
    headers). For example, a stream is replicated on two egress ports, but
    they must have different VLAN IDs on egress ports A and B.
    
    This seems like a task for the VCAP ES0, but that currently only
    supports pushing the ES0 tag A, which is specified in the rule. Pushing
    another VLAN header is not what we want, but rather overwriting the
    existing one.
    
    It looks like when we push the ES0 tag A, it is actually possible to not
    only take the ES0 tag A's value from the rule itself (VID_A_VAL), but
    derive it from the following formula:
    
    ES0_TAG_A = Classified VID + VID_A_VAL
    
    Otherwise said, ES0_TAG_A can be used to increment with a given value
    the VLAN ID that the packet was already classified to, and the packet
    will have this value as an outer VLAN tag. This new VLAN ID value then
    gets stripped on egress (or not) according to the value of the native
    VLAN from the bridging service.
    
    While the hardware will happily increment the classified VLAN ID for all
    packets that match the ES0 rule, in practice this would be rather
    insane, so we only allow this kind of ES0 action if the ES0 filter
    contains a VLAN ID too, so as to restrict the matching on a known
    classified VLAN. If we program VID_A_VAL with the delta between the
    desired final VLAN (ES0_TAG_A) and the classified VLAN, we obtain the
    desired behavior.
    
    It doesn't look like it is possible with the tc-vlan action to modify
    the VLAN ID but not the PCP. In hardware it is possible to leave the PCP
    to the classified value, but we unconditionally program it to overwrite
    it with the PCP value from the rule.
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    de5bbb6f
ocelot_vcap.h 18.1 KB