| From 5bbcf2ad01e0e90bcd2984bc32b718326030185e Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 6 Aug 2021 03:20:06 +0300 |
| Subject: net: dsa: stop syncing the bridge mcast_router attribute at join time |
| |
| From: Vladimir Oltean <vladimir.oltean@nxp.com> |
| |
| [ Upstream commit 7df4e7449489d82cee6813dccbb4ae4f3f26ef7b ] |
| |
| Qingfang points out that when a bridge with the default settings is |
| created and a port joins it: |
| |
| ip link add br0 type bridge |
| ip link set swp0 master br0 |
| |
| DSA calls br_multicast_router() on the bridge to see if the br0 device |
| is a multicast router port, and if it is, it enables multicast flooding |
| to the CPU port, otherwise it disables it. |
| |
| If we look through the multicast_router_show() sysfs or at the |
| IFLA_BR_MCAST_ROUTER netlink attribute, we see that the default mrouter |
| attribute for the bridge device is "1" (MDB_RTR_TYPE_TEMP_QUERY). |
| |
| However, br_multicast_router() will return "0" (MDB_RTR_TYPE_DISABLED), |
| because an mrouter port in the MDB_RTR_TYPE_TEMP_QUERY state may not be |
| actually _active_ until it receives an actual IGMP query. So, the |
| br_multicast_router() function should really have been called |
| br_multicast_router_active() perhaps. |
| |
| When/if an IGMP query is received, the bridge device will transition via |
| br_multicast_mark_router() into the active state until the |
| ip4_mc_router_timer expires after an multicast_querier_interval. |
| |
| Of course, this does not happen if the bridge is created with an |
| mcast_router attribute of "2" (MDB_RTR_TYPE_PERM). |
| |
| The point is that in lack of any IGMP query messages, and in the default |
| bridge configuration, unregistered multicast packets will not be able to |
| reach the CPU port through flooding, and this breaks many use cases |
| (most obviously, IPv6 ND, with its ICMP6 neighbor solicitation multicast |
| messages). |
| |
| Leave the multicast flooding setting towards the CPU port down to a driver |
| level decision. |
| |
| Fixes: 010e269f91be ("net: dsa: sync up switchdev objects and port attributes when joining the bridge") |
| Reported-by: DENG Qingfang <dqfext@gmail.com> |
| Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| net/dsa/port.c | 10 ---------- |
| 1 file changed, 10 deletions(-) |
| |
| diff --git a/net/dsa/port.c b/net/dsa/port.c |
| index 28b45b7e66df..d9ef2c2fbf88 100644 |
| --- a/net/dsa/port.c |
| +++ b/net/dsa/port.c |
| @@ -186,10 +186,6 @@ static int dsa_port_switchdev_sync(struct dsa_port *dp, |
| if (err && err != -EOPNOTSUPP) |
| return err; |
| |
| - err = dsa_port_mrouter(dp->cpu_dp, br_multicast_router(br), extack); |
| - if (err && err != -EOPNOTSUPP) |
| - return err; |
| - |
| err = dsa_port_ageing_time(dp, br_get_ageing_time(br)); |
| if (err && err != -EOPNOTSUPP) |
| return err; |
| @@ -272,12 +268,6 @@ static void dsa_port_switchdev_unsync_attrs(struct dsa_port *dp) |
| |
| /* VLAN filtering is handled by dsa_switch_bridge_leave */ |
| |
| - /* Some drivers treat the notification for having a local multicast |
| - * router by allowing multicast to be flooded to the CPU, so we should |
| - * allow this in standalone mode too. |
| - */ |
| - dsa_port_mrouter(dp->cpu_dp, true, NULL); |
| - |
| /* Ageing time may be global to the switch chip, so don't change it |
| * here because we have no good reason (or value) to change it to. |
| */ |
| -- |
| 2.30.2 |
| |