Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp7515345imu; Mon, 3 Dec 2018 14:18:05 -0800 (PST) X-Google-Smtp-Source: AFSGD/Vkp8NOXgOyugupcU+HugywHraagRwNWTiVQOTl3FNWFuYmMFhlZYnvmBO6U48wKPrWaFJi X-Received: by 2002:a17:902:8c98:: with SMTP id t24mr17608295plo.130.1543875485635; Mon, 03 Dec 2018 14:18:05 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1543875485; cv=none; d=google.com; s=arc-20160816; b=FzKoWwKw9bv9FAEmF9L5C5TiJsQB7MsBp4g7u/d1zN6U4HhMiRoYLFc974liWaM8wQ /P/ODTTKRH+30ILSurxtpxrWJrxoL2hRE4tzMIJ1P+KWqtI9X8li9lstl06zM2Q845Q8 gSTAp78v0FSJs4NTLoMBhstReuwSzel8HZ8xAQ3gerq332oOOpqWrx3kKL9kf/i7KneV lRkp3ya58KG6mHufUlDADZ7ySZ3x5SPQZXrdoPvV8xCoCdkHou2Jdd3WbadkYd335Ulm xmJTQodDoRaKpn9kdNrDLX/NYzo+YpL8T9kF3jKiskld7iGP6fSH/daamTkJy/BEpGWS P59w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:autocrypt:openpgp:from:references:cc:to:subject :dkim-signature; bh=1wJ8A492wBUTcjwFZiNUwmppYHBpsX6n7kYL1QBkhrY=; b=LtrC044tHBEEXRJbOqrm7WyXofAEpkXSLANyYcQ9/mQNAURx2+X1/kmFrW6Gw6cgfx LsQs/7XKJyoT115O2cV6z4JZSBYGWgUBtPqCVzwNgfI4fdVO2TZOQmjk+T3o1zuio6aS vLlpr/Q2NDYxOuRfBJrkojB223gy68H1qm+Yt1na5CUPYw042O5uP3f8ll5DV9k/k1xg TFSUqDDnUsO+NC8PwhHhD22vEzFwLQS1kvdwN953br5PeH4l3yvFWRa/3g97IIS1s8ec Pk1gOMJ4CvfkRbjD118VV+jeFLjD02w+v5Hw7E+aZd/tFBpwUYLHZFbQR50CYUZPM7/B upXQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=k0fD4zo2; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id q8si13571386plr.382.2018.12.03.14.17.50; Mon, 03 Dec 2018 14:18:05 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=k0fD4zo2; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726029AbeLCWRK (ORCPT + 99 others); Mon, 3 Dec 2018 17:17:10 -0500 Received: from mail-yw1-f65.google.com ([209.85.161.65]:39803 "EHLO mail-yw1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725848AbeLCWRJ (ORCPT ); Mon, 3 Dec 2018 17:17:09 -0500 Received: by mail-yw1-f65.google.com with SMTP id j6so6094772ywj.6; Mon, 03 Dec 2018 14:17:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:cc:references:from:openpgp:autocrypt:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=1wJ8A492wBUTcjwFZiNUwmppYHBpsX6n7kYL1QBkhrY=; b=k0fD4zo2FZOetspWwoyFlnWo3WNnOwJ2bg7dD+ZGNckUzx+wTOISrKWBknZaI4vWWL DqmCVaIxroyXb6eTMZM32H2kmkOvzLTuS7JffT8+ZybGhkmmCwKB7hQLK9uOFRkJZ+0F avrAA6GmliNL8AqucJYi9ZuKT4/RlrK231BxwcAsjdrj+TB1p8ABiCBjQ6emRWyXcQO7 eVmw37VwxOH8tJvzhg28Ne8ICS7vSm8IZzmBNunid8EWLWMrZnOKcJpLZ7h+bjfxlOCn MjV+MkZWW8nmwfmPt1/R0Y8ikezLI9A3iqjtf3vX/pzReg7ROg7MHB0mAsZhwb/dPgP9 9Akg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:openpgp:autocrypt :message-id:date:user-agent:mime-version:in-reply-to :content-language:content-transfer-encoding; bh=1wJ8A492wBUTcjwFZiNUwmppYHBpsX6n7kYL1QBkhrY=; b=cxCDEB5KPB7D3lEfP8K8dXbF/Wg2cFB8OqWAHGsLIQnnE2DByHv6pdslMWPp2/zdwf EN1/CH6/mPr1hcxuxBo9m7kgGqUoHTv6EOiyXPngpJaB1vwTAjIQVV1dzHY7FiQtgcwg BRiOCmIzXUSSWah6b1d9ISnMpvA43PaM/Bi9WIecz237xvgE+ATF5ddDwQJqi5esBJ68 SXENC0CJkbGzvJXGG+o6LExRJEi4zpX7Uih5ut3kLMOjDHC+0EjlrmPixcbQzB5qww5P VppJZ3NLlWeLNKjY2CSXEBn2GMSWFcqCZwujXoPRkyIW5hepu2ExdI928+7oD0t6ioJp yyJQ== X-Gm-Message-State: AA+aEWZ0HfVdP088AJo/PRYnqmjxCjgtpnTLTZoiYxSsQGO7e41irOqA 7xQYuwFlfHVzutYhYRzYZYk= X-Received: by 2002:a81:4501:: with SMTP id s1mr17801592ywa.41.1543875428054; Mon, 03 Dec 2018 14:17:08 -0800 (PST) Received: from [10.67.49.9] (igp-prod-emp-gw.vpn.broadcom.com. [192.19.223.250]) by smtp.googlemail.com with ESMTPSA id l9sm5164657ywc.81.2018.12.03.14.17.06 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 03 Dec 2018 14:17:07 -0800 (PST) Subject: Re: [RFC PATCH net-next 2/5] net: 8021q: vlan_dev: add vid tag for uc and mc address lists To: Ivan Khoronzhuk , davem@davemloft.net, grygorii.strashko@ti.com Cc: linux-omap@vger.kernel.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, jiri@mellanox.com, andrew@lunn.ch References: <20181203184023.3430-1-ivan.khoronzhuk@linaro.org> <20181203184023.3430-3-ivan.khoronzhuk@linaro.org> From: Florian Fainelli Openpgp: preference=signencrypt Autocrypt: addr=f.fainelli@gmail.com; prefer-encrypt=mutual; keydata= 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 HGuUuzv+GKZ6nsysJw== Message-ID: Date: Mon, 3 Dec 2018 14:17:00 -0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.2.1 MIME-Version: 1.0 In-Reply-To: <20181203184023.3430-3-ivan.khoronzhuk@linaro.org> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 12/3/18 10:40 AM, Ivan Khoronzhuk wrote: > Update vlan mc and uc addresses with VID tag while propagating address > set to lower devices, do this only if address is not synched. It allows > on end driver level to distinguish address belonging to vlans. Underlying driver for the real device would be able to properly identify that you are attempting to add an address to a virtual device, which happens to be of VLAN kind so I am really not sure this is the right approach here. From there, it seems to me that we have two situations: - each of your network devices expose VLAN devices directly on top of the real device, in which case your driver should support ndo_vlan_rx_add_vid and ndo_vlan_rx_kill_vid to know when VLAN devices are create and maintain a VLAN device to VID correspondence if it needs to when being called while setting the addresses - you are setting up a bridge that is VLAN aware on one of your bridge ports, and there you can use switchdev to learn about such events and know about both addresses as well as VIDs that must be programmed into your real device It seems to me that what you need may be something like either: - notifications on slave devices when addresses are added via ndo_set_rxmode() or - dev_{uc,mc}_sync() should be augmented with a "source net_device" argument which allows you to differentiate which network device is the source of the address programming. That way, no need to "hash" the MAC address with a VID, any network device specific information can be provided and in the real device driver you can do: if (netif_is_vlan()... etc.) Hopefully someone else will chime in. > > Signed-off-by: Ivan Khoronzhuk > --- > include/linux/if_vlan.h | 1 + > net/8021q/vlan_core.c | 10 ++++++++++ > net/8021q/vlan_dev.c | 26 ++++++++++++++++++++++++++ > 3 files changed, 37 insertions(+) > > diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h > index 4cca4da7a6de..94657f3c483a 100644 > --- a/include/linux/if_vlan.h > +++ b/include/linux/if_vlan.h > @@ -136,6 +136,7 @@ extern struct net_device *__vlan_find_dev_deep_rcu(struct net_device *real_dev, > extern int vlan_for_each(struct net_device *dev, > int (*action)(struct net_device *dev, int vid, > void *arg), void *arg); > +extern u16 vlan_dev_get_addr_vid(struct net_device *dev, const u8 *addr); > extern struct net_device *vlan_dev_real_dev(const struct net_device *dev); > extern u16 vlan_dev_vlan_id(const struct net_device *dev); > extern __be16 vlan_dev_vlan_proto(const struct net_device *dev); > diff --git a/net/8021q/vlan_core.c b/net/8021q/vlan_core.c > index a313165e7a67..5d17947d6988 100644 > --- a/net/8021q/vlan_core.c > +++ b/net/8021q/vlan_core.c > @@ -454,6 +454,16 @@ bool vlan_uses_dev(const struct net_device *dev) > } > EXPORT_SYMBOL(vlan_uses_dev); > > +u16 vlan_dev_get_addr_vid(struct net_device *dev, const u8 *addr) > +{ > + u16 vid = 0; > + > + vid = addr[dev->addr_len]; > + vid |= (addr[dev->addr_len + 1] & 0xf) << 8; > + return vid; > +} > +EXPORT_SYMBOL(vlan_dev_get_addr_vid); > + > static struct sk_buff *vlan_gro_receive(struct list_head *head, > struct sk_buff *skb) > { > diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c > index b2d9c8f27cd7..c05b313314b7 100644 > --- a/net/8021q/vlan_dev.c > +++ b/net/8021q/vlan_dev.c > @@ -250,6 +250,14 @@ void vlan_dev_get_realdev_name(const struct net_device *dev, char *result) > strncpy(result, vlan_dev_priv(dev)->real_dev->name, 23); > } > > +static void vlan_dev_set_addr_vid(struct net_device *vlan_dev, u8 *addr) > +{ > + u16 vid = vlan_dev_vlan_id(vlan_dev); > + > + addr[vlan_dev->addr_len] = vid & 0xff; > + addr[vlan_dev->addr_len + 1] = (vid >> 8) & 0xf; > +} > + > bool vlan_dev_inherit_address(struct net_device *dev, > struct net_device *real_dev) > { > @@ -481,8 +489,26 @@ static void vlan_dev_change_rx_flags(struct net_device *dev, int change) > } > } > > +static void vlan_dev_align_addr_vid(struct net_device *vlan_dev) > +{ > + struct net_device *real_dev = vlan_dev_real_dev(vlan_dev); > + struct netdev_hw_addr *ha; > + > + if (!real_dev->vid_len) > + return; > + > + netdev_for_each_mc_addr(ha, vlan_dev) > + if (!ha->sync_cnt) > + vlan_dev_set_addr_vid(vlan_dev, ha->addr); > + > + netdev_for_each_uc_addr(ha, vlan_dev) > + if (!ha->sync_cnt) > + vlan_dev_set_addr_vid(vlan_dev, ha->addr); > +} > + > static void vlan_dev_set_rx_mode(struct net_device *vlan_dev) > { > + vlan_dev_align_addr_vid(vlan_dev); > dev_mc_sync(vlan_dev_priv(vlan_dev)->real_dev, vlan_dev); > dev_uc_sync(vlan_dev_priv(vlan_dev)->real_dev, vlan_dev); > } > -- Florian