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,URIBL_BLOCKED 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 8B678C10F0E for ; Thu, 18 Apr 2019 11:45:30 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 5153F2183E for ; Thu, 18 Apr 2019 11:45:30 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=cumulusnetworks.com header.i=@cumulusnetworks.com header.b="enTuX73p" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388853AbfDRLp3 (ORCPT ); Thu, 18 Apr 2019 07:45:29 -0400 Received: from mail-wm1-f67.google.com ([209.85.128.67]:51684 "EHLO mail-wm1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727807AbfDRLp2 (ORCPT ); Thu, 18 Apr 2019 07:45:28 -0400 Received: by mail-wm1-f67.google.com with SMTP id 4so2424907wmf.1 for ; Thu, 18 Apr 2019 04:45:27 -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=0s7JxWjzOL0GGgkBSaa2IC3DtTMnxj0pbKr3CUzgkKI=; b=enTuX73p67K7XK3rDpxVj+TAhho5VVd03WxpvFHd/QtWyIdWynIAMFzF/YCqvG/+9O i4reQrUIYYEpOkNi9oJeLtBElXg41m7DtY5VU1JibuCJkXRzpNYQ1z/JcuqHQa3NC/x2 cwE19qqB6R/5wwbhaWfHUWF3XZngQqLshals8= 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=0s7JxWjzOL0GGgkBSaa2IC3DtTMnxj0pbKr3CUzgkKI=; b=OHEYCDJ2xnU4iKyMTWZ0BLpKETHt0jl0tUyNLkjzkKULgo7g4VhvT28XiC5+niMgB4 RqakHB3KWhtvvKgNUTJPokKPnAPDMoK4l6c3ecdgVOWgUzc7wwH1DzVTM01UBolzpZRu DK2F0zJEtnocn3/wIy3e9XNN8gRUjXUta99X5uLwZkqRTzUt5gJ73FjfSilBeg6JJTxo iNrHHthI6Y2VDMYUuMurjUgxk9fzihCCGPiYdgKznGGASNLJKiqBAPFXGZJwUtEUaWwI 5Rq1E2rApzBaoCXXaaVCSdFYU3aGrQRzHQDLR7wR6KTLEDuA963BPE4nOsTSIk4z/V7k 6Obg== X-Gm-Message-State: APjAAAWDzto710U6rZ8TD+xfzUaCZqr2MqT2Jv/1Vub57RUkt9IPUmWM gW5MiNK0e5c/s+z5YC+oavG3yQ== X-Google-Smtp-Source: APXvYqwh3aJBRL9pY5Z3Otnf8sSHVUokVaSin09ZfQXneiMUCHxS4v2ssfw90Bi6D6HujNiWiB3b4A== X-Received: by 2002:a7b:c767:: with SMTP id x7mr3000203wmk.6.1555587926429; Thu, 18 Apr 2019 04:45:26 -0700 (PDT) Received: from [192.168.51.243] ([93.152.141.58]) by smtp.gmail.com with ESMTPSA id z140sm2873104wmc.27.2019.04.18.04.45.25 (version=TLS1_3 cipher=AEAD-AES128-GCM-SHA256 bits=128/128); Thu, 18 Apr 2019 04:45:25 -0700 (PDT) Subject: Re: [PATCH net-next v2 5/5] bridge: update vlan dev link state for bridge netdev changes To: Mike Manning , netdev@vger.kernel.org, roopa@cumulusnetworks.com References: <20190417181629.5791-1-mmanning@vyatta.att-mail.com> <20190417181629.5791-6-mmanning@vyatta.att-mail.com> From: Nikolay Aleksandrov Message-ID: <4d1e2530-d87b-ba43-258b-bb8082846d55@cumulusnetworks.com> Date: Thu, 18 Apr 2019 14:45:24 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.6.1 MIME-Version: 1.0 In-Reply-To: <20190417181629.5791-6-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 17/04/2019 21:16, Mike Manning wrote: > If vlan bridge binding is enabled, then the link state of a vlan device > that is an upper device of the bridge tracks the state of bridge ports > that are members of that vlan. But this can only be done when the link > state of the bridge is up. If it is down, then the link state of the > vlan devices must also be down. This is to maintain existing behavior > for when STP is enabled and there are no live ports, in which case the > link state for the bridge and any vlan devices is down. > > Signed-off-by: Mike Manning > --- > net/bridge/br_vlan.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++--- > 1 file changed, 47 insertions(+), 3 deletions(-) > > diff --git a/net/bridge/br_vlan.c b/net/bridge/br_vlan.c > index 89146a5f0c23..2db63997f313 100644 > --- a/net/bridge/br_vlan.c > +++ b/net/bridge/br_vlan.c > @@ -1343,6 +1343,11 @@ static void br_vlan_set_vlan_dev_state(const struct net_bridge *br, > struct net_bridge_port *p; > bool has_carrier = false; > > + if (!netif_carrier_ok(br->dev)) { > + netif_carrier_off(vlan_dev); > + return; > + } > + > list_for_each_entry(p, &br->port_list, list) { > vg = nbp_vlan_group(p); > if (br_vlan_find(vg, vid) && br_vlan_is_dev_up(p->dev)) { > @@ -1367,10 +1372,12 @@ static void br_vlan_set_all_vlan_dev_state(struct net_bridge_port *p) > vlan_dev = br_vlan_get_upper_bind_vlan_dev(p->br->dev, > vlan->vid); > if (vlan_dev) { > - if (br_vlan_is_dev_up(p->dev)) > - netif_carrier_on(vlan_dev); > - else > + if (br_vlan_is_dev_up(p->dev)) { > + if (netif_carrier_ok(p->br->dev)) > + netif_carrier_on(vlan_dev); > + } else { > br_vlan_set_vlan_dev_state(p->br, vlan_dev); > + } > } > } > } > @@ -1393,6 +1400,34 @@ static void br_vlan_upper_change(struct net_device *dev, > } > } > > +struct br_vlan_link_state_walk_data { > + struct net_bridge *br; > +}; > + > +static int br_vlan_link_state_change_fn(struct net_device *vlan_dev, > + void *data_in) > +{ > + struct br_vlan_link_state_walk_data *data = data_in; > + > + if (br_vlan_is_bind_vlan_dev(vlan_dev)) > + br_vlan_set_vlan_dev_state(data->br, vlan_dev); > + > + return 0; > +} > + > +static void br_vlan_link_state_change(struct net_device *dev, > + struct net_bridge *br) > +{ > + struct br_vlan_link_state_walk_data data = { > + .br = br > + }; > + > + rcu_read_lock(); > + netdev_walk_all_upper_dev_rcu(dev, br_vlan_link_state_change_fn, > + &data); > + rcu_read_unlock(); > +} > + > /* Must be protected by RTNL. */ > static void nbp_vlan_set_vlan_dev_state(struct net_bridge_port *p, u16 vid) > { > @@ -1411,12 +1446,21 @@ void br_vlan_bridge_event(struct net_device *dev, unsigned long event, > void *ptr) > { > struct netdev_notifier_changeupper_info *info; > + struct net_bridge *br; > > switch (event) { > case NETDEV_CHANGEUPPER: > info = ptr; > br_vlan_upper_change(dev, info->upper_dev, info->linking); > break; > + > + case NETDEV_CHANGE: > + case NETDEV_UP: > + br = netdev_priv(dev); > + if (!br_opt_get(br, BROPT_VLAN_BRIDGE_BINDING)) > + return; > + br_vlan_link_state_change(dev, br); > + break; > } > } > > Acked-by: Nikolay Aleksandrov