summaryrefslogtreecommitdiffstats
path: root/sys/net/if_bridge.c
diff options
context:
space:
mode:
authorpjd <pjd@FreeBSD.org>2012-11-29 08:06:23 +0000
committerpjd <pjd@FreeBSD.org>2012-11-29 08:06:23 +0000
commit30b3450aa9c23148352ef59fc8db937f930a42b4 (patch)
tree20d5dfb13bd343a3a07b85b5fbde0174e6a4671e /sys/net/if_bridge.c
parent051df828de0ee7c6055c650e9ecd53a7d2413e89 (diff)
downloadFreeBSD-src-30b3450aa9c23148352ef59fc8db937f930a42b4.zip
FreeBSD-src-30b3450aa9c23148352ef59fc8db937f930a42b4.tar.gz
- Use more appropriate loop (do { } while()) when generating ethernet address
for bridge interface. - If we found a collision we can break the loop - only one collision is possible and one is exactly enough to need to renegerate. Obtained from: WHEEL Systems MFC after: 1 week
Diffstat (limited to 'sys/net/if_bridge.c')
-rw-r--r--sys/net/if_bridge.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/sys/net/if_bridge.c b/sys/net/if_bridge.c
index e935782..015cc64 100644
--- a/sys/net/if_bridge.c
+++ b/sys/net/if_bridge.c
@@ -615,7 +615,7 @@ bridge_clone_create(struct if_clone *ifc, int unit, caddr_t params)
*/
fb = 0;
getcredhostid(curthread->td_ucred, &hostid);
- for (retry = 1; retry != 0;) {
+ do {
if (fb || hostid == 0) {
arc4rand(sc->sc_defaddr, ETHER_ADDR_LEN, 1);
sc->sc_defaddr[0] &= ~1;/* clear multicast bit */
@@ -635,11 +635,13 @@ bridge_clone_create(struct if_clone *ifc, int unit, caddr_t params)
LIST_FOREACH(sc2, &bridge_list, sc_list) {
bifp = sc2->sc_ifp;
if (memcmp(sc->sc_defaddr,
- IF_LLADDR(bifp), ETHER_ADDR_LEN) == 0)
+ IF_LLADDR(bifp), ETHER_ADDR_LEN) == 0) {
retry = 1;
+ break;
+ }
}
mtx_unlock(&bridge_list_mtx);
- }
+ } while (retry == 1);
bstp_attach(&sc->sc_stp, &bridge_ops);
ether_ifattach(ifp, sc->sc_defaddr);
OpenPOWER on IntegriCloud