If there is anyone out there who disables fragment reassembly (enabled
by default), you need to help testing this diff which folds
pf_test_fragment() into pf_test_rule().
If I don't hear from anyone we may one day decide that nobody actually
does this and remove the ability to disable reassembly completely...
Index: sys/net/if_pflog.c
===================================================================
RCS file: /cvs/src/sys/net/if_pflog.c,v
retrieving revision 1.35
diff -u -p -r1.35 if_pflog.c
--- sys/net/if_pflog.c 20 Jun 2011 19:03:41 -0000 1.35
+++ sys/net/if_pflog.c 6 Jul 2011 03:56:44 -0000
@@ -273,6 +273,7 @@ pflog_bpfcopy(const void *src_arg, void
{
const struct mbuf *m;
struct pfloghdr *pfloghdr;
+ struct pf_state *s = NULL;
u_int count;
u_char *dst;
u_short action, reason;
@@ -335,7 +336,7 @@ pflog_bpfcopy(const void *src_arg, void
memset(&pd, 0, sizeof(pd));
pd.hdr.any = &pf_hdrs;
if (pf_setup_pdesc(pfloghdr->af, pfloghdr->dir, &pd, &mfake, &action,
- &reason, NULL, NULL, NULL, NULL, &off, &hdrlen) == -1)
+ &reason, NULL, NULL, NULL, &s, NULL, &off, &hdrlen) == -1)
return;
PF_ACPY(&osaddr, pd.src, pd.af);
Index: sys/net/pf.c
===================================================================
RCS file: /cvs/src/sys/net/pf.c,v
retrieving revision 1.759
diff -u -p -r1.759 pf.c
--- sys/net/pf.c 4 Jul 2011 18:12:51 -0000 1.759
+++ sys/net/pf.c 6 Jul 2011 04:35:06 -0000
@@ -186,10 +186,6 @@ static __inline int pf_create_state(str
struct pf_rule_actions *, struct pf_src_node *[]);
int pf_state_key_setup(struct pf_pdesc *, struct
pf_state_key **, struct pf_state_key **, int);
-int pf_test_fragment(struct pf_rule **, int,
- struct pfi_kif *, struct mbuf *,
- struct pf_pdesc *, struct pf_rule **,
- struct pf_ruleset **);
int pf_tcp_track_full(struct pf_state_peer *,
struct pf_state_peer *, struct pf_state **,
struct pfi_kif *, struct mbuf *, int,
@@ -1467,13 +1463,13 @@ pf_calc_skip_steps(struct pf_rulequeue *
if (cur->src.neg != prev->src.neg ||
pf_addr_wrap_neq(&cur->src.addr, &prev->src.addr))
PF_SET_SKIP_STEPS(PF_SKIP_SRC_ADDR);
+ if (cur->dst.neg != prev->dst.neg ||
+ pf_addr_wrap_neq(&cur->dst.addr, &prev->dst.addr))
+ PF_SET_SKIP_STEPS(PF_SKIP_DST_ADDR);
if (cur->src.port[0] != prev->src.port[0] ||
cur->src.port[1] != prev->src.port[1] ||
cur->src.port_op != prev->src.port_op)
PF_SET_SKIP_STEPS(PF_SKIP_SRC_PORT);
- if (cur->dst.neg != prev->dst.neg ||
- pf_addr_wrap_neq(&cur->dst.addr, &prev->dst.addr))
- PF_SET_SKIP_STEPS(PF_SKIP_DST_ADDR);
if (cur->dst.port[0] != prev->dst.port[0] ||
cur->dst.port[1] != prev->dst.port[1] ||
cur->dst.port_op != prev->dst.port_op)
@@ -2719,6 +2715,14 @@ pf_rule_to_actions(struct pf_rule *r, st
PFSTATE_SETTOS|PFSTATE_SCRUB_TCP));
}
+#define PF_TEST_ATTRIB(t, a) \
+ do { \
+ if (t) { \
+ r = a; \
+ goto nextrule; \
+ } \
+ } while (0)
+
int
pf_test_rule(struct pf_rule **rm, struct pf_state **sm, int direction,
struct pfi_kif *kif, struct mbuf *m, int off,
@@ -2763,6 +2767,9 @@ pf_test_rule(struct pf_rule **rm, struct
return (PF_DROP);
}
+ if (pd->frag)
+ goto fragment;
+
switch (pd->proto) {
case IPPROTO_TCP:
pd->nsport = th->th_sport;
@@ -2803,7 +2810,8 @@ pf_test_rule(struct pf_rule **rm, struct
break;
#endif /* INET6 */
default:
- pd->nsport = pd->ndport;
+ fragment:
+ pd->nsport = pd->ndport = 0;
break;
}
@@ -2813,116 +2821,134 @@ pf_test_rule(struct pf_rule **rm, struct
r = TAILQ_FIRST(pf_main_ruleset.rules.active.ptr);
while (r != NULL) {
r->evaluations++;
- if (pfi_kif_match(r->kif, kif) == r->ifnot)
- r = r->skip[PF_SKIP_IFP].ptr;
- else if (r->direction && r->direction != direction)
- r = r->skip[PF_SKIP_DIR].ptr;
- else if (r->onrdomain >= 0 &&
- (r->onrdomain == pd->rdomain) == r->ifnot)
- r = r->skip[PF_SKIP_RDOM].ptr;
- else if (r->af && r->af != af)
- r = r->skip[PF_SKIP_AF].ptr;
- else if (r->proto && r->proto != pd->proto)
- r = r->skip[PF_SKIP_PROTO].ptr;
- else if (PF_MISMATCHAW(&r->src.addr, &pd->nsaddr, af,
- r->src.neg, kif, act.rtableid))
- r = r->skip[PF_SKIP_SRC_ADDR].ptr;
- /* tcp/udp only. port_op always 0 in other cases */
- else if (r->src.port_op && !pf_match_port(r->src.port_op,
- r->src.port[0], r->src.port[1], pd->nsport))
- r = r->skip[PF_SKIP_SRC_PORT].ptr;
- else if (PF_MISMATCHAW(&r->dst.addr, &pd->ndaddr, af,
- r->dst.neg, NULL, act.rtableid))
- r = r->skip[PF_SKIP_DST_ADDR].ptr;
- /* tcp/udp only. port_op always 0 in other cases */
- else if (r->dst.port_op && !pf_match_port(r->dst.port_op,
- r->dst.port[0], r->dst.port[1], pd->ndport))
- r = r->skip[PF_SKIP_DST_PORT].ptr;
- /* icmp only. type always 0 in other cases */
- else if (r->type && r->type != icmptype + 1)
- r = TAILQ_NEXT(r, entries);
- /* icmp only. type always 0 in other cases */
- else if (r->code && r->code != icmpcode + 1)
- r = TAILQ_NEXT(r, entries);
- else if (r->tos && !(r->tos == pd->tos))
- r = TAILQ_NEXT(r, entries);
- else if (r->rule_flag & PFRULE_FRAGMENT)
- r = TAILQ_NEXT(r, entries);
- else if (pd->proto == IPPROTO_TCP &&
- (r->flagset & th->th_flags) != r->flags)
- r = TAILQ_NEXT(r, entries);
- /* tcp/udp only. uid.op always 0 in other cases */
- else if (r->uid.op && (pd->lookup.done || (pd->lookup.done =
- pf_socket_lookup(direction, pd), 1)) &&
- !pf_match_uid(r->uid.op, r->uid.uid[0], r->uid.uid[1],
- pd->lookup.uid))
- r = TAILQ_NEXT(r, entries);
- /* tcp/udp only. gid.op always 0 in other cases */
- else if (r->gid.op && (pd->lookup.done || (pd->lookup.done =
- pf_socket_lookup(direction, pd), 1)) &&
- !pf_match_gid(r->gid.op, r->gid.gid[0], r->gid.gid[1],
- pd->lookup.gid))
- r = TAILQ_NEXT(r, entries);
- else if (r->prob &&
- r->prob <= arc4random_uniform(UINT_MAX - 1) + 1)
- r = TAILQ_NEXT(r, entries);
- else if (r->match_tag && !pf_match_tag(m, r, &tag))
- r = TAILQ_NEXT(r, entries);
- else if (r->rcv_kif && !pf_match_rcvif(m, r))
- r = TAILQ_NEXT(r, entries);
- else if (r->os_fingerprint != PF_OSFP_ANY &&
- (pd->proto != IPPROTO_TCP || !pf_osfp_match(
- pf_osfp_fingerprint(pd, m, off, th),
- r->os_fingerprint)))
- r = TAILQ_NEXT(r, entries);
- else {
- if (r->tag)
- tag = r->tag;
- if (r->anchor == NULL) {
- lastr = r;
- if (r->action == PF_MATCH) {
- if ((ri = pool_get(&pf_rule_item_pl,
- PR_NOWAIT)) == NULL) {
- REASON_SET(&reason,
- PFRES_MEMORY);
- goto cleanup;
- }
- ri->r = r;
- /* order is irrelevant */
- SLIST_INSERT_HEAD(&rules, ri, entry);
- pf_rule_to_actions(r, &act);
- if (pf_get_transaddr(r, pd, sns) ==
- -1) {
- REASON_SET(&reason,
- PFRES_MEMORY);
- goto cleanup;
- }
- /*
- * We need to save this rule pointer,
- * otherwise the counter decrease
- * would not work for SLB.
- */
- nr = r;
- if (r->log || act.log & PF_LOG_MATCHES)
- PFLOG_PACKET(kif, m, direction,
- reason, r, a, ruleset, pd);
- } else {
- match = 1;
- *rm = r;
- *am = a;
- *rsm = ruleset;
- if (act.log & PF_LOG_MATCHES)
- PFLOG_PACKET(kif, m, direction,
- reason, r, a, ruleset, pd);
+ PF_TEST_ATTRIB((pfi_kif_match(r->kif, kif) == r->ifnot),
+ r->skip[PF_SKIP_IFP].ptr);
+ PF_TEST_ATTRIB((r->direction && r->direction != direction),
+ r->skip[PF_SKIP_DIR].ptr);
+ PF_TEST_ATTRIB((r->onrdomain >= 0 &&
+ (r->onrdomain == pd->rdomain) == r->ifnot),
+ r->skip[PF_SKIP_RDOM].ptr);
+ PF_TEST_ATTRIB((r->af && r->af != af),
+ r->skip[PF_SKIP_AF].ptr);
+ PF_TEST_ATTRIB((r->proto && r->proto != pd->proto),
+ r->skip[PF_SKIP_PROTO].ptr);
+ PF_TEST_ATTRIB((PF_MISMATCHAW(&r->src.addr, &pd->nsaddr, af,
+ r->src.neg, kif, act.rtableid)),
+ r->skip[PF_SKIP_SRC_ADDR].ptr);
+ PF_TEST_ATTRIB((PF_MISMATCHAW(&r->dst.addr, &pd->ndaddr, af,
+ r->dst.neg, NULL, act.rtableid)),
+ r->skip[PF_SKIP_DST_ADDR].ptr);
+ if (pd->frag) {
+ /* tcp/udp only. port_op always 0 in other cases */
+ PF_TEST_ATTRIB((r->src.port_op || r->dst.port_op),
+ TAILQ_NEXT(r, entries));
+ PF_TEST_ATTRIB((pd->proto == IPPROTO_TCP && r->flagset),
+ TAILQ_NEXT(r, entries));
+ /* icmp only. type/code always 0 in other cases */
+ PF_TEST_ATTRIB((r->type || r->code),
+ TAILQ_NEXT(r, entries));
+ /* tcp/udp only. {uid|gid}.op always 0 in other cases */
+ PF_TEST_ATTRIB((r->gid.op || r->uid.op),
+ TAILQ_NEXT(r, entries));
+ PF_TEST_ATTRIB((r->os_fingerprint != PF_OSFP_ANY),
+ TAILQ_NEXT(r, entries));
+ } else {
+ /* tcp/udp only. port_op always 0 in other cases */
+ PF_TEST_ATTRIB((r->src.port_op &&
+ !pf_match_port(r->src.port_op, r->src.port[0],
+ r->src.port[1], pd->nsport)),
+ r->skip[PF_SKIP_SRC_PORT].ptr);
+ PF_TEST_ATTRIB((r->dst.port_op &&
+ !pf_match_port(r->dst.port_op, r->dst.port[0],
+ r->dst.port[1], pd->ndport)),
+ r->skip[PF_SKIP_DST_PORT].ptr);
+ /* icmp only. type always 0 in other cases */
+ PF_TEST_ATTRIB((r->type && r->type != icmptype + 1),
+ TAILQ_NEXT(r, entries));
+ /* icmp only. type always 0 in other cases */
+ PF_TEST_ATTRIB((r->code && r->code != icmpcode + 1),
+ TAILQ_NEXT(r, entries));
+ PF_TEST_ATTRIB((r->rule_flag & PFRULE_FRAGMENT),
+ TAILQ_NEXT(r, entries));
+ PF_TEST_ATTRIB((pd->proto == IPPROTO_TCP &&
+ (r->flagset & th->th_flags) != r->flags),
+ TAILQ_NEXT(r, entries));
+ /* tcp/udp only. uid.op always 0 in other cases */
+ PF_TEST_ATTRIB((r->uid.op && (pd->lookup.done ||
+ (pd->lookup.done =
+ pf_socket_lookup(direction, pd), 1)) &&
+ !pf_match_uid(r->uid.op, r->uid.uid[0],
+ r->uid.uid[1], pd->lookup.uid)),
+ TAILQ_NEXT(r, entries));
+ /* tcp/udp only. gid.op always 0 in other cases */
+ PF_TEST_ATTRIB((r->gid.op && (pd->lookup.done ||
+ (pd->lookup.done =
+ pf_socket_lookup(direction, pd), 1)) &&
+ !pf_match_gid(r->gid.op, r->gid.gid[0],
+ r->gid.gid[1], pd->lookup.gid)),
+ TAILQ_NEXT(r, entries));
+ PF_TEST_ATTRIB((r->os_fingerprint != PF_OSFP_ANY &&
+ (pd->proto != IPPROTO_TCP || !pf_osfp_match(
+ pf_osfp_fingerprint(pd, m, off, th),
+ r->os_fingerprint))),
+ TAILQ_NEXT(r, entries));
+ }
+ PF_TEST_ATTRIB((r->tos && !(r->tos == pd->tos)),
+ TAILQ_NEXT(r, entries));
+ PF_TEST_ATTRIB((r->prob &&
+ r->prob <= arc4random_uniform(UINT_MAX - 1) + 1),
+ TAILQ_NEXT(r, entries));
+ PF_TEST_ATTRIB((r->match_tag && !pf_match_tag(m, r, &tag)),
+ TAILQ_NEXT(r, entries));
+ PF_TEST_ATTRIB((r->rcv_kif && !pf_match_rcvif(m, r)),
+ TAILQ_NEXT(r, entries));
+
+ /* FALLTHROUGH */
+ if (r->tag)
+ tag = r->tag;
+ if (r->anchor == NULL) {
+ lastr = r;
+ if (r->action == PF_MATCH) {
+ if ((ri = pool_get(&pf_rule_item_pl,
+ PR_NOWAIT)) == NULL) {
+ REASON_SET(&reason, PFRES_MEMORY);
+ goto cleanup;
}
+ ri->r = r;
+ /* order is irrelevant */
+ SLIST_INSERT_HEAD(&rules, ri, entry);
+ pf_rule_to_actions(r, &act);
+ if (pf_get_transaddr(r, pd, sns) == -1) {
+ REASON_SET(&reason, PFRES_MEMORY);
+ goto cleanup;
+ }
+ /*
+ * We need to save this rule pointer,
+ * otherwise the counter decrease
+ * would not work for SLB.
+ */
+ nr = r;
+ if (r->log || act.log & PF_LOG_MATCHES)
+ PFLOG_PACKET(kif, m, direction,
+ reason, r, a, ruleset, pd);
+ } else {
+ match = 1;
+ *rm = r;
+ *am = a;
+ *rsm = ruleset;
+ if (act.log & PF_LOG_MATCHES)
+ PFLOG_PACKET(kif, m, direction,
+ reason, r, a, ruleset, pd);
+ }
- if ((*rm)->quick)
- break;
- r = TAILQ_NEXT(r, entries);
- } else
- pf_step_into_anchor(&asd, &ruleset,
- &r, &a, &match);
- }
+ if ((*rm)->quick)
+ break;
+ r = TAILQ_NEXT(r, entries);
+ } else
+ pf_step_into_anchor(&asd, &ruleset,
+ &r, &a, &match);
+
+ nextrule:
if (r == NULL && pf_step_out_of_anchor(&asd, &ruleset,
&r, &a, &match))
break;
@@ -2942,7 +2968,7 @@ pf_test_rule(struct pf_rule **rm, struct
if (r->log || act.log & PF_LOG_MATCHES)
PFLOG_PACKET(kif, m, direction, reason, r, a, ruleset, pd);
- if ((r->action == PF_DROP) &&
+ if (!pd->frag && (r->action == PF_DROP) &&
((r->rule_flag & PFRULE_RETURNRST) ||
(r->rule_flag & PFRULE_RETURNICMP) ||
(r->rule_flag & PFRULE_RETURN))) {
@@ -3005,7 +3031,7 @@ pf_test_rule(struct pf_rule **rm, struct
goto cleanup;
}
- if (!state_icmp && r->keep_state) {
+ if (!pd->frag && !state_icmp && r->keep_state) {
int action;
if (r->rule_flag & PFRULE_SRCTRACK &&
@@ -3385,92 +3411,6 @@ pf_translate(struct pf_pdesc *pd, struct
}
int
-pf_test_fragment(struct pf_rule **rm, int direction, struct pfi_kif *kif,
- struct mbuf *m, struct pf_pdesc *pd, struct pf_rule **am,
- struct pf_ruleset **rsm)
-{
- struct pf_rule *r, *a = NULL;
- struct pf_ruleset *ruleset = NULL;
- sa_family_t af = pd->af;
- u_short reason;
- int tag = -1;
- int asd = 0;
- int match = 0;
-
- r = TAILQ_FIRST(pf_main_ruleset.rules.active.ptr);
- while (r != NULL) {
- r->evaluations++;
- if (pfi_kif_match(r->kif, kif) == r->ifnot)
- r = r->skip[PF_SKIP_IFP].ptr;
- else if (r->direction && r->direction != direction)
- r = r->skip[PF_SKIP_DIR].ptr;
- else if (r->onrdomain >= 0 &&
- (r->onrdomain == pd->rdomain) == r->ifnot)
- r = r->skip[PF_SKIP_RDOM].ptr;
- else if (r->af && r->af != af)
- r = r->skip[PF_SKIP_AF].ptr;
- else if (r->proto && r->proto != pd->proto)
- r = r->skip[PF_SKIP_PROTO].ptr;
- else if (PF_MISMATCHAW(&r->src.addr, pd->src, af,
- r->src.neg, kif, pd->rdomain))
- r = r->skip[PF_SKIP_SRC_ADDR].ptr;
- else if (PF_MISMATCHAW(&r->dst.addr, pd->dst, af,
- r->dst.neg, NULL, pd->rdomain))
- r = r->skip[PF_SKIP_DST_ADDR].ptr;
- else if (r->tos && !(r->tos == pd->tos))
- r = TAILQ_NEXT(r, entries);
- else if (r->os_fingerprint != PF_OSFP_ANY)
- r = TAILQ_NEXT(r, entries);
- else if (pd->proto == IPPROTO_UDP &&
- (r->src.port_op || r->dst.port_op))
- r = TAILQ_NEXT(r, entries);
- else if (pd->proto == IPPROTO_TCP &&
- (r->src.port_op || r->dst.port_op || r->flagset))
- r = TAILQ_NEXT(r, entries);
- else if ((pd->proto == IPPROTO_ICMP ||
- pd->proto == IPPROTO_ICMPV6) &&
- (r->type || r->code))
- r = TAILQ_NEXT(r, entries);
- else if (r->prob && r->prob <=
- (arc4random() % (UINT_MAX - 1) + 1))
- r = TAILQ_NEXT(r, entries);
- else if (r->match_tag && !pf_match_tag(m, r, &tag))
- r = TAILQ_NEXT(r, entries);
- else {
- if (r->anchor == NULL) {
- match = 1;
- *rm = r;
- *am = a;
- *rsm = ruleset;
- if ((*rm)->quick)
- break;
- r = TAILQ_NEXT(r, entries);
- } else
- pf_step_into_anchor(&asd, &ruleset,
- &r, &a, &match);
- }
- if (r == NULL && pf_step_out_of_anchor(&asd, &ruleset,
- &r, &a, &match))
- break;
- }
- r = *rm;
- a = *am;
- ruleset = *rsm;
-
- REASON_SET(&reason, PFRES_MATCH);
-
- if (r->log)
- PFLOG_PACKET(kif, m, direction, reason, r, a, ruleset, pd);
-
- if (r->action == PF_DROP)
- return (PF_DROP);
-
- pf_tag_packet(m, tag, -1);
-
- return (PF_PASS);
-}
-
-int
pf_tcp_track_full(struct pf_state_peer *src, struct pf_state_peer *dst,
struct pf_state **state, struct pfi_kif *kif, struct mbuf *m, int off,
struct pf_pdesc *pd, u_short *reason, int *copyback)
@@ -5477,7 +5417,8 @@ pf_get_divert(struct mbuf *m)
int
pf_setup_pdesc(sa_family_t af, int dir, struct pf_pdesc *pd, struct mbuf **m0,
u_short *action, u_short *reason, struct pfi_kif *kif, struct pf_rule **a,
- struct pf_rule **r, struct pf_ruleset **ruleset, int *off, int *hdrlen)
+ struct pf_rule **r, struct pf_state **s, struct pf_ruleset **ruleset,
+ int *off, int *hdrlen)
{
struct mbuf *m = *m0;
@@ -5545,11 +5486,12 @@ pf_setup_pdesc(sa_family_t af, int dir,
* handle fragments that aren't reassembled by
* normalization
*/
+ pd->frag = 1;
if (kif == NULL || r == NULL) /* pflog */
*action = PF_DROP;
else
- *action = pf_test_fragment(r, dir, kif,
- m, pd, a, ruleset);
+ *action = pf_test_rule(r, s, dir, kif,
+ m, *off, pd, a, ruleset, *hdrlen);
if (*action != PF_PASS)
REASON_SET(reason, PFRES_FRAG);
return (-1);
@@ -5609,11 +5551,12 @@ pf_setup_pdesc(sa_family_t af, int dir,
do {
switch (pd->proto) {
case IPPROTO_FRAGMENT:
+ pd->frag = 1;
if (kif == NULL || r == NULL) /* pflog */
*action = PF_DROP;
else
- *action = pf_test_fragment(r, dir, kif,
- m, pd, a, ruleset);
+ *action = pf_test_rule(r, s, dir, kif,
+ m, *off, pd, a, ruleset, *hdrlen);
if (*action != PF_PASS)
REASON_SET(reason, PFRES_FRAG);
return (-1);
@@ -5844,7 +5787,7 @@ pf_test(sa_family_t af, int fwdir, struc
return (PF_PASS);
}
- if (pf_setup_pdesc(af, dir, &pd, m0, &action, &reason, kif, &a, &r,
+ if (pf_setup_pdesc(af, dir, &pd, m0, &action, &reason, kif, &a, &r, &s,
&ruleset, &off, &hdrlen) == -1) {
if (action == PF_PASS)
return (PF_PASS);
Index: sys/net/pfvar.h
===================================================================
RCS file: /cvs/src/sys/net/pfvar.h,v
retrieving revision 1.337
diff -u -p -r1.337 pfvar.h
--- sys/net/pfvar.h 4 Jul 2011 18:12:51 -0000 1.337
+++ sys/net/pfvar.h 5 Jul 2011 19:39:49 -0000
@@ -548,8 +548,8 @@ struct pf_rule {
#define PF_SKIP_AF 3
#define PF_SKIP_PROTO 4
#define PF_SKIP_SRC_ADDR 5
-#define PF_SKIP_SRC_PORT 6
-#define PF_SKIP_DST_ADDR 7
+#define PF_SKIP_DST_ADDR 6
+#define PF_SKIP_SRC_PORT 7
#define PF_SKIP_DST_PORT 8
#define PF_SKIP_COUNT 9
union pf_rule_ptr skip[PF_SKIP_COUNT];
@@ -1245,6 +1245,7 @@ struct pf_pdesc {
u_int8_t didx; /* key index for destination */
u_int8_t destchg; /* flag set when destination changed */
u_int8_t pflog; /* flags for packet logging */
+ u_int8_t frag; /* this packet is a fragment */
};
/* flags for RDR options */
@@ -1757,7 +1758,8 @@ int
pf_setup_pdesc(sa_family_t, int,
struct pf_pdesc *, struct mbuf **,
u_short *, u_short *, struct pfi_kif *,
struct pf_rule **, struct pf_rule **,
- struct pf_ruleset **, int *, int *);
+ struct pf_state **, struct pf_ruleset **,
+ int *, int *);
int pf_test(sa_family_t, int, struct ifnet *, struct mbuf **,
struct ether_header *);
Index: sbin/pfctl//parse.y
===================================================================
RCS file: /cvs/src/sbin/pfctl/parse.y,v
retrieving revision 1.602
diff -u -p -r1.602 parse.y
--- sbin/pfctl//parse.y 4 Jul 2011 03:36:14 -0000 1.602
+++ sbin/pfctl//parse.y 5 Jul 2011 06:49:50 -0000
@@ -4672,10 +4672,10 @@ expand_rule(struct pf_rule *r, int keepr
LOOP_THROUGH(struct node_proto, proto, protos,
LOOP_THROUGH(struct node_icmp, icmp_type, icmp_types,
LOOP_THROUGH(struct node_host, src_host, src_hosts,
- LOOP_THROUGH(struct node_port, src_port, src_ports,
- LOOP_THROUGH(struct node_os, src_os, src_oses,
LOOP_THROUGH(struct node_host, dst_host, dst_hosts,
+ LOOP_THROUGH(struct node_port, src_port, src_ports,
LOOP_THROUGH(struct node_port, dst_port, dst_ports,
+ LOOP_THROUGH(struct node_os, src_os, src_oses,
LOOP_THROUGH(struct node_uid, uid, uids,
LOOP_THROUGH(struct node_gid, gid, gids,
Index: sbin/pfctl//pfctl_optimize.c
===================================================================
RCS file: /cvs/src/sbin/pfctl/pfctl_optimize.c,v
retrieving revision 1.27
diff -u -p -r1.27 pfctl_optimize.c
--- sbin/pfctl//pfctl_optimize.c 3 Jul 2011 23:37:55 -0000 1.27
+++ sbin/pfctl//pfctl_optimize.c 5 Jul 2011 06:49:50 -0000
@@ -249,8 +249,8 @@ const char *skip_comparitors_names[PF_SK
{ "af", PF_SKIP_AF, skip_cmp_af }, \
{ "proto", PF_SKIP_PROTO, skip_cmp_proto }, \
{ "saddr", PF_SKIP_SRC_ADDR, skip_cmp_src_addr }, \
- { "sport", PF_SKIP_SRC_PORT, skip_cmp_src_port }, \
{ "daddr", PF_SKIP_DST_ADDR, skip_cmp_dst_addr }, \
+ { "sport", PF_SKIP_SRC_PORT, skip_cmp_src_port }, \
{ "dport", PF_SKIP_DST_PORT, skip_cmp_dst_port } \
}