PERFORCE change 145769 for review

Gleb Kurtsou gk at FreeBSD.org
Thu Jul 24 08:16:39 UTC 2008


http://perforce.freebsd.org/chv.cgi?CH=145769

Change 145769 by gk at gk_h1 on 2008/07/24 08:16:05

	add per rule flag PFRULE_ETHERSTATE: conditionally perform stateful ethernet filtering. 
	usage: pass log on bridge0 from <test1> to <test1> keep state (ether) 

Affected files ...

.. //depot/projects/soc2008/gk_l2filter/sbin-pfctl/parse.y#4 edit
.. //depot/projects/soc2008/gk_l2filter/sbin-pfctl/pfctl_parser.c#5 edit
.. //depot/projects/soc2008/gk_l2filter/sys-pf/net/pf.c#7 edit
.. //depot/projects/soc2008/gk_l2filter/sys-pf/net/pfvar.h#6 edit

Differences ...

==== //depot/projects/soc2008/gk_l2filter/sbin-pfctl/parse.y#4 (text+ko) ====

@@ -128,7 +128,7 @@
 	    PF_STATE_OPT_MAX_SRC_STATES, PF_STATE_OPT_MAX_SRC_CONN,
 	    PF_STATE_OPT_MAX_SRC_CONN_RATE, PF_STATE_OPT_MAX_SRC_NODES,
 	    PF_STATE_OPT_OVERLOAD, PF_STATE_OPT_STATELOCK,
-	    PF_STATE_OPT_TIMEOUT };
+	    PF_STATE_OPT_TIMEOUT, PF_STATE_OPT_ETHER };
 
 enum	{ PF_SRCTRACK_NONE, PF_SRCTRACK, PF_SRCTRACK_GLOBAL, PF_SRCTRACK_RULE };
 
@@ -1906,6 +1906,10 @@
 					}
 					r.timeout[o->data.timeout.number] =
 					    o->data.timeout.seconds;
+					break;
+				case PF_STATE_OPT_ETHER:
+					r.rule_flag |= PFRULE_ETHERSTATE;
+					break;
 				}
 				o = o->next;
 				free(p);
@@ -3207,6 +3211,14 @@
 			$$->next = NULL;
 			$$->tail = $$;
 		}
+		| ETHER {
+			$$ = calloc(1, sizeof(struct node_state_opt));
+			if ($$ == NULL)
+				err(1, "state_opt_item: calloc");
+			$$->type = PF_STATE_OPT_ETHER;
+			$$->next = NULL;
+			$$->tail = $$;
+		}
 		| sourcetrack {
 			$$ = calloc(1, sizeof(struct node_state_opt));
 			if ($$ == NULL)

==== //depot/projects/soc2008/gk_l2filter/sbin-pfctl/pfctl_parser.c#5 (text+ko) ====

@@ -877,6 +877,8 @@
 	for (i = 0; !opts && i < PFTM_MAX; ++i)
 		if (r->timeout[i])
 			opts = 1;
+	if (r->rule_flag & PFRULE_ETHERSTATE)
+		opts = 1;
 	if (opts) {
 		printf(" (");
 		if (r->max_states) {
@@ -955,6 +957,12 @@
 				    "inv.timeout" : pf_timeouts[j].name,
 				    r->timeout[i]);
 			}
+		if (r->rule_flag & PFRULE_ETHERSTATE) {
+			if (!opts)
+				printf(", ");
+			printf("ether");
+			opts = 0;
+		}
 		printf(")");
 	}
 	if (r->rule_flag & PFRULE_FRAGMENT)

==== //depot/projects/soc2008/gk_l2filter/sys-pf/net/pf.c#7 (text+ko) ====

@@ -706,6 +706,9 @@
 {
 	struct pf_addr_ether	*src, *dst;
 
+	if ((state->rule.ptr->rule_flag & PFRULE_ETHERSTATE) == 0)
+		return (1);
+
 	if (direction == PF_IN) {
 		src = &state->ext.addr_ether;
 		dst = &state->gwy.addr_ether;

==== //depot/projects/soc2008/gk_l2filter/sys-pf/net/pfvar.h#6 (text+ko) ====

@@ -705,6 +705,7 @@
 #define	PFRULE_NOSYNC		0x0010
 #define PFRULE_SRCTRACK		0x0020  /* track source states */
 #define PFRULE_RULESRCTRACK	0x0040  /* per rule */
+#define PFRULE_ETHERSTATE	0x0080  /* per rule */
 
 /* scrub flags */
 #define	PFRULE_NODF		0x0100


More information about the p4-projects mailing list