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=-9.1 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 5C31BC43387 for ; Wed, 16 Jan 2019 20:03:40 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 298E320866 for ; Wed, 16 Jan 2019 20:03:40 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="f79PY2RX" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731988AbfAPUDj (ORCPT ); Wed, 16 Jan 2019 15:03:39 -0500 Received: from mail-yw1-f66.google.com ([209.85.161.66]:44556 "EHLO mail-yw1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732213AbfAPUDh (ORCPT ); Wed, 16 Jan 2019 15:03:37 -0500 Received: by mail-yw1-f66.google.com with SMTP id b63so2900979ywc.11 for ; Wed, 16 Jan 2019 12:03: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=LDCpuwMTsExuN9AY2TbB7aHKA/vWaZhq13Goarr46z4=; b=f79PY2RXVHH7yHcXa3cXRx0DuXclit0MjIQ8P/TV+0eMkgxR5xPQNgTV+QBfmrGs3Z RJpaNhOaZu0tgQaS/fLDiGjPYJq9wqpWjWbqC7sI72g/viw0a6BzI5MxIzNAe4tt99eU lBmK37prqXUg7bQOVy8DE+Wl2MrujC9qIpRNwu9dPj9WRYGYIr/J/kwmejVlrLP2KIBt YlBYbs151Z4nwwL6yLFGflYQ9OIXz/Z5P4Ack7M53qYOoU7WMYfuBvsY9JFAXtEjKJ2O lZ8i6WJSqQCpTqW0J5bkt4pt85juTCX8YKzCTSBeph+bsawhYfFLJ8TBoSEhblV8hGhK 5kIA== 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=AWHAhdeTrdyocjHk8MuERN9r60hoJYSihVbRguB/YG6ALH6ftV+cCgoNUJ9FdvrZY1 q7uAb5IESt1+V7syneszyX5IzBd9GE48XfDk/kndF/YsswzsP9BYc4P/+hAZRHQWl5Kn thgq8nJHJrBpCpLDRbA1sACWv+uz+GtFtimM84brchgBQu4HBTefwsKrM4HGMGovnmRv pH398cxHc1VIaJvjpEjaha/RrcluSWwKxoXkOHuBL44jUb6t7EPa0/CWzNkOZGEX1jZE PEJDQlgFoX3iIeBwH73NQwiN3Sr11D7YbuBVTk//AXqPbZmXyy5hpEkgjwMZBck5EhDA c91w== X-Gm-Message-State: AJcUuke4A4ysDICRYix21WUkkm9KiMdN4m9moV+DNhz9jZ9zh7tykgVy 0Tf4CQHhBex7phvVtfKmRLPCEci1 X-Google-Smtp-Source: ALg8bN4Tus9j0TUHK71jjCwqT9C7mwn8nSTR4NQ1iGc16Riux/lyDGGuzpwbvspUkDtbaPJ7LMDm4Q== X-Received: by 2002:a81:4511:: with SMTP id s17mr9315913ywa.430.1547669016367; Wed, 16 Jan 2019 12:03:36 -0800 (PST) Received: from fainelli-desktop.igp.broadcom.net ([192.19.223.250]) by smtp.gmail.com with ESMTPSA id v128sm2475295ywf.44.2019.01.16.12.03.34 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 16 Jan 2019 12:03: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: [PATCH net-next 09/14] net: bridge: Propagate MC addresses with VID through switchdev Date: Wed, 16 Jan 2019 12:00:57 -0800 Message-Id: <20190116200102.2749-10-f.fainelli@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190116200102.2749-1-f.fainelli@gmail.com> References: <20190116200102.2749-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) -- 2.17.1