Module Name: src Committed By: yamaguchi Date: Thu Mar 31 01:46:25 UTC 2022
Modified Files: src/sys/net/lagg: if_lagg.c Log Message: Switch ifp->if_output along with configuring ifp->if_lagg lagg_port_output stored to ifp->if_output uses ifp->if_lagg. Therefore, ifp->if_output switches to lagg_port_output after ifp->if_lagg is configured, and restores in reverse order. This missing order is pointed out by k-goda@IIJ To generate a diff of this commit: cvs rdiff -u -r1.33 -r1.34 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.33 src/sys/net/lagg/if_lagg.c:1.34 --- src/sys/net/lagg/if_lagg.c:1.33 Thu Mar 31 01:43:48 2022 +++ src/sys/net/lagg/if_lagg.c Thu Mar 31 01:46:25 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: if_lagg.c,v 1.33 2022/03/31 01:43:48 yamaguchi Exp $ */ +/* $NetBSD: if_lagg.c,v 1.34 2022/03/31 01:46:25 yamaguchi Exp $ */ /* * Copyright (c) 2005, 2006 Reyk Floeter <r...@openbsd.org> @@ -20,7 +20,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_lagg.c,v 1.33 2022/03/31 01:43:48 yamaguchi Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_lagg.c,v 1.34 2022/03/31 01:46:25 yamaguchi Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -2352,7 +2352,6 @@ lagg_port_setup(struct lagg_softc *sc, ifp_port->if_type = if_type; ifp_port->if_ioctl = lagg_port_ioctl; - ifp_port->if_output = lagg_port_output; iftype_changed = (lp->lp_iftype != ifp_port->if_type); @@ -2388,15 +2387,16 @@ lagg_port_setup(struct lagg_softc *sc, lagg_port_syncmulti(sc, lp); lagg_port_syncvlan(sc, lp); + IFNET_LOCK(ifp_port); + ifp_port->if_output = lagg_port_output; if (stopped) { - IFNET_LOCK(ifp_port); if (!ISSET(ifp_port->if_flags, IFF_RUNNING)) { error = if_init(ifp_port); if (error != 0) goto remove_port; } - IFNET_UNLOCK(ifp_port); } + IFNET_UNLOCK(ifp_port); lagg_config_promisc(sc, lp); lagg_proto_startport(sc, lp); @@ -2407,6 +2407,9 @@ lagg_port_setup(struct lagg_softc *sc, remove_port: SIMPLEQ_REMOVE(&sc->sc_ports, lp, lagg_port, lp_entry); sc->sc_nports--; + IFNET_LOCK(ifp_port); + ifp_port->if_output = lp->lp_output; + IFNET_UNLOCK(ifp_port); atomic_store_release(&ifp_port->if_lagg, NULL); pserialize_perform(sc->sc_psz); lagg_port_purgemulti(sc, lp); @@ -2432,7 +2435,6 @@ restore_ipv6lla: ifp_port->if_type = lp->lp_iftype; if (ifp_port->if_ioctl == lagg_port_ioctl) ifp_port->if_ioctl = lp->lp_ioctl; - ifp_port->if_output = lp->lp_output; IFNET_UNLOCK(ifp_port); @@ -2465,6 +2467,17 @@ lagg_port_teardown(struct lagg_softc *sc return; } + lagg_proto_stopport(sc, lp); + + IFNET_LOCK(ifp_port); + if (ISSET(ifp_port->if_flags, IFF_RUNNING) && + ifp_port->if_init != NULL) { + if_stop(ifp_port, 0); + stopped = true; + } + ifp_port->if_output = lp->lp_output; + IFNET_UNLOCK(ifp_port); + SIMPLEQ_REMOVE(&sc->sc_ports, lp, lagg_port, lp_entry); sc->sc_nports--; atomic_store_release(&ifp_port->if_lagg, NULL); @@ -2473,7 +2486,6 @@ lagg_port_teardown(struct lagg_softc *sc if_linkstate_change_disestablish(ifp_port, lp->lp_linkstate_hook, NULL); - lagg_proto_stopport(sc, lp); psref_target_destroy(&lp->lp_psref, lagg_port_psref_class); lagg_port_purgemulti(sc, lp); @@ -2481,16 +2493,9 @@ lagg_port_teardown(struct lagg_softc *sc lagg_teardown_lladdr(sc, lp); IFNET_LOCK(ifp_port); - if (ISSET(ifp_port->if_flags, IFF_RUNNING) && - ifp_port->if_init != NULL) { - if_stop(ifp_port, 0); - stopped = true; - } - ifp_port->if_type = lp->lp_iftype; if (ifp_port->if_ioctl == lagg_port_ioctl) ifp_port->if_ioctl = lp->lp_ioctl; - ifp_port->if_output = lp->lp_output; lagg_teardown_mtu(sc, lp); if (stopped) {