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?
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);