static int pflog_modevent(module_t mod, int type, void *data) { int error = 0; switch (type) { case MOD_LOAD: pflogattach(1); PF_LOCK(); pflog_packet_ptr = pflog_packet; PF_UNLOCK(); break; case MOD_UNLOAD: PF_LOCK(); pflog_packet_ptr = NULL; PF_UNLOCK(); if_clone_detach(&pflog_cloner); break; default: error = EINVAL; break; } return error; }
int pflog_clone_destroy(struct ifnet *ifp) #endif { struct pflog_softc *pflogif = ifp->if_softc; int s; s = splnet(); #ifdef __FreeBSD__ PF_LOCK(); #endif pflogifs[pflogif->sc_unit] = NULL; LIST_REMOVE(pflogif, sc_list); #ifdef __FreeBSD__ PF_UNLOCK(); #endif splx(s); #if NBPFILTER > 0 bpfdetach(ifp); #endif if_detach(ifp); #ifdef __FreeBSD__ if_free(ifp); #endif free(pflogif, M_DEVBUF); #ifndef __FreeBSD__ return (0); #endif }
int pflog_clone_create(struct if_clone *ifc, int unit) #endif { struct ifnet *ifp; struct pflog_softc *pflogif; int s; if (unit >= PFLOGIFS_MAX) return (EINVAL); if ((pflogif = malloc(sizeof(*pflogif), M_DEVBUF, M_NOWAIT|M_ZERO)) == NULL) return (ENOMEM); pflogif->sc_unit = unit; #ifdef __FreeBSD__ ifp = pflogif->sc_ifp = if_alloc(IFT_PFLOG); if (ifp == NULL) { free(pflogif, M_DEVBUF); return (ENOSPC); } if_initname(ifp, ifc->ifc_name, unit); #else ifp = &pflogif->sc_if; snprintf(ifp->if_xname, sizeof ifp->if_xname, "pflog%d", unit); #endif ifp->if_softc = pflogif; ifp->if_mtu = PFLOGMTU; ifp->if_ioctl = pflogioctl; ifp->if_output = pflogoutput; ifp->if_start = pflogstart; #ifndef __FreeBSD__ ifp->if_type = IFT_PFLOG; #endif ifp->if_snd.ifq_maxlen = ifqmaxlen; ifp->if_hdrlen = PFLOG_HDRLEN; if_attach(ifp); #ifndef __FreeBSD__ if_alloc_sadl(ifp); #endif #if NBPFILTER > 0 #ifdef __FreeBSD__ bpfattach(ifp, DLT_PFLOG, PFLOG_HDRLEN); #else bpfattach(&pflogif->sc_if.if_bpf, ifp, DLT_PFLOG, PFLOG_HDRLEN); #endif #endif s = splnet(); #ifdef __FreeBSD__ /* XXX: Why pf(4) lock?! Better add a pflog lock?! */ PF_LOCK(); #endif LIST_INSERT_HEAD(&pflogif_list, pflogif, sc_list); pflogifs[unit] = ifp; #ifdef __FreeBSD__ PF_UNLOCK(); #endif splx(s); return (0); }