Propagate the vlan eventis to the underlying interfaces/members so they can do initialization of hw related features.
PR: kern/141646 Reviewed by: thompsa Approved by: thompsa(co-mentor) MFC after: 2 weeks
This commit is contained in:
parent
7402a88ded
commit
644da90d9f
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=203548
@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sys/lock.h>
|
||||
#include <sys/rwlock.h>
|
||||
#include <sys/taskqueue.h>
|
||||
#include <sys/eventhandler.h>
|
||||
|
||||
#include <net/ethernet.h>
|
||||
#include <net/if.h>
|
||||
@ -198,6 +199,50 @@ static moduledata_t lagg_mod = {
|
||||
|
||||
DECLARE_MODULE(if_lagg, lagg_mod, SI_SUB_PSEUDO, SI_ORDER_ANY);
|
||||
|
||||
#if __FreeBSD_version >= 800000
|
||||
/*
|
||||
* This routine is run via an vlan
|
||||
* config EVENT
|
||||
*/
|
||||
static void
|
||||
lagg_register_vlan(void *arg, struct ifnet *ifp, u_int16_t vtag)
|
||||
{
|
||||
struct lagg_softc *sc = ifp->if_softc;
|
||||
struct lagg_port *lp;
|
||||
|
||||
if (ifp->if_softc != arg) /* Not our event */
|
||||
return;
|
||||
|
||||
LAGG_RLOCK(sc);
|
||||
if (!SLIST_EMPTY(&sc->sc_ports)) {
|
||||
SLIST_FOREACH(lp, &sc->sc_ports, lp_entries)
|
||||
EVENTHANDLER_INVOKE(vlan_config, lp->lp_ifp, vtag);
|
||||
}
|
||||
LAGG_RUNLOCK(sc);
|
||||
}
|
||||
|
||||
/*
|
||||
* This routine is run via an vlan
|
||||
* unconfig EVENT
|
||||
*/
|
||||
static void
|
||||
lagg_unregister_vlan(void *arg, struct ifnet *ifp, u_int16_t vtag)
|
||||
{
|
||||
struct lagg_softc *sc = ifp->if_softc;
|
||||
struct lagg_port *lp;
|
||||
|
||||
if (ifp->if_softc != arg) /* Not our event */
|
||||
return;
|
||||
|
||||
LAGG_RLOCK(sc);
|
||||
if (!SLIST_EMPTY(&sc->sc_ports)) {
|
||||
SLIST_FOREACH(lp, &sc->sc_ports, lp_entries)
|
||||
EVENTHANDLER_INVOKE(vlan_unconfig, lp->lp_ifp, vtag);
|
||||
}
|
||||
LAGG_RUNLOCK(sc);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int
|
||||
lagg_clone_create(struct if_clone *ifc, int unit, caddr_t params)
|
||||
{
|
||||
@ -253,6 +298,13 @@ lagg_clone_create(struct if_clone *ifc, int unit, caddr_t params)
|
||||
*/
|
||||
ether_ifattach(ifp, eaddr);
|
||||
|
||||
#if __FreeBSD_version >= 800000
|
||||
sc->vlan_attach = EVENTHANDLER_REGISTER(vlan_config,
|
||||
lagg_register_vlan, sc, EVENTHANDLER_PRI_FIRST);
|
||||
sc->vlan_detach = EVENTHANDLER_REGISTER(vlan_unconfig,
|
||||
lagg_unregister_vlan, sc, EVENTHANDLER_PRI_FIRST);
|
||||
#endif
|
||||
|
||||
/* Insert into the global list of laggs */
|
||||
mtx_lock(&lagg_list_mtx);
|
||||
SLIST_INSERT_HEAD(&lagg_list, sc, sc_entries);
|
||||
@ -272,6 +324,11 @@ lagg_clone_destroy(struct ifnet *ifp)
|
||||
lagg_stop(sc);
|
||||
ifp->if_flags &= ~IFF_UP;
|
||||
|
||||
#if __FreeBSD_version >= 800000
|
||||
EVENTHANDLER_DEREGISTER(vlan_config, sc->vlan_attach);
|
||||
EVENTHANDLER_DEREGISTER(vlan_unconfig, sc->vlan_detach);
|
||||
#endif
|
||||
|
||||
/* Shutdown and remove lagg ports */
|
||||
while ((lp = SLIST_FIRST(&sc->sc_ports)) != NULL)
|
||||
lagg_port_destroy(lp, 1);
|
||||
|
@ -198,6 +198,10 @@ struct lagg_softc {
|
||||
void (*sc_lladdr)(struct lagg_softc *);
|
||||
void (*sc_req)(struct lagg_softc *, caddr_t);
|
||||
void (*sc_portreq)(struct lagg_port *, caddr_t);
|
||||
#if __FreeBSD_version >= 800000
|
||||
eventhandler_tag vlan_attach;
|
||||
eventhandler_tag vlan_detach;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct lagg_port {
|
||||
|
Loading…
Reference in New Issue
Block a user