so, we have some utter confusion in pf about filter criteria versus
packet modifying options. I propose we move the ones that "write" into
a set block, while the filter criteria remain as they are. for the
moment this diff handles tos (I always disliked set-tos...) and prio.
rdomain/rtable stuff should be done the same way (afterwards).
no backwards compat for prio because i clearly stated it's not the
final syntax all the time.
no manpage bits yet.
"match set { prio 6, tos lowdelay }"
"match set prio 6"
Index: sbin/pfctl/parse.y
===================================================================
RCS file: /cvs/src/sbin/pfctl/parse.y,v
retrieving revision 1.614
diff -u -p -r1.614 parse.y
--- sbin/pfctl/parse.y 7 Jul 2012 16:24:32 -0000 1.614
+++ sbin/pfctl/parse.y 7 Jul 2012 17:09:19 -0000
@@ -508,6 +508,7 @@ int parseport(char *, struct range *r, i
%type <v.hfsc_opts> hfscopts_list hfscopts_item hfsc_opts
%type <v.queue_bwspec> bandwidth
%type <v.filter_opts> filter_opts filter_opt filter_opts_l
+%type <v.filter_opts> filter_sets filter_set filter_sets_l
%type <v.antispoof_opts> antispoof_opts antispoof_opt antispoof_opts_l
%type <v.queue_opts> queue_opts queue_opt queue_opts_l
%type <v.scrub_opts> scrub_opts scrub_opt scrub_opts_l
@@ -979,7 +980,7 @@ scrub_opt : NODF {
scrub_opts.marker |= FOM_MAXMSS;
scrub_opts.maxmss = $2;
}
- | SETTOS tos {
+ | SETTOS tos { /* XXX remove in 5.4-current */
if (scrub_opts.marker & FOM_SETTOS) {
yyerror("set-tos cannot be respecified");
YYERROR;
@@ -2379,7 +2380,21 @@ filter_opt : USER uids {
}
filter_opts.rcv = $2;
}
- | prio {
+ | ONCE {
+ filter_opts.marker |= FOM_ONCE;
+ }
+ | filter_sets
+ ;
+
+filter_sets : SET '{' filter_sets_l '}' { $$ = filter_opts; }
+ | SET filter_set { $$ = filter_opts; }
+ ;
+
+filter_sets_l : filter_sets_l comma filter_set
+ | filter_set
+ ;
+
+filter_set : prio {
if (filter_opts.marker & FOM_SETPRIO) {
yyerror("prio cannot be redefined");
YYERROR;
@@ -2388,8 +2403,13 @@ filter_opt : USER uids {
filter_opts.set_prio[0] = $1.b1;
filter_opts.set_prio[1] = $1.b2;
}
- | ONCE {
- filter_opts.marker |= FOM_ONCE;
+ | TOS tos {
+ if (filter_opts.marker & FOM_SETTOS) {
+ yyerror("tos cannot be respecified");
+ YYERROR;
+ }
+ filter_opts.marker |= FOM_SETTOS;
+ filter_opts.settos = $2;
}
;
Index: sbin/pfctl/pfctl_parser.c
===================================================================
RCS file: /cvs/src/sbin/pfctl/pfctl_parser.c,v
retrieving revision 1.285
diff -u -p -r1.285 pfctl_parser.c
--- sbin/pfctl/pfctl_parser.c 7 Jul 2012 16:24:32 -0000 1.285
+++ sbin/pfctl/pfctl_parser.c 7 Jul 2012 17:08:31 -0000
@@ -843,6 +843,25 @@ 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) {
+ char *comma = "";
+ printf(" set {");
+ if (r->set_prio[0] != PF_PRIO_NOTSET) {
+ if (r->set_prio[0] == r->set_prio[1])
+ printf("%s prio %u", comma, r->set_prio[0]);
+ else
+ printf("%s prio(%u, %u)", comma, r->set_prio[0],
+ r->set_prio[1]);
+ comma = ",";
+ }
+ if (r->scrub_flags & PFSTATE_SETTOS) {
+ printf("%s tos 0x%2.2x", comma, r->set_tos);
+ comma = ",";
+ }
+ printf(" }");
+ }
+
ropts = 0;
if (r->max_states || r->max_src_nodes || r->max_src_states)
ropts = 1;
@@ -998,12 +1017,6 @@ print_rule(struct pf_rule *r, const char
printf("min-ttl %d", r->min_ttl);
ropts = 0;
}
- if (r->scrub_flags & PFSTATE_SETTOS) {
- if (!ropts)
- printf(" ");
- printf("set-tos 0x%2.2x", r->set_tos);
- ropts = 0;
- }
if (r->scrub_flags & PFSTATE_SCRUB_TCP) {
if (!ropts)
printf(" ");
@@ -1088,12 +1101,6 @@ print_rule(struct pf_rule *r, const char
printf(" dup-to");
printf(" ");
print_pool(&r->route, 0, 0, r->af, PF_POOL_ROUTE, verbose);
- }
- if (r->set_prio[0] != PF_PRIO_NOTSET) {
- if (r->set_prio[0] == r->set_prio[1])
- printf(" prio %u", r->set_prio[0]);
- else
- printf(" prio(%u, %u)", r->set_prio[0], r->set_prio[1]);
}
}