From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.9 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C4548C43381 for ; Wed, 20 Feb 2019 23:35:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 9309C2146E for ; Wed, 20 Feb 2019 23:35:23 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ZiKUCU9M" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727023AbfBTXfW (ORCPT ); Wed, 20 Feb 2019 18:35:22 -0500 Received: from mail-pg1-f196.google.com ([209.85.215.196]:38935 "EHLO mail-pg1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725804AbfBTXfV (ORCPT ); Wed, 20 Feb 2019 18:35:21 -0500 Received: by mail-pg1-f196.google.com with SMTP id r11so12719216pgp.6 for ; Wed, 20 Feb 2019 15:35:21 -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=ziHTFzj4nx877WWyHG3Q3YW6nF1B64s5aBfjv/QQmes=; b=ZiKUCU9M6K5oDG9mT/YBNu4xKr8boKs/0oOfeuFWY2tZMd1cwoHn4E2ed3YFhNTh6q 1yjyixRGfijGnOitGe5RCGCwWoNWdHCa7NE5zV/U0cHwvt0eHPTrAozP9LVZlpE2of7L BHXfbjXbOBp1Z84xX6dYjIvu/LG12ub9skMTDkg/Y6e4DCQF6di3cPI71mXwhwMkY3bi dFr0qyPGpeUk5BYvLfM/7x3OT8rvCI4KJ/VHcU2bZpWGVV6dxNrbrEieK9bBI05Mp1fv 8RZXBN8IPX6Nrohv5xRavoRMOUr7aRPLbhVkhCHI63nAUo0nRhJnki3W6Y6JG59oUKuR kDog== 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=ziHTFzj4nx877WWyHG3Q3YW6nF1B64s5aBfjv/QQmes=; b=F/c/ynw78yfcC3dT77SJ+x1oadb7T56yytb/rU9h+mLuuQ/Nj3FBs0ZC4xyuZvYseb dLbgrAYvEUMnlSuVqOhFdGstdPW76TLAt5PecavLvVlWAOCRQ+v5S8p4qsYpVfPU3QcR sDu6KBTB4UyO6f5fNMnRCAwDy0fk4Egocgb7uNvarCsVG965QAuqKssxZ4TgiwqGiBKa f87Mt7bQv7la2X8RUcKs9N0tRD5uNvd3fdewIJnP/nt2mj7J6KvNY0jpdj+IW6gCdSWT tCbM6jght9kmLBoM89NyoGkRaEJ7H/YRl4b4xLY8/43LNvp19gQDidfo4umSx3e8FZ0m XtnQ== X-Gm-Message-State: AHQUAuY4PhdhEuYoxikwdHqQUa8IA0+06U9j0ZHpI36JSW6lH4f2zbwH ++sBHgc8j7daDoCxbFjhqmdduFWd X-Google-Smtp-Source: AHgI3IbkGKU5uVths+03G0gmqWRotZInsH8LRNwSoTBL0raTIasdBRSXvdS5A0+1RFYM1iot1X/FYg== X-Received: by 2002:a63:3446:: with SMTP id b67mr27786990pga.122.1550705720322; Wed, 20 Feb 2019 15:35:20 -0800 (PST) Received: from fainelli-desktop.igp.broadcom.net ([192.19.223.250]) by smtp.gmail.com with ESMTPSA id z67sm14716589pfi.152.2019.02.20.15.35.18 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 20 Feb 2019 15:35:19 -0800 (PST) From: Florian Fainelli To: netdev@vger.kernel.org Cc: Russell King , Florian Fainelli , andrew@lunn.ch, vivien.didelot@gmail.com, davem@davemloft.net, hkallweit1@gmail.com Subject: [PATCH net-next v5 1/3] net: dsa: add support for bridge flags Date: Wed, 20 Feb 2019 15:35:04 -0800 Message-Id: <20190220233506.22210-2-f.fainelli@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190220233506.22210-1-f.fainelli@gmail.com> References: <20190220233506.22210-1-f.fainelli@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Russell King The Linux bridge implementation allows various properties of the bridge to be controlled, such as flooding unknown unicast and multicast frames. This patch adds the necessary DSA infrastructure to allow the Linux bridge support to control these properties for DSA switches. Reviewed-by: Vivien Didelot Signed-off-by: Russell King [florian: Add missing dp and ds variables declaration to fix build] Signed-off-by: Florian Fainelli --- include/net/dsa.h | 2 ++ net/dsa/dsa_priv.h | 2 ++ net/dsa/port.c | 17 +++++++++++++++++ net/dsa/slave.c | 9 +++++++++ 4 files changed, 30 insertions(+) diff --git a/include/net/dsa.h b/include/net/dsa.h index 7f2a668ef2cc..2c2c10812814 100644 --- a/include/net/dsa.h +++ b/include/net/dsa.h @@ -400,6 +400,8 @@ struct dsa_switch_ops { void (*port_stp_state_set)(struct dsa_switch *ds, int port, u8 state); void (*port_fast_age)(struct dsa_switch *ds, int port); + int (*port_egress_floods)(struct dsa_switch *ds, int port, + bool unicast, bool multicast); /* * VLAN support diff --git a/net/dsa/dsa_priv.h b/net/dsa/dsa_priv.h index 1f4972dab9f2..f4f99ec29f5d 100644 --- a/net/dsa/dsa_priv.h +++ b/net/dsa/dsa_priv.h @@ -160,6 +160,8 @@ int dsa_port_mdb_add(const struct dsa_port *dp, struct switchdev_trans *trans); int dsa_port_mdb_del(const struct dsa_port *dp, const struct switchdev_obj_port_mdb *mdb); +int dsa_port_bridge_flags(const struct dsa_port *dp, unsigned long flags, + struct switchdev_trans *trans); int dsa_port_vlan_add(struct dsa_port *dp, const struct switchdev_obj_port_vlan *vlan, struct switchdev_trans *trans); diff --git a/net/dsa/port.c b/net/dsa/port.c index 2d7e01b23572..6df29bddf37e 100644 --- a/net/dsa/port.c +++ b/net/dsa/port.c @@ -177,6 +177,23 @@ int dsa_port_ageing_time(struct dsa_port *dp, clock_t ageing_clock, return dsa_port_notify(dp, DSA_NOTIFIER_AGEING_TIME, &info); } +int dsa_port_bridge_flags(const struct dsa_port *dp, unsigned long flags, + struct switchdev_trans *trans) +{ + struct dsa_switch *ds = dp->ds; + int port = dp->index; + int err = 0; + + if (switchdev_trans_ph_prepare(trans)) + return 0; + + if (ds->ops->port_egress_floods) + err = ds->ops->port_egress_floods(ds, port, flags & BR_FLOOD, + flags & BR_MCAST_FLOOD); + + return err; +} + int dsa_port_fdb_add(struct dsa_port *dp, const unsigned char *addr, u16 vid) { diff --git a/net/dsa/slave.c b/net/dsa/slave.c index 2e5e7c04821b..85dc68611002 100644 --- a/net/dsa/slave.c +++ b/net/dsa/slave.c @@ -295,6 +295,9 @@ static int dsa_slave_port_attr_set(struct net_device *dev, case SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME: ret = dsa_port_ageing_time(dp, attr->u.ageing_time, trans); break; + case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS: + ret = dsa_port_bridge_flags(dp, attr->u.brport_flags, trans); + break; default: ret = -EOPNOTSUPP; break; @@ -381,9 +384,15 @@ static int dsa_slave_get_port_parent_id(struct net_device *dev, static int dsa_slave_port_attr_get(struct net_device *dev, struct switchdev_attr *attr) { + struct dsa_port *dp = dsa_slave_to_port(dev); + struct dsa_switch *ds = dp->ds; + switch (attr->id) { case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS_SUPPORT: attr->u.brport_flags_support = 0; + if (ds->ops->port_egress_floods) + attr->u.brport_flags_support |= BR_FLOOD | + BR_MCAST_FLOOD; break; default: return -EOPNOTSUPP; -- 2.17.1