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:
Ermal Luçi 2010-02-06 13:49:35 +00:00
parent 7402a88ded
commit 644da90d9f
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=203548
2 changed files with 61 additions and 0 deletions

View File

@ -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);

View File

@ -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 {