From patchwork Sat Dec 29 04:15:22 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: stephen hemminger X-Patchwork-Id: 208620 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id DC9C02C0085 for ; Sat, 29 Dec 2012 15:36:59 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751474Ab2L2Eg5 (ORCPT ); Fri, 28 Dec 2012 23:36:57 -0500 Received: from mail.vyatta.com ([76.74.103.46]:33780 "EHLO mail.vyatta.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751142Ab2L2Eg4 (ORCPT ); Fri, 28 Dec 2012 23:36:56 -0500 Received: from localhost (localhost.localdomain [127.0.0.1]) by mail.vyatta.com (Postfix) with ESMTP id AC9AE14102C9; Fri, 28 Dec 2012 20:36:55 -0800 (PST) X-Virus-Scanned: amavisd-new at tahiti.vyatta.com Received: from mail.vyatta.com ([127.0.0.1]) by localhost (mail.vyatta.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 6l1X2mpU7Vth; Fri, 28 Dec 2012 20:36:54 -0800 (PST) Received: from nehalam.linuxnetplumber.net (static-50-53-80-93.bvtn.or.frontiernet.net [50.53.80.93]) by mail.vyatta.com (Postfix) with ESMTPSA id 8558714102C8; Fri, 28 Dec 2012 20:36:54 -0800 (PST) Date: Fri, 28 Dec 2012 20:15:22 -0800 From: Stephen Hemminger To: David Miller Cc: netdev@vger.kernel.org Subject: [PATCHv2 net-next] bridge: respect RFC2863 operational state Message-ID: <20121228201522.62a48370@nehalam.linuxnetplumber.net> In-Reply-To: <20121228.152754.707370216340290808.davem@davemloft.net> References: <20121227222854.6ec132dd@nehalam.linuxnetplumber.net> <20121228.152754.707370216340290808.davem@davemloft.net> Organization: Vyatta Mime-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The bridge link detection should follow the operational state of the lower device, rather than the carrier bit. This allows devices like tunnels that are controlled by userspace control plane to work with bridge STP link management. Signed-off-by: Stephen Hemminger Reviewed-by: Flavio Leitner --- v2 - add more places and fix typo net/bridge/br_if.c | 6 +++--- net/bridge/br_netlink.c | 5 ++++- net/bridge/br_notify.c | 2 +- net/bridge/br_stp_if.c | 2 +- 4 files changed, 9 insertions(+), 6 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html --- a/net/bridge/br_if.c 2012-12-27 22:30:53.634796003 -0800 +++ b/net/bridge/br_if.c 2012-12-28 19:54:14.198973683 -0800 @@ -66,14 +66,14 @@ void br_port_carrier_check(struct net_br struct net_device *dev = p->dev; struct net_bridge *br = p->br; - if (netif_running(dev) && netif_carrier_ok(dev)) + if (netif_running(dev) && netif_oper_up(dev)) p->path_cost = port_cost(dev); if (!netif_running(br->dev)) return; spin_lock_bh(&br->lock); - if (netif_running(dev) && netif_carrier_ok(dev)) { + if (netif_running(dev) && netif_oper_up(dev)) { if (p->state == BR_STATE_DISABLED) br_stp_enable_port(p); } else { @@ -383,7 +383,7 @@ int br_add_if(struct net_bridge *br, str spin_lock_bh(&br->lock); changed_addr = br_stp_recalculate_bridge_id(br); - if ((dev->flags & IFF_UP) && netif_carrier_ok(dev) && + if (netif_running(dev) && netif_oper_up(dev) && (br->dev->flags & IFF_UP)) br_stp_enable_port(p); spin_unlock_bh(&br->lock); --- a/net/bridge/br_notify.c 2012-12-27 22:30:23.547098173 -0800 +++ b/net/bridge/br_notify.c 2012-12-28 19:47:57.022761664 -0800 @@ -82,7 +82,7 @@ static int br_device_event(struct notifi break; case NETDEV_UP: - if (netif_carrier_ok(dev) && (br->dev->flags & IFF_UP)) { + if (netif_running(br->dev) && netif_oper_up(dev)) { spin_lock_bh(&br->lock); br_stp_enable_port(p); spin_unlock_bh(&br->lock); --- a/net/bridge/br_netlink.c 2012-12-27 11:36:34.813072288 -0800 +++ b/net/bridge/br_netlink.c 2012-12-28 19:52:24.180078602 -0800 @@ -181,8 +181,11 @@ static int br_set_port_state(struct net_ if (p->br->stp_enabled == BR_KERNEL_STP) return -EBUSY; + /* if device is not up, change is not allowed + * if link is not present, only allowable state is disabled + */ if (!netif_running(p->dev) || - (!netif_carrier_ok(p->dev) && state != BR_STATE_DISABLED)) + (!netif_oper_up(p->dev) && state != BR_STATE_DISABLED)) return -ENETDOWN; p->state = state; --- a/net/bridge/br_stp_if.c 2012-10-29 09:07:36.618530493 -0700 +++ b/net/bridge/br_stp_if.c 2012-12-28 19:53:37.207345191 -0800 @@ -54,7 +54,7 @@ void br_stp_enable_bridge(struct net_bri br_config_bpdu_generation(br); list_for_each_entry(p, &br->port_list, list) { - if ((p->dev->flags & IFF_UP) && netif_carrier_ok(p->dev)) + if (netif_running(p->dev) && netif_oper_up(p->dev)) br_stp_enable_port(p); }