mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-15 10:17:20 +00:00
- Relax the restriction on the member interfaces with LLAs. Two or more
LLAs on the member interfaces are actually harmless when the parent interface does not have a LLA. - Add net.link.bridge.allow_llz_overlap. This is a knob to allow LLAs on a bridge and the member interfaces at the same time. The default is 0. Pointed out by: ume MFC after: 3 days
This commit is contained in:
parent
a29cc9a34b
commit
9fcd8e9ebd
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=253751
@ -382,6 +382,12 @@ SYSCTL_INT(_net_link_bridge, OID_AUTO, inherit_mac, CTLFLAG_RW,
|
||||
&bridge_inherit_mac, 0,
|
||||
"Inherit MAC address from the first bridge member");
|
||||
|
||||
static VNET_DEFINE(int, allow_llz_overlap) = 0;
|
||||
#define V_allow_llz_overlap VNET(allow_llz_overlap)
|
||||
SYSCTL_VNET_INT(_net_link_bridge, OID_AUTO, allow_llz_overlap, CTLFLAG_RW,
|
||||
&VNET_NAME(allow_llz_overlap), 0, "Allow overlap of link-local scope "
|
||||
"zones of a bridge interface and the member interfaces");
|
||||
|
||||
struct bridge_control {
|
||||
int (*bc_func)(struct bridge_softc *, void *);
|
||||
int bc_argsize;
|
||||
@ -1064,7 +1070,8 @@ bridge_ioctl_add(struct bridge_softc *sc, void *arg)
|
||||
*/
|
||||
|
||||
/* Check if the parent interface has a link-local scope addr. */
|
||||
if (in6ifa_llaonifp(sc->sc_ifp) != NULL) {
|
||||
if (V_allow_llz_overlap == 0 &&
|
||||
in6ifa_llaonifp(sc->sc_ifp) != NULL) {
|
||||
/*
|
||||
* If any, remove all inet6 addresses from the member
|
||||
* interfaces.
|
||||
@ -1093,32 +1100,6 @@ bridge_ioctl_add(struct bridge_softc *sc, void *arg)
|
||||
"IPv6 address scope violation.\n",
|
||||
ifs->if_xname);
|
||||
}
|
||||
} else {
|
||||
struct in6_ifaddr *ia6_m, *ia6_s;
|
||||
/*
|
||||
* If not, check whether one of the existing member
|
||||
* interfaces have inet6 address. If any, remove
|
||||
* inet6 addresses on the interface to be added.
|
||||
*/
|
||||
ia6_m = NULL;
|
||||
BRIDGE_XLOCK(sc);
|
||||
LIST_FOREACH(bif, &sc->sc_iflist, bif_next) {
|
||||
ia6_m = in6ifa_llaonifp(bif->bif_ifp);
|
||||
if (ia6_m != NULL)
|
||||
break;
|
||||
}
|
||||
BRIDGE_XDROP(sc);
|
||||
ia6_s = in6ifa_llaonifp(ifs);
|
||||
|
||||
if (ia6_m != NULL && ia6_s != NULL) {
|
||||
BRIDGE_UNLOCK(sc);
|
||||
in6_ifdetach(ifs);
|
||||
BRIDGE_LOCK(sc);
|
||||
if_printf(sc->sc_ifp, "IPv6 addresses on %s have "
|
||||
"been removed before adding it as a member "
|
||||
"to prevent IPv6 address scope violation.\n",
|
||||
ifs->if_xname);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
/* Allow the first Ethernet member to define the MTU */
|
||||
|
Loading…
Reference in New Issue
Block a user