kern/141646: commit references a PR

dfilter service dfilter at FreeBSD.ORG
Sat Feb 6 13:50:04 UTC 2010


The following reply was made to PR kern/141646; it has been noted by GNATS.

From: dfilter at FreeBSD.ORG (dfilter service)
To: bug-followup at FreeBSD.org
Cc:  
Subject: Re: kern/141646: commit references a PR
Date: Sat,  6 Feb 2010 13:49:48 +0000 (UTC)

 Author: eri
 Date: Sat Feb  6 13:49:35 2010
 New Revision: 203548
 URL: http://svn.freebsd.org/changeset/base/203548
 
 Log:
   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
 
 Modified:
   head/sys/net/if_lagg.c
   head/sys/net/if_lagg.h
 
 Modified: head/sys/net/if_lagg.c
 ==============================================================================
 --- head/sys/net/if_lagg.c	Sat Feb  6 13:39:08 2010	(r203547)
 +++ head/sys/net/if_lagg.c	Sat Feb  6 13:49:35 2010	(r203548)
 @@ -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, 
  	 */
  	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);
 
 Modified: head/sys/net/if_lagg.h
 ==============================================================================
 --- head/sys/net/if_lagg.h	Sat Feb  6 13:39:08 2010	(r203547)
 +++ head/sys/net/if_lagg.h	Sat Feb  6 13:49:35 2010	(r203548)
 @@ -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 {
 _______________________________________________
 svn-src-all at freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe at freebsd.org"
 


More information about the freebsd-net mailing list