From patchwork Tue Jan 15 19:41:17 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 1025400 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=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="hEkDcV+E"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43fLNY2pVNz9s9G for ; Wed, 16 Jan 2019 06:43:09 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389420AbfAOTmh (ORCPT ); Tue, 15 Jan 2019 14:42:37 -0500 Received: from mail-pg1-f194.google.com ([209.85.215.194]:44749 "EHLO mail-pg1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389302AbfAOTme (ORCPT ); Tue, 15 Jan 2019 14:42:34 -0500 Received: by mail-pg1-f194.google.com with SMTP id t13so1655240pgr.11 for ; Tue, 15 Jan 2019 11:42:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Di0uk7ChLXqoTDr/qz8RwiDRfIdXYC9TpTLQhiz/VoY=; b=hEkDcV+EanGI1gTo8Ff59m43kTD2FX+HGLNbm1E+iAf8suM/KyITbHKB8SePiMughE bfbdKHnu+NeEi2pbHEaw+irSRzCFvr35qonplO5KXM/XUh2+ir6p73n7azE8acyFIC/2 XcdHIoMUcyguCATG9Owqu8Cjh1huE8pM4KrNM84fdCsvziKEMMRLIz1h+5l3qM26B93K uMu43SJBB79u2TWgyqTbtmtjzxIJchRsDGxbvtyYNXVfqbQI2gWz0YLMqImSUE2zmvKJ QcyG5BjBmAn1K6Xfi9EblxXs68IG1whH5BjH/onYpB8x4wl3EaVcqxwhBbfC4MjNlBEP 01Lw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Di0uk7ChLXqoTDr/qz8RwiDRfIdXYC9TpTLQhiz/VoY=; b=n5wlGq9RKg2o5/7j51e2PSiRcl4G8rMekJzi9GJwGroKK2PWzIzGzgw4f3XXPkf1Pp a4WPhuPzwKiPhO2Qf4D233DncPrhFdFIj9iT2I05SBEUy0zLqT8KTA2IbXBjX5jTFOX4 itCApI8j9Qjqh5AYhN+sNiVANZBut+8c1TClESWNgOKECofDtKP/86LO25G4QAk1ZZAB UHJ1OKRbJ94McdnkaQPoXTmbeMpPm+WYuOpVgZ1y2ornncznuRzNEM+pQl9fWNJdA1oh VszfGbSWfKyQ+oj+wHvicD8YOCaOrl6kt7en8c7izm+vYQKVH4P/0A5Pc1MbiB93ylZi h3cA== X-Gm-Message-State: AJcUukdt2TgzoHMLfnGuWB4IJEzgeoXhQAqSPs1rpqbb7C582jxrw+wY dAMa3OsqR6biyeY3x5jS8Rzd+55S X-Google-Smtp-Source: ALg8bN5Fi9D3CRdJBDbRSpZCEna2BXQkXSk1/MshmKLC9lUUNBZ95jW5f6nYB9ihK2yH10ZIYoWF7g== X-Received: by 2002:a65:43c5:: with SMTP id n5mr5402187pgp.250.1547581352590; Tue, 15 Jan 2019 11:42:32 -0800 (PST) Received: from fainelli-desktop.igp.broadcom.net ([192.19.223.250]) by smtp.gmail.com with ESMTPSA id 128sm6954262pfu.129.2019.01.15.11.42.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 15 Jan 2019 11:42:31 -0800 (PST) From: Florian Fainelli To: netdev@vger.kernel.org Cc: Florian Fainelli , andrew@lunn.ch, vivien.didelot@gmail.com, davem@davemloft.net, idosch@mellanox.com, jiri@mellanox.com, ilias.apalodimas@linaro.org, ivan.khoronzhuk@linaro.org, roopa@cumulusnetworks.com, nikolay@cumulusnetworks.com Subject: [RFC net-next 01/14] net: bridge: multicast: Propagate br_mc_disabled_update() return Date: Tue, 15 Jan 2019 11:41:17 -0800 Message-Id: <20190115194130.19896-2-f.fainelli@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190115194130.19896-1-f.fainelli@gmail.com> References: <20190115194130.19896-1-f.fainelli@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Some Ethernet switches might not be able to support disabling multicast flooding globally when e.g: several bridges span the same physical device, propagate the return value of br_mc_disabled_update() such that this propagates correctly to user-space. Signed-off-by: Florian Fainelli --- net/bridge/br_multicast.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c index 3aeff0895669..09fc92541873 100644 --- a/net/bridge/br_multicast.c +++ b/net/bridge/br_multicast.c @@ -813,7 +813,7 @@ static void br_ip6_multicast_port_query_expired(struct timer_list *t) } #endif -static void br_mc_disabled_update(struct net_device *dev, bool value) +static int br_mc_disabled_update(struct net_device *dev, bool value) { struct switchdev_attr attr = { .orig_dev = dev, @@ -822,11 +822,13 @@ static void br_mc_disabled_update(struct net_device *dev, bool value) .u.mc_disabled = !value, }; - switchdev_port_attr_set(dev, &attr); + return switchdev_port_attr_set(dev, &attr); } int br_multicast_add_port(struct net_bridge_port *port) { + int ret; + port->multicast_router = MDB_RTR_TYPE_TEMP_QUERY; timer_setup(&port->multicast_router_timer, @@ -837,8 +839,11 @@ int br_multicast_add_port(struct net_bridge_port *port) timer_setup(&port->ip6_own_query.timer, br_ip6_multicast_port_query_expired, 0); #endif - br_mc_disabled_update(port->dev, - br_opt_get(port->br, BROPT_MULTICAST_ENABLED)); + ret = br_mc_disabled_update(port->dev, + br_opt_get(port->br, + BROPT_MULTICAST_ENABLED)); + if (ret) + return ret; port->mcast_stats = netdev_alloc_pcpu_stats(struct bridge_mcast_stats); if (!port->mcast_stats) @@ -1937,12 +1942,16 @@ static void br_multicast_start_querier(struct net_bridge *br, int br_multicast_toggle(struct net_bridge *br, unsigned long val) { struct net_bridge_port *port; + int err; spin_lock_bh(&br->multicast_lock); if (!!br_opt_get(br, BROPT_MULTICAST_ENABLED) == !!val) goto unlock; - br_mc_disabled_update(br->dev, val); + err = br_mc_disabled_update(br->dev, val); + if (err) + goto unlock; + br_opt_toggle(br, BROPT_MULTICAST_ENABLED, !!val); if (!br_opt_get(br, BROPT_MULTICAST_ENABLED)) goto unlock; From patchwork Tue Jan 15 19:41:18 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 1025387 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=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="qztITXPB"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43fLMy2cljz9s9G for ; Wed, 16 Jan 2019 06:42:38 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389424AbfAOTmh (ORCPT ); Tue, 15 Jan 2019 14:42:37 -0500 Received: from mail-pg1-f194.google.com ([209.85.215.194]:38357 "EHLO mail-pg1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389415AbfAOTmg (ORCPT ); Tue, 15 Jan 2019 14:42:36 -0500 Received: by mail-pg1-f194.google.com with SMTP id g189so1669181pgc.5 for ; Tue, 15 Jan 2019 11:42:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=y2qm7A+/CCgrfTstiWJF722XPuBVch01JWCyDALceMo=; b=qztITXPB+XYGsHWDmVDgs0PE8iv+8VGSNobV1Fm4smmJ69wmhBVrHQ34ZLHm9VK3rz AsgwA9ttYh2eeowYPDcYNiiY5YOVAqyunVsuwuYbCQWKhd4rl55rqplFN7e9RA19pa46 o1l3EKASPVRjZUgKsC+XCzwB9CoKhyFXbQ3wHlQZWsyK/XNcySzcn5EerWDfoyrY1rD0 vyYKzs0DN1EihbR7DhRvZ7FRviLrqE3LrWy5ifcGskfdKWZuRxNMXZ0UHTcRtEPMUUNP I5okL40SrcY8xravKmDxQFo6oZ957QX7Y3v8pK9GnKpIQHMcr8Cv+wIWfFk3EHWNOHur +X3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=y2qm7A+/CCgrfTstiWJF722XPuBVch01JWCyDALceMo=; b=FyTdiJqt0Hys5lbYxFpS4/hq2zzjgsNzQd8PjsLZXO5iyDjCy1pdqRI25lsiMu8eFP XeB1PVfIJhMDeHRBrS+G63y21OiI3gwPHZWo/2kKtxKaiVNt4pAtjp9qWNPiM+oJU/Rp Ixh9SFyYPa0DoUyiFlnfYAjiuuvBqwKV4tf80+gaQtL/zJoi0CZETUS3e8N4dLRSlkqa SOqUC6wyGSs+BntaWQNBaMYnyH4E3hjdOXE+djw0CIKL9RSv0lzLyfUxEBHOuTxpFJvL kdKuDGWCL87CU1fN0EXa2Tkrv1tPRaktQ9Bm6AUM2Oz0m6kapY+pr8zqGnimMZOUbQ39 oSkQ== X-Gm-Message-State: AJcUukeRt2+kKnpaOcWDfMEE+6c6Ee7HvnVgrChUlRz+wIx7fBpB4o11 +hVWmfH/24MQ6NhSEE/ov6yTxGUt X-Google-Smtp-Source: ALg8bN6+WpGElDL2iDkSTsNCz+kV367/N029KNbM8pGD9iDXz4qkC5DN/9HMF0RKaTUNiY/TBvoHRw== X-Received: by 2002:a65:4683:: with SMTP id h3mr5004701pgr.225.1547581354421; Tue, 15 Jan 2019 11:42:34 -0800 (PST) Received: from fainelli-desktop.igp.broadcom.net ([192.19.223.250]) by smtp.gmail.com with ESMTPSA id 128sm6954262pfu.129.2019.01.15.11.42.32 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 15 Jan 2019 11:42:33 -0800 (PST) From: Florian Fainelli To: netdev@vger.kernel.org Cc: Florian Fainelli , andrew@lunn.ch, vivien.didelot@gmail.com, davem@davemloft.net, idosch@mellanox.com, jiri@mellanox.com, ilias.apalodimas@linaro.org, ivan.khoronzhuk@linaro.org, roopa@cumulusnetworks.com, nikolay@cumulusnetworks.com Subject: [RFC net-next 02/14] net: dsa: b53: Fix default VLAN ID Date: Tue, 15 Jan 2019 11:41:18 -0800 Message-Id: <20190115194130.19896-3-f.fainelli@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190115194130.19896-1-f.fainelli@gmail.com> References: <20190115194130.19896-1-f.fainelli@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org We were not consistent in how the default VID of a given port was defined, b53_br_leave() would make sure the VLAN ID would be either 0/1 depending on the switch generation, but b53_configure_vlan(), which is the default configuration would unconditionally set it to 1. The correct value is 1 for 5325/5365 series and 0 otherwise. To avoid repeating that mistake ever again, introduce a helper function: b53_default_pvid() to factor that out. Fixes: 967dd82ffc52 ("net: dsa: b53: Add support for Broadcom RoboSwitch") Signed-off-by: Florian Fainelli --- drivers/net/dsa/b53/b53_common.c | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c index 0e4bbdcc614f..964a9ec4652a 100644 --- a/drivers/net/dsa/b53/b53_common.c +++ b/drivers/net/dsa/b53/b53_common.c @@ -632,15 +632,25 @@ static void b53_enable_mib(struct b53_device *dev) b53_write8(dev, B53_MGMT_PAGE, B53_GLOBAL_CONFIG, gc); } +static u16 b53_default_pvid(struct b53_device *dev) +{ + if (is5325(dev) || is5365(dev)) + return 1; + else + return 0; +} + int b53_configure_vlan(struct dsa_switch *ds) { struct b53_device *dev = ds->priv; struct b53_vlan vl = { 0 }; - int i; + int i, def_vid; + + def_vid = b53_default_pvid(dev); /* clear all vlan entries */ if (is5325(dev) || is5365(dev)) { - for (i = 1; i < dev->num_vlans; i++) + for (i = def_vid; i < dev->num_vlans; i++) b53_set_vlan_entry(dev, i, &vl); } else { b53_do_vlan_op(dev, VTA_CMD_CLEAR); @@ -650,7 +660,7 @@ int b53_configure_vlan(struct dsa_switch *ds) b53_for_each_port(dev, i) b53_write16(dev, B53_VLAN_PAGE, - B53_VLAN_PORT_DEF_TAG(i), 1); + B53_VLAN_PORT_DEF_TAG(i), def_vid); if (!is5325(dev) && !is5365(dev)) b53_set_jumbo(dev, dev->enable_jumbo, false); @@ -1326,12 +1336,8 @@ int b53_vlan_del(struct dsa_switch *ds, int port, vl->members &= ~BIT(port); - if (pvid == vid) { - if (is5325(dev) || is5365(dev)) - pvid = 1; - else - pvid = 0; - } + if (pvid == vid) + pvid = b53_default_pvid(dev); if (untagged && !dsa_is_cpu_port(ds, port)) vl->untag &= ~(BIT(port)); @@ -1644,10 +1650,7 @@ void b53_br_leave(struct dsa_switch *ds, int port, struct net_device *br) b53_write16(dev, B53_PVLAN_PAGE, B53_PVLAN_PORT_MASK(port), pvlan); dev->ports[port].vlan_ctl_mask = pvlan; - if (is5325(dev) || is5365(dev)) - pvid = 1; - else - pvid = 0; + pvid = b53_default_pvid(dev); /* Make this port join all VLANs without VLAN entries */ if (is58xx(dev)) { From patchwork Tue Jan 15 19:41:19 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 1025388 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=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="Sk91LT52"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43fLN047jgz9s9G for ; Wed, 16 Jan 2019 06:42:40 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389429AbfAOTmj (ORCPT ); Tue, 15 Jan 2019 14:42:39 -0500 Received: from mail-pl1-f193.google.com ([209.85.214.193]:41725 "EHLO mail-pl1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389416AbfAOTmh (ORCPT ); Tue, 15 Jan 2019 14:42:37 -0500 Received: by mail-pl1-f193.google.com with SMTP id u6so1751010plm.8 for ; Tue, 15 Jan 2019 11:42:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Dn5Xrka7oPpFXUszSqf04vJKMymjYDaq2zGfoUQHWCo=; b=Sk91LT52Z8UI2magFzYmfg7FZuHyu9Q/Yb81c/T06vNxYwOnbJFQznZWzcPBzawwSJ B1hXKdbttm/X/urj8/awuClMD3XPjuifDQ5q5t6XNc4eRcbnWKP9iRuhXojiDNB4j3Ty 2TKJMVkAx0GGRE7ckuP4uyEzcbnwmmSywz4+N4dxt/pQhZrp2LKgvF89QmGqWYC6ozj+ fQZvwJdV4TvkDXubkzfoo19stKCDf6cZtMWq1WMDUorcYZ68Y7s96Rr/G40QjN44HMNL NTAlTCGLDcvY1SPlLNkm1qRyNMFIPh1TEgjj8zZmmU9aTsGbq26L7iebTT8nvDD1gmRw vTeg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Dn5Xrka7oPpFXUszSqf04vJKMymjYDaq2zGfoUQHWCo=; b=O3H+xM77XGAmRKgqp/eQrqWWVdinTJzxBDz2Nbo6TI+yUX0FDmClnr2fcI0Dny1aDd MNPWvb81DPwFoMyJIbBbYoX4TDA674rH0OQ6dX6aH5Wrjlltuv2iBYNAI6GNnjM4D/7V WEjynQf+pLHejAzNyivEIOv71Q8VNsRCtoEiLy2xaU4n0Nm9F3rG/smeEOUFCH0tZDGR cRMHdhojMxVAANLbwiwewhE2bQwubSoKMxHDjKrtQ74/oC74dxgfvbHTtepQ2zh2oqcd nHdQDeffFSh+NGE6IgECUik1wlIySHEh1dufzqomTn9GJPcd/4qDBpSrcAzrNjLx6jG6 9R7Q== X-Gm-Message-State: AJcUukc9cqLImNK/5EkFeKdcwZ5MceflZxNYymAGkJ2aQXsokgTcMkEh DxQVGt0R5e5A8cQvDwJftGj+mQ+H X-Google-Smtp-Source: ALg8bN4Lu8bZojv0o1diVgr1nusd/wv35/7I2rIZqUwtO6JpzAcJgWSLubgbmVXzzthNrjwgSdgVcg== X-Received: by 2002:a17:902:2c03:: with SMTP id m3mr5938964plb.125.1547581356084; Tue, 15 Jan 2019 11:42:36 -0800 (PST) Received: from fainelli-desktop.igp.broadcom.net ([192.19.223.250]) by smtp.gmail.com with ESMTPSA id 128sm6954262pfu.129.2019.01.15.11.42.34 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 15 Jan 2019 11:42:35 -0800 (PST) From: Florian Fainelli To: netdev@vger.kernel.org Cc: Florian Fainelli , andrew@lunn.ch, vivien.didelot@gmail.com, davem@davemloft.net, idosch@mellanox.com, jiri@mellanox.com, ilias.apalodimas@linaro.org, ivan.khoronzhuk@linaro.org, roopa@cumulusnetworks.com, nikolay@cumulusnetworks.com Subject: [RFC net-next 03/14] net: dsa: b53: Properly account for VLAN filtering Date: Tue, 15 Jan 2019 11:41:19 -0800 Message-Id: <20190115194130.19896-4-f.fainelli@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190115194130.19896-1-f.fainelli@gmail.com> References: <20190115194130.19896-1-f.fainelli@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org VLAN filtering can be built into the kernel, and also dynamically turned on/off through the bridge master device. Allow re-configuring the switch appropriately to account for that by deciding whether VLAN table (v_table) misses should lead to a drop or forward. Fixes: a2482d2ce349 ("net: dsa: b53: Plug in VLAN support") Signed-off-by: Florian Fainelli --- drivers/net/dsa/b53/b53_common.c | 59 +++++++++++++++++++++++++++++--- drivers/net/dsa/b53/b53_priv.h | 3 ++ 2 files changed, 57 insertions(+), 5 deletions(-) diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c index 964a9ec4652a..2fef4c564420 100644 --- a/drivers/net/dsa/b53/b53_common.c +++ b/drivers/net/dsa/b53/b53_common.c @@ -344,7 +344,8 @@ static void b53_set_forwarding(struct b53_device *dev, int enable) b53_write8(dev, B53_CTRL_PAGE, B53_SWITCH_CTRL, mgmt); } -static void b53_enable_vlan(struct b53_device *dev, bool enable) +static void b53_enable_vlan(struct b53_device *dev, bool enable, + bool enable_filtering) { u8 mgmt, vc0, vc1, vc4 = 0, vc5; @@ -369,8 +370,13 @@ static void b53_enable_vlan(struct b53_device *dev, bool enable) vc0 |= VC0_VLAN_EN | VC0_VID_CHK_EN | VC0_VID_HASH_VID; vc1 |= VC1_RX_MCST_UNTAG_EN | VC1_RX_MCST_FWD_EN; vc4 &= ~VC4_ING_VID_CHECK_MASK; - vc4 |= VC4_ING_VID_VIO_DROP << VC4_ING_VID_CHECK_S; - vc5 |= VC5_DROP_VTABLE_MISS; + if (enable_filtering) { + vc4 |= VC4_ING_VID_VIO_DROP << VC4_ING_VID_CHECK_S; + vc5 |= VC5_DROP_VTABLE_MISS; + } else { + vc4 |= VC4_ING_VID_VIO_FWD << VC4_ING_VID_CHECK_S; + vc5 &= ~VC5_DROP_VTABLE_MISS; + } if (is5325(dev)) vc0 &= ~VC0_RESERVED_1; @@ -420,6 +426,9 @@ static void b53_enable_vlan(struct b53_device *dev, bool enable) } b53_write8(dev, B53_CTRL_PAGE, B53_SWITCH_MODE, mgmt); + + dev->vlan_enabled = enable; + dev->vlan_filtering_enabled = enable_filtering; } static int b53_set_jumbo(struct b53_device *dev, bool enable, bool allow_10_100) @@ -656,7 +665,7 @@ int b53_configure_vlan(struct dsa_switch *ds) b53_do_vlan_op(dev, VTA_CMD_CLEAR); } - b53_enable_vlan(dev, false); + b53_enable_vlan(dev, false, dev->vlan_filtering_enabled); b53_for_each_port(dev, i) b53_write16(dev, B53_VLAN_PAGE, @@ -1265,6 +1274,46 @@ EXPORT_SYMBOL(b53_phylink_mac_link_up); int b53_vlan_filtering(struct dsa_switch *ds, int port, bool vlan_filtering) { + struct b53_device *dev = ds->priv; + struct net_device *bridge_dev; + unsigned int i; + u16 pvid, new_pvid; + + /* Handle the case were multiple bridges span the same switch device + * and one of them has a different setting than what is being requested + * which would be breaking filtering semantics for any of the other + * bridge devices. + */ + b53_for_each_port(dev, i) { + bridge_dev = dsa_to_port(ds, i)->bridge_dev; + if (bridge_dev && + bridge_dev != dsa_to_port(ds, port)->bridge_dev && + br_vlan_enabled(bridge_dev) != vlan_filtering) { + netdev_err(bridge_dev, + "VLAN filtering is global to the switch!\n"); + return -EINVAL; + } + } + + b53_read16(dev, B53_VLAN_PAGE, B53_VLAN_PORT_DEF_TAG(port), &pvid); + new_pvid = pvid; + if (dev->vlan_filtering_enabled && !vlan_filtering) { + /* Filtering is currently enabled, use the default PVID since + * the bridge does not expect tagging anymore + */ + dev->ports[port].pvid = pvid; + new_pvid = b53_default_pvid(dev); + } else if (!dev->vlan_filtering_enabled && vlan_filtering) { + /* Filtering is currently disabled, restore the previous PVID */ + new_pvid = dev->ports[port].pvid; + } + + if (pvid != new_pvid) + b53_write16(dev, B53_VLAN_PAGE, B53_VLAN_PORT_DEF_TAG(port), + new_pvid); + + b53_enable_vlan(dev, dev->vlan_enabled, vlan_filtering); + return 0; } EXPORT_SYMBOL(b53_vlan_filtering); @@ -1280,7 +1329,7 @@ int b53_vlan_prepare(struct dsa_switch *ds, int port, if (vlan->vid_end > dev->num_vlans) return -ERANGE; - b53_enable_vlan(dev, true); + b53_enable_vlan(dev, true, dev->vlan_filtering_enabled); return 0; } diff --git a/drivers/net/dsa/b53/b53_priv.h b/drivers/net/dsa/b53/b53_priv.h index ec796482792d..4dc7ee38b258 100644 --- a/drivers/net/dsa/b53/b53_priv.h +++ b/drivers/net/dsa/b53/b53_priv.h @@ -91,6 +91,7 @@ enum { struct b53_port { u16 vlan_ctl_mask; struct ethtool_eee eee; + u16 pvid; }; struct b53_vlan { @@ -137,6 +138,8 @@ struct b53_device { unsigned int num_vlans; struct b53_vlan *vlans; + bool vlan_enabled; + bool vlan_filtering_enabled; unsigned int num_ports; struct b53_port *ports; }; From patchwork Tue Jan 15 19:41:20 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 1025389 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=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="GnYrdBRQ"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43fLN31lT6z9s9G for ; Wed, 16 Jan 2019 06:42:43 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389434AbfAOTml (ORCPT ); Tue, 15 Jan 2019 14:42:41 -0500 Received: from mail-pg1-f193.google.com ([209.85.215.193]:38360 "EHLO mail-pg1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389415AbfAOTmj (ORCPT ); Tue, 15 Jan 2019 14:42:39 -0500 Received: by mail-pg1-f193.google.com with SMTP id g189so1669235pgc.5 for ; Tue, 15 Jan 2019 11:42:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=wLi++uDM9+2NnPAn6Vc7NFWtXwDgQL/o9s/qCZcheD0=; b=GnYrdBRQmhZ5Jz6JYH6y4GOGZOuIGaEtTXXWV6kmx9RBZ+BBB3hJVquMh59kux/rhs cfQFHe8HVRb+nrlc1F6o/hA7FVjOH1VF3mZxsbeQvj1+Y5PU0C9u8fDadSWYBu5JXxoN krAeEkNv6i21v1/tC5yr4Kjj1nupaDCL/9wIltNOArE36SOqOxnUYBAA84YShEJwrcU9 oOlzXEDlyWliGZNNiUynxIMswv4jwwpYAuulMr3tFk0ldCJ9vRG2YVR4cglr+ND53Ga1 sTneAJX9nbJ5mWsinHWbeiBtzzaQkNZgAJHuubTyufPQxGooJUK5r+pshh9A6mrhaSWV GJ3w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=wLi++uDM9+2NnPAn6Vc7NFWtXwDgQL/o9s/qCZcheD0=; b=cddknGv+zGRtlLF+3j39f4M8LKD3qi9yWX3NXLPOFgdEcRc8De+FAVCiZUeL+eGN/w RTZl8Hm5exIXjolGqvPwvB6LU+k7Q0kjTIKd5xvWwXCtYLgWHeXIKygxOMD2s9Hj7jhm ZgYFGfJy+a9vqDTeQDuLeASlEh+j2zOY5kxFMxhSyvAIctUDhv51BDbPHybD6q2mkbJm m3/yIxqbzfF5cDFDHC3b5f6bT/aJKHzgdamER3z4ZIHzoA9MDUZ59zHMEvjhIq9lRjH/ iN+f+xdSzYR1gU5n5VwFE1LX3mIcXYPcHR8L8JCLJsbiObrkrjWE01v/emlzCTWWNK16 S95A== X-Gm-Message-State: AJcUukd7ejtf+MuLmGSgPLnvSFhRtBL3LBFw+r3qMpXodK4QCpfnDMXk zn01qRXbVdml4TSI8MuKEIGJW6sR X-Google-Smtp-Source: ALg8bN72mMX7lybXtlBbRZ5yDfPCnBim08Xg8TlNnVnwJJ/prGpJBOJu4+AC4GJQBPdaNjkXz/dJbA== X-Received: by 2002:a65:6148:: with SMTP id o8mr5223237pgv.451.1547581357761; Tue, 15 Jan 2019 11:42:37 -0800 (PST) Received: from fainelli-desktop.igp.broadcom.net ([192.19.223.250]) by smtp.gmail.com with ESMTPSA id 128sm6954262pfu.129.2019.01.15.11.42.36 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 15 Jan 2019 11:42:37 -0800 (PST) From: Florian Fainelli To: netdev@vger.kernel.org Cc: Florian Fainelli , andrew@lunn.ch, vivien.didelot@gmail.com, davem@davemloft.net, idosch@mellanox.com, jiri@mellanox.com, ilias.apalodimas@linaro.org, ivan.khoronzhuk@linaro.org, roopa@cumulusnetworks.com, nikolay@cumulusnetworks.com Subject: [RFC net-next 04/14] net: systemport: Fix reception of BPDUs Date: Tue, 15 Jan 2019 11:41:20 -0800 Message-Id: <20190115194130.19896-5-f.fainelli@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190115194130.19896-1-f.fainelli@gmail.com> References: <20190115194130.19896-1-f.fainelli@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org SYSTEMPORT has its RXCHK parser block that attempts to validate the packet structures, unfortunately setting the L2 header check bit will cause Bridge PDUs (BPDUs) to be incorrectly rejected because they look like LLC/SNAP packets with a non-IPv4 or non-IPv6 Ethernet Type. Fixes: 4e8aedfe78c7 ("net: systemport: Turn on offloads by default") Signed-off-by: Florian Fainelli --- drivers/net/ethernet/broadcom/bcmsysport.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c index 4574275ef445..720dc3b59cdb 100644 --- a/drivers/net/ethernet/broadcom/bcmsysport.c +++ b/drivers/net/ethernet/broadcom/bcmsysport.c @@ -134,6 +134,10 @@ static void bcm_sysport_set_rx_csum(struct net_device *dev, priv->rx_chk_en = !!(wanted & NETIF_F_RXCSUM); reg = rxchk_readl(priv, RXCHK_CONTROL); + /* Clear L2 header checks, which would prevent BPDUs + * from being received. + */ + reg &= ~RXCHK_L2_HDR_DIS; if (priv->rx_chk_en) reg |= RXCHK_EN; else From patchwork Tue Jan 15 19:41:21 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 1025390 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=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="UZi0eCoY"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43fLN74Ymdz9s9G for ; Wed, 16 Jan 2019 06:42:47 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389446AbfAOTmq (ORCPT ); Tue, 15 Jan 2019 14:42:46 -0500 Received: from mail-pg1-f196.google.com ([209.85.215.196]:46023 "EHLO mail-pg1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389416AbfAOTmk (ORCPT ); Tue, 15 Jan 2019 14:42:40 -0500 Received: by mail-pg1-f196.google.com with SMTP id y4so1653543pgc.12 for ; Tue, 15 Jan 2019 11:42:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=5fH5gr9sNUrm8VK7d4y4RBnmbuL7cLAznMFlqfUMim4=; b=UZi0eCoYqxYM3nkmVCnvfHfmb5atCiTKphd+F+aaruV/RbTlKwDbtYhZvkcOD4c4yd TuYCgQfOP8sHiR57PGYO/dzRoms8mkUX4LlECkl9WEuuczDcyqU3aY/mtfj9hi2bWYX6 X26DmVoezdqLMRpiChgpFbSKTnYJBSoZqsiYWyEkZ1tGvfraSCkKSE6GCHzX5Q56Jvjn 6tYeWiwfgQkE7B1TOpWx/JYVLEkOso3DS9xn57VB0WBwN6URSAeLJc4YjXcvrNHU6sJr I60u+jPPgS5F+IQKkDCTfLluXk4w9nERxfeoGMibDdhmITKtUtfQin0zuRnnuVvDX69C nOSQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=5fH5gr9sNUrm8VK7d4y4RBnmbuL7cLAznMFlqfUMim4=; b=S2CVNg4hHnnJJ/1CQxZ/5RwlWNhRrBmSfCNsbg4BzTuXv46WCI0dZxkjZx4/U9sdxt rXnqtJwkAugGYgCiKXbIqFw914BL09MM185osaGDMCZ7V5SPZ8v8+pyp3JmXDs/Ei1iz mpolUGgMDGIb+oi2w8kFlijlYpJZznC8SRIaYB8etODdI9iyN74oHYC89nv/ltTHEVYl i4BAdbGu/55OMKxNPwChxsk6/fFJ8CG2yO0QxIN7oqrgHPe5S3XbAD3H/FR8pweyv304 n1tISayT8pyT2oqeoZR6/c0CnscR/shTD7DExe/98GYty9Ierr1kEEbhJhZramP6AOMG LIlw== X-Gm-Message-State: AJcUukdfPszWW4GyKaKkDiEPgslTa5L4OHGQfXuGQ409+HlhwAIXDLa0 9qi2M2l/vglP3RfJxfAwwnqNAm6Y X-Google-Smtp-Source: ALg8bN5yWnQV+Q8pi/EpHHbu713itItGn3OWvLWWBcJp42E8uRLpJR3UjadDRx+vDWHv7Hk7TshxvQ== X-Received: by 2002:a62:c613:: with SMTP id m19mr5682605pfg.207.1547581359545; Tue, 15 Jan 2019 11:42:39 -0800 (PST) Received: from fainelli-desktop.igp.broadcom.net ([192.19.223.250]) by smtp.gmail.com with ESMTPSA id 128sm6954262pfu.129.2019.01.15.11.42.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 15 Jan 2019 11:42:38 -0800 (PST) From: Florian Fainelli To: netdev@vger.kernel.org Cc: Florian Fainelli , andrew@lunn.ch, vivien.didelot@gmail.com, davem@davemloft.net, idosch@mellanox.com, jiri@mellanox.com, ilias.apalodimas@linaro.org, ivan.khoronzhuk@linaro.org, roopa@cumulusnetworks.com, nikolay@cumulusnetworks.com Subject: [RFC net-next 05/14] net: dsa: b53: Define registers for IGMP snooping Date: Tue, 15 Jan 2019 11:41:21 -0800 Message-Id: <20190115194130.19896-6-f.fainelli@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190115194130.19896-1-f.fainelli@gmail.com> References: <20190115194130.19896-1-f.fainelli@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Define all necessary registers in order to implement IGMP snooping later on, which are mostly comprised of the high-level protocol register control definitions. Signed-off-by: Florian Fainelli --- drivers/net/dsa/b53/b53_regs.h | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/drivers/net/dsa/b53/b53_regs.h b/drivers/net/dsa/b53/b53_regs.h index 2a9f421680aa..b4aecd4552b6 100644 --- a/drivers/net/dsa/b53/b53_regs.h +++ b/drivers/net/dsa/b53/b53_regs.h @@ -115,6 +115,8 @@ #define B53_UC_FLOOD_MASK 0x32 #define B53_MC_FLOOD_MASK 0x34 #define B53_IPMC_FLOOD_MASK 0x36 +#define B53_DIS_LEARN 0x3c +#define B53_SFT_LRN_CTRL 0x3e /* * Override Ports 0-7 State on devices with xMII interfaces (8 bit) @@ -253,6 +255,26 @@ /* Revision ID register (8 bit) */ #define B53_REV_ID 0x40 +/* High-level Protocol Control Register (32 bit) */ +#define B53_HL_PRTC_CTRL 0x50 +#define HL_PRTC_ARP_EN (1 << 0) +#define HL_PRTC_RARP_EN (1 << 1) +#define HL_PRTC_DHCP_EN (1 << 2) +#define HL_PRTC_ICMPV4_EN (1 << 3) +#define HL_PRTC_ICMPV6_EN (1 << 4) +#define HL_PRTC_ICMPV6_FWD_MODE (1 << 5) +#define HL_PRTC_IGMP_DIP_EN (1 << 8) +#define HL_PRTC_IGMP_RPTLVE_EN (1 << 9) +#define HL_PRTC_IGMP_RPTVLE_FWD_MODE (1 << 10) +#define HL_PRTC_IGMP_QRY_EN (1 << 11) +#define HL_PRTC_IGMP_QRY_FWD_MODE (1 << 12) +#define HL_PRTC_IGMP_UKN_EN (1 << 13) +#define HL_PRTC_IGMP_UKN_FWD_MODE (1 << 14) +#define HL_PRTC_MLD_RPTDONE_EN (1 << 15) +#define HL_PRTC_MLD_RPTDONE_FWD_MODE (1 << 16) +#define HL_PRTC_MLD_QRY_EN (1 << 17) +#define HL_PRTC_MLD_QRY_FWD_MODE (1 << 18) + /* Broadcom header RX control (16 bit) */ #define B53_BRCM_HDR_RX_DIS 0x60 From patchwork Tue Jan 15 19:41:22 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 1025397 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=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="BGUpgvFZ"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43fLNP1wSwz9s9G for ; Wed, 16 Jan 2019 06:43:01 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389450AbfAOTmr (ORCPT ); Tue, 15 Jan 2019 14:42:47 -0500 Received: from mail-pg1-f196.google.com ([209.85.215.196]:44759 "EHLO mail-pg1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389415AbfAOTmm (ORCPT ); Tue, 15 Jan 2019 14:42:42 -0500 Received: by mail-pg1-f196.google.com with SMTP id t13so1655396pgr.11 for ; Tue, 15 Jan 2019 11:42:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=61kJRgAHiPAs/4u/rsaX9zX3GHTNWz6BIEpA+UYqK3w=; b=BGUpgvFZ8FSrAoJtHAsqX53BCTIKOCP69yVIZ0NjToEzeV6qCJlIY2V7X3DVaxiduD XZBsS04aPuHQ01Dkm/kwy+6w+OHnQhS+LMUK/9nkeN3Gs0hJ6z44khiU8ZGo0nBt7Ame vcBAjDAt8QWN8JJfcJzjdkszAW2JVW74ietlBvN6xkWm8Wb2JIIcyKwQi/2e2uoA2RTi hnc2S001MiNSGZRbLw/tSGXVqQmdHYLn2ICAS5WYxKFDlKUUMAlbglAcOx9cgNRB+cLA NDWZfYQVlCoJCorJuKjEARmbBfFMcheRWABLQlRS1hTgEzYbuej4CqImB4wkn9pTAxvZ ThlA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=61kJRgAHiPAs/4u/rsaX9zX3GHTNWz6BIEpA+UYqK3w=; b=GZJRLhdZgUF2vGjfiQWNqEfAux2qoZ5GkLLasrh7SG6Fe50mvizgcUieCU+HJFzl2q BggaQwq6XPaMv/sunSKgdxIiTdChGTbVBeB8m6TazX9CQm03n+XqFTWErQ0YYS+a28NW 3gDYZQmCLlxBVR4u+JALlDYD7iesC0gDPyx5QnwLNHHGayNRzer5kzmOxbm/aCVk7aWF GqEzUsGz7TR/5M/rq3twOe6uRrb/TKjSr1O2uU8F8n1FqY7Wq8+uwbCon34PsTlgi6f6 I3hdbc2lRq36wTsPKowrgJSFole1P4Af0fFlekStsdVyI56E9jsumhnBZFFWblHbrQUk ozTA== X-Gm-Message-State: AJcUukd+6RPji7ZwpJyKPtn3Psf1xPaDFbJ7MNi2qxaAXz569bkbyFG2 MqExxy4Ijk7XQoZYF97dCQqk3iVe X-Google-Smtp-Source: ALg8bN4lW/TJ6/swu2JWmtNWaIc9TUgVP2TU90p4I1zyVBJXdoJXVk5iLYpzjKh/sC1oDd4rUfwKhQ== X-Received: by 2002:a63:c0f:: with SMTP id b15mr5314863pgl.314.1547581361245; Tue, 15 Jan 2019 11:42:41 -0800 (PST) Received: from fainelli-desktop.igp.broadcom.net ([192.19.223.250]) by smtp.gmail.com with ESMTPSA id 128sm6954262pfu.129.2019.01.15.11.42.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 15 Jan 2019 11:42:40 -0800 (PST) From: Florian Fainelli To: netdev@vger.kernel.org Cc: Florian Fainelli , andrew@lunn.ch, vivien.didelot@gmail.com, davem@davemloft.net, idosch@mellanox.com, jiri@mellanox.com, ilias.apalodimas@linaro.org, ivan.khoronzhuk@linaro.org, roopa@cumulusnetworks.com, nikolay@cumulusnetworks.com Subject: [RFC net-next 06/14] net: dsa: b53: Add support for MDB Date: Tue, 15 Jan 2019 11:41:22 -0800 Message-Id: <20190115194130.19896-7-f.fainelli@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190115194130.19896-1-f.fainelli@gmail.com> References: <20190115194130.19896-1-f.fainelli@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org In preparation for supporting IGMP snooping with or without the use of a bridge, add support within b53_common.c to program the ARL entries for multicast operations. The key difference is that a multicast ARL entry is comprised of a bitmask of enabled ports, instead of a port number. Signed-off-by: Florian Fainelli --- drivers/net/dsa/b53/b53_common.c | 62 ++++++++++++++++++++++++++++++-- drivers/net/dsa/b53/b53_priv.h | 8 ++++- 2 files changed, 67 insertions(+), 3 deletions(-) diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c index 2fef4c564420..6c894ad4768a 100644 --- a/drivers/net/dsa/b53/b53_common.c +++ b/drivers/net/dsa/b53/b53_common.c @@ -1503,11 +1503,25 @@ static int b53_arl_op(struct b53_device *dev, int op, int port, idx = 1; } - memset(&ent, 0, sizeof(ent)); - ent.port = port; + /* For multicast address, the port is a bitmask and the validity + * is determined by having at least one port being still active + */ + if (!is_multicast_ether_addr(addr)) { + ent.port = port; + ent.is_valid = is_valid; + } else { + if (is_valid) + ent.port |= BIT(port); + else + ent.port &= ~BIT(port); + + ent.is_valid = !!(ent.port); + } + ent.is_valid = is_valid; ent.vid = vid; ent.is_static = true; + ent.is_age = false; memcpy(ent.mac, addr, ETH_ALEN); b53_arl_from_entry(&mac_vid, &fwd_entry, &ent); @@ -1626,6 +1640,47 @@ int b53_fdb_dump(struct dsa_switch *ds, int port, } EXPORT_SYMBOL(b53_fdb_dump); +int b53_mdb_prepare(struct dsa_switch *ds, int port, + const struct switchdev_obj_port_mdb *mdb) +{ + struct b53_device *priv = ds->priv; + + /* 5325 and 5365 require some more massaging, but could + * be supported eventually + */ + if (is5325(priv) || is5365(priv)) + return -EOPNOTSUPP; + + return 0; +} +EXPORT_SYMBOL(b53_mdb_prepare); + +void b53_mdb_add(struct dsa_switch *ds, int port, + const struct switchdev_obj_port_mdb *mdb) +{ + struct b53_device *priv = ds->priv; + int ret; + + ret = b53_arl_op(priv, 0, port, mdb->addr, mdb->vid, true); + if (ret) + dev_err(ds->dev, "failed to add MDB entry\n"); +} +EXPORT_SYMBOL(b53_mdb_add); + +int b53_mdb_del(struct dsa_switch *ds, int port, + const struct switchdev_obj_port_mdb *mdb) +{ + struct b53_device *priv = ds->priv; + int ret; + + ret = b53_arl_op(priv, 0, port, mdb->addr, mdb->vid, false); + if (ret) + dev_err(ds->dev, "failed to delete MDB entry\n"); + + return ret; +} +EXPORT_SYMBOL(b53_mdb_del); + int b53_br_join(struct dsa_switch *ds, int port, struct net_device *br) { struct b53_device *dev = ds->priv; @@ -1969,6 +2024,9 @@ static const struct dsa_switch_ops b53_switch_ops = { .port_fdb_del = b53_fdb_del, .port_mirror_add = b53_mirror_add, .port_mirror_del = b53_mirror_del, + .port_mdb_prepare = b53_mdb_prepare, + .port_mdb_add = b53_mdb_add, + .port_mdb_del = b53_mdb_del, }; struct b53_chip_data { diff --git a/drivers/net/dsa/b53/b53_priv.h b/drivers/net/dsa/b53/b53_priv.h index 4dc7ee38b258..620638ff9338 100644 --- a/drivers/net/dsa/b53/b53_priv.h +++ b/drivers/net/dsa/b53/b53_priv.h @@ -251,7 +251,7 @@ b53_build_op(write48, u64); b53_build_op(write64, u64); struct b53_arl_entry { - u8 port; + u16 port; u8 mac[ETH_ALEN]; u16 vid; u8 is_valid:1; @@ -350,6 +350,12 @@ int b53_fdb_del(struct dsa_switch *ds, int port, const unsigned char *addr, u16 vid); int b53_fdb_dump(struct dsa_switch *ds, int port, dsa_fdb_dump_cb_t *cb, void *data); +int b53_mdb_prepare(struct dsa_switch *ds, int port, + const struct switchdev_obj_port_mdb *mdb); +void b53_mdb_add(struct dsa_switch *ds, int port, + const struct switchdev_obj_port_mdb *mdb); +int b53_mdb_del(struct dsa_switch *ds, int port, + const struct switchdev_obj_port_mdb *mdb); int b53_mirror_add(struct dsa_switch *ds, int port, struct dsa_mall_mirror_tc_entry *mirror, bool ingress); enum dsa_tag_protocol b53_get_tag_protocol(struct dsa_switch *ds, int port); From patchwork Tue Jan 15 19:41:23 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 1025399 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=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="K1x9JaF5"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43fLNW1cfbz9s9G for ; Wed, 16 Jan 2019 06:43:07 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389484AbfAOTnF (ORCPT ); Tue, 15 Jan 2019 14:43:05 -0500 Received: from mail-pl1-f193.google.com ([209.85.214.193]:34712 "EHLO mail-pl1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389438AbfAOTmo (ORCPT ); Tue, 15 Jan 2019 14:42:44 -0500 Received: by mail-pl1-f193.google.com with SMTP id w4so1777689plz.1 for ; Tue, 15 Jan 2019 11:42:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=TJyRoY35BZ44Wn/vP37Pz+tEPeYCUHy1JVXuNzq45LQ=; b=K1x9JaF5021zlAFDpgNt9DSZyR4aZcn1ytBCyhZQn9xnBwliA/CRT7DXxBByinLvOt qKYsP50Ma+NnD9miIXggP4ZFocwbchqqSrJAlYEAy2iZTrLWt/72r0HVosN2/UNQNliD 18TEf9BmLExZC0EaHf+NU7Cx0c2jCbyrcQmtLg4Lr49ecg/dejPdt+Q+tK3sW+IUQMj7 zSsUsoHpvMT3FSvI1M7lJ8s3V9tcXO86Q/gvPpCyfGAIz4qBP2ZrEImhU7uSCYMQl3xh Tp/HT4v02C1Bft+LttJ8T5t0M3uYnpEvcMxSS1BF1XDmvW02Vl4joxUh2kR/EIS2O/gQ RhTQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=TJyRoY35BZ44Wn/vP37Pz+tEPeYCUHy1JVXuNzq45LQ=; b=bdruGHJRSdBAVFlEDBwqhWfV5zGXqi45lBBmvLOtcv3NeS2ZXN6ccSJsCKP8NHce4j tBl2hLTPpo4rIekRXEh2QFwTSU2ny/EtK+TvnKekYfPKcABy2URJeK7WAvQJHQenn4jO cck1MnAWqerc3PQyqjdxgco96/dYrNwctK+rLTm208dXuu+TSp9C+sYfAcTKrA8NDmM4 QJrbCY3z/pJ9gnVuOk5WNF19+L9KC7VNytuBCnw9A3RIywuWn45hf5lLCNEuHj3hEbip vKeaHSv/TImH2xNgKLdIMaon0MRhZAnuuKh8INZo8AANGNTAxlGmYp9sI52EZnvRhA/S fxKQ== X-Gm-Message-State: AJcUukf9Usl5ZVeLxIp/GmfVPodviSZtGsPkQ8dffceENfdc/JtIF2A+ AcohGUCmckeFDLEYWiifK2B7Pqus X-Google-Smtp-Source: ALg8bN68HHScXDSl3sNO3GzOc4W59uIsw0sDGprw6PEmImBijkjr3wN3shKWQ3WHhqa3ctoDtwrDSA== X-Received: by 2002:a17:902:2006:: with SMTP id n6mr5860292pla.66.1547581362965; Tue, 15 Jan 2019 11:42:42 -0800 (PST) Received: from fainelli-desktop.igp.broadcom.net ([192.19.223.250]) by smtp.gmail.com with ESMTPSA id 128sm6954262pfu.129.2019.01.15.11.42.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 15 Jan 2019 11:42:42 -0800 (PST) From: Florian Fainelli To: netdev@vger.kernel.org Cc: Florian Fainelli , andrew@lunn.ch, vivien.didelot@gmail.com, davem@davemloft.net, idosch@mellanox.com, jiri@mellanox.com, ilias.apalodimas@linaro.org, ivan.khoronzhuk@linaro.org, roopa@cumulusnetworks.com, nikolay@cumulusnetworks.com Subject: [RFC net-next 07/14] net: dsa: Add ability to program multicast filter for CPU port Date: Tue, 15 Jan 2019 11:41:23 -0800 Message-Id: <20190115194130.19896-8-f.fainelli@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190115194130.19896-1-f.fainelli@gmail.com> References: <20190115194130.19896-1-f.fainelli@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org When the switch ports operate as individual network devices, the switch driver might have configured the switch to flood multicast all the way to the CPU port. This is really undesireable as it can lead to receiving a lot of unwanted traffic that the network stack needs to filter in software. For each valid multicast address, program it into the switch's MDB only when the host is interested in receiving such traffic, e.g: running an multicast application. Signed-off-by: Florian Fainelli --- net/dsa/slave.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/net/dsa/slave.c b/net/dsa/slave.c index a3fcc1d01615..33f6b88b6fd6 100644 --- a/net/dsa/slave.c +++ b/net/dsa/slave.c @@ -68,6 +68,39 @@ static int dsa_slave_get_iflink(const struct net_device *dev) return dsa_slave_to_master(dev)->ifindex; } +static int dsa_slave_sync_unsync_mdb_addr(struct net_device *dev, + const unsigned char *addr, bool add) +{ + struct switchdev_obj_port_mdb mdb = { + .obj = { + .id = SWITCHDEV_OBJ_ID_HOST_MDB, + .flags = SWITCHDEV_F_DEFER, + }, + .vid = 0, + }; + int ret = -EOPNOTSUPP; + + ether_addr_copy(mdb.addr, addr); + if (add) + ret = switchdev_port_obj_add(dev, &mdb.obj, NULL); + else + ret = switchdev_port_obj_del(dev, &mdb.obj); + + return ret; +} + +static int dsa_slave_sync_mdb_addr(struct net_device *dev, + const unsigned char *addr) +{ + return dsa_slave_sync_unsync_mdb_addr(dev, addr, true); +} + +static int dsa_slave_unsync_mdb_addr(struct net_device *dev, + const unsigned char *addr) +{ + return dsa_slave_sync_unsync_mdb_addr(dev, addr, false); +} + static int dsa_slave_open(struct net_device *dev) { struct net_device *master = dsa_slave_to_master(dev); @@ -126,6 +159,8 @@ static int dsa_slave_close(struct net_device *dev) dev_mc_unsync(master, dev); dev_uc_unsync(master, dev); + __hw_addr_unsync_dev(&dev->mc, dev, dsa_slave_unsync_mdb_addr); + if (dev->flags & IFF_ALLMULTI) dev_set_allmulti(master, -1); if (dev->flags & IFF_PROMISC) @@ -150,7 +185,17 @@ static void dsa_slave_change_rx_flags(struct net_device *dev, int change) static void dsa_slave_set_rx_mode(struct net_device *dev) { struct net_device *master = dsa_slave_to_master(dev); + struct dsa_port *dp = dsa_slave_to_port(dev); + /* If the port is bridged, the bridge takes care of sending + * SWITCHDEV_OBJ_ID_HOST_MDB to program the host's MC filter + */ + if (netdev_mc_empty(dev) || dp->bridge_dev) + goto out; + + __hw_addr_sync_dev(&dev->mc, dev, dsa_slave_sync_mdb_addr, + dsa_slave_unsync_mdb_addr); +out: dev_mc_sync(master, dev); dev_uc_sync(master, dev); } @@ -1395,6 +1440,11 @@ static int dsa_slave_changeupper(struct net_device *dev, if (netif_is_bridge_master(info->upper_dev)) { if (info->linking) { + /* Remove existing MC addresses that might have been + * programmed + */ + __hw_addr_unsync_dev(&dev->mc, dev, + dsa_slave_unsync_mdb_addr); err = dsa_port_bridge_join(dp, info->upper_dev); err = notifier_from_errno(err); } else { From patchwork Tue Jan 15 19:41:24 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 1025391 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=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="OhFPYNrB"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43fLNB0DFCz9s9G for ; Wed, 16 Jan 2019 06:42:50 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389455AbfAOTms (ORCPT ); Tue, 15 Jan 2019 14:42:48 -0500 Received: from mail-pl1-f196.google.com ([209.85.214.196]:35807 "EHLO mail-pl1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389444AbfAOTmq (ORCPT ); Tue, 15 Jan 2019 14:42:46 -0500 Received: by mail-pl1-f196.google.com with SMTP id p8so1775758plo.2 for ; Tue, 15 Jan 2019 11:42:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=WTpEG0hverzLx5Az4KZkJD9LeNYpfD5yIIcyKuae3VI=; b=OhFPYNrB9hWxYHx05u+Hi1i6AgiqBRhUGRlSdciGu+iCAl8PjOoVSDlpc2oNk8M38S 5iCg2XufsqX7tzs8OQ8VvG5UTlmi0vrgvosWi16CfMAxsliQGRvUi6IBzoN2qCeQiPH5 pZranirqsHTARjRwmNjr3tzhRCFtGAL/IfLl4CoRzeJnKKhnzkaZqdKDk/N1qNBdiDda sBEwbH2JD/a0oEiE1nPFDpYTnwLBIBfnaMe2vnnw9gvTfj8rANk6dBm0zlMBdYfO5zq9 4Z144LLqpuf2lyRJ+xNZSbF/ygEmItez1lDJECPMyXRPugJJ5KTMkTXzGbduG6Faxdp+ +5zg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=WTpEG0hverzLx5Az4KZkJD9LeNYpfD5yIIcyKuae3VI=; b=EV3l1JCQgK/bXeYAie1Mh44CQsYxtSA8M7j1JZo7K0HzLSZYWsecW63ZvhzJl2Cm2G 3nZ8UO8/59EBmwtWkXEmMux0l7vmqG0m/GwyT6CD/F5Uss6NEhXU8PWWhe+3o6bK4dHY khELSpHKjllTZsjKbkwjQqKKEFcfZedS8sDSOrzMw+rGI6jNCoqOT8N9/KtBrbWDLqF+ tL13i0GL7zdtRvBVb1xo+pouHAyTPGbKZL9vTRRPlkcSE19f0bzEJeQU/lVE09Mg0Wex gLtlmg1WHpATn+6Lv7+UBIDL0nAiA36gemfIsMgPWkHu8gj5wxHK8AtL7Xh+F9MF5N+x Vl2Q== X-Gm-Message-State: AJcUukfZSxUPzcZuFqiTlfAJIYHfMzGuFT6I+BUnlasaMno2jCMBshlY wlKFduzJENAAo+nTlIS5xeGcz3Er X-Google-Smtp-Source: ALg8bN4tBrqZl/KAwWZugZuvgglv6DwvV6DFdpKn4UnHguIjx9YASI8RXp+VKO2fID1aMF2ugJHNkw== X-Received: by 2002:a17:902:2c03:: with SMTP id m3mr5580985plb.6.1547581364673; Tue, 15 Jan 2019 11:42:44 -0800 (PST) Received: from fainelli-desktop.igp.broadcom.net ([192.19.223.250]) by smtp.gmail.com with ESMTPSA id 128sm6954262pfu.129.2019.01.15.11.42.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 15 Jan 2019 11:42:43 -0800 (PST) From: Florian Fainelli To: netdev@vger.kernel.org Cc: Florian Fainelli , andrew@lunn.ch, vivien.didelot@gmail.com, davem@davemloft.net, idosch@mellanox.com, jiri@mellanox.com, ilias.apalodimas@linaro.org, ivan.khoronzhuk@linaro.org, roopa@cumulusnetworks.com, nikolay@cumulusnetworks.com Subject: [RFC net-next 08/14] net: dsa: Add ndo_vlan_rx_{add, kill}_vid implementation Date: Tue, 15 Jan 2019 11:41:24 -0800 Message-Id: <20190115194130.19896-9-f.fainelli@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190115194130.19896-1-f.fainelli@gmail.com> References: <20190115194130.19896-1-f.fainelli@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org In order to properly support VLAN filtering being enabled/disabled on a bridge, while having other ports being non bridge port members, we need to support the ndo_vlan_rx_{add,kill}_vid callbacks in order to make sure the non-bridge ports can continue receiving VLAN tags, even when the switch is globally configured to do ingress/egress VID checking. We don't allow configuring VLAN devices on a bridge port member though, since the bridge with VLAN awareness should be taking care of that, if needed. Since we can call dsa_port_vlan_{add,del} with a bridge_dev pointer NULL, we now need to check that in these two functions. Signed-off-by: Florian Fainelli --- net/dsa/port.c | 12 +++++++++-- net/dsa/slave.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 62 insertions(+), 3 deletions(-) diff --git a/net/dsa/port.c b/net/dsa/port.c index 2d7e01b23572..185e85a4f5f0 100644 --- a/net/dsa/port.c +++ b/net/dsa/port.c @@ -252,7 +252,11 @@ int dsa_port_vlan_add(struct dsa_port *dp, .vlan = vlan, }; - if (br_vlan_enabled(dp->bridge_dev)) + /* Can be called from dsa_slave_port_obj_add() or + * dsa_slave_vlan_rx_add_vid() + */ + if ((dp->bridge_dev && br_vlan_enabled(dp->bridge_dev)) || + !dp->bridge_dev) return dsa_port_notify(dp, DSA_NOTIFIER_VLAN_ADD, &info); return 0; @@ -270,7 +274,11 @@ int dsa_port_vlan_del(struct dsa_port *dp, if (netif_is_bridge_master(vlan->obj.orig_dev)) return -EOPNOTSUPP; - if (br_vlan_enabled(dp->bridge_dev)) + /* Can be called from dsa_slave_port_obj_del() or + * dsa_slave_vlan_rx_kill_vid() + */ + if ((dp->bridge_dev && br_vlan_enabled(dp->bridge_dev)) || + !dp->bridge_dev) return dsa_port_notify(dp, DSA_NOTIFIER_VLAN_DEL, &info); return 0; diff --git a/net/dsa/slave.c b/net/dsa/slave.c index 33f6b88b6fd6..e266ef329583 100644 --- a/net/dsa/slave.c +++ b/net/dsa/slave.c @@ -1027,6 +1027,54 @@ static int dsa_slave_get_ts_info(struct net_device *dev, return ds->ops->get_ts_info(ds, p->dp->index, ts); } +static int dsa_slave_vlan_rx_add_vid(struct net_device *dev, __be16 proto, + u16 vid) +{ + struct dsa_port *dp = dsa_slave_to_port(dev); + struct switchdev_obj_port_vlan vlan = { }; + int ret = 0; + + /* If the port is bridged and the bridge is VLAN aware, let the bridge + * manage VLANs + */ + if (dp->bridge_dev && br_vlan_enabled(dp->bridge_dev)) + return -EINVAL; + + /* This API only allows programming tagged, non-PVID VIDs */ + vlan.vid_begin = vid; + vlan.vid_end = vid; + + ret = dsa_port_vlan_add(dp, &vlan, NULL); + if (ret == -EOPNOTSUPP) + ret = 0; + + return ret; +} + +static int dsa_slave_vlan_rx_kill_vid(struct net_device *dev, __be16 proto, + u16 vid) +{ + struct dsa_port *dp = dsa_slave_to_port(dev); + struct switchdev_obj_port_vlan vlan = { }; + int ret = 0; + + /* If the port is bridged and the bridge is VLAN aware, let the bridge + * manage VLANs + */ + if (dp->bridge_dev && br_vlan_enabled(dp->bridge_dev)) + return -EINVAL; + + /* This API only allows programming tagged, non-PVID VIDs */ + vlan.vid_begin = vid; + vlan.vid_end = vid; + + ret = dsa_port_vlan_del(dp, &vlan); + if (ret == -EOPNOTSUPP) + ret = 0; + + return ret; +} + static const struct ethtool_ops dsa_slave_ethtool_ops = { .get_drvinfo = dsa_slave_get_drvinfo, .get_regs_len = dsa_slave_get_regs_len, @@ -1090,6 +1138,8 @@ static const struct net_device_ops dsa_slave_netdev_ops = { .ndo_get_phys_port_name = dsa_slave_get_phys_port_name, .ndo_setup_tc = dsa_slave_setup_tc, .ndo_get_stats64 = dsa_slave_get_stats64, + .ndo_vlan_rx_add_vid = dsa_slave_vlan_rx_add_vid, + .ndo_vlan_rx_kill_vid = dsa_slave_vlan_rx_kill_vid, }; static const struct switchdev_ops dsa_slave_switchdev_ops = { @@ -1350,7 +1400,8 @@ int dsa_slave_create(struct dsa_port *port) if (slave_dev == NULL) return -ENOMEM; - slave_dev->features = master->vlan_features | NETIF_F_HW_TC; + slave_dev->features = master->vlan_features | NETIF_F_HW_TC | + NETIF_F_HW_VLAN_CTAG_FILTER; slave_dev->hw_features |= NETIF_F_HW_TC; slave_dev->ethtool_ops = &dsa_slave_ethtool_ops; eth_hw_addr_inherit(slave_dev, master); From patchwork Tue Jan 15 19:41:25 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 1025392 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=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="WTblBvYc"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43fLNC48Srz9s9G for ; Wed, 16 Jan 2019 06:42:51 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731866AbfAOTmu (ORCPT ); Tue, 15 Jan 2019 14:42:50 -0500 Received: from mail-pg1-f196.google.com ([209.85.215.196]:40082 "EHLO mail-pg1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389451AbfAOTms (ORCPT ); Tue, 15 Jan 2019 14:42:48 -0500 Received: by mail-pg1-f196.google.com with SMTP id z10so1666928pgp.7 for ; Tue, 15 Jan 2019 11:42:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=LDCpuwMTsExuN9AY2TbB7aHKA/vWaZhq13Goarr46z4=; b=WTblBvYcyq5NEd7UkkOLl4ay3uCXvlsoDjXQQftnn0guBJ+GlMmibNAuVN8jKRDfGY Wr5mC2/ZRnyLwdopXb2VdkMm5vC+u3Bp5jLPYPYpS/5dvNoZFElQh33AoqpW4VUwZ127 4aeSVDnLng9baNEVfKGnQMMTtm/8G9aUl4HBpwcyVJbxBSEi3R+uhEzVz+/ZKomjbEyB +oNZUXO9H/Ku5P+7D70cvpODOGQW+76zkZj+5qm0RGGtVyitpSr4JeISY5xNgX+dLofF 3krRN7X0cnnkCiQtLEXzB3J+hP4+LVvwVGzRix/RgmHeoXpvqoPF9NMjCepa4ilX4rX2 /qzg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=LDCpuwMTsExuN9AY2TbB7aHKA/vWaZhq13Goarr46z4=; b=HM4OnoFQe20sfyi9MP4p2Fe+hYMw0ILLw1sLnCmL/hS4tjMZQAfmrXYoWFl699GbGE 9zE4MZB/brVJzN0vL6L8SeBKButv4KXBdzXA79F1hXq6N2dtw1NC8Z5Q09uHsTnPrhI2 N7/VDAVpv3dn36LQzogrQmxm9ueKYECs0J8jJD6cofXFY/BYOS81JjaH83tCIYx9U/Ow 5Y/XqFh9FTkJjtmMGLTXiGQtDdKvQp1sHsuC/F9TBWCaQcTLFbh/bQJAnq+5r236w5om dKez3L0+Tsa7utlZmMSbipySVmv2HorlIe2T18LNozmaSl8PwhfMMbYx028hvyZBVqUc BFGw== X-Gm-Message-State: AJcUukcD1wZZ2g1FCt9W4fS+LU1NF+maf1DnXL18udwb/3H0I6AM2jrx ENpFubSXW6sshzboiCYdoKfQjwo+ X-Google-Smtp-Source: ALg8bN74f5paYpJCrOfr022bo6Pzy5RxfdYWWRSredt+kMt3+DLBS/UjD1Is76lOLyTNbUWCuIY3Ag== X-Received: by 2002:a63:4c5:: with SMTP id 188mr5273706pge.391.1547581366477; Tue, 15 Jan 2019 11:42:46 -0800 (PST) Received: from fainelli-desktop.igp.broadcom.net ([192.19.223.250]) by smtp.gmail.com with ESMTPSA id 128sm6954262pfu.129.2019.01.15.11.42.44 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 15 Jan 2019 11:42:45 -0800 (PST) From: Florian Fainelli To: netdev@vger.kernel.org Cc: Florian Fainelli , andrew@lunn.ch, vivien.didelot@gmail.com, davem@davemloft.net, idosch@mellanox.com, jiri@mellanox.com, ilias.apalodimas@linaro.org, ivan.khoronzhuk@linaro.org, roopa@cumulusnetworks.com, nikolay@cumulusnetworks.com Subject: [RFC net-next 09/14] net: bridge: Propagate MC addresses with VID through switchdev Date: Tue, 15 Jan 2019 11:41:25 -0800 Message-Id: <20190115194130.19896-10-f.fainelli@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190115194130.19896-1-f.fainelli@gmail.com> References: <20190115194130.19896-1-f.fainelli@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org In order for bridge port members to get a chance to implement unicast and multicast address filtering correctly, which would matter for e.g: switch network devices, synchronize the UC and MC lists down to the individual bridge port members using switchdev HOST_MDB objects such that this does not impact drivers that already have a ndo_set_rx_mode() operation which likely already operate in promiscuous mode. When the bridge has multicast snooping enabled, proper HOST_MDB notifications will be sent through br_mdb_notify() already. Signed-off-by: Florian Fainelli --- net/bridge/br_device.c | 55 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c index 013323b6dbe4..ce10d6b7b151 100644 --- a/net/bridge/br_device.c +++ b/net/bridge/br_device.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include "br_private.h" @@ -182,8 +183,62 @@ static int br_dev_open(struct net_device *dev) return 0; } +static int bridge_sync_unsync_mc_addr(struct net_device *dev, + const unsigned char *addr, + bool add) +{ + struct net_bridge *br = netdev_priv(dev); + struct switchdev_obj_port_mdb mdb = { + .obj = { + .orig_dev = dev, + .id = SWITCHDEV_OBJ_ID_HOST_MDB, + .flags = SWITCHDEV_F_DEFER, + }, + .vid = 0, + }; + struct net_bridge_port *p; + int ret = -EOPNOTSUPP; + +#ifdef CONFIG_BRIDGE_VLAN_FILTERING + if (br_vlan_enabled(dev)) + mdb.vid = br->default_pvid; +#endif + + ether_addr_copy(mdb.addr, addr); + spin_lock_bh(&br->lock); + list_for_each_entry(p, &br->port_list, list) { + if (add) + ret = switchdev_port_obj_add(p->dev, &mdb.obj, NULL); + else + ret = switchdev_port_obj_del(p->dev, &mdb.obj); + if (ret) + goto out; + } +out: + spin_unlock_bh(&br->lock); + return ret; +} + +static int bridge_sync_mc_addr(struct net_device *dev, + const unsigned char *addr) +{ + return bridge_sync_unsync_mc_addr(dev, addr, true); +} + +static int bridge_unsync_mc_addr(struct net_device *dev, + const unsigned char *addr) +{ + return bridge_sync_unsync_mc_addr(dev, addr, false); +} + static void br_dev_set_multicast_list(struct net_device *dev) { + /* HOST_MDB notifications are sent through MDB notifications */ + if (br_multicast_enabled(dev)) + return; + + __hw_addr_sync_dev(&dev->mc, dev, bridge_sync_mc_addr, + bridge_unsync_mc_addr); } static void br_dev_change_rx_flags(struct net_device *dev, int change) From patchwork Tue Jan 15 19:41:26 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 1025393 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=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="IO+jF1PE"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43fLNF5Q1Jz9s9G for ; Wed, 16 Jan 2019 06:42:53 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389465AbfAOTmw (ORCPT ); Tue, 15 Jan 2019 14:42:52 -0500 Received: from mail-pf1-f193.google.com ([209.85.210.193]:43161 "EHLO mail-pf1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389456AbfAOTmt (ORCPT ); Tue, 15 Jan 2019 14:42:49 -0500 Received: by mail-pf1-f193.google.com with SMTP id w73so1783960pfk.10 for ; Tue, 15 Jan 2019 11:42:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=JEutX8kgB6GAcF/QGEpqEAY8qJKUc7qUN7KGrDDvLRE=; b=IO+jF1PEV6w30zNWQCeXZewL/EUMQMZBP2lfEbuNdhAtASiOGrbDHRBQwBeOGSjFvE gXslogYyeW3tHBiNfc2TJ3raJBBrkR9/ijB7WhbfPMLyDS5K1iEXMIupaiKm72LG9W73 H2qOQ+FUTaStqNOkh3IEOvVXDq0wU7Xt54lNdlO16pVYom3YayRBmzqsNusvlsXdpUQl 2jRZ68r7AsSF5lz4t8ve0u3jpXVcQ88vjgQD/46pqSHLuE/z6+6Y1h0otoJh7nCnaNaL b7+p7eF9Ny5SEASI+nJ8wVfz4iHMuCuOcgk0Tfz2svn82Sei0IkOhurdTNFjjOeLCnqG ZtXw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=JEutX8kgB6GAcF/QGEpqEAY8qJKUc7qUN7KGrDDvLRE=; b=h+yKOCyOJpLGh5nNdWL0EYrDuyqWnXesQkhWOZ5+yE+yKrIqCmiLx5nbFUngHgiRpd XEkIGbaW542DRHYbr5vmTHY7haXs30vobkpSz3/VvBZhqPIvnOyA5EvgLrYHyjBpCEx2 kHySb3y9DzwzQbGpYvK5RxKEvsNV3B9BZV21pyl6fFavHmA2a8Rzzuc0GOoRHf0upm7j VXgcyxypgVRlrgwAvdzpMiuG/G9QQNd7w/HRizCWAxgk/LEfYWGzVHkBMEiNNX5yId6c Epbw2UqgY1Zk8r6RgGUx7Hvt2GdEVeAjHlm/sr9PVwbHfMgXhgXSc3qG9TD4+Ai2ASwT helw== X-Gm-Message-State: AJcUukc6NzY+kOer+5G5ATV+J/2iTq3LiKU7Jv6fF+R+VixB0X1zERq5 ghuErXWWM4zgJ2jxxgOYRo9P/+W3 X-Google-Smtp-Source: ALg8bN6YgHlp8qbnVf8fNHDw3fFKXCmRwjJGSgq1Y8QI8QB/WjrfxRrAhvVBna8PwDBqJlWzw0p+1Q== X-Received: by 2002:a63:6984:: with SMTP id e126mr5306557pgc.143.1547581368173; Tue, 15 Jan 2019 11:42:48 -0800 (PST) Received: from fainelli-desktop.igp.broadcom.net ([192.19.223.250]) by smtp.gmail.com with ESMTPSA id 128sm6954262pfu.129.2019.01.15.11.42.46 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 15 Jan 2019 11:42:47 -0800 (PST) From: Florian Fainelli To: netdev@vger.kernel.org Cc: Florian Fainelli , andrew@lunn.ch, vivien.didelot@gmail.com, davem@davemloft.net, idosch@mellanox.com, jiri@mellanox.com, ilias.apalodimas@linaro.org, ivan.khoronzhuk@linaro.org, roopa@cumulusnetworks.com, nikolay@cumulusnetworks.com Subject: [RFC net-next 10/14] net: vlan: Propagate MC addresses with VID through switchdev Date: Tue, 15 Jan 2019 11:41:26 -0800 Message-Id: <20190115194130.19896-11-f.fainelli@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190115194130.19896-1-f.fainelli@gmail.com> References: <20190115194130.19896-1-f.fainelli@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The VLAN real device could be an Ethernet switch port and that switch might have VLAN filtering globally enabled (because of a bridge requesting VLAN filtering on the switch on another port) and so when programming multicast addresses, we need the multicast filter programming to be aware of the correct VLAN ID as well. Ethernet drivers that do not implement switchdev_port_{add,del} operations and do not specifically check for SWITCHDEV_OBJ_ID_HOST_MDB are not affected by that change. Signed-off-by: Florian Fainelli --- net/8021q/vlan_dev.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c index b2d9c8f27cd7..ea2ef9d78dcb 100644 --- a/net/8021q/vlan_dev.c +++ b/net/8021q/vlan_dev.c @@ -312,6 +312,43 @@ static int vlan_dev_open(struct net_device *dev) return err; } +static int vlan_dev_sync_unsync_mc_addr(struct net_device *dev, + const unsigned char *addr, + bool add) +{ + struct net_device *real_dev = vlan_dev_priv(dev)->real_dev; + struct switchdev_obj_port_mdb mdb = { + .obj = { + .orig_dev = dev, + .id = SWITCHDEV_OBJ_ID_HOST_MDB, + .flags = SWITCHDEV_F_DEFER, + }, + .vid = vlan_dev_vlan_id(dev), + }; + int ret = -EOPNOTSUPP; + + ether_addr_copy(mdb.addr, addr); + if (add) + ret = switchdev_port_obj_add(real_dev, &mdb.obj, NULL); + else + ret = switchdev_port_obj_del(real_dev, &mdb.obj); + + return ret; +} + +static int vlan_dev_sync_mc_addr(struct net_device *dev, + const unsigned char *addr) +{ + return vlan_dev_sync_unsync_mc_addr(dev, addr, true); +} + +static int vlan_dev_unsync_mc_addr(struct net_device *dev, + const unsigned char *addr) +{ + return vlan_dev_sync_unsync_mc_addr(dev, addr, false); +} + + static int vlan_dev_stop(struct net_device *dev) { struct vlan_dev_priv *vlan = vlan_dev_priv(dev); @@ -319,6 +356,7 @@ static int vlan_dev_stop(struct net_device *dev) dev_mc_unsync(real_dev, dev); dev_uc_unsync(real_dev, dev); + __hw_addr_unsync_dev(&dev->mc, dev, vlan_dev_unsync_mc_addr); if (dev->flags & IFF_ALLMULTI) dev_set_allmulti(real_dev, -1); if (dev->flags & IFF_PROMISC) @@ -483,6 +521,8 @@ static void vlan_dev_change_rx_flags(struct net_device *dev, int change) static void vlan_dev_set_rx_mode(struct net_device *vlan_dev) { + __hw_addr_sync_dev(&vlan_dev->mc, vlan_dev, vlan_dev_sync_mc_addr, + vlan_dev_unsync_mc_addr); dev_mc_sync(vlan_dev_priv(vlan_dev)->real_dev, vlan_dev); dev_uc_sync(vlan_dev_priv(vlan_dev)->real_dev, vlan_dev); } From patchwork Tue Jan 15 19:41:27 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 1025396 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=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="NV7lDfuS"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43fLNM5605z9sBQ for ; Wed, 16 Jan 2019 06:42:59 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389473AbfAOTm4 (ORCPT ); Tue, 15 Jan 2019 14:42:56 -0500 Received: from mail-pf1-f194.google.com ([209.85.210.194]:45930 "EHLO mail-pf1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389451AbfAOTmv (ORCPT ); Tue, 15 Jan 2019 14:42:51 -0500 Received: by mail-pf1-f194.google.com with SMTP id g62so1779615pfd.12 for ; Tue, 15 Jan 2019 11:42:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=LQmcwQpg9X9bNg67SqJHMVqilF+UsBd7H1NgLsz4Cn0=; b=NV7lDfuS23SIJeoxNhr36PIkvumKfCf4l6oMl9LHpDM7GMfoRY0yM4blgIIulU0PTQ HmaL9eG/PLdGAik9Q4uGIy/7UHxVSe54HHFwHBoYfKsXHXH3ONHimvbge2luiM+DBIoc geIuopmZdfOnkVg8zDZv+k/oZABI+D695Da0G9F8YXG5yl3IvE8vUjNo1K3+i+Ix1dBf /ZVzGKVFSQ3uimMMOtBV8k8RuLUN33DNDM1A8OAjL/Lo/ZQkFOQwx0udVRKelwI/DyJM 4PYVwsIZPa3Dluh+H9St+7IDRAghV92M5f7kKUm2xvAdVZgEH3AUR/m1x8hVRDiRa06G 1VHg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=LQmcwQpg9X9bNg67SqJHMVqilF+UsBd7H1NgLsz4Cn0=; b=IobannjVAaf0P8IUeFHNqdHXsZRhaGAE9u7nn3Aem4wGMUj3fD5WRtALehf0N8hWyE RUjn95jQaFGhjs3Jf0G4LXsq9C8MdIE9Anx4Uva7fYqO5qwu+a/4dyKbNsyengeDcUkr zZFpIjrrKAuIC6dH+TRMb6Y+5fUDRB/XjUesnJAUqf2lCuNz5j8/Hsm56Nw3V9TonkUl VoggeDzTF9f0EhS4LbiBiURS2/DVafZC8vK5rVAfTk7CgFFg/Hp8D8wojOaEkMRlYbAf E51eL1gU4N8X7Sff3FpYMsgZ/Exs2L/sSEvCv5JmJdNjO4CUVyJ/7QyAZglb16qdw/zn HFYQ== X-Gm-Message-State: AJcUukez5voNeEnRyvba9G8S5S/cR0nrTPnu1S9u7mDtaToxYfSqwE+1 M3lD1Qecf1NlfsLN174SkF3RM+hw X-Google-Smtp-Source: ALg8bN7FFTb60kG1Iztzu6f/P9hzrZDo+Na4EzjV42ZqZwx8f3vX+kuo1lkPn+1q4j8dOTpOvgarSw== X-Received: by 2002:a63:ed03:: with SMTP id d3mr5163964pgi.275.1547581369913; Tue, 15 Jan 2019 11:42:49 -0800 (PST) Received: from fainelli-desktop.igp.broadcom.net ([192.19.223.250]) by smtp.gmail.com with ESMTPSA id 128sm6954262pfu.129.2019.01.15.11.42.48 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 15 Jan 2019 11:42:49 -0800 (PST) From: Florian Fainelli To: netdev@vger.kernel.org Cc: Florian Fainelli , andrew@lunn.ch, vivien.didelot@gmail.com, davem@davemloft.net, idosch@mellanox.com, jiri@mellanox.com, ilias.apalodimas@linaro.org, ivan.khoronzhuk@linaro.org, roopa@cumulusnetworks.com, nikolay@cumulusnetworks.com Subject: [RFC net-next 11/14] net: dsa: Make VLAN filtering use DSA notifiers Date: Tue, 15 Jan 2019 11:41:27 -0800 Message-Id: <20190115194130.19896-12-f.fainelli@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190115194130.19896-1-f.fainelli@gmail.com> References: <20190115194130.19896-1-f.fainelli@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org In preparation for allowing for global checks that would apply to the entire switch and not just on a per-port basis, make the VLAN filtering attribute follow other switchdev attributes/objects and make it use the DSA notifier infrastructure. Signed-off-by: Florian Fainelli --- net/dsa/dsa_priv.h | 11 ++++++++++- net/dsa/port.c | 17 +++++++---------- net/dsa/switch.c | 29 +++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 11 deletions(-) diff --git a/net/dsa/dsa_priv.h b/net/dsa/dsa_priv.h index 026a05774bf7..aad8acc70183 100644 --- a/net/dsa/dsa_priv.h +++ b/net/dsa/dsa_priv.h @@ -26,6 +26,7 @@ enum { DSA_NOTIFIER_MDB_DEL, DSA_NOTIFIER_VLAN_ADD, DSA_NOTIFIER_VLAN_DEL, + DSA_NOTIFIER_VLAN_FILTERING, }; /* DSA_NOTIFIER_AGEING_TIME */ @@ -57,7 +58,7 @@ struct dsa_notifier_mdb_info { int port; }; -/* DSA_NOTIFIER_VLAN_* */ +/* DSA_NOTIFIER_VLAN_{ADD,DEL} */ struct dsa_notifier_vlan_info { const struct switchdev_obj_port_vlan *vlan; struct switchdev_trans *trans; @@ -65,6 +66,14 @@ struct dsa_notifier_vlan_info { int port; }; +/* DSA_NOTIFIER_VLAN_FILTERING */ +struct dsa_notifier_vlan_filtering_info { + bool vlan_filtering; + struct switchdev_trans *trans; + int sw_index; + int port; +}; + struct dsa_slave_priv { /* Copy of CPU port xmit for faster access in slave transmit hot path */ struct sk_buff * (*xmit)(struct sk_buff *skb, diff --git a/net/dsa/port.c b/net/dsa/port.c index 185e85a4f5f0..d7b057d46460 100644 --- a/net/dsa/port.c +++ b/net/dsa/port.c @@ -146,17 +146,14 @@ void dsa_port_bridge_leave(struct dsa_port *dp, struct net_device *br) int dsa_port_vlan_filtering(struct dsa_port *dp, bool vlan_filtering, struct switchdev_trans *trans) { - struct dsa_switch *ds = dp->ds; - - /* bridge skips -EOPNOTSUPP, so skip the prepare phase */ - if (switchdev_trans_ph_prepare(trans)) - return 0; - - if (ds->ops->port_vlan_filtering) - return ds->ops->port_vlan_filtering(ds, dp->index, - vlan_filtering); + struct dsa_notifier_vlan_filtering_info info = { + .sw_index = dp->ds->index, + .port = dp->index, + .trans = trans, + .vlan_filtering = vlan_filtering, + }; - return 0; + return dsa_port_notify(dp, DSA_NOTIFIER_VLAN_FILTERING, &info); } int dsa_port_ageing_time(struct dsa_port *dp, clock_t ageing_clock, diff --git a/net/dsa/switch.c b/net/dsa/switch.c index 142b294d3446..831334dc5e79 100644 --- a/net/dsa/switch.c +++ b/net/dsa/switch.c @@ -235,6 +235,32 @@ static int dsa_switch_vlan_del(struct dsa_switch *ds, return 0; } +static int dsa_switch_vlan_filtering(struct dsa_switch *ds, + struct dsa_notifier_vlan_filtering_info *info) +{ + struct switchdev_trans *trans = info->trans; + bool vlan_filtering = info->vlan_filtering; + int port = info->port; + int err; + + /* bridge skips -EOPNOTSUPP, so skip the prepare phase */ + if (switchdev_trans_ph_prepare(trans)) + return 0; + + /* Build a mask of port members */ + bitmap_zero(ds->bitmap, ds->num_ports); + if (ds->index == info->sw_index) + set_bit(port, ds->bitmap); + + for_each_set_bit(port, ds->bitmap, ds->num_ports) { + err = ds->ops->port_vlan_filtering(ds, port, vlan_filtering); + if (err) + return err; + } + + return 0; +} + static int dsa_switch_event(struct notifier_block *nb, unsigned long event, void *info) { @@ -269,6 +295,9 @@ static int dsa_switch_event(struct notifier_block *nb, case DSA_NOTIFIER_VLAN_DEL: err = dsa_switch_vlan_del(ds, info); break; + case DSA_NOTIFIER_VLAN_FILTERING: + err = dsa_switch_vlan_filtering(ds, info); + break; default: err = -EOPNOTSUPP; break; From patchwork Tue Jan 15 19:41:28 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 1025394 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=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="Sj+nZAao"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43fLNH2vD7z9sBQ for ; Wed, 16 Jan 2019 06:42:55 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389469AbfAOTmx (ORCPT ); Tue, 15 Jan 2019 14:42:53 -0500 Received: from mail-pg1-f196.google.com ([209.85.215.196]:39756 "EHLO mail-pg1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389463AbfAOTmw (ORCPT ); Tue, 15 Jan 2019 14:42:52 -0500 Received: by mail-pg1-f196.google.com with SMTP id w6so1667954pgl.6 for ; Tue, 15 Jan 2019 11:42:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=RXV104XivffX/oUqKPlk/V803i3ijUs034q3KjO8D/o=; b=Sj+nZAaouBy5LKkeb5hHQ5g1An/H4KYJMFFcYf+VVdodfghPwfCk1+1EZlLO9BvAkZ b1whtOwaCMEjx3+f0rGOMwl3YqTvoTGN8i/pYGAWlg62d1CdMsaaU6gYzLkV4Vrc4yag oXDM63RAue9eeQ32E6OBakJy55gIJYoji2XUNfcTliLc2SnJUOBxgtFHmO09QUEYF+Jl bIxJu2+plCM5WBw29tdf3/+L/8ITg5zrJYzO+AacZOVUQdE8nW5q+qume36XrtDXdunN mGvvDSTfwF7l/PLrk+TTx0haOy0dMQIe7nchgsuksQ3wEV90zZn3JIGHgXrtwb201FNf Ma6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=RXV104XivffX/oUqKPlk/V803i3ijUs034q3KjO8D/o=; b=Jcc+tyzXtK0R8fSBQJ1ALrGnP82ICemcrqxwVB50ECKpXp/FPn2zHp9r+cvAs/cofy Qr2O31PSQtZHj3kuwbdtaTttqqVsQZu/B3arnZCxHKyw2et7XHdVnXj4EnketHEi0nEy aKRJRENdgqTHukzcGzHHFxSq9g71IREUY5+m7QQ/1F0muOJs1MClqUTIeqUuVJiIBTrP 5P6csQsCtQbfvNaROrKrr1NdxYKO2kpv2AKYVtIFvq1lqKgh12FtWfiMpantgKukh0Lp kHr1byYZU6eUmMZOl/xd9S2crQfzz1jEbJeDmn5IWcv5hJ2ABghRkcd4Y/BS7q0HlDl6 XTCQ== X-Gm-Message-State: AJcUukclF+8GNeB6ts92f7DNiUGqfnn59slpq0S7MXq061Sj1Cq4TdJU R1icnrGU+duqZzwtbPHYnR93lfTL X-Google-Smtp-Source: ALg8bN7taqlNu9c7DgHa+VGVBmxsPfaJLackzWKK60el5xLn47ri5JeG1iL4LB7NIQcYkA4n6XtOIA== X-Received: by 2002:a65:43c5:: with SMTP id n5mr5403123pgp.250.1547581371596; Tue, 15 Jan 2019 11:42:51 -0800 (PST) Received: from fainelli-desktop.igp.broadcom.net ([192.19.223.250]) by smtp.gmail.com with ESMTPSA id 128sm6954262pfu.129.2019.01.15.11.42.49 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 15 Jan 2019 11:42:50 -0800 (PST) From: Florian Fainelli To: netdev@vger.kernel.org Cc: Florian Fainelli , andrew@lunn.ch, vivien.didelot@gmail.com, davem@davemloft.net, idosch@mellanox.com, jiri@mellanox.com, ilias.apalodimas@linaro.org, ivan.khoronzhuk@linaro.org, roopa@cumulusnetworks.com, nikolay@cumulusnetworks.com Subject: [RFC net-next 12/14] net: dsa: Wire up multicast IGMP snooping attribute notification Date: Tue, 15 Jan 2019 11:41:28 -0800 Message-Id: <20190115194130.19896-13-f.fainelli@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190115194130.19896-1-f.fainelli@gmail.com> References: <20190115194130.19896-1-f.fainelli@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The bridge can at runtime be configured with or without IGMP snooping enabled but we were not processing the switchdev attribute that notifies about that toggle, do this now. Signed-off-by: Florian Fainelli --- include/net/dsa.h | 2 ++ net/dsa/dsa_priv.h | 11 +++++++++++ net/dsa/port.c | 13 +++++++++++++ net/dsa/slave.c | 4 ++++ net/dsa/switch.c | 28 ++++++++++++++++++++++++++++ 5 files changed, 58 insertions(+) diff --git a/include/net/dsa.h b/include/net/dsa.h index b3eefe8e18fd..11cd4db3bc9e 100644 --- a/include/net/dsa.h +++ b/include/net/dsa.h @@ -479,6 +479,8 @@ struct dsa_switch_ops { /* * Multicast database */ + int (*port_multicast_toggle)(struct dsa_switch *ds, int port, + bool mc_disabled); int (*port_mdb_prepare)(struct dsa_switch *ds, int port, const struct switchdev_obj_port_mdb *mdb); void (*port_mdb_add)(struct dsa_switch *ds, int port, diff --git a/net/dsa/dsa_priv.h b/net/dsa/dsa_priv.h index aad8acc70183..6f7ed2b3494f 100644 --- a/net/dsa/dsa_priv.h +++ b/net/dsa/dsa_priv.h @@ -27,6 +27,7 @@ enum { DSA_NOTIFIER_VLAN_ADD, DSA_NOTIFIER_VLAN_DEL, DSA_NOTIFIER_VLAN_FILTERING, + DSA_NOTIFIER_MC_DISABLED, }; /* DSA_NOTIFIER_AGEING_TIME */ @@ -74,6 +75,14 @@ struct dsa_notifier_vlan_filtering_info { int port; }; +/* DSA_NOTIFIER_MC_DISABLED */ +struct dsa_notifier_mc_disabled_info { + bool mc_disabled; + struct switchdev_trans *trans; + int sw_index; + int port; +}; + struct dsa_slave_priv { /* Copy of CPU port xmit for faster access in slave transmit hot path */ struct sk_buff * (*xmit)(struct sk_buff *skb, @@ -154,6 +163,8 @@ int dsa_port_enable(struct dsa_port *dp, struct phy_device *phy); void dsa_port_disable(struct dsa_port *dp, struct phy_device *phy); int dsa_port_bridge_join(struct dsa_port *dp, struct net_device *br); void dsa_port_bridge_leave(struct dsa_port *dp, struct net_device *br); +int dsa_port_multicast_toggle(struct dsa_port *dp, bool mc_disabled, + struct switchdev_trans *trans); int dsa_port_vlan_filtering(struct dsa_port *dp, bool vlan_filtering, struct switchdev_trans *trans); int dsa_port_ageing_time(struct dsa_port *dp, clock_t ageing_clock, diff --git a/net/dsa/port.c b/net/dsa/port.c index d7b057d46460..148458941b51 100644 --- a/net/dsa/port.c +++ b/net/dsa/port.c @@ -143,6 +143,19 @@ void dsa_port_bridge_leave(struct dsa_port *dp, struct net_device *br) dsa_port_set_state_now(dp, BR_STATE_FORWARDING); } +int dsa_port_multicast_toggle(struct dsa_port *dp, bool mc_disabled, + struct switchdev_trans *trans) +{ + struct dsa_notifier_mc_disabled_info info = { + .sw_index = dp->ds->index, + .port = dp->index, + .trans = trans, + .mc_disabled = mc_disabled, + }; + + return dsa_port_notify(dp, DSA_NOTIFIER_MC_DISABLED, &info); +} + int dsa_port_vlan_filtering(struct dsa_port *dp, bool vlan_filtering, struct switchdev_trans *trans) { diff --git a/net/dsa/slave.c b/net/dsa/slave.c index e266ef329583..acb7f1830e98 100644 --- a/net/dsa/slave.c +++ b/net/dsa/slave.c @@ -337,6 +337,10 @@ 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_BRIDGE_MC_DISABLED: + ret = dsa_port_multicast_toggle(dp, attr->u.mc_disabled, + trans); + break; default: ret = -EOPNOTSUPP; break; diff --git a/net/dsa/switch.c b/net/dsa/switch.c index 831334dc5e79..e095eb808434 100644 --- a/net/dsa/switch.c +++ b/net/dsa/switch.c @@ -261,6 +261,31 @@ static int dsa_switch_vlan_filtering(struct dsa_switch *ds, return 0; } +static int dsa_switch_mc_disabled(struct dsa_switch *ds, + struct dsa_notifier_mc_disabled_info *info) +{ + struct switchdev_trans *trans = info->trans; + bool mc_disabled = info->mc_disabled; + int port = info->port; + int err; + + if (switchdev_trans_ph_prepare(trans)) + return ds->ops->port_multicast_toggle ? 0 : -EOPNOTSUPP; + + /* Build a mask of port members */ + bitmap_zero(ds->bitmap, ds->num_ports); + if (ds->index == info->sw_index) + set_bit(port, ds->bitmap); + + for_each_set_bit(port, ds->bitmap, ds->num_ports) { + err = ds->ops->port_multicast_toggle(ds, port, mc_disabled); + if (err) + return err; + } + + return 0; +} + static int dsa_switch_event(struct notifier_block *nb, unsigned long event, void *info) { @@ -298,6 +323,9 @@ static int dsa_switch_event(struct notifier_block *nb, case DSA_NOTIFIER_VLAN_FILTERING: err = dsa_switch_vlan_filtering(ds, info); break; + case DSA_NOTIFIER_MC_DISABLED: + err = dsa_switch_mc_disabled(ds, info); + break; default: err = -EOPNOTSUPP; break; From patchwork Tue Jan 15 19:41:29 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 1025398 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=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="XKH8iFBD"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43fLNR04r4z9s9G for ; Wed, 16 Jan 2019 06:43:03 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389480AbfAOTnB (ORCPT ); Tue, 15 Jan 2019 14:43:01 -0500 Received: from mail-pg1-f195.google.com ([209.85.215.195]:38377 "EHLO mail-pg1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389463AbfAOTmz (ORCPT ); Tue, 15 Jan 2019 14:42:55 -0500 Received: by mail-pg1-f195.google.com with SMTP id g189so1669480pgc.5 for ; Tue, 15 Jan 2019 11:42:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=mdUnN5x3Vn8Yt72tUN0LMxO57uYgS0rR0UfsRiQw270=; b=XKH8iFBD2cPcExLayX/f2MWJTs0I+u5CcavfqBAsJry2/+l0Xx6gUl3KHbJSOIHsln XQQs78Po4TfOEczPso+VIb8BbAq6RMJDDCAOCoU9WHweyHAxFIwYXkxTcPoPbGd2u8Lj 87JiNJ7sOEo3dWJNnXs8R1imPa8UGD+po1ea7NYDqFkbuf1En+ta6rtVpa5UP+b6wKtG 0dxQSSRApmqTplhCjpwdNu0SwKGMi7Hdf77p4qHsekiVZYZUUhivDkOCgLVXoC58hNKp gyK6iroPYP06APivwx6K+TD759g+NSuOD+V2Ju82jEGiReA5scYRDRWhuzjtB4UMonnL Wguw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=mdUnN5x3Vn8Yt72tUN0LMxO57uYgS0rR0UfsRiQw270=; b=EBwW5Q5RZI/H+KdVw65tuUjNbqjazl34/6UULl+FHTovkDqzDn4z2rTYXzfLdaudPW CNP39g9+SJiZdpFgN/FN3baTqpUeJ9yR4YRCg3WRFXEy2yHROUIIvZ7G0da9ry8zQWcZ 0VYfpYNt+iVE8LYTsWP3SR2Q5l9a/qDoE4HzODQOmz/ELDalOn131i3WeFasHVb5dUoe 0rKPtDZC1vyEXwOLwnjBt1GoruUOmRLQZ1GkldUZaqyIsKmw31V6jMrHhUBPJle/ZK0N q11F1zC49lKR8ij3bBf19+89/+kj5rNu8/B0wzhFhHEf2IzcTEVLQRb3eZCSVdejCB+9 YTfQ== X-Gm-Message-State: AJcUukeoON9odegVlp7OsVxBwQVnZJIMPOD5X4Mr3oTa+y7jA4WkYpAt 8pzZTh9xINO9GNMBVl+i6SnT9w5w X-Google-Smtp-Source: ALg8bN68FwNwQ5kZ9NYx2aM+otO36WQPci2R52wqQFTPwR1tn0wGYHJAWTdIgaMiRPt9Buk0Qyyt8Q== X-Received: by 2002:a63:df13:: with SMTP id u19mr5302241pgg.294.1547581373302; Tue, 15 Jan 2019 11:42:53 -0800 (PST) Received: from fainelli-desktop.igp.broadcom.net ([192.19.223.250]) by smtp.gmail.com with ESMTPSA id 128sm6954262pfu.129.2019.01.15.11.42.51 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 15 Jan 2019 11:42:52 -0800 (PST) From: Florian Fainelli To: netdev@vger.kernel.org Cc: Florian Fainelli , andrew@lunn.ch, vivien.didelot@gmail.com, davem@davemloft.net, idosch@mellanox.com, jiri@mellanox.com, ilias.apalodimas@linaro.org, ivan.khoronzhuk@linaro.org, roopa@cumulusnetworks.com, nikolay@cumulusnetworks.com Subject: [RFC net-next 13/14] net: dsa: b53: Add support for toggling IGMP snooping Date: Tue, 15 Jan 2019 11:41:29 -0800 Message-Id: <20190115194130.19896-14-f.fainelli@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190115194130.19896-1-f.fainelli@gmail.com> References: <20190115194130.19896-1-f.fainelli@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Add the required configuration knobs to honor the turning off of IGMP snooping (typically through the bridge interface) which means that when IGMP snooping is off, we must be flooding mutlicast since we do not get any notifications about IGMP join/leave through the network stack running on the bridge. Signed-off-by: Florian Fainelli --- drivers/net/dsa/b53/b53_common.c | 30 ++++++++++++++++++++++++++++++ drivers/net/dsa/b53/b53_priv.h | 2 ++ 2 files changed, 32 insertions(+) diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c index 6c894ad4768a..2c9f6f6abdf3 100644 --- a/drivers/net/dsa/b53/b53_common.c +++ b/drivers/net/dsa/b53/b53_common.c @@ -1640,6 +1640,35 @@ int b53_fdb_dump(struct dsa_switch *ds, int port, } EXPORT_SYMBOL(b53_fdb_dump); +int b53_multicast_toggle(struct dsa_switch *ds, int port, + bool mc_disabled) +{ + struct b53_device *dev = ds->priv; + u16 mc_ctrl; + + if (is5325(dev) || is5365(dev)) + return -EOPNOTSUPP; + + /* Allow port to flood multicast */ + b53_read16(dev, B53_CTRL_PAGE, B53_MC_FLOOD_MASK, &mc_ctrl); + if (mc_disabled) + mc_ctrl |= BIT(port); + else + mc_ctrl &= ~BIT(port); + b53_write16(dev, B53_CTRL_PAGE, B53_MC_FLOOD_MASK, mc_ctrl); + + /* And flood IP multicast as well */ + b53_read16(dev, B53_CTRL_PAGE, B53_IPMC_FLOOD_MASK, &mc_ctrl); + if (mc_disabled) + mc_ctrl |= BIT(port); + else + mc_ctrl &= ~BIT(port); + b53_write16(dev, B53_CTRL_PAGE, B53_IPMC_FLOOD_MASK, mc_ctrl); + + return 0; +} +EXPORT_SYMBOL(b53_multicast_toggle); + int b53_mdb_prepare(struct dsa_switch *ds, int port, const struct switchdev_obj_port_mdb *mdb) { @@ -2025,6 +2054,7 @@ static const struct dsa_switch_ops b53_switch_ops = { .port_mirror_add = b53_mirror_add, .port_mirror_del = b53_mirror_del, .port_mdb_prepare = b53_mdb_prepare, + .port_multicast_toggle = b53_multicast_toggle, .port_mdb_add = b53_mdb_add, .port_mdb_del = b53_mdb_del, }; diff --git a/drivers/net/dsa/b53/b53_priv.h b/drivers/net/dsa/b53/b53_priv.h index 620638ff9338..cd259fb8b00e 100644 --- a/drivers/net/dsa/b53/b53_priv.h +++ b/drivers/net/dsa/b53/b53_priv.h @@ -350,6 +350,8 @@ int b53_fdb_del(struct dsa_switch *ds, int port, const unsigned char *addr, u16 vid); int b53_fdb_dump(struct dsa_switch *ds, int port, dsa_fdb_dump_cb_t *cb, void *data); +int b53_multicast_toggle(struct dsa_switch *ds, int port, + bool mc_disabled); int b53_mdb_prepare(struct dsa_switch *ds, int port, const struct switchdev_obj_port_mdb *mdb); void b53_mdb_add(struct dsa_switch *ds, int port, From patchwork Tue Jan 15 19:41:30 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 1025395 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=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="hUPJGi7R"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43fLNL3mXHz9s9G for ; Wed, 16 Jan 2019 06:42:58 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389477AbfAOTm5 (ORCPT ); Tue, 15 Jan 2019 14:42:57 -0500 Received: from mail-pf1-f195.google.com ([209.85.210.195]:39799 "EHLO mail-pf1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731791AbfAOTm4 (ORCPT ); Tue, 15 Jan 2019 14:42:56 -0500 Received: by mail-pf1-f195.google.com with SMTP id r136so1795775pfc.6 for ; Tue, 15 Jan 2019 11:42:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=2R8HBLoAeAE5bVNhHfGoDYJQh7I3z67q3Ap5PPfODug=; b=hUPJGi7RwmlDUHgEr9VhJwu84VbuENDPXsJNam4NKtK6WKhcvF/e800a4glWEf1EDA GtxtSDRFrmAFoKZBfmhHMHnqbgNnZ+EfOfLTTme11Afhn69ZsBsBpkZeJgqI8KhLN2Be HeOJQYydhhGQUjFJLuwAqdTKO6plNSNyVCtwFHM61qWnEnAeWaIiAP/v25obXFhf43s+ daT73+DW+CalTxC1uNIm4BPojiMiFJRKK6dWPODfIqqcWONYWxaw6+27lp8ybMxc1DJo jkAmElniN98s6TLUsOFVPD5mWLmECeB21sRnzdYS6vR+qr58ku5qtz08eskryDl9bzQJ 4Ayw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=2R8HBLoAeAE5bVNhHfGoDYJQh7I3z67q3Ap5PPfODug=; b=SpuRXlNwM7VNv95K7AAAMZyud+4Svg56vgIiwZa+7lj0u71kF+0da5Xx61BaDJG23J oOWzV26hcBUfnBdh521JI3zINYVfst2R3X9D0T+UKL6HPMO2fgqUf/mJB71dlTfecMMk /CItdDmHHyNirtpjGDalvJ2Li4q15TfHc4B/S8LRywbtwNxDC/IRREQyjdpfF5DnNV1J Ma39WYgkcWcgKJXcO9CQe3yH8HfWGG/vWKyrIx21VjUuMesDYto30pkBjREat5bgO7Mh y97r1rolHV0KVhaWl8pWx0Qk6ihVLZvkl8qgfb+JKan78mVfMu8IjPhTLhH0vYdEK0Vu 69rA== X-Gm-Message-State: AJcUukfSgsYVIRGAYmO9vrLeiyzjCa7gZTGm1TKlquKCBCrAEX/cokTD bMelczfBx/6HcGyWrmSPkpzsNoT/ X-Google-Smtp-Source: ALg8bN7RjvaL2H2s/i7Zvx+tu/1QjmDUK0R2UVOc4AQf7DC8syUq920m3Il+vEExnuYCvNMSmjR8zw== X-Received: by 2002:a65:6148:: with SMTP id o8mr5224094pgv.451.1547581375040; Tue, 15 Jan 2019 11:42:55 -0800 (PST) Received: from fainelli-desktop.igp.broadcom.net ([192.19.223.250]) by smtp.gmail.com with ESMTPSA id 128sm6954262pfu.129.2019.01.15.11.42.53 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 15 Jan 2019 11:42:54 -0800 (PST) From: Florian Fainelli To: netdev@vger.kernel.org Cc: Florian Fainelli , andrew@lunn.ch, vivien.didelot@gmail.com, davem@davemloft.net, idosch@mellanox.com, jiri@mellanox.com, ilias.apalodimas@linaro.org, ivan.khoronzhuk@linaro.org, roopa@cumulusnetworks.com, nikolay@cumulusnetworks.com Subject: [RFC net-next 14/14] net: dsa: bcm_sf2: Enable management mode Date: Tue, 15 Jan 2019 11:41:30 -0800 Message-Id: <20190115194130.19896-15-f.fainelli@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190115194130.19896-1-f.fainelli@gmail.com> References: <20190115194130.19896-1-f.fainelli@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Now that we have all the necessary plumbing in place to get notified when a multicast MAC address must be programmed, configure the switch to oeprate in managed mode and let the network stack learn about management traffic. Signed-off-by: Florian Fainelli --- drivers/net/dsa/b53/b53_common.c | 39 ++++++++++++++++++++-- drivers/net/dsa/b53/b53_priv.h | 1 + drivers/net/dsa/bcm_sf2.c | 56 +++++++++++++++++++++++--------- drivers/net/dsa/bcm_sf2_regs.h | 5 +++ 4 files changed, 84 insertions(+), 17 deletions(-) diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c index 2c9f6f6abdf3..37bc25107158 100644 --- a/drivers/net/dsa/b53/b53_common.c +++ b/drivers/net/dsa/b53/b53_common.c @@ -364,8 +364,6 @@ static void b53_enable_vlan(struct b53_device *dev, bool enable, b53_read8(dev, B53_VLAN_PAGE, B53_VLAN_CTRL5, &vc5); } - mgmt &= ~SM_SW_FWD_MODE; - if (enable) { vc0 |= VC0_VLAN_EN | VC0_VID_CHK_EN | VC0_VID_HASH_VID; vc1 |= VC1_RX_MCST_UNTAG_EN | VC1_RX_MCST_FWD_EN; @@ -490,6 +488,43 @@ static int b53_fast_age_vlan(struct b53_device *dev, u16 vid) return b53_flush_arl(dev, FAST_AGE_VLAN); } +void b53_port_learn_setup(struct dsa_switch *ds, int port) +{ + struct b53_device *dev = ds->priv; + u16 reg; + + /* Enable learning */ + b53_read16(dev, B53_CTRL_PAGE, B53_DIS_LEARN, ®); + reg &= ~BIT(port); + b53_write16(dev, B53_CTRL_PAGE, B53_DIS_LEARN, reg); + + /* Software learning control disabled */ + b53_read16(dev, B53_CTRL_PAGE, B53_SFT_LRN_CTRL, ®); + reg &= ~BIT(port); + b53_write16(dev, B53_CTRL_PAGE, B53_SFT_LRN_CTRL, reg); + + /* Configure IP multicast, allow Unicast ARL misses to be forwarded */ + b53_read16(dev, B53_CTRL_PAGE, B53_IP_MULTICAST_CTRL, ®); + reg |= B53_IPMC_FWD_EN | B53_UC_FWD_EN; + b53_write16(dev, B53_CTRL_PAGE, B53_IP_MULTICAST_CTRL, reg); + + /* Set port in Unicast lookup forward map */ + b53_read16(dev, B53_CTRL_PAGE, B53_UC_FLOOD_MASK, ®); + reg |= BIT(port); + b53_write16(dev, B53_CTRL_PAGE, B53_UC_FLOOD_MASK, reg); + + /* Do not set port in Multicast lookup forward map, learn */ + b53_read16(dev, B53_CTRL_PAGE, B53_MC_FLOOD_MASK, ®); + reg &= ~BIT(port); + b53_write16(dev, B53_CTRL_PAGE, B53_MC_FLOOD_MASK, reg); + + /* Do not set port in IP multicast lookup formward map, learn */ + b53_read16(dev, B53_CTRL_PAGE, B53_IPMC_FLOOD_MASK, ®); + reg &= ~BIT(port); + b53_write16(dev, B53_CTRL_PAGE, B53_IPMC_FLOOD_MASK, reg); +} +EXPORT_SYMBOL(b53_port_learn_setup); + void b53_imp_vlan_setup(struct dsa_switch *ds, int cpu_port) { struct b53_device *dev = ds->priv; diff --git a/drivers/net/dsa/b53/b53_priv.h b/drivers/net/dsa/b53/b53_priv.h index cd259fb8b00e..1806304c38cc 100644 --- a/drivers/net/dsa/b53/b53_priv.h +++ b/drivers/net/dsa/b53/b53_priv.h @@ -309,6 +309,7 @@ static inline int b53_switch_get_reset_gpio(struct b53_device *dev) #endif /* Exported functions towards other drivers */ +void b53_port_learn_setup(struct dsa_switch *ds, int port); void b53_imp_vlan_setup(struct dsa_switch *ds, int cpu_port); int b53_configure_vlan(struct dsa_switch *ds); void b53_get_strings(struct dsa_switch *ds, int port, u32 stringset, diff --git a/drivers/net/dsa/bcm_sf2.c b/drivers/net/dsa/bcm_sf2.c index aa4a1f5206f1..a2036c8a7fd1 100644 --- a/drivers/net/dsa/bcm_sf2.c +++ b/drivers/net/dsa/bcm_sf2.c @@ -51,19 +51,19 @@ static void bcm_sf2_imp_setup(struct dsa_switch *ds, int port) reg &= ~P_TXQ_PSM_VDD(port); core_writel(priv, reg, CORE_MEM_PSM_VDD_CTRL); - /* Enable Broadcast, Multicast, Unicast forwarding to IMP port */ - reg = core_readl(priv, CORE_IMP_CTL); - reg |= (RX_BCST_EN | RX_MCST_EN | RX_UCST_EN); - reg &= ~(RX_DIS | TX_DIS); - core_writel(priv, reg, CORE_IMP_CTL); + /* Enable forwarding and managed mode */ + core_writel(priv, SW_FWDG_EN | SW_FWDG_MODE, CORE_SWMODE); - /* Enable forwarding */ - core_writel(priv, SW_FWDG_EN, CORE_SWMODE); + /* Configure port for learning */ + b53_port_learn_setup(ds, port); - /* Enable IMP port in dumb mode */ - reg = core_readl(priv, CORE_SWITCH_CTRL); - reg |= MII_DUMB_FWDG_EN; - core_writel(priv, reg, CORE_SWITCH_CTRL); + /* Enable IGMP and MLD high-level protocol snooping support */ + reg = HL_PRTC_IGMP_RPTLVE_EN | HL_PRTC_IGMP_RPTVLE_FWD_MODE | + HL_PRTC_IGMP_QRY_EN | HL_PRTC_IGMP_QRY_FWD_MODE | + HL_PRTC_IGMP_UKN_EN | HL_PRTC_IGMP_UKN_FWD_MODE | + HL_PRTC_MLD_RPTDONE_EN | HL_PRTC_MLD_RPTDONE_FWD_MODE | + HL_PRTC_MLD_QRY_EN | HL_PRTC_MLD_QRY_FWD_MODE; + b53_write32(priv->dev, B53_MGMT_PAGE, B53_HL_PRTC_CTRL, reg); /* Configure Traffic Class to QoS mapping, allow each priority to map * to a different queue number @@ -75,10 +75,26 @@ static void bcm_sf2_imp_setup(struct dsa_switch *ds, int port) b53_brcm_hdr_setup(ds, port); + /* Set IMP0 or IMP1 port to be managed port, enable BPDU */ + reg = core_readl(priv, CORE_GMNCFGCFG); + reg &= ~(FRM_MGNP_MASK << FRM_MGNP_SHIFT); + if (port == core_readl(priv, CORE_IMP0_PRT_ID)) + reg |= FRM_MNGP_IMP0 << FRM_MGNP_SHIFT; + if (port == core_readl(priv, CORE_IMP1_PRT_ID)) + reg |= FRM_MGNP_IMP_DUAL << FRM_MGNP_SHIFT; + reg |= RXBPDU_EN; + core_writel(priv, reg, CORE_GMNCFGCFG); + /* Force link status for IMP port */ reg = core_readl(priv, offset); reg |= (MII_SW_OR | LINK_STS); core_writel(priv, reg, offset); + + /* Enable Broadcast, Unicast forwarding to IMP port */ + reg = core_readl(priv, CORE_IMP_CTL); + reg |= (RX_BCST_EN | RX_UCST_EN); + reg &= ~(RX_DIS | TX_DIS); + core_writel(priv, reg, CORE_IMP_CTL); } static void bcm_sf2_gphy_enable_set(struct dsa_switch *ds, bool enable) @@ -166,10 +182,8 @@ static int bcm_sf2_port_setup(struct dsa_switch *ds, int port, reg &= ~P_TXQ_PSM_VDD(port); core_writel(priv, reg, CORE_MEM_PSM_VDD_CTRL); - /* Enable learning */ - reg = core_readl(priv, CORE_DIS_LEARN); - reg &= ~BIT(port); - core_writel(priv, reg, CORE_DIS_LEARN); + /* Configure port for learning */ + b53_port_learn_setup(ds, port); /* Enable Broadcom tags for that port if requested */ if (priv->brcm_tag_mask & BIT(port)) @@ -684,6 +698,7 @@ static int bcm_sf2_sw_suspend(struct dsa_switch *ds) { struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds); unsigned int port; + u32 reg; bcm_sf2_intr_disable(priv); @@ -696,6 +711,13 @@ static int bcm_sf2_sw_suspend(struct dsa_switch *ds) bcm_sf2_port_disable(ds, port, NULL); } + /* Disable management mode since we won't be able to + * perform any tasks while being suspended. + */ + reg = core_readl(priv, CORE_SWMODE); + reg &= ~SW_FWDG_MODE; + core_writel(priv, reg, CORE_SWMODE); + return 0; } @@ -931,6 +953,10 @@ static const struct dsa_switch_ops bcm_sf2_ops = { .set_rxnfc = bcm_sf2_set_rxnfc, .port_mirror_add = b53_mirror_add, .port_mirror_del = b53_mirror_del, + .port_multicast_toggle = b53_multicast_toggle, + .port_mdb_prepare = b53_mdb_prepare, + .port_mdb_add = b53_mdb_add, + .port_mdb_del = b53_mdb_del, }; struct bcm_sf2_of_data { diff --git a/drivers/net/dsa/bcm_sf2_regs.h b/drivers/net/dsa/bcm_sf2_regs.h index 0a1e530d52b7..211db9a2e9e9 100644 --- a/drivers/net/dsa/bcm_sf2_regs.h +++ b/drivers/net/dsa/bcm_sf2_regs.h @@ -222,8 +222,13 @@ enum bcm_sf2_reg_offs { #define CORE_GMNCFGCFG 0x0800 #define RST_MIB_CNT (1 << 0) #define RXBPDU_EN (1 << 1) +#define FRM_MGNP_SHIFT 6 +#define FRM_MGNP_MASK 0x3 +#define FRM_MNGP_IMP0 2 +#define FRM_MGNP_IMP_DUAL 3 #define CORE_IMP0_PRT_ID 0x0804 +#define CORE_IMP1_PRT_ID 0x0808 #define CORE_RST_MIB_CNT_EN 0x0950