From patchwork Wed Jan 16 20:00:58 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 1026171 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="JC4FlgDc"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43fynn6g80z9sCh for ; Thu, 17 Jan 2019 07:03:41 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732266AbfAPUDk (ORCPT ); Wed, 16 Jan 2019 15:03:40 -0500 Received: from mail-yw1-f68.google.com ([209.85.161.68]:41729 "EHLO mail-yw1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732244AbfAPUDj (ORCPT ); Wed, 16 Jan 2019 15:03:39 -0500 Received: by mail-yw1-f68.google.com with SMTP id f65so2909914ywc.8 for ; Wed, 16 Jan 2019 12:03:39 -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=JC4FlgDcNoI3UMr1aBxvM5X8sE2bLc6VOvgAgGiq0dFyydN4GfFvxWoqnsMYerYFp5 Saa+D0ZfBwnpHYCsVhjRGUdGxbb6oJxIA7nVAlrNSFieTe+4Sx0SxfkBuPzy5OIBApWy i4mfiiWJ8i5dL0ta8yD8pJW+zlG9yQrkBUCtJ09a43Fk6cZVoSDgddwQfZ9jnFIFKoe0 a+hF/OYj8wXXc4CEh1TKnqPR9q4VOi+2URpGNPpIOgd9Jhe9pciq0y1LBtKhr6SaOJhG VL3Gs/x3tqTge6kELZsD1mthRYkpOlF0CbIerpRYbGOIJjzg29ZKxULUlXrM2s9Ykgsq usjw== 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=jF/FNzciJ4ZRCx/ty5jskZq1YlvfXbG3x0Rmm04AQt/cIWPInN2hlK2fM1VIMWWkDu aO/iaB26yBKVVzs2oJzpJGqKdbsPl8mIoZSMe3rk5b+bwQc1Gi1uGAM4I9K4i27tSvSq ztE2rYqED+oEC/lNUQBSK2hg24ngKF85mPKFKzugUnhAdKsP7ZMTFWZCurRBgpaWuPIv JFCdEi/PVr/b0PlgAQWk1WM5FqOfSBGWiE9bzDsWBkZFwKJ32XdxjuK+CrIKr0H2qlCH zmM+FsEHhI9Dvt0H5oaMAhSCssjWwfwr3ZSCQu2B17z6cUSCVfE9U2nT/Ir4+k0Cgi1x X/4w== X-Gm-Message-State: AJcUukdm/pouDEL5ybcbCPhS7eASKtllSKs2e+PzP1uNx3nAYDfKtdsb Gd3/OpMFaeLAxRb1i8BOQW0Ff8AF X-Google-Smtp-Source: ALg8bN514V8cflzZ6ZOts2lHLU7AJqGzxsyq4LYUPPxn9q8ztOOvk+11ULUvR8gtt1LenakhOGE9YQ== X-Received: by 2002:a0d:ccd6:: with SMTP id o205mr9313037ywd.339.1547669018310; Wed, 16 Jan 2019 12:03:38 -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.36 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 16 Jan 2019 12:03: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: [PATCH net-next 10/14] net: vlan: Propagate MC addresses with VID through switchdev Date: Wed, 16 Jan 2019 12:00:58 -0800 Message-Id: <20190116200102.2749-11-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 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); }