• Vladimir Oltean's avatar
    net: mscc: ocelot: support L2 multicast entries · e5d1f896
    Vladimir Oltean authored
    There is one main difference in mscc_ocelot between IP multicast and L2
    multicast. With IP multicast, destination ports are encoded into the
    upper bytes of the multicast MAC address. Example: to deliver the
    address 01:00:5E:11:22:33 to ports 3, 8, and 9, one would need to
    program the address of 00:03:08:11:22:33 into hardware. Whereas for L2
    multicast, the MAC table entry points to a Port Group ID (PGID), and
    that PGID contains the port mask that the packet will be forwarded to.
    As to why it is this way, no clue. My guess is that not all port
    combinations can be supported simultaneously with the limited number of
    PGIDs, and this was somehow an issue for IP multicast but not for L2
    multicast. Anyway.
    
    Prior to this change, the raw L2 multicast code was bogus, due to the
    fact that there wasn't really any way to test it using the bridge code.
    There were 2 issues:
    - A multicast PGID was allocated for each MDB entry, but it wasn't in
      fact programmed to hardware. It was dummy.
    - In fact we don't want to reserve a multicast PGID for every single MDB
      entry. That would be odd because we can only have ~60 PGIDs, but
      thousands of MDB entries. So instead, we want to reserve a multicast
      PGID for every single port combination for multicast traffic. And
      since we can have 2 (or more) MDB entries delivered to the same port
      group (and therefore PGID), we need to reference-count the PGIDs.
    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>
    e5d1f896
ocelot.h 21.7 KB