Module Name:    src
Committed By:   rmind
Date:           Sun Jun 29 00:05:24 UTC 2014

Modified Files:
        src/sys/net/npf: npf.h npf_bpf.c
        src/usr.sbin/npf/npfctl: npf_bpf_comp.c

Log Message:
NPF:
- Populate the BPF external memory store with L3 information.
- Eliminate NPF_COP_L3 call and just use the data in the memstore.
- Bump NPF_VERSION.


To generate a diff of this commit:
cvs rdiff -u -r1.41 -r1.42 src/sys/net/npf/npf.h
cvs rdiff -u -r1.8 -r1.9 src/sys/net/npf/npf_bpf.c
cvs rdiff -u -r1.6 -r1.7 src/usr.sbin/npf/npfctl/npf_bpf_comp.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.h
diff -u src/sys/net/npf/npf.h:1.41 src/sys/net/npf/npf.h:1.42
--- src/sys/net/npf/npf.h:1.41	Wed Jun 25 00:20:06 2014
+++ src/sys/net/npf/npf.h	Sun Jun 29 00:05:24 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: npf.h,v 1.41 2014/06/25 00:20:06 rmind Exp $	*/
+/*	$NetBSD: npf.h,v 1.42 2014/06/29 00:05:24 rmind Exp $	*/
 
 /*-
  * Copyright (c) 2009-2014 The NetBSD Foundation, Inc.
@@ -45,7 +45,7 @@
 #include <netinet/in_systm.h>
 #include <netinet/in.h>
 
-#define	NPF_VERSION		13
+#define	NPF_VERSION		14
 
 /*
  * Public declarations and definitions.

Index: src/sys/net/npf/npf_bpf.c
diff -u src/sys/net/npf/npf_bpf.c:1.8 src/sys/net/npf/npf_bpf.c:1.9
--- src/sys/net/npf/npf_bpf.c:1.8	Wed Jun 25 00:20:06 2014
+++ src/sys/net/npf/npf_bpf.c	Sun Jun 29 00:05:24 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: npf_bpf.c,v 1.8 2014/06/25 00:20:06 rmind Exp $	*/
+/*	$NetBSD: npf_bpf.c,v 1.9 2014/06/29 00:05:24 rmind Exp $	*/
 
 /*-
  * Copyright (c) 2009-2013 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_bpf.c,v 1.8 2014/06/25 00:20:06 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_bpf.c,v 1.9 2014/06/29 00:05:24 rmind Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -78,7 +78,7 @@ npf_bpf_sysfini(void)
 }
 
 void
-npf_bpf_prepare(npf_cache_t *npc, nbuf_t *nbuf, bpf_args_t *args, uint32_t *m)
+npf_bpf_prepare(npf_cache_t *npc, nbuf_t *nbuf, bpf_args_t *args, uint32_t *M)
 {
 	const struct mbuf *mbuf = nbuf_head_mbuf(nbuf);
 	const size_t pktlen = m_length(mbuf);
@@ -87,19 +87,39 @@ npf_bpf_prepare(npf_cache_t *npc, nbuf_t
 	args->pkt = (const uint8_t *)mbuf;
 	args->wirelen = pktlen;
 	args->buflen = 0;
-	args->mem = m;
+	args->mem = M;
 	args->arg = npc;
+
+	/*
+	 * Convert address length to IP version.  Just mask out
+	 * number 4 or set 6 if higher bits set, such that:
+	 *
+	 *	0	=>	0
+	 *	4	=>	4 (IPVERSION)
+	 *	16	=>	6 (IPV6_VERSION >> 4)
+	 */
+	const u_int alen = npc->npc_alen;
+	const uint32_t ver = (alen & 4) | ((alen >> 4) * 6);
+
+	/*
+	 * Output words in the memory store:
+	 *	BPF_MW_IPVER	IP version (4 or 6).
+	 *	BPF_MW_L4OFF	L4 header offset.
+	 *	BPF_MW_L4PROTO	L4 protocol.
+	 */
+	M[BPF_MW_IPVER] = ver;
+	M[BPF_MW_L4OFF] = npc->npc_hlen;
+	M[BPF_MW_L4PROTO] = npc->npc_proto;
 }
 
 int
 npf_bpf_filter(bpf_args_t *args, const void *code, bpfjit_func_t jcode)
 {
-#if 0
 	/* Execute JIT-compiled code. */
 	if (__predict_true(jcode)) {
 		return jcode(npf_bpfctx, args);
 	}
-#endif
+
 	/* Execute BPF byte-code. */
 	return bpf_filter_ext(npf_bpfctx, code, args);
 }
@@ -123,35 +143,18 @@ npf_bpf_validate(const void *code, size_
 
 /*
  * NPF_COP_L3: fetches layer 3 information.
- *
- * Output words in the memory store:
- *	BPF_MW_IPVER	IP version (4 or 6).
- *	BPF_MW_L4OFF	L4 header offset.
- *	BPF_MW_L4PROTO	L4 protocol.
  */
 static uint32_t
 npf_cop_l3(const bpf_ctx_t *bc, bpf_args_t *args, uint32_t A)
 {
 	const npf_cache_t * const npc = (const npf_cache_t *)args->arg;
+	const uint32_t ver = (npc->npc_alen & 4) | ((npc->npc_alen >> 4) * 6);
 	uint32_t * const M = args->mem;
 
-	/*
-	 * Convert address length to IP version.  Just mask out
-	 * number 4 or set 6 if higher bits set, such that:
-	 *
-	 *	0	=>	0
-	 *	4	=>	4 (IPVERSION)
-	 *	16	=>	6 (IPV6_VERSION >> 4)
-	 */
-	const u_int alen = npc->npc_alen;
-	const uint32_t ver = (alen & 4) | ((alen >> 4) * 6);
-
 	M[BPF_MW_IPVER] = ver;
 	M[BPF_MW_L4OFF] = npc->npc_hlen;
 	M[BPF_MW_L4PROTO] = npc->npc_proto;
-
-	/* A <- IP version */
-	return ver;
+	return ver; /* A <- IP version */
 }
 
 #define	SRC_FLAG_BIT	(1U << 31)

Index: src/usr.sbin/npf/npfctl/npf_bpf_comp.c
diff -u src/usr.sbin/npf/npfctl/npf_bpf_comp.c:1.6 src/usr.sbin/npf/npfctl/npf_bpf_comp.c:1.7
--- src/usr.sbin/npf/npfctl/npf_bpf_comp.c:1.6	Sat May 31 22:41:37 2014
+++ src/usr.sbin/npf/npfctl/npf_bpf_comp.c	Sun Jun 29 00:05:24 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: npf_bpf_comp.c,v 1.6 2014/05/31 22:41:37 rmind Exp $	*/
+/*	$NetBSD: npf_bpf_comp.c,v 1.7 2014/06/29 00:05:24 rmind Exp $	*/
 
 /*-
  * Copyright (c) 2010-2014 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: npf_bpf_comp.c,v 1.6 2014/05/31 22:41:37 rmind Exp $");
+__RCSID("$NetBSD: npf_bpf_comp.c,v 1.7 2014/06/29 00:05:24 rmind Exp $");
 
 #include <stdlib.h>
 #include <stdbool.h>
@@ -284,8 +284,7 @@ fetch_l3(npf_bpf_t *ctx, sa_family_t af,
 	}
 
 	/*
-	 * Call NPF_COP_L3 to fetch L3 information.  The coprocessor
-	 * populates the following words in the scratch memory store:
+	 * The memory store is populated with:
 	 * - BPF_MW_IPVER: IP version (4 or 6).
 	 * - BPF_MW_L4OFF: L4 header offset.
 	 * - BPF_MW_L4PROTO: L4 protocol.
@@ -308,21 +307,12 @@ fetch_l3(npf_bpf_t *ctx, sa_family_t af,
 		 * A <- IP version; A == expected-version?
 		 * If no particular version specified, check for non-zero.
 		 */
-		if ((ctx->flags & FETCHED_L3) == 0) {
-			struct bpf_insn insns_l3[] = {
-				BPF_STMT(BPF_MISC+BPF_COP, NPF_COP_L3),
-				BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, ver, jt, jf),
-			};
-			add_insns(ctx, insns_l3, __arraycount(insns_l3));
-			ctx->flags |= FETCHED_L3;
-		} else {
-			/* IP version is already fetched in BPF_MW_IPVER. */
-			struct bpf_insn insns_af[] = {
-				BPF_STMT(BPF_LD+BPF_W+BPF_MEM, BPF_MW_IPVER),
-				BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, ver, jt, jf),
-			};
-			add_insns(ctx, insns_af, __arraycount(insns_af));
-		}
+		struct bpf_insn insns_af[] = {
+			BPF_STMT(BPF_LD+BPF_W+BPF_MEM, BPF_MW_IPVER),
+			BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, ver, jt, jf),
+		};
+		add_insns(ctx, insns_af, __arraycount(insns_af));
+		ctx->flags |= FETCHED_L3;
 		ctx->af = af;
 
 		if (af) {

Reply via email to