]> git.ipfire.org Git - thirdparty/nftables.git/commit
src: support for selectors with different byteorder with interval concatenations
authorPablo Neira Ayuso <pablo@netfilter.org>
Wed, 23 Nov 2022 16:59:21 +0000 (17:59 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Wed, 30 Nov 2022 11:50:00 +0000 (12:50 +0100)
commit1017d323cafa6d4df34b9a2d0bea505e5253bc2b
tree56215f9c59d06c8e27691f6a3a015c32ad442b73
parentc327e9331e50d7b4d6cfd0a82fb38bec73703bfb
src: support for selectors with different byteorder with interval concatenations

Assuming the following interval set with concatenation:

 set test {
typeof ip saddr . meta mark
flags interval
 }

then, the following rule:

 ip saddr . meta mark @test

requires bytecode that swaps the byteorder for the meta mark selector in
case the set contains intervals and concatenations.

 inet x y
   [ meta load nfproto => reg 1 ]
   [ cmp eq reg 1 0x00000002 ]
   [ payload load 4b @ network header + 12 => reg 1 ]
   [ meta load mark => reg 9 ]
   [ byteorder reg 9 = hton(reg 9, 4, 4) ]  <----- this is required !
   [ lookup reg 1 set test dreg 0 ]

This patch updates byteorder_conversion() to add the unary expression
that introduces the byteorder expression.

Moreover, store the meta mark range component of the element tuple in
the set in big endian as it is required for the range comparisons. Undo
the byteorder swap in the netlink delinearize path to listing the meta
mark values accordingly.

Update tests/py to validate that byteorder expression is emitted in the
bytecode. Update tests/shell to validate insertion and listing of a
named map declaration.

A similar commit 806ab081dc9a ("netlink: swap byteorder for
host-endian concat data") already exists in the tree to handle this for
strings with prefix (e.g. eth*).

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
src/evaluate.c
src/netlink.c
tests/py/inet/meta.t
tests/py/inet/meta.t.payload
tests/shell/testcases/maps/0012map_0
tests/shell/testcases/maps/dumps/0012map_0.nft