From patchwork Sun Feb 17 14:25:07 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Russell King (Oracle)" X-Patchwork-Id: 1043670 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=armlinux.org.uk Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=armlinux.org.uk header.i=@armlinux.org.uk header.b="UZa9Jovy"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 442Tpj0myqz9sDX for ; Mon, 18 Feb 2019 01:27:09 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726875AbfBQOZO (ORCPT ); Sun, 17 Feb 2019 09:25:14 -0500 Received: from pandora.armlinux.org.uk ([78.32.30.218]:38232 "EHLO pandora.armlinux.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725795AbfBQOZN (ORCPT ); Sun, 17 Feb 2019 09:25:13 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=armlinux.org.uk; s=pandora-2019; h=Date:Sender:Message-Id:Content-Type: Content-Transfer-Encoding:MIME-Version:Subject:Cc:To:From:References: In-Reply-To:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=aRG/eI8nQQhU0ar61HsYptlAHBKBnt2CoZ1k/51Fvhg=; b=UZa9JovysAbZV8lWYKs+PvN9Gr yBVRZz3Hyu136hTDaEVcudKtR1c3CWEsiWoH616+OVDpZ6LPdtvjVy7WtpoubKiykvBdoQca3tI77 P/G5gtDWGU2xbPg4xm/o5LqoOhmyHGNMkHYlVCtV7/qt3oxFidIvm/XYPVk4jFlQrYtvdHZWDepzh avkY5xMmkpgx0kabCQrkfIpXCLcTIgVubjS/8y2PwWSAIStXyu/Ccv8S8RPmcz15Hfbd4UmYoaj7S HUxAxAAf2WittfWp8GwWMMWHclONozLXEVujVZyhci7MUjLlQrjYYL849zzfQFpmIxLhFE/eyoVRL ltXHywYQ==; Received: from e0022681537dd.dyn.armlinux.org.uk ([2001:4d48:ad52:3201:222:68ff:fe15:37dd]:56816 helo=rmk-PC.armlinux.org.uk) by pandora.armlinux.org.uk with esmtpsa (TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256:128) (Exim 4.90_1) (envelope-from ) id 1gvNNU-0000eS-4R; Sun, 17 Feb 2019 14:25:08 +0000 Received: from rmk by rmk-PC.armlinux.org.uk with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1gvNNT-0006Xr-JA; Sun, 17 Feb 2019 14:25:07 +0000 In-Reply-To: <20190217142414.cjtmpi5y2l5rtdlb@shell.armlinux.org.uk> References: <20190217142414.cjtmpi5y2l5rtdlb@shell.armlinux.org.uk> From: Russell King To: Andrew Lunn , Florian Fainelli , Vivien Didelot Cc: "David S. Miller" , netdev@vger.kernel.org Subject: [PATCH net-next 1/3] net: dsa: add support for bridge flags MIME-Version: 1.0 Content-Disposition: inline Message-Id: Date: Sun, 17 Feb 2019 14:25:07 +0000 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The Linux bridge implementation allows various properties of the bridge to be controlled, such as flooding unknown unicast and multicast frames. This patch adds the necessary DSA infrastructure to allow the Linux bridge support to control these properties for DSA switches. We implement this by providing two new methods: one to get the switch- wide support bitmask, and another to set the properties. Signed-off-by: Russell King --- include/net/dsa.h | 3 +++ net/dsa/dsa_priv.h | 2 ++ net/dsa/port.c | 15 +++++++++++++++ net/dsa/slave.c | 6 ++++++ 4 files changed, 26 insertions(+) diff --git a/include/net/dsa.h b/include/net/dsa.h index 7f2a668ef2cc..6cc1222aa2ca 100644 --- a/include/net/dsa.h +++ b/include/net/dsa.h @@ -400,6 +400,9 @@ struct dsa_switch_ops { void (*port_stp_state_set)(struct dsa_switch *ds, int port, u8 state); void (*port_fast_age)(struct dsa_switch *ds, int port); + int (*port_bridge_flags)(struct dsa_switch *ds, int port, + unsigned long); + unsigned long (*bridge_flags_support)(struct dsa_switch *ds); /* * VLAN support diff --git a/net/dsa/dsa_priv.h b/net/dsa/dsa_priv.h index 1f4972dab9f2..f4f99ec29f5d 100644 --- a/net/dsa/dsa_priv.h +++ b/net/dsa/dsa_priv.h @@ -160,6 +160,8 @@ int dsa_port_mdb_add(const struct dsa_port *dp, struct switchdev_trans *trans); int dsa_port_mdb_del(const struct dsa_port *dp, const struct switchdev_obj_port_mdb *mdb); +int dsa_port_bridge_flags(const struct dsa_port *dp, unsigned long flags, + struct switchdev_trans *trans); int dsa_port_vlan_add(struct dsa_port *dp, const struct switchdev_obj_port_vlan *vlan, struct switchdev_trans *trans); diff --git a/net/dsa/port.c b/net/dsa/port.c index 2d7e01b23572..eb745041b1d9 100644 --- a/net/dsa/port.c +++ b/net/dsa/port.c @@ -177,6 +177,21 @@ int dsa_port_ageing_time(struct dsa_port *dp, clock_t ageing_clock, return dsa_port_notify(dp, DSA_NOTIFIER_AGEING_TIME, &info); } +int dsa_port_bridge_flags(const struct dsa_port *dp, unsigned long flags, + struct switchdev_trans *trans) +{ + struct dsa_switch *ds = dp->ds; + int port = dp->index; + + if (switchdev_trans_ph_prepare(trans)) + return ds->ops->port_bridge_flags ? 0 : -EOPNOTSUPP; + + if (ds->ops->port_bridge_flags) + ds->ops->port_bridge_flags(ds, port, flags); + + return 0; +} + int dsa_port_fdb_add(struct dsa_port *dp, const unsigned char *addr, u16 vid) { diff --git a/net/dsa/slave.c b/net/dsa/slave.c index 2e5e7c04821b..af53cdd14a29 100644 --- a/net/dsa/slave.c +++ b/net/dsa/slave.c @@ -295,6 +295,9 @@ static int dsa_slave_port_attr_set(struct net_device *dev, case SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME: ret = dsa_port_ageing_time(dp, attr->u.ageing_time, trans); break; + case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS: + ret = dsa_port_bridge_flags(dp, attr->u.brport_flags, trans); + break; default: ret = -EOPNOTSUPP; break; @@ -384,6 +387,9 @@ static int dsa_slave_port_attr_get(struct net_device *dev, switch (attr->id) { case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS_SUPPORT: attr->u.brport_flags_support = 0; + if (ds->ops->bridge_flags_support) + attr->u.brport_flags_support |= + ds->ops->bridge_flags_support(ds); break; default: return -EOPNOTSUPP; From patchwork Sun Feb 17 14:25:12 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Russell King (Oracle)" X-Patchwork-Id: 1043671 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=armlinux.org.uk Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=armlinux.org.uk header.i=@armlinux.org.uk header.b="f78XS++L"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 442Tpj6TcFz9s7h for ; Mon, 18 Feb 2019 01:27:09 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726985AbfBQOZT (ORCPT ); Sun, 17 Feb 2019 09:25:19 -0500 Received: from pandora.armlinux.org.uk ([78.32.30.218]:38242 "EHLO pandora.armlinux.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725795AbfBQOZT (ORCPT ); Sun, 17 Feb 2019 09:25:19 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=armlinux.org.uk; s=pandora-2019; h=Date:Sender:Message-Id:Content-Type: Content-Transfer-Encoding:MIME-Version:Subject:Cc:To:From:References: In-Reply-To:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=KQVpUCZ6gIrwP4aNaa9JCsneRM1KxYUgG98dD30g77k=; b=f78XS++LJCdIZgg7oHyEYrBDgK H4vefFhniiS9FI81YTcj/rj2F00xcsPwYAR5AF+LcraORO24bzNXmwZ7Uv6+JTs+L/F8h35jG2Qdf GSrGlS0fYp+UcVIrB8D6bLCeMfSW1M4iW3XrJn7fqt7FmnOgrDuKhUk5H8bEfqTVacf3AklJShNm/ 8y+UaKqHuamPkzOPVCzQ9OKEHZDMFI2kppopAkc0azkH8jnYu8fGYpglDhzYzhBXKycsp26Fw4FhA SVwtmeCN78BRRP2TmONoSrJaLsPrjNCtlFk8nDKD1YkFQcAL+bf1cZDYJ3t/t+pAaByDQT2QVtZqq /1VbvbZA==; Received: from e0022681537dd.dyn.armlinux.org.uk ([fd8f:7570:feb6:1:222:68ff:fe15:37dd]:46874 helo=rmk-PC.armlinux.org.uk) by pandora.armlinux.org.uk with esmtpsa (TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256:128) (Exim 4.90_1) (envelope-from ) id 1gvNNZ-0000eb-Gs; Sun, 17 Feb 2019 14:25:13 +0000 Received: from rmk by rmk-PC.armlinux.org.uk with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1gvNNY-0006Y7-NF; Sun, 17 Feb 2019 14:25:12 +0000 In-Reply-To: <20190217142414.cjtmpi5y2l5rtdlb@shell.armlinux.org.uk> References: <20190217142414.cjtmpi5y2l5rtdlb@shell.armlinux.org.uk> From: Russell King To: Andrew Lunn , Florian Fainelli , Vivien Didelot Cc: "David S. Miller" , netdev@vger.kernel.org Subject: [PATCH net-next 2/3] net: dsa: mv88e6xxx: add support for bridge flags MIME-Version: 1.0 Content-Disposition: inline Message-Id: Date: Sun, 17 Feb 2019 14:25:12 +0000 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Add support for the bridge flags to Marvell 88e6xxx bridges, allowing the multicast and unicast flood properties to be controlled. These can be controlled on a per-port basis via commands such as: bridge link set dev lan1 flood on|off bridge link set dev lan1 mcast_flood on|off Signed-off-by: Russell King Reviewed-by: Florian Fainelli --- drivers/net/dsa/mv88e6xxx/chip.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c index 32e7af5caa69..b75a865a293d 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c @@ -4692,6 +4692,37 @@ static int mv88e6xxx_port_mdb_del(struct dsa_switch *ds, int port, return err; } +static int mv88e6xxx_port_bridge_flags(struct dsa_switch *ds, int port, + unsigned long flags) +{ + struct mv88e6xxx_chip *chip = ds->priv; + bool unicast, multicast; + int ret = -EOPNOTSUPP; + + unicast = dsa_is_cpu_port(ds, port) || dsa_is_dsa_port(ds, port) || + flags & BR_FLOOD; + multicast = flags & BR_MCAST_FLOOD; + + mutex_lock(&chip->reg_lock); + if (chip->info->ops->port_set_egress_floods) + ret = chip->info->ops->port_set_egress_floods(chip, port, + unicast, + multicast); + mutex_unlock(&chip->reg_lock); + + return ret; +} + +static unsigned long mv88e6xxx_bridge_flags_support(struct dsa_switch *ds) +{ + unsigned long support = 0; + + if (chip->info->ops->port_set_egress_floods) + support |= BR_FLOOD | BR_MCAST_FLOOD; + + return support; +} + static const struct dsa_switch_ops mv88e6xxx_switch_ops = { #if IS_ENABLED(CONFIG_NET_DSA_LEGACY) .probe = mv88e6xxx_drv_probe, @@ -4719,6 +4750,8 @@ static const struct dsa_switch_ops mv88e6xxx_switch_ops = { .set_ageing_time = mv88e6xxx_set_ageing_time, .port_bridge_join = mv88e6xxx_port_bridge_join, .port_bridge_leave = mv88e6xxx_port_bridge_leave, + .port_bridge_flags = mv88e6xxx_port_bridge_flags, + .bridge_flags_support = mv88e6xxx_bridge_flags_support, .port_stp_state_set = mv88e6xxx_port_stp_state_set, .port_fast_age = mv88e6xxx_port_fast_age, .port_vlan_filtering = mv88e6xxx_port_vlan_filtering, From patchwork Sun Feb 17 14:25:17 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Russell King (Oracle)" X-Patchwork-Id: 1043672 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=armlinux.org.uk Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=armlinux.org.uk header.i=@armlinux.org.uk header.b="0op1vccd"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 442Tpk4zc7z9sDX for ; Mon, 18 Feb 2019 01:27:10 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727147AbfBQOZ0 (ORCPT ); Sun, 17 Feb 2019 09:25:26 -0500 Received: from pandora.armlinux.org.uk ([78.32.30.218]:38254 "EHLO pandora.armlinux.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725795AbfBQOZZ (ORCPT ); Sun, 17 Feb 2019 09:25:25 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=armlinux.org.uk; s=pandora-2019; h=Date:Sender:Message-Id:Content-Type: Content-Transfer-Encoding:MIME-Version:Subject:Cc:To:From:References: In-Reply-To:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=g8IIAX7Z2Dqi+wtcxopc8JnaTH+uZJKRAArwmwaaXsc=; b=0op1vccd+6wudJtGTzwQ6GWHxM Qd7Foy+n232ttWoEuQfNBtZew2lF+iRG1opnyalr1dSrHZtmZgMuovRPGuxmJiItoRRAxqHMYhek6 uzdOsiiI9fkkyIaGGg3tyuqS3KCh90p9g4TIPyp9+sVyZM2yZSSwTC6sgtWEolSntqC5Ap0cR8kyM 4DN14LFiZHgTrZKBY+tPa4e37l709NqyjJDISRSnu8vggzeeTjAxgIoGJPb0taJdZnGhEkLBSdIHv uwD9PbP8JHao8/a9qlULVloxpwU/bW69VCGKeO1RzaGcM6DJQC6bzNwjIHGljhwWo5qmMWD60YhFZ zBjjSklQ==; Received: from e0022681537dd.dyn.armlinux.org.uk ([2001:4d48:ad52:3201:222:68ff:fe15:37dd]:56820 helo=rmk-PC.armlinux.org.uk) by pandora.armlinux.org.uk with esmtpsa (TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256:128) (Exim 4.90_1) (envelope-from ) id 1gvNNf-0000ek-0g; Sun, 17 Feb 2019 14:25:19 +0000 Received: from rmk by rmk-PC.armlinux.org.uk with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1gvNNd-0006YN-Rc; Sun, 17 Feb 2019 14:25:17 +0000 In-Reply-To: <20190217142414.cjtmpi5y2l5rtdlb@shell.armlinux.org.uk> References: <20190217142414.cjtmpi5y2l5rtdlb@shell.armlinux.org.uk> From: Russell King To: Andrew Lunn , Florian Fainelli , Vivien Didelot Cc: "David S. Miller" , netdev@vger.kernel.org Subject: [PATCH net-next 3/3] net: dsa: mv88e6xxx: defautl to multicast and unicast flooding MIME-Version: 1.0 Content-Disposition: inline Message-Id: Date: Sun, 17 Feb 2019 14:25:17 +0000 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Switches work by learning the MAC address for each attached station by monitoring traffic from each station. When a station sends a packet, the switch records which port the MAC address is connected to. With IPv4 networking, before communication commences with a neighbour, an ARP packet is broadcasted to all stations asking for the MAC address corresponding with the IPv4. The desired station responds with an ARP reply, and the ARP reply causes the switch to learn which port the station is connected to. With IPv6 networking, the situation is rather different. Rather than broadcasting ARP packets, a "neighbour solicitation" is multicasted rather than broadcasted. This multicast needs to reach the intended station in order for the neighbour to be discovered. Once a neighbour has been discovered, and entered into the sending stations neighbour cache, communication can restart at a point later without sending a new neighbour solicitation, even if the entry in the neighbour cache is marked as stale. This can be after the MAC address has expired from the forwarding cache of the DSA switch - when that occurs, there is a long pause in communication. Our DSA implementation for mv88e6xxx switches has defaulted to having multicast and unicast flooding disabled. As per the above description, this is fine for IPv4 networking, since the broadcasted ARP queries will be sent to and received by all stations on the same network. However, this breaks IPv6 very badly - blocking neighbour solicitations and later causing connections to stall. The defaults that the Linux bridge code expect from bridges are that unknown unicast frames and unknown multicast frames are flooded to all stations, which is at odds to the defaults adopted by our DSA implementation for mv88e6xxx switches. This commit enables by default flooding of both unknown unicast and unknown multicast frames. This means that mv88e6xxx DSA switches now behave as per the bridge(8) man page, and IPv6 works flawlessly through such a switch. Signed-off-by: Russell King --- drivers/net/dsa/mv88e6xxx/chip.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c index b75a865a293d..eb5e3d88374f 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c @@ -2144,13 +2144,14 @@ static int mv88e6xxx_setup_message_port(struct mv88e6xxx_chip *chip, int port) static int mv88e6xxx_setup_egress_floods(struct mv88e6xxx_chip *chip, int port) { struct dsa_switch *ds = chip->ds; - bool flood; - /* Upstream ports flood frames with unknown unicast or multicast DA */ - flood = dsa_is_cpu_port(ds, port) || dsa_is_dsa_port(ds, port); + /* Linux bridges are expected to flood unknown multicast and + * unicast frames to all ports - as per the defaults specified + * in the iproute2 bridge(8) man page. Not doing this causes + * stalls and failures with IPv6 over Marvell bridges. */ if (chip->info->ops->port_set_egress_floods) return chip->info->ops->port_set_egress_floods(chip, port, - flood, flood); + true, true); return 0; }