diff options
author | pjd <pjd@FreeBSD.org> | 2012-11-29 08:06:23 +0000 |
---|---|---|
committer | pjd <pjd@FreeBSD.org> | 2012-11-29 08:06:23 +0000 |
commit | 30b3450aa9c23148352ef59fc8db937f930a42b4 (patch) | |
tree | 20d5dfb13bd343a3a07b85b5fbde0174e6a4671e /sys/net | |
parent | 051df828de0ee7c6055c650e9ecd53a7d2413e89 (diff) | |
download | FreeBSD-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')
-rw-r--r-- | sys/net/if_bridge.c | 8 |
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); |