diff options
Diffstat (limited to 'src/jansson.c')
-rw-r--r-- | src/jansson.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/jansson.c b/src/jansson.c index 682b74b..04146e2 100644 --- a/src/jansson.c +++ b/src/jansson.c @@ -16,6 +16,7 @@ #include <errno.h> #include <string.h> #include "expr_ops.h" +#include <libnftables/set.h> #include <libnftables/expr.h> #include <linux/netfilter/nf_tables.h> @@ -210,4 +211,40 @@ int nft_jansson_data_reg_parse(json_t *root, const char *tag, return -1; } } + +int nft_set_elem_json_parse(struct nft_set_elem *e, json_t *root) +{ + uint32_t uval32; + int set_elem_data; + + if (nft_jansson_parse_val(root, "flags", NFT_TYPE_U32, &uval32) < 0) + return -1; + + nft_set_elem_attr_set_u32(e, NFT_SET_ELEM_ATTR_FLAGS, uval32); + + if (nft_jansson_data_reg_parse(root, "key", &e->key) != DATA_VALUE) + return -1; + + e->flags |= (1 << NFT_SET_ELEM_ATTR_KEY); + + if (nft_jansson_node_exist(root, "data")) { + set_elem_data = nft_jansson_data_reg_parse(root, "data", + &e->data); + switch (set_elem_data) { + case DATA_VALUE: + e->flags |= (1 << NFT_SET_ELEM_ATTR_DATA); + break; + case DATA_VERDICT: + e->flags |= (1 << NFT_SET_ELEM_ATTR_VERDICT); + break; + case DATA_CHAIN: + e->flags |= (1 << NFT_SET_ELEM_ATTR_CHAIN); + break; + default: + return -1; + } + } + + return 0; +} #endif |