17 #include <linux/netfilter/nf_tables.h>
18 #include <libnftnl/table.h>
19 #include <libnftnl/chain.h>
20 #include <libnftnl/rule.h>
21 #include <libnftnl/expr.h>
22 #include <libnftnl/set.h>
25 mxml_node_t *nftnl_mxml_build_tree(
const void *data,
const char *treename,
26 struct nftnl_parse_err *err,
enum nftnl_parse_input input)
31 case NFTNL_PARSE_BUFFER:
32 tree = mxmlLoadString(NULL, data, MXML_OPAQUE_CALLBACK);
34 case NFTNL_PARSE_FILE:
35 tree = mxmlLoadFile(NULL, (FILE *)data, MXML_OPAQUE_CALLBACK);
42 err->error = NFTNL_PARSE_EBADINPUT;
46 if (tree->value.opaque != NULL &&
47 strcmp(tree->value.opaque, treename) == 0)
50 err->error = NFTNL_PARSE_EMISSINGNODE;
51 err->node_name = treename;
61 struct nftnl_expr *nftnl_mxml_expr_parse(mxml_node_t *node,
62 struct nftnl_parse_err *err,
67 const char *expr_name;
72 expr_name = mxmlElementGetAttr(node,
"type");
73 if (expr_name == NULL) {
74 err->node_name =
"type";
75 err->error = NFTNL_PARSE_EMISSINGNODE;
79 e = nftnl_expr_alloc(expr_name);
83 xml_text = mxmlSaveAllocString(node, MXML_NO_CALLBACK);
87 tree = mxmlLoadString(NULL, xml_text, MXML_OPAQUE_CALLBACK);
93 ret = e->ops->xml_parse(e, tree, err);
96 if (set_list != NULL &&
97 strcmp(expr_name,
"lookup") == 0 &&
98 nftnl_set_lookup_id(e, set_list, &set_id))
99 nftnl_expr_set_u32(e, NFTNL_EXPR_LOOKUP_SET_ID, set_id);
101 return ret < 0 ? NULL : e;
110 int nftnl_mxml_reg_parse(mxml_node_t *tree,
const char *reg_name, uint32_t *reg,
111 uint32_t mxmlflags, uint32_t flags,
112 struct nftnl_parse_err *err)
116 node = mxmlFindElement(tree, tree, reg_name, NULL, NULL, mxmlflags);
118 if (!(flags & NFTNL_XML_OPT)) {
119 err->error = NFTNL_PARSE_EMISSINGNODE;
126 if (nftnl_strtoi(node->child->value.opaque, BASE_DEC, reg,
127 NFTNL_TYPE_U32) != 0) {
128 err->error = NFTNL_PARSE_EBADTYPE;
132 if (*reg > NFT_REG_MAX) {
139 err->node_name = reg_name;
143 int nftnl_mxml_data_reg_parse(mxml_node_t *tree,
const char *node_name,
144 union nftnl_data_reg *data_reg, uint16_t flags,
145 struct nftnl_parse_err *err)
149 node = mxmlFindElement(tree, tree, node_name, NULL, NULL,
153 if (node == NULL || node->child == NULL)
156 return nftnl_data_reg_xml_parse(data_reg, node, err);
160 nftnl_mxml_num_parse(mxml_node_t *tree,
const char *node_name,
161 uint32_t mxml_flags,
int base,
void *number,
162 enum nftnl_type type, uint16_t flags,
163 struct nftnl_parse_err *err)
165 mxml_node_t *node = NULL;
168 node = mxmlFindElement(tree, tree, node_name, NULL, NULL, mxml_flags);
169 if (node == NULL || node->child == NULL) {
170 if (!(flags & NFTNL_XML_OPT)) {
172 err->node_name = node_name;
173 err->error = NFTNL_PARSE_EMISSINGNODE;
178 ret = nftnl_strtoi(node->child->value.opaque, base, number, type);
181 err->error = NFTNL_PARSE_EBADTYPE;
182 err->node_name = node_name;
187 const char *nftnl_mxml_str_parse(mxml_node_t *tree,
const char *node_name,
188 uint32_t mxml_flags, uint16_t flags,
189 struct nftnl_parse_err *err)
194 node = mxmlFindElement(tree, tree, node_name, NULL, NULL, mxml_flags);
195 if (node == NULL || node->child == NULL) {
196 if (!(flags & NFTNL_XML_OPT)) {
198 err->node_name = node_name;
199 err->error = NFTNL_PARSE_EMISSINGNODE;
204 ret = node->child->value.opaque;
206 err->node_name = node_name;
207 err->error = NFTNL_PARSE_EBADTYPE;
212 int nftnl_mxml_family_parse(mxml_node_t *tree,
const char *node_name,
213 uint32_t mxml_flags, uint16_t flags,
214 struct nftnl_parse_err *err)
216 const char *family_str;
219 family_str = nftnl_mxml_str_parse(tree, node_name, mxml_flags,
221 if (family_str == NULL)
224 family = nftnl_str2family(family_str);
226 err->node_name = node_name;
227 errno = EAFNOSUPPORT;