]> git.ipfire.org Git - thirdparty/nftables.git/commit
rule: collapse set element commands
authorPablo Neira Ayuso <pablo@netfilter.org>
Mon, 13 Jun 2022 15:22:44 +0000 (17:22 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Sat, 18 Jun 2022 22:55:16 +0000 (00:55 +0200)
commit498a5f0c219d8a118af4f172f248647d9b077101
tree51555bfc0bf056b1db7c15d4b5321541b34514ca
parent8fafe4e6b5b30f2539f16403da8d5c5f819e523b
rule: collapse set element commands

Robots might generate a long list of singleton element commands such as:

  add element t s { 1.0.1.0/24 }
  ...
  add element t s { 1.0.2.0/23 }

collapse them into one single command before the evaluation step, ie.

  add element t s { 1.0.1.0/24, ..., 1.0.2.0/23 }

this speeds up overlap detection and set element automerge operations in
this worst case scenario.

Since 3da9643fb9ff9 ("intervals: add support to automerge with kernel
elements"), the new interval tracking relies on mergesort. The pattern
above triggers the set sorting for each element.

This patch adds a list to cmd objects that store collapsed commands.
Moreover, expressions also contain a reference to the original command,
to uncollapse the commands after the evaluation step.

These commands are uncollapsed after the evaluation step to ensure error
reporting works as expected (command and netlink message are mapped
1:1).

For the record:

- nftables versions <= 1.0.2 did not perform any kind of overlap
  check for the described scenario above (because set cache only contained
  elements in the kernel in this case). This is a problem for kernels < 5.7
  which rely on userspace to detect overlaps.

- the overlap detection could be skipped for kernels >= 5.7.

- The extended netlink error reporting available for set elements
  since 5.19-rc might allow to remove the uncollapse step, in this case,
  error reporting does not rely on the netlink sequence to refer to the
  command triggering the problem.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
include/expression.h
include/rule.h
src/libnftables.c
src/rule.c