summaryrefslogtreecommitdiffstats
path: root/src/jansson.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/jansson.c')
-rw-r--r--src/jansson.c37
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