MFC r203272:
- Fix a bug when adding an interface with an invalid MTU sets the bridge's MTU if it is the firstly-added one while the addition itself fails. - Allow SIOCSIFMTU only when all members have the same MTU. - Remove IFT_GIF check when defining the brige MTU by the firstly-added interface's one. The MTU of the gif interface has to be the same as the bridge's one.
This commit is contained in:
parent
274885ab20
commit
7fe6975097
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/stable/8/; revision=205485
@ -682,6 +682,8 @@ static int
|
||||
bridge_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
|
||||
{
|
||||
struct bridge_softc *sc = ifp->if_softc;
|
||||
struct ifreq *ifr = (struct ifreq *)data;
|
||||
struct bridge_iflist *bif;
|
||||
struct thread *td = curthread;
|
||||
union {
|
||||
struct ifbreq ifbreq;
|
||||
@ -771,10 +773,29 @@ bridge_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
|
||||
break;
|
||||
|
||||
case SIOCSIFMTU:
|
||||
/* Do not allow the MTU to be changed on the bridge */
|
||||
error = EINVAL;
|
||||
if (ifr->ifr_mtu < 576) {
|
||||
error = EINVAL;
|
||||
break;
|
||||
}
|
||||
if (LIST_EMPTY(&sc->sc_iflist)) {
|
||||
sc->sc_ifp->if_mtu = ifr->ifr_mtu;
|
||||
break;
|
||||
}
|
||||
BRIDGE_LOCK(sc);
|
||||
LIST_FOREACH(bif, &sc->sc_iflist, bif_next) {
|
||||
if (bif->bif_ifp->if_mtu != ifr->ifr_mtu) {
|
||||
log(LOG_NOTICE, "%s: invalid MTU: %lu(%s)"
|
||||
" != %d\n", sc->sc_ifp->if_xname,
|
||||
bif->bif_ifp->if_mtu,
|
||||
bif->bif_ifp->if_xname, ifr->ifr_mtu);
|
||||
error = EINVAL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!error)
|
||||
sc->sc_ifp->if_mtu = ifr->ifr_mtu;
|
||||
BRIDGE_UNLOCK(sc);
|
||||
break;
|
||||
|
||||
default:
|
||||
/*
|
||||
* drop the lock as ether_ioctl() will call bridge_start() and
|
||||
@ -987,17 +1008,6 @@ bridge_ioctl_add(struct bridge_softc *sc, void *arg)
|
||||
if (ifs == bif->bif_ifp)
|
||||
return (EBUSY);
|
||||
|
||||
/* Allow the first Ethernet member to define the MTU */
|
||||
if (ifs->if_type != IFT_GIF) {
|
||||
if (LIST_EMPTY(&sc->sc_iflist))
|
||||
sc->sc_ifp->if_mtu = ifs->if_mtu;
|
||||
else if (sc->sc_ifp->if_mtu != ifs->if_mtu) {
|
||||
if_printf(sc->sc_ifp, "invalid MTU for %s\n",
|
||||
ifs->if_xname);
|
||||
return (EINVAL);
|
||||
}
|
||||
}
|
||||
|
||||
if (ifs->if_bridge == sc)
|
||||
return (EEXIST);
|
||||
|
||||
@ -1023,6 +1033,16 @@ bridge_ioctl_add(struct bridge_softc *sc, void *arg)
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Allow the first Ethernet member to define the MTU */
|
||||
if (LIST_EMPTY(&sc->sc_iflist))
|
||||
sc->sc_ifp->if_mtu = ifs->if_mtu;
|
||||
else if (sc->sc_ifp->if_mtu != ifs->if_mtu) {
|
||||
if_printf(sc->sc_ifp, "invalid MTU: %lu(%s) != %lu\n",
|
||||
ifs->if_mtu, ifs->if_xname, sc->sc_ifp->if_mtu);
|
||||
error = EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* Assign the interface's MAC address to the bridge if it's the first
|
||||
* member and the MAC address of the bridge has not been changed from
|
||||
|
Loading…
Reference in New Issue
Block a user