From owner-freebsd-bugs@FreeBSD.ORG Mon Aug 29 23:00:20 2011 Return-Path: Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 663601065673 for ; Mon, 29 Aug 2011 23:00:20 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id 2D6ED8FC13 for ; Mon, 29 Aug 2011 23:00:20 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.4/8.14.4) with ESMTP id p7TN0K2B046686 for ; Mon, 29 Aug 2011 23:00:20 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.4/8.14.4/Submit) id p7TN0KYX046685; Mon, 29 Aug 2011 23:00:20 GMT (envelope-from gnats) Resent-Date: Mon, 29 Aug 2011 23:00:20 GMT Resent-Message-Id: <201108292300.p7TN0KYX046685@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, "Matthew N. Dodd" Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E0D68106566C for ; Mon, 29 Aug 2011 22:59:23 +0000 (UTC) (envelope-from mdodd@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id B72F68FC18 for ; Mon, 29 Aug 2011 22:59:23 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.4/8.14.4) with ESMTP id p7TMxNf2046542 for ; Mon, 29 Aug 2011 22:59:23 GMT (envelope-from mdodd@freefall.freebsd.org) Received: (from mdodd@localhost) by freefall.freebsd.org (8.14.4/8.14.4/Submit) id p7TMxN0n046541; Mon, 29 Aug 2011 22:59:23 GMT (envelope-from mdodd) Message-Id: <201108292259.p7TMxN0n046541@freefall.freebsd.org> Date: Mon, 29 Aug 2011 22:59:23 GMT From: "Matthew N. Dodd" To: FreeBSD-gnats-submit@FreeBSD.org X-Send-Pr-Version: 3.113 Cc: Subject: kern/160300: bridge(4) should attempt to use a static MAC address. X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: "Matthew N. Dodd" List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 29 Aug 2011 23:00:20 -0000 >Number: 160300 >Category: kern >Synopsis: bridge(4) should attempt to use a static MAC address. >Confidential: no >Severity: non-critical >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Mon Aug 29 23:00:19 UTC 2011 >Closed-Date: >Last-Modified: >Originator: >Release: >Organization: >Environment: System: FreeBSD neo-sasami.jurai.net 8.2-STABLE FreeBSD 8.2-STABLE #5 r224868M: Mon Aug 15 21:36:11 EDT 2011 root@neo-sasami.jurai.net:/vol/raid/svn/stable8/sys/i386/compile/DL380G3 i386 Description: bridge(4) uses a random number function to generate it's MAC address. This causes issues with IPv6. >Description: Submitter-Id: current-users Originator: Matthew N. Dodd Release: FreeBSD 8.2-STABLE i386 >How-To-Repeat: >Fix: Use the Hostid and interface unit number to generate a MAC address and fall-back to the random number generator on conflict. Index: if_bridge.c =================================================================== --- if_bridge.c (revision 224868) +++ if_bridge.c (working copy) @@ -85,6 +85,7 @@ #include #include #include +#include #include #include /* for net/if.h */ #include @@ -560,7 +561,7 @@ { struct bridge_softc *sc, *sc2; struct ifnet *bifp, *ifp; - int retry; + int fb, retry; sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK|M_ZERO); ifp = sc->sc_ifp = if_alloc(IFT_ETHER); @@ -600,10 +601,24 @@ * possible that we might have address collisions, so make sure that * this hardware address isn't already in use on another bridge. */ + fb = 0; for (retry = 1; retry != 0;) { - arc4rand(sc->sc_defaddr, ETHER_ADDR_LEN, 1); - sc->sc_defaddr[0] &= ~1; /* clear multicast bit */ - sc->sc_defaddr[0] |= 2; /* set the LAA bit */ + if (fb) { + arc4rand(sc->sc_defaddr, ETHER_ADDR_LEN, 1); + sc->sc_defaddr[0] &= ~1;/* clear multicast bit */ + sc->sc_defaddr[0] |= 2; /* set the LAA bit */ + } else { + unsigned long hostid; + getcredhostid(curthread->td_ucred, &hostid); + sc->sc_defaddr[0] = 0x2; + sc->sc_defaddr[1] = (hostid >> 24) & 0xff; + sc->sc_defaddr[2] = (hostid >> 16) & 0xff; + sc->sc_defaddr[3] = (hostid >> 8 ) & 0xff; + sc->sc_defaddr[4] = hostid & 0xff; + sc->sc_defaddr[5] = ifp->if_dunit & 0xff; + } + + fb = 1; retry = 0; mtx_lock(&bridge_list_mtx); LIST_FOREACH(sc2, &bridge_list, sc_list) { >Release-Note: >Audit-Trail: >Unformatted: