Module Name: src
Committed By: rmind
Date: Mon Feb 20 00:18:20 UTC 2012
Modified Files:
src/sys/net/npf: npf.c npf_alg.c npf_alg_icmp.c npf_ctl.c npf_handler.c
npf_impl.h npf_inet.c npf_instr.c npf_log.c npf_nat.c
npf_processor.c npf_rproc.c npf_ruleset.c npf_sendpkt.c
npf_session.c npf_tableset.c
src/usr.sbin/npf/npfctl: npf_build.c
Log Message:
- Add NPF_DECISION_BLOCK and NPF_DECISION_PASS. Be more defensive in the
packet handler. Change the default policy to block when the config is
loaded and set it to pass when flush operation is performed.
- Use kmem_zalloc(9) instead of kmem_alloc(9) in few places.
- npf_rproc_{create,release}: use kmem_intr_{alloc,free} as the destruction
of rule procedure might happen in the interrupt handler (under a very rare
condition, if config reload races with the handler).
- npf_session_establish: check whether layer 3 and 4 are cached.
- npfctl_build_group: do not make groups as passing rules.
- Remove some unecessary header inclusion.
To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/sys/net/npf/npf.c
cvs rdiff -u -r1.2 -r1.3 src/sys/net/npf/npf_alg.c src/sys/net/npf/npf_log.c
cvs rdiff -u -r1.8 -r1.9 src/sys/net/npf/npf_alg_icmp.c \
src/sys/net/npf/npf_sendpkt.c
cvs rdiff -u -r1.12 -r1.13 src/sys/net/npf/npf_ctl.c
cvs rdiff -u -r1.13 -r1.14 src/sys/net/npf/npf_handler.c
cvs rdiff -u -r1.10 -r1.11 src/sys/net/npf/npf_impl.h \
src/sys/net/npf/npf_inet.c src/sys/net/npf/npf_nat.c \
src/sys/net/npf/npf_ruleset.c src/sys/net/npf/npf_session.c
cvs rdiff -u -r1.9 -r1.10 src/sys/net/npf/npf_instr.c \
src/sys/net/npf/npf_processor.c src/sys/net/npf/npf_tableset.c
cvs rdiff -u -r1.1 -r1.2 src/sys/net/npf/npf_rproc.c
cvs rdiff -u -r1.4 -r1.5 src/usr.sbin/npf/npfctl/npf_build.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/net/npf/npf.c
diff -u src/sys/net/npf/npf.c:1.7 src/sys/net/npf/npf.c:1.8
--- src/sys/net/npf/npf.c:1.7 Sun Jan 15 00:49:48 2012
+++ src/sys/net/npf/npf.c Mon Feb 20 00:18:19 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: npf.c,v 1.7 2012/01/15 00:49:48 rmind Exp $ */
+/* $NetBSD: npf.c,v 1.8 2012/02/20 00:18:19 rmind Exp $ */
/*-
* Copyright (c) 2009-2010 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf.c,v 1.7 2012/01/15 00:49:48 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf.c,v 1.8 2012/02/20 00:18:19 rmind Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -70,6 +70,7 @@ typedef struct {
npf_ruleset_t * n_rules;
npf_tableset_t * n_tables;
npf_ruleset_t * n_nat_rules;
+ bool n_default_pass;
} npf_core_t;
static void npf_core_destroy(npf_core_t *);
@@ -106,7 +107,7 @@ npf_init(void)
rset = npf_ruleset_create();
tset = npf_tableset_create();
nset = npf_ruleset_create();
- npf_reload(rset, tset, nset);
+ npf_reload(rset, tset, nset, true);
KASSERT(npf_core != NULL);
#ifdef _MODULE
@@ -265,12 +266,14 @@ npf_core_destroy(npf_core_t *nc)
* Then destroy old (unloaded) structures.
*/
void
-npf_reload(npf_ruleset_t *rset, npf_tableset_t *tset, npf_ruleset_t *nset)
+npf_reload(npf_ruleset_t *rset, npf_tableset_t *tset, npf_ruleset_t *nset,
+ bool flush)
{
npf_core_t *nc, *onc;
/* Setup a new core structure. */
- nc = kmem_alloc(sizeof(npf_core_t), KM_SLEEP);
+ nc = kmem_zalloc(sizeof(npf_core_t), KM_SLEEP);
+ nc->n_default_pass = flush;
nc->n_rules = rset;
nc->n_tables = tset;
nc->n_nat_rules = nset;
@@ -330,6 +333,13 @@ npf_core_locked(void)
return rw_lock_held(&npf_lock);
}
+bool
+npf_default_pass(void)
+{
+ KASSERT(rw_lock_held(&npf_lock));
+ return npf_core->n_default_pass;
+}
+
/*
* NPF statistics interface.
*/
Index: src/sys/net/npf/npf_alg.c
diff -u src/sys/net/npf/npf_alg.c:1.2 src/sys/net/npf/npf_alg.c:1.3
--- src/sys/net/npf/npf_alg.c:1.2 Thu Nov 11 06:30:39 2010
+++ src/sys/net/npf/npf_alg.c Mon Feb 20 00:18:19 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: npf_alg.c,v 1.2 2010/11/11 06:30:39 rmind Exp $ */
+/* $NetBSD: npf_alg.c,v 1.3 2012/02/20 00:18:19 rmind Exp $ */
/*-
* Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -36,10 +36,9 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_alg.c,v 1.2 2010/11/11 06:30:39 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_alg.c,v 1.3 2012/02/20 00:18:19 rmind Exp $");
#include <sys/param.h>
-#include <sys/kernel.h>
#include <sys/kmem.h>
#include <sys/pool.h>
#include <net/pfil.h>
@@ -83,7 +82,7 @@ npf_alg_register(npf_algfunc_t match, np
{
npf_alg_t *alg;
- alg = kmem_alloc(sizeof(npf_alg_t), KM_SLEEP);
+ alg = kmem_zalloc(sizeof(npf_alg_t), KM_SLEEP);
alg->na_bptr = alg;
alg->na_match_func = match;
alg->na_out_func = out;
Index: src/sys/net/npf/npf_log.c
diff -u src/sys/net/npf/npf_log.c:1.2 src/sys/net/npf/npf_log.c:1.3
--- src/sys/net/npf/npf_log.c:1.2 Tue Jan 18 20:33:46 2011
+++ src/sys/net/npf/npf_log.c Mon Feb 20 00:18:20 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: npf_log.c,v 1.2 2011/01/18 20:33:46 rmind Exp $ */
+/* $NetBSD: npf_log.c,v 1.3 2012/02/20 00:18:20 rmind Exp $ */
/*-
* Copyright (c) 2010-2011 The NetBSD Foundation, Inc.
@@ -34,10 +34,10 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_log.c,v 1.2 2011/01/18 20:33:46 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_log.c,v 1.3 2012/02/20 00:18:20 rmind Exp $");
#include <sys/param.h>
-#include <sys/kernel.h>
+#include <sys/types.h>
#include <sys/conf.h>
#include <sys/kmem.h>
Index: src/sys/net/npf/npf_alg_icmp.c
diff -u src/sys/net/npf/npf_alg_icmp.c:1.8 src/sys/net/npf/npf_alg_icmp.c:1.9
--- src/sys/net/npf/npf_alg_icmp.c:1.8 Tue Nov 29 20:05:30 2011
+++ src/sys/net/npf/npf_alg_icmp.c Mon Feb 20 00:18:19 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: npf_alg_icmp.c,v 1.8 2011/11/29 20:05:30 rmind Exp $ */
+/* $NetBSD: npf_alg_icmp.c,v 1.9 2012/02/20 00:18:19 rmind Exp $ */
/*-
* Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -34,10 +34,9 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_alg_icmp.c,v 1.8 2011/11/29 20:05:30 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_alg_icmp.c,v 1.9 2012/02/20 00:18:19 rmind Exp $");
#include <sys/param.h>
-#include <sys/kernel.h>
#include <sys/module.h>
#include <sys/pool.h>
Index: src/sys/net/npf/npf_sendpkt.c
diff -u src/sys/net/npf/npf_sendpkt.c:1.8 src/sys/net/npf/npf_sendpkt.c:1.9
--- src/sys/net/npf/npf_sendpkt.c:1.8 Tue Nov 29 20:05:30 2011
+++ src/sys/net/npf/npf_sendpkt.c Mon Feb 20 00:18:20 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: npf_sendpkt.c,v 1.8 2011/11/29 20:05:30 rmind Exp $ */
+/* $NetBSD: npf_sendpkt.c,v 1.9 2012/02/20 00:18:20 rmind Exp $ */
/*-
* Copyright (c) 2010-2011 The NetBSD Foundation, Inc.
@@ -34,10 +34,10 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_sendpkt.c,v 1.8 2011/11/29 20:05:30 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_sendpkt.c,v 1.9 2012/02/20 00:18:20 rmind Exp $");
#include <sys/param.h>
-#include <sys/kernel.h>
+#include <sys/types.h>
#include <netinet/in_systm.h>
#include <netinet/in.h>
Index: src/sys/net/npf/npf_ctl.c
diff -u src/sys/net/npf/npf_ctl.c:1.12 src/sys/net/npf/npf_ctl.c:1.13
--- src/sys/net/npf/npf_ctl.c:1.12 Sun Feb 5 00:37:13 2012
+++ src/sys/net/npf/npf_ctl.c Mon Feb 20 00:18:19 2012
@@ -1,7 +1,7 @@
-/* $NetBSD: npf_ctl.c,v 1.12 2012/02/05 00:37:13 rmind Exp $ */
+/* $NetBSD: npf_ctl.c,v 1.13 2012/02/20 00:18:19 rmind Exp $ */
/*-
- * Copyright (c) 2009-2011 The NetBSD Foundation, Inc.
+ * Copyright (c) 2009-2012 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This material is based upon work partially supported by The
@@ -37,11 +37,10 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_ctl.c,v 1.12 2012/02/05 00:37:13 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_ctl.c,v 1.13 2012/02/20 00:18:19 rmind Exp $");
#include <sys/param.h>
#include <sys/conf.h>
-#include <sys/kernel.h>
#include <prop/proplib.h>
@@ -479,7 +478,7 @@ npfctl_reload(u_long cmd, void *data)
* Finally - reload ruleset, tableset and NAT policies.
* Operation will be performed as a single transaction.
*/
- npf_reload(rlset, tblset, nset);
+ npf_reload(rlset, tblset, nset, flush);
/* Turn on/off session tracking accordingly. */
npf_session_tracking(!flush);
@@ -506,7 +505,9 @@ fail:
/* Error report. */
prop_dictionary_set_int32(errdict, "errno", error);
+#ifdef _KERNEL
prop_dictionary_copyout_ioctl(pref, cmd, errdict);
+#endif
prop_object_release(errdict);
return 0;
}
@@ -561,7 +562,9 @@ out: /* Error path. */
/* Error report. */
prop_dictionary_set_int32(errdict, "errno", error);
+#ifdef _KERNEL
prop_dictionary_copyout_ioctl(pref, cmd, errdict);
+#endif
prop_object_release(errdict);
return error;
}
Index: src/sys/net/npf/npf_handler.c
diff -u src/sys/net/npf/npf_handler.c:1.13 src/sys/net/npf/npf_handler.c:1.14
--- src/sys/net/npf/npf_handler.c:1.13 Mon Feb 6 23:30:14 2012
+++ src/sys/net/npf/npf_handler.c Mon Feb 20 00:18:19 2012
@@ -1,7 +1,7 @@
-/* $NetBSD: npf_handler.c,v 1.13 2012/02/06 23:30:14 rmind Exp $ */
+/* $NetBSD: npf_handler.c,v 1.14 2012/02/20 00:18:19 rmind Exp $ */
/*-
- * Copyright (c) 2009-2010 The NetBSD Foundation, Inc.
+ * Copyright (c) 2009-2012 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This material is based upon work partially supported by The
@@ -34,10 +34,10 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_handler.c,v 1.13 2012/02/06 23:30:14 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_handler.c,v 1.14 2012/02/20 00:18:19 rmind Exp $");
+#include <sys/types.h>
#include <sys/param.h>
-#include <sys/systm.h>
#include <sys/mbuf.h>
#include <sys/mutex.h>
@@ -61,8 +61,6 @@ static struct pfil_head * npf_ph_if = NU
static struct pfil_head * npf_ph_inet = NULL;
static struct pfil_head * npf_ph_inet6 = NULL;
-static bool default_pass = true;
-
int npf_packet_handler(void *, struct mbuf **, ifnet_t *, int);
/*
@@ -89,26 +87,28 @@ npf_packet_handler(void *arg, struct mbu
npf_ruleset_t *rlset;
npf_rule_t *rl;
npf_rproc_t *rp;
- int retfl, error, ret;
+ int error, retfl;
+ int decision;
/*
* Initialise packet information cache.
* Note: it is enough to clear the info bits.
*/
npc.npc_info = 0;
+ decision = NPF_DECISION_BLOCK;
error = 0;
retfl = 0;
rp = NULL;
- ret = 0;
/* Cache everything. Determine whether it is an IP fragment. */
if (npf_cache_all(&npc, nbuf) & NPC_IPFRAG) {
+ int ret = -1;
+
/* Pass to IPv4 or IPv6 reassembly mechanism. */
if (npf_iscached(&npc, NPC_IP4)) {
struct ip *ip = nbuf_dataptr(*mp);
ret = ip_reass_packet(mp, ip);
- } else {
- KASSERT(npf_iscached(&npc, NPC_IP6));
+ } else if (npf_iscached(&npc, NPC_IP6)) {
#ifdef INET6
/*
* Note: frag6_input() offset is the start of the
@@ -116,11 +116,8 @@ npf_packet_handler(void *arg, struct mbu
*/
const u_int hlen = npf_cache_hlen(&npc);
ret = ip6_reass_packet(mp, hlen);
-#else
- ret = -1;
#endif
}
-
if (ret) {
error = EINVAL;
se = NULL;
@@ -137,7 +134,9 @@ npf_packet_handler(void *arg, struct mbu
*/
nbuf = (nbuf_t *)*mp;
npc.npc_info = 0;
- (void)npf_cache_all(&npc, nbuf);
+
+ ret = npf_cache_all(&npc, nbuf);
+ KASSERT((ret & NPC_IPFRAG) == 0);
}
/* Inspect the list of sessions. */
@@ -146,8 +145,10 @@ npf_packet_handler(void *arg, struct mbu
/* If "passing" session found - skip the ruleset inspection. */
if (se && npf_session_pass(se, &rp)) {
npf_stats_inc(NPF_STAT_PASS_SESSION);
+ KASSERT(error == 0);
goto pass;
- } else if (error) {
+ }
+ if (error) {
goto block;
}
@@ -156,13 +157,14 @@ npf_packet_handler(void *arg, struct mbu
rlset = npf_core_ruleset();
rl = npf_ruleset_inspect(&npc, nbuf, rlset, ifp, di, NPF_LAYER_3);
if (rl == NULL) {
+ bool default_pass = npf_default_pass();
npf_core_exit();
+
if (default_pass) {
npf_stats_inc(NPF_STAT_PASS_DEFAULT);
goto pass;
}
npf_stats_inc(NPF_STAT_BLOCK_DEFAULT);
- error = ENETUNREACH;
goto block;
}
@@ -181,20 +183,21 @@ npf_packet_handler(void *arg, struct mbu
}
npf_stats_inc(NPF_STAT_PASS_RULESET);
- /* Establish a "pass" session, if required. */
+ /*
+ * Establish a "pass" session, if required. Just proceed, if session
+ * creation fails (e.g. due to unsupported protocol).
+ *
+ * Note: the reference on the rule procedure is transfered to the
+ * session. It will be released on session destruction.
+ */
if ((retfl & NPF_RULE_KEEPSTATE) != 0 && !se) {
se = npf_session_establish(&npc, nbuf, di);
- if (se == NULL) {
- error = ENOMEM;
- goto out;
+ if (se) {
+ npf_session_setpass(se, rp);
}
- /*
- * Note: the reference to the rule procedure is transfered to
- * the session. It will be released on session destruction.
- */
- npf_session_setpass(se, rp);
}
pass:
+ decision = NPF_DECISION_PASS;
KASSERT(error == 0);
/*
* Perform NAT.
@@ -218,8 +221,8 @@ out:
npf_rproc_release(rp);
}
- /* Pass the packet, if no error. */
- if (!error) {
+ /* Pass the packet if decided and there is no error. */
+ if (decision == NPF_DECISION_PASS && !error) {
/*
* XXX: Disable for now, it will be set accordingly later,
* for optimisations (to reduce inspection).
@@ -236,9 +239,10 @@ out:
if (retfl) {
npf_return_block(&npc, nbuf, retfl);
}
- if (error != ENETUNREACH) {
- NPF_PRINTF(("NPF: error in handler '%d'\n", error));
+ if (error) {
npf_stats_inc(NPF_STAT_ERROR);
+ } else {
+ error = ENETUNREACH;
}
m_freem(*mp);
*mp = NULL;
@@ -267,7 +271,7 @@ npf_register_pfil(void)
npf_ph_if = pfil_head_get(PFIL_TYPE_IFNET, 0);
npf_ph_inet = pfil_head_get(PFIL_TYPE_AF, AF_INET);
npf_ph_inet6 = pfil_head_get(PFIL_TYPE_AF, AF_INET6);
- if (npf_ph_if == NULL || npf_ph_inet == NULL) {
+ if (npf_ph_if == NULL || npf_ph_inet == NULL || npf_ph_inet6 == NULL) {
npf_ph_if = NULL;
error = ENOENT;
goto fail;
Index: src/sys/net/npf/npf_impl.h
diff -u src/sys/net/npf/npf_impl.h:1.10 src/sys/net/npf/npf_impl.h:1.11
--- src/sys/net/npf/npf_impl.h:1.10 Mon Feb 6 23:30:14 2012
+++ src/sys/net/npf/npf_impl.h Mon Feb 20 00:18:19 2012
@@ -1,7 +1,7 @@
-/* $NetBSD: npf_impl.h,v 1.10 2012/02/06 23:30:14 rmind Exp $ */
+/* $NetBSD: npf_impl.h,v 1.11 2012/02/20 00:18:19 rmind Exp $ */
/*-
- * Copyright (c) 2009-2011 The NetBSD Foundation, Inc.
+ * Copyright (c) 2009-2012 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This material is based upon work partially supported by The
@@ -91,6 +91,9 @@ typedef npf_table_t * npf_tableset_t;
* DEFINITIONS.
*/
+#define NPF_DECISION_BLOCK 0
+#define NPF_DECISION_PASS 1
+
typedef bool (*npf_algfunc_t)(npf_cache_t *, nbuf_t *, void *);
#define NPF_NCODE_LIMIT 1024
@@ -127,7 +130,9 @@ npf_ruleset_t * npf_core_natset(void);
npf_tableset_t *npf_core_tableset(void);
void npf_core_exit(void);
bool npf_core_locked(void);
-void npf_reload(npf_ruleset_t *, npf_tableset_t *, npf_ruleset_t *);
+bool npf_default_pass(void);
+void npf_reload(npf_ruleset_t *, npf_tableset_t *,
+ npf_ruleset_t *, bool);
void npflogattach(int);
void npflogdetach(void);
Index: src/sys/net/npf/npf_inet.c
diff -u src/sys/net/npf/npf_inet.c:1.10 src/sys/net/npf/npf_inet.c:1.11
--- src/sys/net/npf/npf_inet.c:1.10 Tue Nov 29 20:05:30 2011
+++ src/sys/net/npf/npf_inet.c Mon Feb 20 00:18:19 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: npf_inet.c,v 1.10 2011/11/29 20:05:30 rmind Exp $ */
+/* $NetBSD: npf_inet.c,v 1.11 2012/02/20 00:18:19 rmind Exp $ */
/*-
* Copyright (c) 2009-2011 The NetBSD Foundation, Inc.
@@ -34,10 +34,10 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_inet.c,v 1.10 2011/11/29 20:05:30 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_inet.c,v 1.11 2012/02/20 00:18:19 rmind Exp $");
#include <sys/param.h>
-#include <sys/kernel.h>
+#include <sys/types.h>
#include <net/pfil.h>
#include <net/if.h>
Index: src/sys/net/npf/npf_nat.c
diff -u src/sys/net/npf/npf_nat.c:1.10 src/sys/net/npf/npf_nat.c:1.11
--- src/sys/net/npf/npf_nat.c:1.10 Sun Feb 5 00:37:13 2012
+++ src/sys/net/npf/npf_nat.c Mon Feb 20 00:18:20 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: npf_nat.c,v 1.10 2012/02/05 00:37:13 rmind Exp $ */
+/* $NetBSD: npf_nat.c,v 1.11 2012/02/20 00:18:20 rmind Exp $ */
/*-
* Copyright (c) 2010-2011 The NetBSD Foundation, Inc.
@@ -76,10 +76,10 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_nat.c,v 1.10 2012/02/05 00:37:13 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_nat.c,v 1.11 2012/02/20 00:18:20 rmind Exp $");
#include <sys/param.h>
-#include <sys/kernel.h>
+#include <sys/types.h>
#include <sys/atomic.h>
#include <sys/bitops.h>
Index: src/sys/net/npf/npf_ruleset.c
diff -u src/sys/net/npf/npf_ruleset.c:1.10 src/sys/net/npf/npf_ruleset.c:1.11
--- src/sys/net/npf/npf_ruleset.c:1.10 Mon Feb 6 23:30:14 2012
+++ src/sys/net/npf/npf_ruleset.c Mon Feb 20 00:18:20 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: npf_ruleset.c,v 1.10 2012/02/06 23:30:14 rmind Exp $ */
+/* $NetBSD: npf_ruleset.c,v 1.11 2012/02/20 00:18:20 rmind Exp $ */
/*-
* Copyright (c) 2009-2012 The NetBSD Foundation, Inc.
@@ -34,10 +34,10 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_ruleset.c,v 1.10 2012/02/06 23:30:14 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_ruleset.c,v 1.11 2012/02/20 00:18:20 rmind Exp $");
#include <sys/param.h>
-#include <sys/kernel.h>
+#include <sys/types.h>
#include <sys/kmem.h>
#include <sys/queue.h>
@@ -208,7 +208,7 @@ npf_rule_alloc(prop_dictionary_t rldict,
int errat __unused;
/* Allocate a rule structure. */
- rl = kmem_alloc(sizeof(npf_rule_t), KM_SLEEP);
+ rl = kmem_zalloc(sizeof(npf_rule_t), KM_SLEEP);
TAILQ_INIT(&rl->r_subset.rs_queue);
rl->r_natp = NULL;
@@ -217,14 +217,14 @@ npf_rule_alloc(prop_dictionary_t rldict,
rl->r_ncode = nc;
rl->r_nc_size = nc_size;
- /* Name (string, optional) */
+ /* Name (optional) */
if (prop_dictionary_get_cstring_nocopy(rldict, "name", &rname)) {
strlcpy(rl->r_name, rname, NPF_RNAME_LEN);
} else {
rl->r_name[0] = '\0';
}
- /* Attributes, priority and interface ID. */
+ /* Attributes, priority and interface ID (optional). */
prop_dictionary_get_uint32(rldict, "attributes", &rl->r_attr);
prop_dictionary_get_int32(rldict, "priority", &rl->r_priority);
prop_dictionary_get_uint32(rldict, "interface", &rl->r_ifid);
Index: src/sys/net/npf/npf_session.c
diff -u src/sys/net/npf/npf_session.c:1.10 src/sys/net/npf/npf_session.c:1.11
--- src/sys/net/npf/npf_session.c:1.10 Tue Nov 29 20:05:30 2011
+++ src/sys/net/npf/npf_session.c Mon Feb 20 00:18:20 2012
@@ -1,7 +1,7 @@
-/* $NetBSD: npf_session.c,v 1.10 2011/11/29 20:05:30 rmind Exp $ */
+/* $NetBSD: npf_session.c,v 1.11 2012/02/20 00:18:20 rmind Exp $ */
/*-
- * Copyright (c) 2010-2011 The NetBSD Foundation, Inc.
+ * Copyright (c) 2010-2012 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This material is based upon work partially supported by The
@@ -74,10 +74,10 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_session.c,v 1.10 2011/11/29 20:05:30 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_session.c,v 1.11 2012/02/20 00:18:20 rmind Exp $");
#include <sys/param.h>
-#include <sys/kernel.h>
+#include <sys/types.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
@@ -93,7 +93,6 @@ __KERNEL_RCSID(0, "$NetBSD: npf_session.
#include <sys/rwlock.h>
#include <sys/queue.h>
#include <sys/systm.h>
-#include <sys/types.h>
#include "npf_impl.h"
@@ -277,7 +276,7 @@ sess_htable_create(void)
npf_sehash_t *stbl, *sh;
u_int i;
- stbl = kmem_alloc(SESS_HASH_BUCKETS * sizeof(*sh), KM_SLEEP);
+ stbl = kmem_zalloc(SESS_HASH_BUCKETS * sizeof(*sh), KM_SLEEP);
if (stbl == NULL) {
return NULL;
}
@@ -406,7 +405,10 @@ npf_session_inspect(npf_cache_t *npc, nb
npf_sentry_t *sen;
npf_session_t *se;
- /* Layer 3 and 4 should be already cached for session tracking. */
+ /*
+ * If layer 3 and 4 are not cached - protocol is not supported
+ * or packet is invalid.
+ */
if (!sess_tracking || !npf_iscached(npc, NPC_IP46) ||
!npf_iscached(npc, NPC_LAYER4)) {
return NULL;
@@ -491,7 +493,7 @@ npf_session_inspect(npf_cache_t *npc, nb
/*
* npf_establish_session: create a new session, insert into the global list.
*
- * => Sessions is created with the held reference (for caller).
+ * => Session is created with the reference held for the caller.
*/
npf_session_t *
npf_session_establish(const npf_cache_t *npc, nbuf_t *nbuf, const int di)
@@ -504,11 +506,14 @@ npf_session_establish(const npf_cache_t
int proto, sz;
bool ok;
- if (!sess_tracking) {
+ /*
+ * If layer 3 and 4 are not cached - protocol is not supported
+ * or packet is invalid.
+ */
+ if (!sess_tracking || !npf_iscached(npc, NPC_IP46) ||
+ !npf_iscached(npc, NPC_LAYER4)) {
return NULL;
}
- KASSERT(npf_iscached(npc, NPC_IP46));
- KASSERT(npf_iscached(npc, NPC_LAYER4));
/* Allocate and initialise new state. */
se = pool_cache_get(sess_cache, PR_NOWAIT);
Index: src/sys/net/npf/npf_instr.c
diff -u src/sys/net/npf/npf_instr.c:1.9 src/sys/net/npf/npf_instr.c:1.10
--- src/sys/net/npf/npf_instr.c:1.9 Sun Jan 15 00:49:48 2012
+++ src/sys/net/npf/npf_instr.c Mon Feb 20 00:18:20 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: npf_instr.c,v 1.9 2012/01/15 00:49:48 rmind Exp $ */
+/* $NetBSD: npf_instr.c,v 1.10 2012/02/20 00:18:20 rmind Exp $ */
/*-
* Copyright (c) 2009-2010 The NetBSD Foundation, Inc.
@@ -34,10 +34,10 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_instr.c,v 1.9 2012/01/15 00:49:48 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_instr.c,v 1.10 2012/02/20 00:18:20 rmind Exp $");
#include <sys/param.h>
-#include <sys/kernel.h>
+#include <sys/types.h>
#include <net/if.h>
#include <net/ethertypes.h>
Index: src/sys/net/npf/npf_processor.c
diff -u src/sys/net/npf/npf_processor.c:1.9 src/sys/net/npf/npf_processor.c:1.10
--- src/sys/net/npf/npf_processor.c:1.9 Sun Feb 5 00:37:13 2012
+++ src/sys/net/npf/npf_processor.c Mon Feb 20 00:18:20 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: npf_processor.c,v 1.9 2012/02/05 00:37:13 rmind Exp $ */
+/* $NetBSD: npf_processor.c,v 1.10 2012/02/20 00:18:20 rmind Exp $ */
/*-
* Copyright (c) 2009-2010 The NetBSD Foundation, Inc.
@@ -47,17 +47,12 @@
* N-code memory address and thus instructions should be word aligned.
* All processing is done in 32 bit words, since both instructions (their
* codes) and arguments use 32 bits words.
- *
- * TODO:
- * - There is some space for better a abstraction. Duplicated opcode
- * maintenance in npf_ncode_process() and nc_insn_check() might be avoided.
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_processor.c,v 1.9 2012/02/05 00:37:13 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_processor.c,v 1.10 2012/02/20 00:18:20 rmind Exp $");
#include <sys/param.h>
-#include <sys/kernel.h>
#include <sys/types.h>
#include <sys/kmem.h>
Index: src/sys/net/npf/npf_tableset.c
diff -u src/sys/net/npf/npf_tableset.c:1.9 src/sys/net/npf/npf_tableset.c:1.10
--- src/sys/net/npf/npf_tableset.c:1.9 Sun Jan 15 00:49:49 2012
+++ src/sys/net/npf/npf_tableset.c Mon Feb 20 00:18:20 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: npf_tableset.c,v 1.9 2012/01/15 00:49:49 rmind Exp $ */
+/* $NetBSD: npf_tableset.c,v 1.10 2012/02/20 00:18:20 rmind Exp $ */
/*-
* Copyright (c) 2009-2012 The NetBSD Foundation, Inc.
@@ -39,10 +39,10 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_tableset.c,v 1.9 2012/01/15 00:49:49 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_tableset.c,v 1.10 2012/02/20 00:18:20 rmind Exp $");
#include <sys/param.h>
-#include <sys/kernel.h>
+#include <sys/types.h>
#include <sys/atomic.h>
#include <sys/hash.h>
Index: src/sys/net/npf/npf_rproc.c
diff -u src/sys/net/npf/npf_rproc.c:1.1 src/sys/net/npf/npf_rproc.c:1.2
--- src/sys/net/npf/npf_rproc.c:1.1 Mon Feb 6 23:30:14 2012
+++ src/sys/net/npf/npf_rproc.c Mon Feb 20 00:18:20 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: npf_rproc.c,v 1.1 2012/02/06 23:30:14 rmind Exp $ */
+/* $NetBSD: npf_rproc.c,v 1.2 2012/02/20 00:18:20 rmind Exp $ */
/*-
* Copyright (c) 2009-2012 The NetBSD Foundation, Inc.
@@ -37,11 +37,10 @@
__KERNEL_RCSID(0, "$NetBSD");
#include <sys/param.h>
-#include <sys/kernel.h>
+#include <sys/types.h>
#include <sys/atomic.h>
#include <sys/kmem.h>
-#include <sys/types.h>
#include "npf_impl.h"
@@ -69,7 +68,7 @@ npf_rproc_create(prop_dictionary_t rpdic
npf_rproc_t *rp;
const char *rname;
- rp = kmem_zalloc(sizeof(npf_rproc_t), KM_SLEEP);
+ rp = kmem_intr_zalloc(sizeof(npf_rproc_t), KM_SLEEP);
rp->rp_refcnt = 1;
/* Name and flags. */
@@ -107,7 +106,7 @@ npf_rproc_release(npf_rproc_t *rp)
if (atomic_dec_uint_nv(&rp->rp_refcnt) != 0) {
return;
}
- kmem_free(rp, sizeof(npf_rproc_t));
+ kmem_intr_free(rp, sizeof(npf_rproc_t));
}
void
Index: src/usr.sbin/npf/npfctl/npf_build.c
diff -u src/usr.sbin/npf/npfctl/npf_build.c:1.4 src/usr.sbin/npf/npfctl/npf_build.c:1.5
--- src/usr.sbin/npf/npfctl/npf_build.c:1.4 Mon Feb 6 00:37:52 2012
+++ src/usr.sbin/npf/npfctl/npf_build.c Mon Feb 20 00:18:19 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: npf_build.c,v 1.4 2012/02/06 00:37:52 rmind Exp $ */
+/* $NetBSD: npf_build.c,v 1.5 2012/02/20 00:18:19 rmind Exp $ */
/*-
* Copyright (c) 2011-2012 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: npf_build.c,v 1.4 2012/02/06 00:37:52 rmind Exp $");
+__RCSID("$NetBSD: npf_build.c,v 1.5 2012/02/20 00:18:19 rmind Exp $");
#include <sys/types.h>
#include <sys/ioctl.h>
@@ -400,9 +400,8 @@ npfctl_build_group(const char *name, int
} else if ((attr & attr_di) == 0) {
attr |= attr_di;
}
- attr |= (NPF_RULE_PASS | NPF_RULE_FINAL);
- rl = npf_rule_create(name, attr, if_idx);
+ rl = npf_rule_create(name, attr | NPF_RULE_FINAL, if_idx);
npf_rule_insert(npf_conf, NULL, rl, NPF_PRI_NEXT);
current_group = rl;
}