Module Name:    src
Committed By:   ahoka
Date:           Mon Apr 12 13:57:38 UTC 2010

Modified Files:
        src/sys/dist/pf/net: if_pflog.c pf.c pf_if.c pf_ioctl.c pf_norm.c
            pf_osfp.c pf_table.c pfvar.h

Log Message:
- Make the pf and pflog driver able to detach.
- Add code for module support.

Original patch from Jared McNeill


To generate a diff of this commit:
cvs rdiff -u -r1.17 -r1.18 src/sys/dist/pf/net/if_pflog.c \
    src/sys/dist/pf/net/pfvar.h
cvs rdiff -u -r1.62 -r1.63 src/sys/dist/pf/net/pf.c
cvs rdiff -u -r1.20 -r1.21 src/sys/dist/pf/net/pf_if.c
cvs rdiff -u -r1.37 -r1.38 src/sys/dist/pf/net/pf_ioctl.c
cvs rdiff -u -r1.21 -r1.22 src/sys/dist/pf/net/pf_norm.c
cvs rdiff -u -r1.9 -r1.10 src/sys/dist/pf/net/pf_osfp.c
cvs rdiff -u -r1.15 -r1.16 src/sys/dist/pf/net/pf_table.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/dist/pf/net/if_pflog.c
diff -u src/sys/dist/pf/net/if_pflog.c:1.17 src/sys/dist/pf/net/if_pflog.c:1.18
--- src/sys/dist/pf/net/if_pflog.c:1.17	Mon Apr  5 07:22:22 2010
+++ src/sys/dist/pf/net/if_pflog.c	Mon Apr 12 13:57:38 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_pflog.c,v 1.17 2010/04/05 07:22:22 joerg Exp $	*/
+/*	$NetBSD: if_pflog.c,v 1.18 2010/04/12 13:57:38 ahoka Exp $	*/
 /*	$OpenBSD: if_pflog.c,v 1.24 2007/05/26 17:13:30 jason Exp $	*/
 
 /*
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_pflog.c,v 1.17 2010/04/05 07:22:22 joerg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_pflog.c,v 1.18 2010/04/12 13:57:38 ahoka Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -82,6 +82,9 @@
 #endif
 
 void	pflogattach(int);
+#ifdef _MODULE
+void	pflogdetach(void);
+#endif /* _MODULE */
 int	pflogoutput(struct ifnet *, struct mbuf *, const struct sockaddr *,
 	    	       struct rtentry *);
 int	pflogioctl(struct ifnet *, u_long, void *);
@@ -106,6 +109,20 @@
 	if_clone_attach(&pflog_cloner);
 }
 
+#ifdef _MODULE
+void
+pflogdetach(void)
+{
+	int i;
+
+	for (i = 0; i < PFLOGIFS_MAX; i++) {
+		if (pflogifs[i] != NULL)
+			pflog_clone_destroy(pflogifs[i]);
+	}
+	if_clone_detach(&pflog_cloner);
+}
+#endif /* _MODULE */
+
 int
 pflog_clone_create(struct if_clone *ifc, int unit)
 {
Index: src/sys/dist/pf/net/pfvar.h
diff -u src/sys/dist/pf/net/pfvar.h:1.17 src/sys/dist/pf/net/pfvar.h:1.18
--- src/sys/dist/pf/net/pfvar.h:1.17	Tue Jul 28 18:15:26 2009
+++ src/sys/dist/pf/net/pfvar.h	Mon Apr 12 13:57:38 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: pfvar.h,v 1.17 2009/07/28 18:15:26 minskim Exp $	*/
+/*	$NetBSD: pfvar.h,v 1.18 2010/04/12 13:57:38 ahoka Exp $	*/
 /*	$OpenBSD: pfvar.h,v 1.254 2007/07/13 09:17:48 markus Exp $ */
 
 /*
@@ -1641,6 +1641,9 @@
 int	pf_match_gid(u_int8_t, gid_t, gid_t, gid_t);
 
 void	pf_normalize_init(void);
+#ifdef _MODULE
+void	pf_normalize_destroy(void);
+#endif /* _MODULE */
 int	pf_normalize_ip(struct mbuf **, int, struct pfi_kif *, u_short *,
 	    struct pf_pdesc *);
 int	pf_normalize_ip6(struct mbuf **, int, struct pfi_kif *, u_short *,
@@ -1662,6 +1665,9 @@
 struct pf_state_key *
 	pf_alloc_state_key(struct pf_state *);
 void	pfr_initialize(void);
+#ifdef _MODULE
+void	pfr_destroy(void);
+#endif /* _MODULE */
 int	pfr_match_addr(struct pfr_ktable *, struct pf_addr *, sa_family_t);
 void	pfr_update_stats(struct pfr_ktable *, struct pf_addr *, sa_family_t,
 	    u_int64_t, int, int, int);
@@ -1701,6 +1707,9 @@
 extern struct pfi_kif		*pfi_all;
 
 void		 pfi_initialize(void);
+#ifdef _MODULE
+void		 pfi_destroy(void);
+#endif /* _MODULE */
 struct pfi_kif	*pfi_kif_get(const char *);
 void		 pfi_kif_ref(struct pfi_kif *, enum pfi_kif_refs);
 void		 pfi_kif_unref(struct pfi_kif *, enum pfi_kif_refs);
@@ -1803,6 +1812,9 @@
 void	pf_osfp_flush(void);
 int	pf_osfp_get(struct pf_osfp_ioctl *);
 void	pf_osfp_initialize(void);
+#ifdef _MODULE
+void	pf_osfp_destroy(void);
+#endif /* _MODULE */
 int	pf_osfp_match(struct pf_osfp_enlist *, pf_osfp_t);
 struct pf_os_fingerprint *
 	pf_osfp_validate(void);

Index: src/sys/dist/pf/net/pf.c
diff -u src/sys/dist/pf/net/pf.c:1.62 src/sys/dist/pf/net/pf.c:1.63
--- src/sys/dist/pf/net/pf.c:1.62	Mon Apr 12 06:56:19 2010
+++ src/sys/dist/pf/net/pf.c	Mon Apr 12 13:57:38 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: pf.c,v 1.62 2010/04/12 06:56:19 skrll Exp $	*/
+/*	$NetBSD: pf.c,v 1.63 2010/04/12 13:57:38 ahoka Exp $	*/
 /*	$OpenBSD: pf.c,v 1.552.2.1 2007/11/27 16:37:57 henning Exp $ */
 
 /*
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pf.c,v 1.62 2010/04/12 06:56:19 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pf.c,v 1.63 2010/04/12 13:57:38 ahoka Exp $");
 
 #include "pflog.h"
 
@@ -917,12 +917,24 @@
 	return (0);
 }
 
+#ifdef _LKM
+volatile int pf_purge_thread_stop;
+volatile int pf_purge_thread_running;
+#endif
+
 void
 pf_purge_thread(void *v)
 {
 	int nloops = 0, s;
 
+#ifdef _LKM
+	pf_purge_thread_running = 1;
+	pf_purge_thread_stop = 0;
+
+	while (!pf_purge_thread_stop) {
+#else
 	for (;;) {
+#endif /* !_LKM */
 		tsleep(pf_purge_thread, PWAIT, "pftm", 1 * hz);
 
 		s = splsoftnet();
@@ -940,6 +952,12 @@
 
 		splx(s);
 	}
+
+#ifdef _LKM
+	pf_purge_thread_running = 0;
+	wakeup(&pf_purge_thread_running);
+	kthread_exit(0);
+#endif /* _LKM */
 }
 
 u_int32_t

Index: src/sys/dist/pf/net/pf_if.c
diff -u src/sys/dist/pf/net/pf_if.c:1.20 src/sys/dist/pf/net/pf_if.c:1.21
--- src/sys/dist/pf/net/pf_if.c:1.20	Sun Dec  6 16:46:11 2009
+++ src/sys/dist/pf/net/pf_if.c	Mon Apr 12 13:57:38 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: pf_if.c,v 1.20 2009/12/06 16:46:11 dsl Exp $	*/
+/*	$NetBSD: pf_if.c,v 1.21 2010/04/12 13:57:38 ahoka Exp $	*/
 /*	$OpenBSD: pf_if.c,v 1.47 2007/07/13 09:17:48 markus Exp $ */
 
 /*
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pf_if.c,v 1.20 2009/12/06 16:46:11 dsl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pf_if.c,v 1.21 2010/04/12 13:57:38 ahoka Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -138,6 +138,37 @@
 #endif /* __NetBSD__ */
 }
 
+#ifdef _MODULE
+void
+pfi_destroy(void)
+{
+	struct pfi_kif *p;
+	int i;
+
+	pfil_remove_hook(pfil_ifaddr_wrapper, NULL, PFIL_IFADDR, &if_pfil);
+	pfil_remove_hook(pfil_ifnet_wrapper, NULL, PFIL_IFNET, &if_pfil);
+
+	for (i = 0; i < if_indexlim; i++) {
+		struct ifnet *ifp = ifindex2ifnet[i];
+
+		if (ifp != NULL) {
+			pfi_detach_ifnet(ifp);
+
+			pfi_destroy_groups(ifp);
+		}
+	}
+
+	while ((p = RB_MIN(pfi_ifhead, &pfi_ifs))) {
+		RB_REMOVE(pfi_ifhead, &pfi_ifs, p);
+		free(p, PFI_MTYPE);
+	}
+
+	pool_destroy(&pfi_addr_pl);
+
+	free(pfi_buffer, PFI_MTYPE);
+}
+#endif /* _MODULE */
+
 struct pfi_kif *
 pfi_kif_get(const char *kif_name)
 {

Index: src/sys/dist/pf/net/pf_ioctl.c
diff -u src/sys/dist/pf/net/pf_ioctl.c:1.37 src/sys/dist/pf/net/pf_ioctl.c:1.38
--- src/sys/dist/pf/net/pf_ioctl.c:1.37	Sat Oct  3 00:37:02 2009
+++ src/sys/dist/pf/net/pf_ioctl.c	Mon Apr 12 13:57:38 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: pf_ioctl.c,v 1.37 2009/10/03 00:37:02 elad Exp $	*/
+/*	$NetBSD: pf_ioctl.c,v 1.38 2010/04/12 13:57:38 ahoka Exp $	*/
 /*	$OpenBSD: pf_ioctl.c,v 1.182 2007/06/24 11:17:13 mcbride Exp $ */
 
 /*
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pf_ioctl.c,v 1.37 2009/10/03 00:37:02 elad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pf_ioctl.c,v 1.38 2010/04/12 13:57:38 ahoka Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -65,6 +65,7 @@
 #include <sys/conf.h>
 #include <sys/lwp.h>
 #include <sys/kauth.h>
+#include <sys/module.h>
 #endif /* __NetBSD__ */
 
 #include <net/if.h>
@@ -104,6 +105,9 @@
 #endif
 
 void			 pfattach(int);
+#ifdef _MODULE
+void			 pfdetach(void);
+#endif /* _MODULE */
 #ifndef __NetBSD__
 void			 pf_thread_create(void *);
 #endif /* !__NetBSD__ */
@@ -309,6 +313,98 @@
 #endif /* __NetBSD__ */
 }
 
+#ifdef _MODULE
+void
+pfdetach(void)
+{
+	extern int		 pf_purge_thread_running;
+	extern int		 pf_purge_thread_stop;
+	struct pf_anchor	*anchor;
+	struct pf_state		*state;
+	struct pf_src_node	*node;
+	struct pfioc_table	 pt;
+	u_int32_t		 ticket;
+	int			 i;
+	char			 r = '\0';
+
+	pf_purge_thread_stop = 1;
+	wakeup(pf_purge_thread);
+
+	/* wait until the kthread exits */
+	while (pf_purge_thread_running)
+		tsleep(&pf_purge_thread_running, PWAIT, "pfdown", 0);
+
+	(void)pf_pfil_detach();
+
+	pf_status.running = 0;
+
+	/* clear the rulesets */
+	for (i = 0; i < PF_RULESET_MAX; i++)
+		if (pf_begin_rules(&ticket, i, &r) == 0)
+			pf_commit_rules(ticket, i, &r);
+#ifdef ALTQ
+	if (pf_begin_altq(&ticket) == 0)
+		pf_commit_altq(ticket);
+#endif /* ALTQ */
+
+	/* clear states */
+	RB_FOREACH(state, pf_state_tree_id, &tree_id) {
+		state->timeout = PFTM_PURGE;
+#if NPFSYNC > 0
+		state->sync_flags = PFSTATE_NOSYNC;
+#endif /* NPFSYNC > 0 */
+	}
+	pf_purge_expired_states(pf_status.states);
+#if NPFSYNC > 0
+	pfsync_clear_states(pf_status.hostid, NULL);
+#endif /* NPFSYNC > 0 */
+
+	/* clear source nodes */
+	RB_FOREACH(state, pf_state_tree_id, &tree_id) {
+		state->src_node = NULL;
+		state->nat_src_node = NULL;
+	}
+	RB_FOREACH(node, pf_src_tree, &tree_src_tracking) {
+		node->expire = 1;
+		node->states = 0;
+	}
+	pf_purge_expired_src_nodes(0);
+
+	/* clear tables */
+	memset(&pt, '\0', sizeof(pt));
+	pfr_clr_tables(&pt.pfrio_table, &pt.pfrio_ndel, pt.pfrio_flags);
+
+	/* destroy anchors */
+	while ((anchor = RB_MIN(pf_anchor_global, &pf_anchors)) != NULL) {
+		for (i = 0; i < PF_RULESET_MAX; i++)
+			if (pf_begin_rules(&ticket, i, anchor->name) == 0)
+				pf_commit_rules(ticket, i, anchor->name);
+	}
+
+	/* destroy main ruleset */
+	pf_remove_if_empty_ruleset(&pf_main_ruleset);
+
+	/* destroy the pools */
+	pool_destroy(&pf_pooladdr_pl);
+	pool_destroy(&pf_altq_pl);
+	pool_destroy(&pf_state_key_pl);
+	pool_destroy(&pf_state_pl);
+	pool_destroy(&pf_rule_pl);
+	pool_destroy(&pf_src_tree_pl);
+
+	rw_destroy(&pf_consistency_lock);
+
+	/* destroy subsystems */
+	pf_normalize_destroy();
+	pf_osfp_destroy();
+	pfr_destroy();
+	pfi_destroy();
+
+	/* cleanup kauth listener */
+	kauth_unlisten_scope(pf_listener);
+}
+#endif /* _MODULE */
+
 #ifndef __NetBSD__
 void
 pf_thread_create(void *v)
@@ -3245,3 +3341,39 @@
 	return (0);
 }
 #endif /* __NetBSD__ */
+
+#if defined(__NetBSD__)
+MODULE(MODULE_CLASS_MISC, pf, "bpf");
+
+static int
+pf_modcmd(modcmd_t cmd, void *opaque)
+{
+#ifdef _MODULE
+	extern void pflogattach(int);
+	extern void pflogdetach(void);
+
+	devmajor_t cmajor = NODEVMAJOR, bmajor = NODEVMAJOR;
+	int err;
+
+	switch (cmd) {
+	case MODULE_CMD_INIT:
+		err = devsw_attach("pf", NULL, &bmajor, &pf_cdevsw, &cmajor);
+		if (err)
+			return err;
+		pfattach(1);
+		pflogattach(1);
+		return 0;
+	case MODULE_CMD_FINI:
+		pfdetach();
+		pflogdetach();
+		return devsw_detach(NULL, &pf_cdevsw);
+	default:
+		return ENOTTY;
+	}
+#else
+	if (cmd == MODULE_CMD_INIT)
+		return 0;
+	return ENOTTY;
+#endif
+}
+#endif

Index: src/sys/dist/pf/net/pf_norm.c
diff -u src/sys/dist/pf/net/pf_norm.c:1.21 src/sys/dist/pf/net/pf_norm.c:1.22
--- src/sys/dist/pf/net/pf_norm.c:1.21	Tue Jul 28 18:15:26 2009
+++ src/sys/dist/pf/net/pf_norm.c	Mon Apr 12 13:57:38 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: pf_norm.c,v 1.21 2009/07/28 18:15:26 minskim Exp $	*/
+/*	$NetBSD: pf_norm.c,v 1.22 2010/04/12 13:57:38 ahoka Exp $	*/
 /*	$OpenBSD: pf_norm.c,v 1.109 2007/05/28 17:16:39 henning Exp $ */
 
 /*
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pf_norm.c,v 1.21 2009/07/28 18:15:26 minskim Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pf_norm.c,v 1.22 2010/04/12 13:57:38 ahoka Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -177,6 +177,18 @@
 	TAILQ_INIT(&pf_cachequeue);
 }
 
+#ifdef _MODULE
+void
+pf_normalize_destroy(void)
+{
+	pool_destroy(&pf_state_scrub_pl);
+	pool_destroy(&pf_cent_pl);
+	pool_destroy(&pf_cache_pl);
+	pool_destroy(&pf_frag_pl);
+	pool_destroy(&pf_frent_pl);
+}
+#endif /* _MODULE */
+
 static __inline int
 pf_frag_compare(struct pf_fragment *a, struct pf_fragment *b)
 {

Index: src/sys/dist/pf/net/pf_osfp.c
diff -u src/sys/dist/pf/net/pf_osfp.c:1.9 src/sys/dist/pf/net/pf_osfp.c:1.10
--- src/sys/dist/pf/net/pf_osfp.c:1.9	Tue Jul 28 18:15:26 2009
+++ src/sys/dist/pf/net/pf_osfp.c	Mon Apr 12 13:57:38 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: pf_osfp.c,v 1.9 2009/07/28 18:15:26 minskim Exp $	*/
+/*	$NetBSD: pf_osfp.c,v 1.10 2010/04/12 13:57:38 ahoka Exp $	*/
 /*	$OpenBSD: pf_osfp.c,v 1.12 2006/12/13 18:14:10 itojun Exp $ */
 
 /*
@@ -19,7 +19,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pf_osfp.c,v 1.9 2009/07/28 18:15:26 minskim Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pf_osfp.c,v 1.10 2010/04/12 13:57:38 ahoka Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -315,6 +315,17 @@
 	SLIST_INIT(&pf_osfp_list);
 }
 
+#ifdef _MODULE
+void
+pf_osfp_destroy(void)
+{
+	pf_osfp_flush();
+
+	pool_destroy(&pf_osfp_pl);
+	pool_destroy(&pf_osfp_entry_pl);
+}
+#endif /* _MODULE */
+
 /* Flush the fingerprint list */
 void
 pf_osfp_flush(void)

Index: src/sys/dist/pf/net/pf_table.c
diff -u src/sys/dist/pf/net/pf_table.c:1.15 src/sys/dist/pf/net/pf_table.c:1.16
--- src/sys/dist/pf/net/pf_table.c:1.15	Tue Jul 28 18:15:26 2009
+++ src/sys/dist/pf/net/pf_table.c	Mon Apr 12 13:57:38 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: pf_table.c,v 1.15 2009/07/28 18:15:26 minskim Exp $	*/
+/*	$NetBSD: pf_table.c,v 1.16 2010/04/12 13:57:38 ahoka Exp $	*/
 /*	$OpenBSD: pf_table.c,v 1.70 2007/05/23 11:53:45 markus Exp $	*/
 
 /*
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pf_table.c,v 1.15 2009/07/28 18:15:26 minskim Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pf_table.c,v 1.16 2010/04/12 13:57:38 ahoka Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -222,6 +222,16 @@
 	memset(&pfr_ffaddr, 0xff, sizeof(pfr_ffaddr));
 }
 
+#ifdef _MODULE
+void
+pfr_destroy(void)
+{
+	pool_destroy(&pfr_ktable_pl);
+	pool_destroy(&pfr_kentry_pl);
+	pool_destroy(&pfr_kentry_pl2);
+}
+#endif /* _MODULE */
+
 int
 pfr_clr_addrs(struct pfr_table *tbl, int *ndel, int flags)
 {

Reply via email to