Module Name: src
Committed By: yamaguchi
Date: Thu Mar 31 03:21:33 UTC 2022
Modified Files:
src/sys/net/lagg: if_lagg.c
Log Message:
Use ether_ioctl to change mtu of lagg(4)
To generate a diff of this commit:
cvs rdiff -u -r1.42 -r1.43 src/sys/net/lagg/if_lagg.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/net/lagg/if_lagg.c
diff -u src/sys/net/lagg/if_lagg.c:1.42 src/sys/net/lagg/if_lagg.c:1.43
--- src/sys/net/lagg/if_lagg.c:1.42 Thu Mar 31 03:15:15 2022
+++ src/sys/net/lagg/if_lagg.c Thu Mar 31 03:21:33 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: if_lagg.c,v 1.42 2022/03/31 03:15:15 yamaguchi Exp $ */
+/* $NetBSD: if_lagg.c,v 1.43 2022/03/31 03:21:33 yamaguchi Exp $ */
/*
* Copyright (c) 2005, 2006 Reyk Floeter <[email protected]>
@@ -20,7 +20,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_lagg.c,v 1.42 2022/03/31 03:15:15 yamaguchi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_lagg.c,v 1.43 2022/03/31 03:21:33 yamaguchi Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -730,6 +730,7 @@ lagg_ioctl(struct ifnet *ifp, u_long cmd
break;
case SIOCSIFMTU:
LAGG_LOCK(sc);
+ /* set the MTU to each port */
LAGG_PORTS_FOREACH(sc, lp) {
error = lagg_lp_ioctl(lp, cmd, (void *)ifr);
@@ -744,10 +745,12 @@ lagg_ioctl(struct ifnet *ifp, u_long cmd
}
}
- if (error == 0) {
- ifp->if_mtu = ifr->ifr_mtu;
- } else {
- /* set every port back to the original MTU */
+ /* set the MTU to the lagg interface */
+ if (error == 0)
+ error = ether_ioctl(ifp, cmd, data);
+
+ if (error != 0) {
+ /* undo the changed MTU */
ifr->ifr_mtu = ifp->if_mtu;
LAGG_PORTS_FOREACH(sc, lp) {
if (lp->lp_ioctl != NULL)
@@ -2008,11 +2011,13 @@ lagg_capabilities_update(struct lagg_sof
static int
lagg_setup_mtu(struct lagg_softc *sc, struct lagg_port *lp)
{
- struct ifnet *ifp_port;
+ struct ifnet *ifp, *ifp_port;
struct ifreq ifr;
int error;
+ ifp = &sc->sc_if;
ifp_port = lp->lp_ifp;
+
KASSERT(IFNET_LOCKED(ifp_port));
error = 0;
@@ -2020,30 +2025,35 @@ lagg_setup_mtu(struct lagg_softc *sc, st
if (SIMPLEQ_EMPTY(&sc->sc_ports)) {
ifr.ifr_mtu = lp->lp_mtu;
+
+ if (ifp->if_mtu != (uint64_t)ifr.ifr_mtu) {
+ KASSERT(IFNET_LOCKED(ifp));
+ error = ether_ioctl(ifp, SIOCSIFMTU, &ifr);
+ }
} else {
ifr.ifr_mtu = sc->sc_if.if_mtu;
- }
- if (sc->sc_if.if_mtu != (uint64_t)ifr.ifr_mtu)
- sc->sc_if.if_mtu = ifr.ifr_mtu;
-
- if (lp->lp_mtu != (uint64_t)ifr.ifr_mtu) {
- if (lp->lp_ioctl == NULL) {
- LAGG_DPRINTF(sc, "cannot change MTU for %s\n",
- ifp_port->if_xname);
- return EINVAL;
- }
+ if (lp->lp_mtu != (uint64_t)ifr.ifr_mtu) {
+ if (lp->lp_ioctl == NULL) {
+ LAGG_DPRINTF(sc,
+ "cannot change MTU for %s\n",
+ ifp_port->if_xname);
+ return EINVAL;
+ }
- strlcpy(ifr.ifr_name, ifp_port->if_xname, sizeof(ifr.ifr_name));
- error = lp->lp_ioctl(ifp_port, SIOCSIFMTU, (void *)&ifr);
- if (error != 0) {
- LAGG_DPRINTF(sc, "invalid MTU %d for %s\n",
- ifr.ifr_mtu, ifp_port->if_xname);
- return error;
+ strlcpy(ifr.ifr_name, ifp_port->if_xname,
+ sizeof(ifr.ifr_name));
+ error = lp->lp_ioctl(ifp_port,
+ SIOCSIFMTU, (void *)&ifr);
+ if (error != 0) {
+ LAGG_DPRINTF(sc,
+ "invalid MTU %d for %s\n",
+ ifr.ifr_mtu, ifp_port->if_xname);
+ }
}
}
- return 0;
+ return error;
}
static void
@@ -2059,9 +2069,6 @@ lagg_teardown_mtu(struct lagg_softc *sc,
ifp_port = lp->lp_ifp;
KASSERT(IFNET_LOCKED(ifp_port));
- if (SIMPLEQ_EMPTY(&sc->sc_ports))
- sc->sc_if.if_mtu = 0;
-
if (ifp_port->if_mtu != lp->lp_mtu) {
memset(&ifr, 0, sizeof(ifr));
strlcpy(ifr.ifr_name, ifp_port->if_xname, sizeof(ifr.ifr_name));
@@ -2338,6 +2345,8 @@ lagg_port_setup(struct lagg_softc *sc,
/* to delete ipv6 link local address */
lagg_in6_ifdetach(ifp_port);
+ lagg_capabilities_update(sc);
+
error = lagg_setup_mtu(sc, lp);
if (error != 0)
goto restore_ipv6lla;
@@ -2373,7 +2382,6 @@ lagg_port_setup(struct lagg_softc *sc,
lagg_config_promisc(sc, lp);
lagg_proto_startport(sc, lp);
- lagg_capabilities_update(sc);
return 0;