From patchwork Thu Mar 13 03:15:25 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Luis R. Rodriguez" X-Patchwork-Id: 329782 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 6F8712C00B1 for ; Thu, 13 Mar 2014 14:16:55 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753228AbaCMDPo (ORCPT ); Wed, 12 Mar 2014 23:15:44 -0400 Received: from mail-pb0-f45.google.com ([209.85.160.45]:54053 "EHLO mail-pb0-f45.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752715AbaCMDPl (ORCPT ); Wed, 12 Mar 2014 23:15:41 -0400 Received: by mail-pb0-f45.google.com with SMTP id uo5so454180pbc.4 for ; Wed, 12 Mar 2014 20:15:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=LfnyXO8vwF3G/lHNhMPAvRhkTh5VfiLGFcIQ8Iic3EM=; b=0d/MoyCzUPeHzfDoiMOInyGdVqu+6MFYvkbalU6vzfUo0SwDTazw8//oYM570VxJDH WBfvBaUVcc3czZ6e54JkWjB66Jx95JxWkAuD+WAxEBSj+p5fBFz5ylulclOvN3aLUeng vRZ2Xs/ZTZAnNLV2ZjKOW3HXIRcKVkJKdht8EZZ+l2cegDPpHGLI9FLMp5g+r0wcLRHU qgeVAhU48i81aDASw/oyxm3cfTyRK3g3XUc9Q6t+aSfUQ3C8yLDfNhdWvFER7uJJ6h6x NvL4040KGyzmdJ9ZROUZH4cGZWDCQNEP4Yf1VhLzux+6mqXc/53+j49dp1qBULu3q2Vc 89Ow== X-Received: by 10.68.132.130 with SMTP id ou2mr1237413pbb.107.1394680540907; Wed, 12 Mar 2014 20:15:40 -0700 (PDT) Received: from mcgrof@gmail.com (c-98-234-145-61.hsd1.ca.comcast.net. [98.234.145.61]) by mx.google.com with ESMTPSA id ix2sm1885243pbc.45.2014.03.12.20.15.37 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Wed, 12 Mar 2014 20:15:39 -0700 (PDT) Received: by mcgrof@gmail.com (sSMTP sendmail emulation); Wed, 12 Mar 2014 20:15:35 -0700 From: "Luis R. Rodriguez" To: netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org, xen-devel@lists.xenproject.org, mcgrof@suse.com, Stephen Hemminger , bridge@lists.linux-foundation.org Subject: [PATCH 1/3] bridge: preserve random init MAC address Date: Wed, 12 Mar 2014 20:15:25 -0700 Message-Id: <1394680527-28970-2-git-send-email-mcgrof@do-not-panic.com> X-Mailer: git-send-email 1.8.5.3 In-Reply-To: <1394680527-28970-1-git-send-email-mcgrof@do-not-panic.com> References: <1394680527-28970-1-git-send-email-mcgrof@do-not-panic.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: "Luis R. Rodriguez" As it is now if you add create a bridge it gets started with a random MAC address and if you then add a net_device as a slave but later kick it out you end up with a zero MAC address. Instead preserve the original random MAC address and use it. If you manually set the bridge address that will always be respected. This change only takes effect if at the time of computing the new root port we determine we have found no candidates. Cc: Stephen Hemminger Cc: bridge@lists.linux-foundation.org Cc: netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org Cc: xen-devel@lists.xenproject.org Cc: kvm@vger.kernel.org Signed-off-by: Luis R. Rodriguez --- net/bridge/br_device.c | 1 + net/bridge/br_private.h | 1 + net/bridge/br_stp_if.c | 3 +++ 3 files changed, 5 insertions(+) diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c index b063050..5f13eac 100644 --- a/net/bridge/br_device.c +++ b/net/bridge/br_device.c @@ -368,6 +368,7 @@ void br_dev_setup(struct net_device *dev) br->bridge_id.prio[1] = 0x00; ether_addr_copy(br->group_addr, eth_reserved_addr_base); + ether_addr_copy(br->random_init_addr, dev->dev_addr); br->stp_enabled = BR_NO_STP; br->group_fwd_mask = BR_GROUPFWD_DEFAULT; diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h index e1ca1dc..32a06da 100644 --- a/net/bridge/br_private.h +++ b/net/bridge/br_private.h @@ -240,6 +240,7 @@ struct net_bridge unsigned long bridge_hello_time; unsigned long bridge_forward_delay; + u8 random_init_addr[ETH_ALEN]; u8 group_addr[ETH_ALEN]; u16 root_port; diff --git a/net/bridge/br_stp_if.c b/net/bridge/br_stp_if.c index 189ba1e..4c9ad45 100644 --- a/net/bridge/br_stp_if.c +++ b/net/bridge/br_stp_if.c @@ -239,6 +239,9 @@ bool br_stp_recalculate_bridge_id(struct net_bridge *br) if (ether_addr_equal(br->bridge_id.addr, addr)) return false; /* no change */ + if (ether_addr_equal(addr, br_mac_zero)) + addr = br->random_init_addr; + br_stp_change_bridge_id(br, addr); return true; }