15 #include <arpa/inet.h>
19 #include <libnftnl/set.h>
21 #include <libnftnl/expr.h>
22 #include <linux/netfilter/nf_tables.h>
26 static int nft_jansson_load_int_node(json_t *root,
const char *node_name,
27 json_int_t *val,
struct nft_parse_err *err)
31 node = json_object_get(root, node_name);
33 err->error = NFT_PARSE_EMISSINGNODE;
34 err->node_name = node_name;
39 if (!json_is_integer(node)) {
40 err->error = NFT_PARSE_EBADTYPE;
41 err->node_name = node_name;
45 *val = json_integer_value(node);
50 const char *nft_jansson_parse_str(json_t *root,
const char *node_name,
51 struct nft_parse_err *err)
56 node = json_object_get(root, node_name);
58 err->error = NFT_PARSE_EMISSINGNODE;
59 err->node_name = node_name;
64 val = json_string_value(node);
66 err->error = NFT_PARSE_EBADTYPE;
67 err->node_name = node_name;
73 int nft_jansson_parse_val(json_t *root,
const char *node_name,
int type,
74 void *out,
struct nft_parse_err *err)
78 if (nft_jansson_load_int_node(root, node_name, &val, err) == -1)
81 if (nft_get_value(type, &val, out) == -1)
87 bool nft_jansson_node_exist(json_t *root,
const char *node_name)
89 return json_object_get(root, node_name) != NULL;
92 json_t *nft_jansson_create_root(
const void *json, json_error_t *error,
93 struct nft_parse_err *err,
enum nft_parse_input input)
98 case NFT_PARSE_BUFFER:
99 root = json_loadb(json, strlen(json), 0, error);
102 root = json_loadf((FILE *)json, 0, error);
109 err->error = NFT_PARSE_EBADINPUT;
110 err->line = error->line;
111 err->column = error->column;
112 err->node_name = error->source;
122 json_t *nft_jansson_get_node(json_t *root,
const char *node_name,
123 struct nft_parse_err *err)
127 node = json_object_get(root, node_name);
129 err->error = NFT_PARSE_EMISSINGNODE;
130 err->node_name = node_name;
138 void nft_jansson_free_root(json_t *root)
143 int nft_jansson_parse_family(json_t *root,
void *out,
struct nft_parse_err *err)
148 str = nft_jansson_parse_str(root,
"family", err);
152 family = nft_str2family(str);
154 err->node_name =
"family";
159 memcpy(out, &family,
sizeof(family));
163 int nft_jansson_parse_reg(json_t *root,
const char *node_name,
int type,
164 void *out,
struct nft_parse_err *err)
166 if (nft_jansson_parse_val(root, node_name, type, out, err) < 0)
169 if (*((uint32_t *)out) > NFT_REG_MAX){
177 int nft_jansson_str2num(json_t *root,
const char *node_name,
int base,
178 void *out,
enum nft_type type,
struct nft_parse_err *err)
182 str = nft_jansson_parse_str(root, node_name, err);
186 return nft_strtoi(str, base, out, type);
189 struct nft_rule_expr *nft_jansson_expr_parse(json_t *root,
190 struct nft_parse_err *err)
192 struct nft_rule_expr *e;
196 type = nft_jansson_parse_str(root,
"type", err);
200 e = nft_rule_expr_alloc(type);
202 err->node_name =
"type";
206 ret = e->ops->json_parse(e, root, err);
208 return ret < 0 ? NULL : e;
211 int nft_jansson_data_reg_parse(json_t *root,
const char *node_name,
212 union nft_data_reg *data_reg,
213 struct nft_parse_err *err)
219 data = json_object_get(root, node_name);
223 data = json_object_get(data,
"data_reg");
225 err->error = NFT_PARSE_EMISSINGNODE;
226 err->node_name =
"data_reg";
231 ret = nft_data_reg_json_parse(data_reg, data, err);
232 if (ret == DATA_NONE) {
240 int nft_jansson_set_elem_parse(
struct nft_set_elem *e, json_t *root,
241 struct nft_parse_err *err)
246 if (nft_jansson_parse_val(root,
"flags", NFT_TYPE_U32, &flags, err) == 0)
247 nft_set_elem_attr_set_u32(e, NFT_SET_ELEM_ATTR_FLAGS, flags);
249 if (nft_jansson_data_reg_parse(root,
"key", &e->key, err) == DATA_VALUE)
250 e->flags |= (1 << NFT_SET_ELEM_ATTR_KEY);
252 if (nft_jansson_node_exist(root,
"data")) {
253 set_elem_data = nft_jansson_data_reg_parse(root,
"data",
255 switch (set_elem_data) {
257 e->flags |= (1 << NFT_SET_ELEM_ATTR_DATA);
260 e->flags |= (1 << NFT_SET_ELEM_ATTR_VERDICT);
261 if (e->data.chain != NULL)
262 e->flags |= (1 << NFT_SET_ELEM_ATTR_CHAIN);