This change speeds up DIOCGETRULE ioctl(2) which pfctl(8) uses to
authorsashan <sashan@openbsd.org>
Fri, 28 Apr 2023 14:08:38 +0000 (14:08 +0000)
committersashan <sashan@openbsd.org>
Fri, 28 Apr 2023 14:08:38 +0000 (14:08 +0000)
commit072583c99019a91ac511a1e33e10ad02df79ec97
tree83103713fc3bd2a55660c376588c037178b5f0ed
parent49f39043a02d6011c1907e1b07eb034652a1269c
This change speeds up DIOCGETRULE ioctl(2) which pfctl(8) uses to
retrieve rules from kernel. The current implementation requires
like O((n^2)/2) operation to read the complete rule set, because
each DIOCGETRULE operation must iterate over previous n
rules to find (n + 1)-th rule to read.

To address the issue diff introduces a pf_trans structure to keep
pointer to next rule to read, thus  reading process does not need
to iterate from beginning of rule set to reach the next rule.
All transactions opened by process get closed either when process
is done (reads all rules) or when /dev/pf device is closed.

the diff also comes with lots of improvements from dlg@ and kn@

OK dlg@, kn@
sbin/pfctl/pfctl.c
sys/net/pf_ioctl.c
sys/net/pf_ruleset.c
sys/net/pfvar.h
sys/net/pfvar_priv.h