Module Name: src Committed By: rmind Date: Thu Dec 8 23:36:57 UTC 2011
Modified Files: src/sys/net/npf: npf_ruleset.c npf_state_tcp.c Log Message: - Explain the magic in npf_tcpfl2case(). - Use __unused instead of (void)cast; fix comment. To generate a diff of this commit: cvs rdiff -u -r1.7 -r1.8 src/sys/net/npf/npf_ruleset.c cvs rdiff -u -r1.2 -r1.3 src/sys/net/npf/npf_state_tcp.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_ruleset.c diff -u src/sys/net/npf/npf_ruleset.c:1.7 src/sys/net/npf/npf_ruleset.c:1.8 --- src/sys/net/npf/npf_ruleset.c:1.7 Wed Feb 2 02:20:25 2011 +++ src/sys/net/npf/npf_ruleset.c Thu Dec 8 23:36:57 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: npf_ruleset.c,v 1.7 2011/02/02 02:20:25 rmind Exp $ */ +/* $NetBSD: npf_ruleset.c,v 1.8 2011/12/08 23:36:57 rmind Exp $ */ /*- * Copyright (c) 2009-2011 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: npf_ruleset.c,v 1.7 2011/02/02 02:20:25 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: npf_ruleset.c,v 1.8 2011/12/08 23:36:57 rmind Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -306,7 +306,7 @@ npf_rule_alloc(prop_dictionary_t rldict, { npf_rule_t *rl; const char *rname; - int errat; + int errat __unused; /* Allocate a rule structure. */ rl = kmem_alloc(sizeof(npf_rule_t), KM_SLEEP); @@ -316,7 +316,6 @@ npf_rule_alloc(prop_dictionary_t rldict, rl->r_natp = NULL; /* N-code. */ - (void)errat; KASSERT(nc == NULL || npf_ncode_validate(nc, nc_size, &errat) == 0); rl->r_ncode = nc; rl->r_nc_size = nc_size; Index: src/sys/net/npf/npf_state_tcp.c diff -u src/sys/net/npf/npf_state_tcp.c:1.2 src/sys/net/npf/npf_state_tcp.c:1.3 --- src/sys/net/npf/npf_state_tcp.c:1.2 Mon Dec 5 00:34:25 2011 +++ src/sys/net/npf/npf_state_tcp.c Thu Dec 8 23:36:57 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: npf_state_tcp.c,v 1.2 2011/12/05 00:34:25 rmind Exp $ */ +/* $NetBSD: npf_state_tcp.c,v 1.3 2011/12/08 23:36:57 rmind Exp $ */ /*- * Copyright (c) 2010-2011 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: npf_state_tcp.c,v 1.2 2011/12/05 00:34:25 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: npf_state_tcp.c,v 1.3 2011/12/08 23:36:57 rmind Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -115,9 +115,24 @@ npf_tcpfl2case(const int tcpfl) { u_int i, c; + CTASSERT(TH_FIN == 0x01); + CTASSERT(TH_SYN == 0x02); + CTASSERT(TH_ACK == 0x10); + /* - * Magic value maps flag combinations to TCPFC case numbers. - * Other cases are zero. Note: FIN-ACK is mapped to FIN. + * Flags are shifted to use three least significant bits, thus each + * flag combination has a unique number ranging from 0 to 7, e.g. + * TH_SYN | TH_ACK has number 6, since (0x02 | (0x10 >> 2)) == 6. + * However, the requirement is to have number 0 for invalid cases, + * such as TH_SYN | TH_FIN, and to have the same number for TH_FIN + * and TH_FIN|TH_ACK cases. Thus, we generate a mask assigning 3 + * bits for each number, which contains the actual case numbers: + * + * TCPFC_SYNACK << (6 << 2) == 0x2000000 (6 - SYN,ACK) + * TCPFC_FIN << (5 << 2) == 0x0400000 (5 - FIN,ACK) + * ... + * + * Hence, OR'ed mask value is 0x2430140. */ i = (tcpfl & (TH_SYN | TH_FIN)) | ((tcpfl & TH_ACK) >> 2); c = (0x2430140 >> (i << 2)) & 7; @@ -291,7 +306,7 @@ npf_tcp_inwindow(const npf_cache_t *npc, * Rooij G., "Real stateful TCP packet filtering in IP Filter", * 10th USENIX Security Symposium invited talk, Aug. 2001. * - * There four boundaries are defined as following: + * There are four boundaries defined as following: * I) SEQ + LEN <= MAX { SND.ACK + MAX(SND.WIN, 1) } * II) SEQ >= MAX { SND.SEQ + SND.LEN - MAX(RCV.WIN, 1) } * III) ACK <= MAX { RCV.SEQ + RCV.LEN }