Klemens Nanni writes:
> On Wed, Nov 27, 2019 at 08:04:47PM +0100, Klemens Nanni wrote: >> If an anchor/ruleset contains no rules, there is no point in creating >> a temporary copy, optimizing and replacing it. >> >> Regress passes on amd64. >> >> Feedback? OK? > Anyone? > FWIW, it looks good to me. Ok mikeb > All optimizations work on actual rules; if there are none, we don't > need to look further, especially not in "profile" mode where existing > rules are read from the kernel as feedback: an empty ruleset will stay > empty after optimization is done. > > This also does not affect `set' or `table' lines in any way, e.g. > > # echo 'table <t>' | pfctl -o basic -d -nf- > > still is an empty ruleset. > > > I came across when debugging anchors, but with -DOPT_DEBUG as well this > time where `-d' output for multiple anchors wouldn't really be helpful: > > $ pfctl -dnf test.pf > pfctl_optimize_ruleset: optimizing ruleset > pfctl_optimize_ruleset: optimizing ruleset > pfctl_optimize_ruleset: optimizing ruleset > > So below is an updated diff that also prints the anchor path, letting > developers know which anchor is being optimized in wha order: > > pfctl_optimize_ruleset: optimizing ruleset "" > pfctl_optimize_ruleset: optimizing ruleset "a1" > pfctl_optimize_ruleset: optimizing ruleset "_1/a2" > > Yes, the main anchor prints as "" but all that is behind compile time > -DOPT_DEBUG so regular users won't deal with it anyway, so keep the code > simple instead of adding logging around `rs->anchor->path'. > > OK? > > > Index: pfctl_optimize.c > =================================================================== > RCS file: /cvs/src/sbin/pfctl/pfctl_optimize.c,v > retrieving revision 1.42 > diff -u -p -r1.42 pfctl_optimize.c > --- pfctl_optimize.c 28 Jun 2019 13:32:45 -0000 1.42 > +++ pfctl_optimize.c 12 Dec 2019 20:06:15 -0000 > @@ -270,7 +270,10 @@ pfctl_optimize_ruleset(struct pfctl *pf, > struct pf_rule *r; > struct pf_rulequeue *old_rules; > > - DEBUG("optimizing ruleset"); > + if (TAILQ_EMPTY(rs->rules.active.ptr)) > + return (0); > + > + DEBUG("optimizing ruleset \"%s\"", rs->anchor->path); > memset(&table_buffer, 0, sizeof(table_buffer)); > skip_init(); > TAILQ_INIT(&opt_queue);