]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
netlink: handle concatenations on set elements mappings
authorFlorian Westphal <fw@strlen.de>
Mon, 24 Feb 2020 00:03:21 +0000 (01:03 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Mon, 24 Feb 2020 09:58:04 +0000 (10:58 +0100)
We can already handle concatenated keys, this extends concat
coverage to the data type as well, i.e. this can be dissected:

type ipv4_addr : ipv4_addr . inet_service

Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
src/netlink.c

index e4128963138092d6d8446be09c7bbc06694e4280..0c6b8c58238b72a1d9f959d34add8d56e619efb8 100644 (file)
@@ -169,6 +169,9 @@ static struct nftnl_set_elem *alloc_nftnl_setelem(const struct expr *set,
                                nftnl_set_elem_set(nlse, NFTNL_SET_ELEM_CHAIN,
                                                   nld.chain, strlen(nld.chain));
                        break;
+               case EXPR_CONCAT:
+                       assert(nld.len > 0);
+                       /* fallthrough */
                case EXPR_VALUE:
                        nftnl_set_elem_set(nlse, NFTNL_SET_ELEM_DATA,
                                           nld.value, nld.len);
@@ -1005,6 +1008,10 @@ key_end:
                                          NFT_REG_VERDICT : NFT_REG_1);
                datatype_set(data, set->data->dtype);
                data->byteorder = set->data->byteorder;
+
+               if (set->data->dtype->subtypes)
+                       data = netlink_parse_concat_elem(set->data->dtype, data);
+
                if (data->byteorder == BYTEORDER_HOST_ENDIAN)
                        mpz_switch_byteorder(data->value, data->len / BITS_PER_BYTE);