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=-7.1 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_PASS 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 85DC3C4360F for ; Tue, 2 Apr 2019 20:15:51 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 49B462070D for ; Tue, 2 Apr 2019 20:15:51 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=cumulusnetworks.com header.i=@cumulusnetworks.com header.b="Jn7n7ED8" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726078AbfDBUPu (ORCPT ); Tue, 2 Apr 2019 16:15:50 -0400 Received: from mail-wr1-f65.google.com ([209.85.221.65]:46627 "EHLO mail-wr1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725812AbfDBUPt (ORCPT ); Tue, 2 Apr 2019 16:15:49 -0400 Received: by mail-wr1-f65.google.com with SMTP id t17so5230263wrw.13 for ; Tue, 02 Apr 2019 13:15:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cumulusnetworks.com; s=google; h=subject:to:references:from:message-id:date:user-agent:mime-version :in-reply-to:content-language:content-transfer-encoding; bh=cl+ZJJ0PsyCYjELPC12oPTt1JEjk1Gt2xxYYQpizGOg=; b=Jn7n7ED8yp72xvZmMb+kAIIbvVWtXugTyETZp5ijvXdoq1Lv2L62LvEp/aVRidm0kb ++JZ6Y3n59JlNjs1J7P4Vt5QP9ogXOI7ji1ZbKIHRLrZITLFFZx/m0TsMSK0JAPYTPSP a1BT6UBLb705nlYmLny8gMbKtfjWswLInJu70= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=cl+ZJJ0PsyCYjELPC12oPTt1JEjk1Gt2xxYYQpizGOg=; b=tsrNchnCdZg8Kn76x0NIMU9RCCzmT2PXhIMZamGMm/lLFLW+UvYn88ro9r7C6YbSUm LcGo/2re7QaK8lkex7qNquZM34KivW3/8HoLQsTEDjShqVd/B1tYnFVHQnYm3TSiPUcG dz65//muDX3p9GeNqCOZctet01O5meP/WmGhaCJKoKRWEszvzPCG6F+rQR6tGHvMsVnc c6CiY/HMW3aUygfXQncUCDAUQfPQOAYDt73t0ZI46hOWxEE+uv9gRzvhZ0qPSVvkbAkf dxoF6pDtYJHprIZ1SsU4gGPaGH8ZG6RslT3RZ9rCXfyyblWYmfoh7uen3PgE5C4Pivk5 /MdA== X-Gm-Message-State: APjAAAW+LFvvc8w5BG9tss3tyOdp/41hzo8Ul36UNz7t8hqiOs3kjh5k zBp48wECa0hR1NsjtXutlt1AMuFugvKqIw== X-Google-Smtp-Source: APXvYqw0rWG78+wEPHN+WeRaJMuT5oz6FsWhL+ObAl3VNSriUF4qUF73gBosOOz7BvCV5/pmx4KUjA== X-Received: by 2002:adf:edcf:: with SMTP id v15mr15846921wro.20.1554236146931; Tue, 02 Apr 2019 13:15:46 -0700 (PDT) Received: from [192.168.0.107] (84-238-136-197.ip.btc-net.bg. [84.238.136.197]) by smtp.gmail.com with ESMTPSA id v190sm35704818wme.18.2019.04.02.13.15.45 (version=TLS1_3 cipher=AEAD-AES128-GCM-SHA256 bits=128/128); Tue, 02 Apr 2019 13:15:45 -0700 (PDT) Subject: Re: [PATCH net-next 2/4] vlan: do not transfer link state in vlan bridge binding mode To: Mike Manning , netdev@vger.kernel.org References: <20190402153543.6277-1-mmanning@vyatta.att-mail.com> <20190402153543.6277-3-mmanning@vyatta.att-mail.com> From: Nikolay Aleksandrov Message-ID: <358a0759-e2be-52e7-eabd-928c678cb06d@cumulusnetworks.com> Date: Tue, 2 Apr 2019 23:15:44 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.4.0 MIME-Version: 1.0 In-Reply-To: <20190402153543.6277-3-mmanning@vyatta.att-mail.com> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org On 02/04/2019 18:35, Mike Manning wrote: > In vlan bridge binding mode, the link state is no longer transferred > from the lower device. Instead it is set by the bridge module according > to the state of bridge ports that are members of the vlan. > > Signed-off-by: Mike Manning > --- > net/8021q/vlan.c | 18 ++++++++++++++---- > net/8021q/vlan_dev.c | 19 ++++++++++++------- > 2 files changed, 26 insertions(+), 11 deletions(-) > > diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c > index dc4411165e43..1f99678751df 100644 > --- a/net/8021q/vlan.c > +++ b/net/8021q/vlan.c > @@ -75,6 +75,14 @@ static int vlan_group_prealloc_vid(struct vlan_group *vg, > return 0; > } > > +static void vlan_stacked_transfer_operstate(const struct net_device *rootdev, > + struct net_device *dev, > + struct vlan_dev_priv *vlan) > +{ > + if (!(vlan->flags & VLAN_FLAG_BRIDGE_BINDING)) > + netif_stacked_transfer_operstate(rootdev, dev); > +} I think this may be problematic with STP since STP can set netif_carrier_off() to the bridge device even with up ports (but not forwarding) and it will not be propagated to the vlan > + > void unregister_vlan_dev(struct net_device *dev, struct list_head *head) > { > struct vlan_dev_priv *vlan = vlan_dev_priv(dev); > @@ -180,7 +188,7 @@ int register_vlan_dev(struct net_device *dev, struct netlink_ext_ack *extack) > /* Account for reference in struct vlan_dev_priv */ > dev_hold(real_dev); > > - netif_stacked_transfer_operstate(real_dev, dev); > + vlan_stacked_transfer_operstate(real_dev, dev, vlan); > linkwatch_fire_event(dev); /* _MUST_ call rfc2863_policy() */ > > /* So, got the sucker initialized, now lets place > @@ -399,7 +407,8 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event, > case NETDEV_CHANGE: > /* Propagate real device state to vlan devices */ > vlan_group_for_each_dev(grp, i, vlandev) > - netif_stacked_transfer_operstate(dev, vlandev); > + vlan_stacked_transfer_operstate(dev, vlandev, > + vlan_dev_priv(vlandev)); > break; > > case NETDEV_CHANGEADDR: > @@ -446,7 +455,8 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event, > dev_close_many(&close_list, false); > > list_for_each_entry_safe(vlandev, tmp, &close_list, close_list) { > - netif_stacked_transfer_operstate(dev, vlandev); > + vlan_stacked_transfer_operstate(dev, vlandev, > + vlan_dev_priv(vlandev)); > list_del_init(&vlandev->close_list); > } > list_del(&close_list); > @@ -463,7 +473,7 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event, > if (!(vlan->flags & VLAN_FLAG_LOOSE_BINDING)) > dev_change_flags(vlandev, flgs | IFF_UP, > extack); > - netif_stacked_transfer_operstate(dev, vlandev); > + vlan_stacked_transfer_operstate(dev, vlandev, vlan); > } > break; > > diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c > index 86b38bb87f9a..270df9f0dfea 100644 > --- a/net/8021q/vlan_dev.c > +++ b/net/8021q/vlan_dev.c > @@ -297,7 +297,8 @@ static int vlan_dev_open(struct net_device *dev) > if (vlan->flags & VLAN_FLAG_MVRP) > vlan_mvrp_request_join(dev); > > - if (netif_carrier_ok(real_dev)) > + if (netif_carrier_ok(real_dev) && > + !(vlan->flags & VLAN_FLAG_BRIDGE_BINDING)) > netif_carrier_on(dev); > return 0; > > @@ -327,7 +328,8 @@ static int vlan_dev_stop(struct net_device *dev) > if (!ether_addr_equal(dev->dev_addr, real_dev->dev_addr)) > dev_uc_del(real_dev, dev->dev_addr); > > - netif_carrier_off(dev); > + if (!(vlan->flags & VLAN_FLAG_BRIDGE_BINDING)) > + netif_carrier_off(dev); > return 0; > } > > @@ -549,7 +551,8 @@ static const struct net_device_ops vlan_netdev_ops; > > static int vlan_dev_init(struct net_device *dev) > { > - struct net_device *real_dev = vlan_dev_priv(dev)->real_dev; > + struct vlan_dev_priv *vlan = vlan_dev_priv(dev); > + struct net_device *real_dev = vlan->real_dev; > > netif_carrier_off(dev); > > @@ -560,6 +563,9 @@ static int vlan_dev_init(struct net_device *dev) > (1<<__LINK_STATE_DORMANT))) | > (1<<__LINK_STATE_PRESENT); > > + if (vlan->flags & VLAN_FLAG_BRIDGE_BINDING) > + dev->state |= (1 << __LINK_STATE_NOCARRIER); > + > dev->hw_features = NETIF_F_HW_CSUM | NETIF_F_SG | > NETIF_F_FRAGLIST | NETIF_F_GSO_SOFTWARE | > NETIF_F_GSO_ENCAP_ALL | > @@ -590,8 +596,7 @@ static int vlan_dev_init(struct net_device *dev) > #endif > > dev->needed_headroom = real_dev->needed_headroom; > - if (vlan_hw_offload_capable(real_dev->features, > - vlan_dev_priv(dev)->vlan_proto)) { > + if (vlan_hw_offload_capable(real_dev->features, vlan->vlan_proto)) { > dev->header_ops = &vlan_passthru_header_ops; > dev->hard_header_len = real_dev->hard_header_len; > } else { > @@ -605,8 +610,8 @@ static int vlan_dev_init(struct net_device *dev) > > vlan_dev_set_lockdep_class(dev, vlan_dev_get_lock_subclass(dev)); > > - vlan_dev_priv(dev)->vlan_pcpu_stats = netdev_alloc_pcpu_stats(struct vlan_pcpu_stats); > - if (!vlan_dev_priv(dev)->vlan_pcpu_stats) > + vlan->vlan_pcpu_stats = netdev_alloc_pcpu_stats(struct vlan_pcpu_stats); > + if (!vlan->vlan_pcpu_stats) > return -ENOMEM; > > return 0; >