• Vladimir Oltean's avatar
    net: mscc: ocelot: fix backwards compatibility with single-chain tc-flower offload · 8e0341ae
    Vladimir Oltean authored
    ACL rules can be offloaded to VCAP IS2 either through chain 0, or, since
    the blamed commit, through a chain index whose number encodes a specific
    PAG (Policy Action Group) and lookup number.
    
    The chain number is translated through ocelot_chain_to_pag() into a PAG,
    and through ocelot_chain_to_lookup() into a lookup number.
    
    The problem with the blamed commit is that the above 2 functions don't
    have special treatment for chain 0. So ocelot_chain_to_pag(0) returns
    filter->pag = 224, which is in fact -32, but the "pag" field is an u8.
    
    So we end up programming the hardware with VCAP IS2 entries having a PAG
    of 224. But the way in which the PAG works is that it defines a subset
    of VCAP IS2 filters which should match on a packet. The default PAG is
    0, and previous VCAP IS1 rules (which we offload using 'goto') can
    modify it. So basically, we are installing filters with a PAG on which
    no packet will ever match. This is the hardware equivalent of adding
    filters to a chain which has no 'goto' to it.
    
    Restore the previous functionality by making ACL filters offloaded to
    chain 0 go to PAG 0 and lookup number 0. The choice of PAG is clearly
    correct, but the choice of lookup number isn't "as before" (which was to
    leave the lookup a "don't care"). However, lookup 0 should be fine,
    since even though there are ACL actions (policers) which have a
    requirement to be used in a specific lookup, that lookup is 0.
    
    Fixes: 226e9cd8 ("net: mscc: ocelot: only install TCAM entries into a specific lookup and PAG")
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Link: https://lore.kernel.org/r/20220316192117.2568261-1-vladimir.oltean@nxp.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    8e0341ae
ocelot_flower.c 26.1 KB