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 nftnl_jansson_load_int_node(json_t *root,
const char *node_name,
27 json_int_t *val,
struct nftnl_parse_err *err)
31 node = json_object_get(root, node_name);
33 err->error = NFTNL_PARSE_EMISSINGNODE;
34 err->node_name = node_name;
39 if (!json_is_integer(node)) {
40 err->error = NFTNL_PARSE_EBADTYPE;
41 err->node_name = node_name;
45 *val = json_integer_value(node);
50 const char *nftnl_jansson_parse_str(json_t *root,
const char *node_name,
51 struct nftnl_parse_err *err)
56 node = json_object_get(root, node_name);
58 err->error = NFTNL_PARSE_EMISSINGNODE;
59 err->node_name = node_name;
64 val = json_string_value(node);
66 err->error = NFTNL_PARSE_EBADTYPE;
67 err->node_name = node_name;
73 int nftnl_jansson_parse_val(json_t *root,
const char *node_name,
int type,
74 void *out,
struct nftnl_parse_err *err)
78 if (nftnl_jansson_load_int_node(root, node_name, &val, err) == -1)
81 if (nftnl_get_value(type, &val, out) == -1)
87 bool nftnl_jansson_node_exist(json_t *root,
const char *node_name)
89 return json_object_get(root, node_name) != NULL;
92 json_t *nftnl_jansson_create_root(
const void *json, json_error_t *error,
93 struct nftnl_parse_err *err,
enum nftnl_parse_input input)
98 case NFTNL_PARSE_BUFFER:
99 root = json_loadb(json, strlen(json), 0, error);
101 case NFTNL_PARSE_FILE:
102 root = json_loadf((FILE *)json, 0, error);
109 err->error = NFTNL_PARSE_EBADINPUT;
110 err->line = error->line;
111 err->column = error->column;
112 err->node_name = error->source;
122 json_t *nftnl_jansson_get_node(json_t *root,
const char *node_name,
123 struct nftnl_parse_err *err)
127 node = json_object_get(root, node_name);
129 err->error = NFTNL_PARSE_EMISSINGNODE;
130 err->node_name = node_name;
138 void nftnl_jansson_free_root(json_t *root)
143 int nftnl_jansson_parse_family(json_t *root,
void *out,
struct nftnl_parse_err *err)
148 str = nftnl_jansson_parse_str(root,
"family", err);
152 family = nftnl_str2family(str);
154 err->node_name =
"family";
159 memcpy(out, &family,
sizeof(family));
163 int nftnl_jansson_parse_reg(json_t *root,
const char *node_name,
int type,
164 void *out,
struct nftnl_parse_err *err)
166 if (nftnl_jansson_parse_val(root, node_name, type, out, err) < 0)
169 if (*((uint32_t *)out) > NFT_REG_MAX){
177 int nftnl_jansson_str2num(json_t *root,
const char *node_name,
int base,
178 void *out,
enum nftnl_type type,
struct nftnl_parse_err *err)
182 str = nftnl_jansson_parse_str(root, node_name, err);
186 return nftnl_strtoi(str, base, out, type);
189 struct nftnl_expr *nftnl_jansson_expr_parse(json_t *root,
190 struct nftnl_parse_err *err,
193 struct nftnl_expr *e;
198 type = nftnl_jansson_parse_str(root,
"type", err);
202 e = nftnl_expr_alloc(type);
204 err->node_name =
"type";
208 ret = e->ops->json_parse(e, root, err);
210 if (set_list != NULL &&
211 strcmp(type,
"lookup") == 0 &&
212 nftnl_set_lookup_id(e, set_list, &set_id))
213 nftnl_expr_set_u32(e, NFTNL_EXPR_LOOKUP_SET_ID, set_id);
215 return ret < 0 ? NULL : e;
218 int nftnl_jansson_data_reg_parse(json_t *root,
const char *node_name,
219 union nftnl_data_reg *data_reg,
220 struct nftnl_parse_err *err)
226 data = json_object_get(root, node_name);
230 data = json_object_get(data,
"reg");
232 err->error = NFTNL_PARSE_EMISSINGNODE;
233 err->node_name =
"reg";
238 ret = nftnl_data_reg_json_parse(data_reg, data, err);
239 if (ret == DATA_NONE) {
247 int nftnl_jansson_set_elem_parse(
struct nftnl_set_elem *e, json_t *root,
248 struct nftnl_parse_err *err)
253 if (nftnl_jansson_parse_val(root,
"flags", NFTNL_TYPE_U32, &flags, err) == 0)
254 nftnl_set_elem_set_u32(e, NFTNL_SET_ELEM_FLAGS, flags);
256 if (nftnl_jansson_data_reg_parse(root,
"key", &e->key, err) == DATA_VALUE)
257 e->flags |= (1 << NFTNL_SET_ELEM_KEY);
259 if (nftnl_jansson_node_exist(root,
"data")) {
260 set_elem_data = nftnl_jansson_data_reg_parse(root,
"data",
262 switch (set_elem_data) {
264 e->flags |= (1 << NFTNL_SET_ELEM_DATA);
267 e->flags |= (1 << NFTNL_SET_ELEM_VERDICT);
268 if (e->data.chain != NULL)
269 e->flags |= (1 << NFTNL_SET_ELEM_CHAIN);