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); }