diff options
author | Arturo Borrero Gonzalez <arturo.borrero.glez@gmail.com> | 2013-04-07 22:30:22 +0000 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2013-04-19 01:35:33 +0200 |
commit | aa56f410581fe3539b3c907c2a2fdec360481d5c (patch) | |
tree | 2e0fbf8123ea70f739c4b6879f2817eabb2a0cad /src/expr/data_reg.c | |
parent | 00ea30a840c0a7620b3a227198ded78b49d7e67e (diff) |
expr: basic support for printing nft_data_reg in XML format
nft_data_reg now is printed in XML according to what it contains
<data> nodes have been also renamed.
Arturo Borrero Gonzalez says:
====================
cmp is using <cmpdata> <cmpdata> has <data_reg></data_reg> which
can also be redundant.
But all around the XML printing (including sets, an incoming patch)
i've been nesting the data_reg into another XML node, so you could
easily see (also the XML parser) the difference between (for example.
in set) nft_set_elem->key and nft_set_elem->data.
As I needed to nest in nft_set_elem I decided to follow a constant
line and do nest all data_reg.
====================
Signed-off-by: Arturo Borrero Gonzalez <arturo.borrero.glez@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src/expr/data_reg.c')
-rw-r--r-- | src/expr/data_reg.c | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/src/expr/data_reg.c b/src/expr/data_reg.c index 5b14695..78c7d49 100644 --- a/src/expr/data_reg.c +++ b/src/expr/data_reg.c @@ -18,10 +18,105 @@ #include <linux/netfilter.h> #include <linux/netfilter/nf_tables.h> #include <libnftables/expr.h> +#include <libnftables/rule.h> #include "expr_ops.h" #include "data_reg.h" #include "internal.h" +static int nft_data_reg_value_snprintf_xml(char *buf, size_t size, + union nft_data_reg *reg, + uint32_t flags) +{ + int len = size, offset = 0, ret, i, j; + uint8_t *tmp; + int data_len = reg->len/sizeof(uint32_t); + + ret = snprintf(buf, len, "<data_reg type=\"value\" >"); + SNPRINTF_BUFFER_SIZE(ret, size, len, offset); + + ret = snprintf(buf+offset, len, "<len>%d</len>", data_len); + SNPRINTF_BUFFER_SIZE(ret, size, len, offset); + + for (i=0; i<data_len; i++) { + ret = snprintf(buf+offset, len, "<data%d>0x", i); + SNPRINTF_BUFFER_SIZE(ret, size, len, offset); + + tmp = (uint8_t *)®->val[i]; + + for (j=0; j<sizeof(int); j++) { + ret = snprintf(buf+offset, len, "%.02x", tmp[j]); + SNPRINTF_BUFFER_SIZE(ret, size, len, offset); + } + + ret = snprintf(buf+offset, len, "</data%d>", i); + SNPRINTF_BUFFER_SIZE(ret, size, len, offset); + } + + ret = snprintf(buf+offset, len, "</data_reg>"); + SNPRINTF_BUFFER_SIZE(ret, size, len, offset); + + return offset; +} + +static int +nft_data_reg_value_snprintf_default(char *buf, size_t size, + union nft_data_reg *reg, uint32_t flags) +{ + int len = size, offset = 0, ret, i; + + for (i=0; i<reg->len/sizeof(uint32_t); i++) { + ret = snprintf(buf+offset, len, "0x%.8x ", reg->val[i]); + SNPRINTF_BUFFER_SIZE(ret, size, len, offset); + } + + return offset; +} + +int nft_data_reg_snprintf(char *buf, size_t size, union nft_data_reg *reg, + uint32_t output_format, uint32_t flags, int reg_type) +{ + switch(reg_type) { + case DATA_VALUE: + switch(output_format) { + case NFT_RULE_O_XML: + return nft_data_reg_value_snprintf_xml(buf, size, + reg, flags); + case NFT_RULE_O_DEFAULT: + return nft_data_reg_value_snprintf_default(buf, size, + reg, flags); + default: + break; + } + case DATA_VERDICT: + switch(output_format) { + case NFT_RULE_O_XML: + return snprintf(buf, size, + "<data_reg type=\"verdict\" >" + "<verdict>%d</verdict>" + "</data_reg>", reg->verdict); + case NFT_RULE_O_DEFAULT: + return snprintf(buf, size, "verdict=%d", reg->verdict); + default: + break; + } + case DATA_CHAIN: + switch(output_format) { + case NFT_RULE_O_XML: + return snprintf(buf, size, + "<data_reg type=\"chain\" >" + "<chain>%s</chain>" + "</data_reg>", reg->chain); + case NFT_RULE_O_DEFAULT: + return snprintf(buf, size, "chain=%s", reg->chain); + default: + break; + } + default: + break; + } + return -1; +} + static int nft_data_parse_cb(const struct nlattr *attr, void *data) { const struct nlattr **tb = data; |