• Vladimir Oltean's avatar
    net: mscc: ocelot: support IPv4, IPv6 and plain Ethernet mdb entries · 9403c158
    Vladimir Oltean authored
    The current procedure for installing a multicast address is hardcoded
    for IPv4. But, in the ocelot hardware, there are 3 different procedures
    for IPv4, IPv6 and for regular L2 multicast.
    
    For IPv6 (33-33-xx-xx-xx-xx), it's the same as for IPv4
    (01-00-5e-xx-xx-xx), except that the destination port mask is stuffed
    into first 2 bytes of the MAC address except into first 3 bytes.
    
    For plain Ethernet multicast, there's no port-in-address stuffing going
    on, instead the DEST_IDX (pointer to PGID) is used there, just as for
    unicast. So we have to use one of the nonreserved multicast PGIDs that
    the hardware has allocated for this purpose.
    
    This patch classifies the type of multicast address based on its first
    bytes, then redirects to one of the 3 different hardware procedures.
    
    Note that this gives us a really better way of redirecting PTP frames
    sent at 01-1b-19-00-00-00 to the CPU. Previously, Yangbo Lu tried to add
    a trapping rule for PTP EtherType but got a lot of pushback:
    
    https://patchwork.ozlabs.org/project/netdev/patch/20190813025214.18601-5-yangbo.lu@nxp.com/
    
    But right now, that isn't needed at all. The application stack (ptp4l)
    does this for the PTP multicast addresses it's interested in (which are
    configurable, and include 01-1b-19-00-00-00):
    
    	memset(&mreq, 0, sizeof(mreq));
    	mreq.mr_ifindex = index;
    	mreq.mr_type = PACKET_MR_MULTICAST;
    	mreq.mr_alen = MAC_LEN;
    	memcpy(mreq.mr_address, addr1, MAC_LEN);
    
    	err1 = setsockopt(fd, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mreq,
    			  sizeof(mreq));
    
    Into the kernel, this translates into a dev_mc_add on the switch network
    interfaces, and our drivers know that it means they should translate it
    into a host MDB address (make the CPU port be the destination).
    Previously, this was broken because all mdb addresses were treated as
    IPv4 (which 01-1b-19-00-00-00 obviously is not).
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    9403c158
ocelot.c 41.9 KB