From patchwork Sun Feb 17 16:32:29 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: 1043692 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="bdOuAOps"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 442XbV5Ydfz9s3x for ; Mon, 18 Feb 2019 03:32:38 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726452AbfBQQch (ORCPT ); Sun, 17 Feb 2019 11:32:37 -0500 Received: from pandora.armlinux.org.uk ([78.32.30.218]:39720 "EHLO pandora.armlinux.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726087AbfBQQcg (ORCPT ); Sun, 17 Feb 2019 11:32:36 -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=bdOuAOps8KJHT00hXKpXCEe4R3 htiG+qgYMdC1Ts9CDQze5zQTLpO8cv7pmDb7AdmSxl9KV4HdjGNGOvsMJXedF4dlMTniIdj7U3XEc kLmgniVC5S683zWZns2rNabEQc4bN/VXeXXgj71fvnaVL/EuYRSaL2kG4/5yCFdtNFcaONnrHgZHR hTjj2NuNF8Do3R+vnRH26LxVqQEs4XfvmbiYut1tXJeiKVICJlFSjlTlw+6roZWm7cwmUEegh67Qd pM5DqBIS3Vf8RCVBbRM+q95kHXrcWeuWFTx25+IdFchq5pwFbjbGPurW4Vlu+QrgodTslXhiDkSTT 8sPI7vBw==; Received: from e0022681537dd.dyn.armlinux.org.uk ([2001:4d48:ad52:3201:222:68ff:fe15:37dd]:57206 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 1gvPMk-0001J3-Dw; Sun, 17 Feb 2019 16:32:30 +0000 Received: from rmk by rmk-PC.armlinux.org.uk with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1gvPMj-0000AR-KP; Sun, 17 Feb 2019 16:32:29 +0000 In-Reply-To: <20190217163114.yomawlljyxlqy3ob@shell.armlinux.org.uk> References: <20190217163114.yomawlljyxlqy3ob@shell.armlinux.org.uk> From: Russell King To: Andrew Lunn , Florian Fainelli , Vivien Didelot Cc: Heiner Kallweit , "David S. Miller" , netdev@vger.kernel.org Subject: [PATCH net-next v2 1/3] net: dsa: add support for bridge flags MIME-Version: 1.0 Content-Disposition: inline Message-Id: Date: Sun, 17 Feb 2019 16:32:29 +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;