linux_dsm_epyc7002/drivers/net/ethernet/mscc
Vladimir Oltean 9403c158b8 net: mscc: ocelot: support IPv4, IPv6 and plain Ethernet mdb entries
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: Vladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2020-06-22 20:41:05 -07:00
..
Kconfig net: mscc: ocelot: rename MSCC_OCELOT_SWITCH_OCELOT to MSCC_OCELOT_SWITCH 2020-06-20 17:25:23 -07:00
Makefile net: mscc: ocelot: rename ocelot_ace.{c, h} to ocelot_vcap.{c,h} 2020-06-20 17:25:23 -07:00
ocelot_flower.c net: mscc: ocelot: generalize the "ACE/ACL" names 2020-06-20 17:25:23 -07:00
ocelot_io.c net: mscc: ocelot: move resource ioremap and regmap init to common code 2019-11-15 12:32:16 -08:00
ocelot_net.c net: mscc: ocelot: introduce macros for iterating over PGIDs 2020-06-22 20:41:05 -07:00
ocelot_police.c net: mscc: ocelot: move net_device related functions to ocelot_net.c 2020-06-20 17:25:23 -07:00
ocelot_police.h net: mscc: ocelot: unexpose ocelot_vcap_policer_{add,del} 2020-06-20 17:25:23 -07:00
ocelot_ptp.c net: mscc: ocelot: support 4 PTP programmable pins 2020-04-21 15:38:33 -07:00
ocelot_qs.h
ocelot_rew.h
ocelot_s2.h net: mscc: ocelot: Add support for tcam 2019-06-02 13:49:49 -07:00
ocelot_vcap.c net: mscc: ocelot: unexpose ocelot_vcap_policer_{add,del} 2020-06-20 17:25:23 -07:00
ocelot_vcap.h net: mscc: ocelot: generalize the "ACE/ACL" names 2020-06-20 17:25:23 -07:00
ocelot_vsc7514.c net: mscc: ocelot: move ocelot_regs.c into ocelot_vsc7514.c 2020-06-20 17:25:23 -07:00
ocelot.c net: mscc: ocelot: support IPv4, IPv6 and plain Ethernet mdb entries 2020-06-22 20:41:05 -07:00
ocelot.h net: mscc: ocelot: support IPv4, IPv6 and plain Ethernet mdb entries 2020-06-22 20:41:05 -07:00