svn commit: r200629 - head/sys/netinet/ipfw
Luigi Rizzo
luigi at FreeBSD.org
Thu Dec 17 12:27:54 UTC 2009
Author: luigi
Date: Thu Dec 17 12:27:54 2009
New Revision: 200629
URL: http://svn.freebsd.org/changeset/base/200629
Log:
simplify the code that finds the next rule after reinjections
MFC after: 1 week
Modified:
head/sys/netinet/ipfw/ip_fw2.c
Modified: head/sys/netinet/ipfw/ip_fw2.c
==============================================================================
--- head/sys/netinet/ipfw/ip_fw2.c Thu Dec 17 08:42:44 2009 (r200628)
+++ head/sys/netinet/ipfw/ip_fw2.c Thu Dec 17 12:27:54 2009 (r200629)
@@ -1183,31 +1183,29 @@ do { \
mtag = m_tag_find(m, PACKET_TAG_DIVERT, NULL);
if (args->rule) {
/*
- * Packet has already been tagged. Look for the next rule
- * to restart processing. Make sure that args->rule still
- * exists and not changed.
- * If fw_one_pass != 0 then just accept it.
- * XXX should not happen here, but optimized out in
- * the caller.
+ * Packet has already been tagged as a result of a previous
+ * match on rule args->rule aka args->rule_id (PIPE, QUEUE,
+ * REASS, NETGRAPH and similar, never a skipto).
+ * Validate the pointer and continue from args->rule->next
+ * if still present, otherwise use the default rule.
+ * XXX If fw_one_pass != 0 then just accept it, though
+ * the caller should never pass us such packets.
*/
if (V_fw_one_pass) {
IPFW_RUNLOCK(chain);
return (IP_FW_PASS);
}
- if (chain->id != args->chain_id) {
+ if (chain->id == args->chain_id) { /* pointer still valid */
+ f = args->rule->next;
+ } else { /* must revalidate the pointer */
for (f = chain->rules; f != NULL; f = f->next)
- if (f == args->rule && f->id == args->rule_id)
+ if (f == args->rule && f->id == args->rule_id) {
+ f = args->rule->next;
break;
-
- if (f != NULL)
- f = f->next_rule;
- else
- f = V_layer3_chain.default_rule;
- } else
- f = args->rule->next_rule;
-
- if (f == NULL)
- f = lookup_next_rule(args->rule, 0);
+ }
+ }
+ if (f == NULL) /* in case of errors, use default; */
+ f = chain->default_rule;
} else {
/*
* Find the starting rule. It can be either the first
More information about the svn-src-head
mailing list