diff options
author | Pablo Neira Ayuso <pablo@netfilter.org> | 2017-02-24 20:47:49 +0100 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2017-02-25 13:40:34 +0100 |
commit | b9b6092304aef17fea704c25b3d9d7dcdb3995a5 (patch) | |
tree | 38167a7fa655d2423f3d1e08b24c005813a3e54f /include | |
parent | 261a3e61bab009982239de3c550299c50a60d902 (diff) |
evaluate: store byteorder for set keys
Selectors that rely on the integer type and expect host endian
byteorder don't work properly.
We need to keep the byteorder around based on the left hand size
expression that provides the context, so store the byteorder when
evaluating the map.
Before this patch.
# nft --debug=netlink add rule x y meta mark set meta cpu map { 0 : 1, 1 : 2 }
__map%d x b
__map%d x 0
element 00000000 : 00000001 0 [end] element 01000000 : 00000002 0 [end]
^^^^^^^^
This is expressed in network byteorder, because the invalid byteorder
defaults on this.
After this patch:
# nft --debug=netlink add rule x y meta mark set meta cpu map { 0 : 1, 1 : 2 }
__map%d x b
__map%d x 0
element 00000000 : 00000001 0 [end] element 00000001 : 00000002 0 [end]
^^^^^^^^
This is in host byteorder, as the key selector in the map mandates.
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'include')
-rw-r--r-- | include/datatype.h | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/include/datatype.h b/include/datatype.h index 9f127f29..68fb2a6c 100644 --- a/include/datatype.h +++ b/include/datatype.h @@ -251,6 +251,10 @@ concat_subtype_lookup(uint32_t type, unsigned int n) return datatype_lookup(concat_subtype_id(type, n)); } +extern const struct datatype * +set_keytype_alloc(const struct datatype *orig_dtype, unsigned int byteorder); +extern void set_keytype_destroy(const struct datatype *dtype); + extern void time_print(uint64_t seconds); extern struct error_record *time_parse(const struct location *loc, const char *c, uint64_t *res); |