summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Pascoe <pascoe@cvs.openbsd.org>2005-07-31 05:20:58 +0000
committerChristopher Pascoe <pascoe@cvs.openbsd.org>2005-07-31 05:20:58 +0000
commit794456a5c342417ad49f0e2bb427f4f6555d79a6 (patch)
treef6612bb92913eadc619afb90ceba2cb844390289
parente121266a67b6adeedf5f350d883dc8bf8ea1a4a8 (diff)
Perform pf state/rule/table expiry in a kernel thread instead of running
it out of a timeout handler. This means we will have process context, required when using the oldnointr pool allocator. Addresses pr4186, pr4273. ok dhartmei@ henning@ tedu@
-rw-r--r--sys/net/pf.c25
-rw-r--r--sys/net/pf_ioctl.c23
-rw-r--r--sys/net/pfvar.h4
3 files changed, 31 insertions, 21 deletions
diff --git a/sys/net/pf.c b/sys/net/pf.c
index c2f29bb30d5..c708d25af91 100644
--- a/sys/net/pf.c
+++ b/sys/net/pf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pf.c,v 1.497 2005/07/31 03:30:55 pascoe Exp $ */
+/* $OpenBSD: pf.c,v 1.498 2005/07/31 05:20:56 pascoe Exp $ */
/*
* Copyright (c) 2001 Daniel Hartmeier
@@ -106,8 +106,6 @@ u_int32_t ticket_altqs_inactive;
int altqs_inactive_open;
u_int32_t ticket_pabuf;
-struct timeout pf_expire_to; /* expire timeout */
-
struct pf_anchor_stackframe {
struct pf_ruleset *rs;
struct pf_rule *r;
@@ -861,18 +859,19 @@ pf_insert_state(struct pfi_kif *kif, struct pf_state *state)
}
void
-pf_purge_timeout(void *arg)
+pf_purge_thread(void *v)
{
- struct timeout *to = arg;
- int s;
-
- s = splsoftnet();
- pf_purge_expired_states();
- pf_purge_expired_fragments();
- pf_purge_expired_src_nodes();
- splx(s);
+ int s;
- timeout_add(to, pf_default_rule.timeout[PFTM_INTERVAL] * hz);
+ for (;;) {
+ tsleep(pf_purge_thread, PWAIT, "pftm",
+ pf_default_rule.timeout[PFTM_INTERVAL] * hz);
+ s = splsoftnet();
+ pf_purge_expired_states();
+ pf_purge_expired_fragments();
+ pf_purge_expired_src_nodes();
+ splx(s);
+ }
}
u_int32_t
diff --git a/sys/net/pf_ioctl.c b/sys/net/pf_ioctl.c
index 1905f5b56ff..88e8c091192 100644
--- a/sys/net/pf_ioctl.c
+++ b/sys/net/pf_ioctl.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pf_ioctl.c,v 1.147 2005/07/26 05:21:27 pascoe Exp $ */
+/* $OpenBSD: pf_ioctl.c,v 1.148 2005/07/31 05:20:57 pascoe Exp $ */
/*
* Copyright (c) 2001 Daniel Hartmeier
@@ -50,6 +50,7 @@
#include <sys/pool.h>
#include <sys/proc.h>
#include <sys/malloc.h>
+#include <sys/kthread.h>
#include <net/if.h>
#include <net/if_types.h>
@@ -80,6 +81,7 @@
#endif
void pfattach(int);
+void pf_thread_create(void *);
int pfopen(dev_t, int, int, struct proc *);
int pfclose(dev_t, int, int, struct proc *);
struct pf_pool *pf_get_pool(char *, u_int32_t, u_int8_t, u_int32_t,
@@ -109,8 +111,6 @@ void pf_hash_rule(MD5_CTX *, struct pf_rule *);
void pf_hash_rule_addr(MD5_CTX *, struct pf_rule_addr *);
int pf_commit_rules(u_int32_t, int, char *);
-extern struct timeout pf_expire_to;
-
struct pf_rule pf_default_rule;
#ifdef ALTQ
static int pf_altq_running;
@@ -189,15 +189,22 @@ pfattach(int num)
timeout[PFTM_SRC_NODE] = PFTM_SRC_NODE_VAL;
timeout[PFTM_TS_DIFF] = PFTM_TS_DIFF_VAL;
- timeout_set(&pf_expire_to, pf_purge_timeout, &pf_expire_to);
- timeout_add(&pf_expire_to, timeout[PFTM_INTERVAL] * hz);
-
pf_normalize_init();
bzero(&pf_status, sizeof(pf_status));
pf_status.debug = PF_DEBUG_URGENT;
/* XXX do our best to avoid a conflict */
pf_status.hostid = arc4random();
+
+ /* require process context to purge states, so perform in a thread */
+ kthread_create_deferred(pf_thread_create, NULL);
+}
+
+void
+pf_thread_create(void *v)
+{
+ if (kthread_create(pf_purge_thread, NULL, NULL, "pfpurge"))
+ panic("pfpurge thread");
}
int
@@ -1939,7 +1946,11 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
goto fail;
}
old = pf_default_rule.timeout[pt->timeout];
+ if (pt->timeout == PFTM_INTERVAL && pt->seconds == 0)
+ pt->seconds = 1;
pf_default_rule.timeout[pt->timeout] = pt->seconds;
+ if (pt->timeout == PFTM_INTERVAL && pt->seconds < old)
+ wakeup(pf_purge_thread);
pt->seconds = old;
break;
}
diff --git a/sys/net/pfvar.h b/sys/net/pfvar.h
index 35813d6ed2f..a2690328df5 100644
--- a/sys/net/pfvar.h
+++ b/sys/net/pfvar.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: pfvar.h,v 1.225 2005/06/30 20:52:20 sturm Exp $ */
+/* $OpenBSD: pfvar.h,v 1.226 2005/07/31 05:20:57 pascoe Exp $ */
/*
* Copyright (c) 2001 Daniel Hartmeier
@@ -1404,7 +1404,7 @@ extern void pf_calc_skip_steps(struct pf_rulequeue *);
extern struct pool pf_src_tree_pl, pf_rule_pl;
extern struct pool pf_state_pl, pf_altq_pl, pf_pooladdr_pl;
extern struct pool pf_state_scrub_pl;
-extern void pf_purge_timeout(void *);
+extern void pf_purge_thread(void *);
extern void pf_purge_expired_src_nodes(void);
extern void pf_purge_expired_states(void);
extern void pf_purge_expired_state(struct pf_state *);