err, nobody? * Henning Brauer <henn...@openbsd.org> [2012-07-11 13:14]: > ..because now you had to initialize both set_prio in pf_rule to it > everywhere. we did that, at least in some parts of our tree... > problem being of course that 0 is a valid value there and can\t easily > be used as "don't touch" indicator. > so use a flag and only ever look at the set_prio fields if the flag is > set. > > this is entirely untested, I am asking you guys to help with this. I > am reaosnably confident this is right tho. > > now excuse me pls, have to bang my head against a wall of queues > > Index: libexec/tftp-proxy/filter.c > =================================================================== > RCS file: /cvs/src/libexec/tftp-proxy/filter.c,v > retrieving revision 1.13 > diff -u -p -r1.13 filter.c > --- libexec/tftp-proxy/filter.c 8 Jul 2012 11:57:08 -0000 1.13 > +++ libexec/tftp-proxy/filter.c 11 Jul 2012 11:03:11 -0000 > @@ -176,7 +176,6 @@ prepare_rule(u_int32_t id, struct sockad > pfr.rule.dst.port[0] = htons(d_port); > pfr.rule.rtableid = -1; > pfr.rule.onrdomain = -1; > - pfr.rule.set_prio[0] = pfr.rule.set_prio[1] = PF_PRIO_NOTSET; > pfr.rule.action = PF_PASS; > pfr.rule.quick = 1; > pfr.rule.log = rule_log; > Index: sbin/pfctl/parse.y > =================================================================== > RCS file: /cvs/src/sbin/pfctl/parse.y,v > retrieving revision 1.618 > diff -u -p -r1.618 parse.y > --- sbin/pfctl/parse.y 10 Jul 2012 09:29:36 -0000 1.618 > +++ sbin/pfctl/parse.y 11 Jul 2012 10:57:07 -0000 > @@ -892,8 +892,8 @@ anchorrule : ANCHOR anchorname dir quick > if ($9.marker & FOM_SETPRIO) { > r.set_prio[0] = $9.set_prio[0]; > r.set_prio[1] = $9.set_prio[1]; > - } else > - r.set_prio[0] = r.set_prio[1] = PF_PRIO_NOTSET; > + r.scrub_flags |= PFSTATE_SETPRIO; > + } > > decide_address_family($8.src.host, &r.af); > decide_address_family($8.dst.host, &r.af); > @@ -1025,7 +1025,6 @@ antispoof : ANTISPOOF logquick antispoof > r.logif = $2.logif; > r.quick = $2.quick; > r.af = $4; > - r.set_prio[0] = r.set_prio[1] = PF_PRIO_NOTSET; > if (rule_label(&r, $5.label)) > YYERROR; > r.rtableid = $5.rtableid; > @@ -1710,8 +1709,8 @@ pfrule : action dir logquick interface > if ($8.marker & FOM_SETPRIO) { > r.set_prio[0] = $8.set_prio[0]; > r.set_prio[1] = $8.set_prio[1]; > - } else > - r.set_prio[0] = r.set_prio[1] = PF_PRIO_NOTSET; > + r.scrub_flags |= PFSTATE_SETPRIO; > + } > if ($8.marker & FOM_ONCE) > r.rule_flag |= PFRULE_ONCE; > if ($8.marker & FOM_AFTO) > Index: sbin/pfctl/pfctl_parser.c > =================================================================== > RCS file: /cvs/src/sbin/pfctl/pfctl_parser.c,v > retrieving revision 1.289 > diff -u -p -r1.289 pfctl_parser.c > --- sbin/pfctl/pfctl_parser.c 10 Jul 2012 09:39:26 -0000 1.289 > +++ sbin/pfctl/pfctl_parser.c 11 Jul 2012 10:59:19 -0000 > @@ -843,11 +843,10 @@ print_rule(struct pf_rule *r, const char > if (r->tos) > printf(" tos 0x%2.2x", r->tos); > > - if (r->set_prio[0] != PF_PRIO_NOTSET || > - r->scrub_flags & PFSTATE_SETTOS) { > + if (r->scrub_flags & PFSTATE_SETMASK) { > char *comma = ""; > printf(" set ("); > - if (r->set_prio[0] != PF_PRIO_NOTSET) { > + if (r->scrub_flags & PFSTATE_SETPRIO) { > if (r->set_prio[0] == r->set_prio[1]) > printf("%s prio %u", comma, r->set_prio[0]); > else > Index: sys/net/pf.c > =================================================================== > RCS file: /cvs/src/sys/net/pf.c,v > retrieving revision 1.808 > diff -u -p -r1.808 pf.c > --- sys/net/pf.c 10 Jul 2012 17:33:48 -0000 1.808 > +++ sys/net/pf.c 11 Jul 2012 10:52:59 -0000 > @@ -2526,7 +2526,7 @@ pf_send_tcp(const struct pf_rule *r, sa_ > m->m_pkthdr.pf.flags |= PF_TAG_GENERATED; > m->m_pkthdr.pf.tag = rtag; > m->m_pkthdr.rdomain = rdom; > - if (r && r->set_prio[0] != PF_PRIO_NOTSET) > + if (r && (r->scrub_flags & PFSTATE_SETPRIO)) > m->m_pkthdr.pf.prio = r->set_prio[0]; > > #ifdef ALTQ > @@ -2650,7 +2650,7 @@ pf_send_icmp(struct mbuf *m, u_int8_t ty > > m0->m_pkthdr.pf.flags |= PF_TAG_GENERATED; > m0->m_pkthdr.rdomain = rdomain; > - if (r && r->set_prio[0] != PF_PRIO_NOTSET) > + if (r && (r->scrub_flags & PFSTATE_SETPRIO)) > m0->m_pkthdr.pf.prio = r->set_prio[0]; > > #ifdef ALTQ > @@ -3279,11 +3279,9 @@ pf_rule_to_actions(struct pf_rule *r, st > if (r->max_mss) > a->max_mss = r->max_mss; > a->flags |= (r->scrub_flags & (PFSTATE_NODF|PFSTATE_RANDOMID| > - PFSTATE_SETTOS|PFSTATE_SCRUB_TCP)); > - if (r->set_prio[0] != PF_PRIO_NOTSET) > - a->set_prio[0] = r->set_prio[0]; > - if (r->set_prio[1] != PF_PRIO_NOTSET) > - a->set_prio[1] = r->set_prio[1]; > + PFSTATE_SETTOS|PFSTATE_SCRUB_TCP|PFSTATE_SETPRIO)); > + a->set_prio[0] = r->set_prio[0]; > + a->set_prio[1] = r->set_prio[1]; > } > > #define PF_TEST_ATTRIB(t, a) \ > @@ -3319,7 +3317,6 @@ pf_test_rule(struct pf_pdesc *pd, struct > u_int8_t icmptype = 0, icmpcode = 0; > > bzero(&act, sizeof(act)); > - act.set_prio[0] = act.set_prio[1] = PF_PRIO_NOTSET; > bzero(sns, sizeof(sns)); > act.rtableid = pd->rdomain; > SLIST_INIT(&rules); > @@ -6886,11 +6883,11 @@ done: > pf_tag_packet(pd.m, s->tag, s->rtableid[pd.didx]); > if (pqid || (pd.tos & IPTOS_LOWDELAY)) { > qid = s->pqid; > - if (s->set_prio[1] != PF_PRIO_NOTSET) > + if (s->state_flags & PFSTATE_SETPRIO) > pd.m->m_pkthdr.pf.prio = s->set_prio[1]; > } else { > qid = s->qid; > - if (s->set_prio[0] != PF_PRIO_NOTSET) > + if (s->state_flags & PFSTATE_SETPRIO) > pd.m->m_pkthdr.pf.prio = s->set_prio[0]; > } > } else { > @@ -6898,11 +6895,11 @@ done: > r->set_tos); > if (pqid || (pd.tos & IPTOS_LOWDELAY)) { > qid = r->pqid; > - if (r->set_prio[1] != PF_PRIO_NOTSET) > + if (r->scrub_flags & PFSTATE_SETPRIO) > pd.m->m_pkthdr.pf.prio = r->set_prio[1]; > } else { > qid = r->qid; > - if (r->set_prio[0] != PF_PRIO_NOTSET) > + if (r->scrub_flags & PFSTATE_SETPRIO) > pd.m->m_pkthdr.pf.prio = r->set_prio[0]; > } > } > Index: sys/net/pf_ioctl.c > =================================================================== > RCS file: /cvs/src/sys/net/pf_ioctl.c,v > retrieving revision 1.253 > diff -u -p -r1.253 pf_ioctl.c > --- sys/net/pf_ioctl.c 8 Jul 2012 07:58:09 -0000 1.253 > +++ sys/net/pf_ioctl.c 11 Jul 2012 10:54:35 -0000 > @@ -1088,10 +1088,9 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a > error = EINVAL; > if (rule->rt && !rule->direction) > error = EINVAL; > - if ((rule->set_prio[0] != PF_PRIO_NOTSET && > - rule->set_prio[0] > IFQ_MAXPRIO) || > - (rule->set_prio[1] != PF_PRIO_NOTSET && > - rule->set_prio[1] > IFQ_MAXPRIO)) > + if (rule->scrub_flags & PFSTATE_SETPRIO && > + (rule->set_prio[0] > IFQ_MAXPRIO || > + rule->set_prio[1] > IFQ_MAXPRIO)) > error = EINVAL; > > if (error) { > Index: sys/net/pfvar.h > =================================================================== > RCS file: /cvs/src/sys/net/pfvar.h,v > retrieving revision 1.365 > diff -u -p -r1.365 pfvar.h > --- sys/net/pfvar.h 10 Jul 2012 09:38:22 -0000 1.365 > +++ sys/net/pfvar.h 11 Jul 2012 10:59:21 -0000 > @@ -648,7 +648,6 @@ struct pf_rule { > #define PF_FLUSH 0x01 > #define PF_FLUSH_GLOBAL 0x02 > u_int8_t flush; > -#define PF_PRIO_NOTSET 0xff > u_int8_t set_prio[2]; > sa_family_t naf; > > @@ -840,7 +839,9 @@ struct pf_state { > #define PFSTATE_SETTOS 0x0040 > #define PFSTATE_RANDOMID 0x0080 > #define PFSTATE_SCRUB_TCP 0x0100 > +#define PFSTATE_SETPRIO 0x0200 > #define PFSTATE_SCRUBMASK > (PFSTATE_NODF|PFSTATE_RANDOMID|PFSTATE_SCRUB_TCP) > +#define PFSTATE_SETMASK (PFSTATE_SETTOS|PFSTATE_SETPRIO) > u_int8_t log; > u_int8_t timeout; > u_int8_t sync_state; /* PFSYNC_S_x */ > Index: usr.sbin/ftp-proxy/filter.c > =================================================================== > RCS file: /cvs/src/usr.sbin/ftp-proxy/filter.c,v > retrieving revision 1.19 > diff -u -p -r1.19 filter.c > --- usr.sbin/ftp-proxy/filter.c 7 Jul 2012 16:24:32 -0000 1.19 > +++ usr.sbin/ftp-proxy/filter.c 11 Jul 2012 11:00:05 -0000 > @@ -207,7 +207,6 @@ prepare_rule(u_int32_t id, struct sockad > pfr.rule.dst.addr.type = PF_ADDR_ADDRMASK; > pfr.rule.nat.addr.type = PF_ADDR_NONE; > pfr.rule.rdr.addr.type = PF_ADDR_NONE; > - pfr.rule.set_prio[0] = pfr.rule.set_prio[1] = PF_PRIO_NOTSET; > > if (src->sa_family == AF_INET) { > memcpy(&pfr.rule.src.addr.v.a.addr.v4, > Index: usr.sbin/relayd/pfe_filter.c > =================================================================== > RCS file: /cvs/src/usr.sbin/relayd/pfe_filter.c,v > retrieving revision 1.49 > diff -u -p -r1.49 pfe_filter.c > --- usr.sbin/relayd/pfe_filter.c 7 Jul 2012 16:24:32 -0000 1.49 > +++ usr.sbin/relayd/pfe_filter.c 11 Jul 2012 11:00:43 -0000 > @@ -440,7 +440,6 @@ sync_ruleset(struct relayd *env, struct > rio.rule.dst.port[1] = address->port.val[1]; > rio.rule.rtableid = -1; /* stay in the main routing table */ > rio.rule.onrdomain = getrtable(); > - rio.rule.set_prio[0] = rio.rule.set_prio[1] = PF_PRIO_NOTSET; > > if (rio.rule.proto == IPPROTO_TCP) > rio.rule.timeout[PFTM_TCP_ESTABLISHED] = >
-- Henning Brauer, h...@bsws.de, henn...@openbsd.org BS Web Services, http://bsws.de, Full-Service ISP Secure Hosting, Mail and DNS Services. Dedicated Servers, Root to Fully Managed Henning Brauer Consulting, http://henningbrauer.com/