On Tue, Mar 22, 2016 at 08:46:27PM +0100, Carlos Falgueras García wrote: > Now it is possible to store multiple variable length user data into rule. > Modify the parser in order to fill the nftnl_udata with the comment, and > the print function for extract these commentary and print it to user. Applied with minor changes, see below. thanks Carlos. > Signed-off-by: Carlos Falgueras García <carlosfg@xxxxxxxxxx> > --- > include/rule.h | 7 +++++++ > src/netlink_delinearize.c | 40 ++++++++++++++++++++++++++++++++++++++-- > src/netlink_linearize.c | 18 ++++++++++++++++-- > 3 files changed, 61 insertions(+), 4 deletions(-) > > diff --git a/include/rule.h b/include/rule.h > index c848f0f..b52f0ac 100644 > --- a/include/rule.h > +++ b/include/rule.h > @@ -4,6 +4,7 @@ > #include <stdint.h> > #include <nftables.h> > #include <list.h> > +#include <libnftnl/udata.h> > > /** > * struct handle - handle for tables, chains, rules and sets > @@ -396,4 +397,10 @@ extern int do_command(struct netlink_ctx *ctx, struct cmd *cmd); > extern int cache_update(enum cmd_ops cmd, struct list_head *msgs); > extern void cache_release(void); > > +enum udata_type { > + UDATA_TYPE_COMMENT, > + __UDATA_TYPE_MAX, > +}; > +#define UDATA_TYPE_MAX (__UDATA_TYPE_MAX - 1) > + > #endif /* NFTABLES_RULE_H */ > diff --git a/src/netlink_delinearize.c b/src/netlink_delinearize.c > index d431588..1171e6f 100644 > --- a/src/netlink_delinearize.c > +++ b/src/netlink_delinearize.c > @@ -25,6 +25,7 @@ > #include <utils.h> > #include <erec.h> > #include <sys/socket.h> > +#include <libnftnl/udata.h> > > struct netlink_parse_ctx { > struct list_head *msgs; > @@ -1746,6 +1747,42 @@ static void rule_parse_postprocess(struct netlink_parse_ctx *ctx, struct rule *r > } > } > > +static int parse_udata_cb(const struct nftnl_udata *attr, void *data) > +{ > + unsigned char *value = nftnl_udata_attr_value(attr); > + uint8_t type = nftnl_udata_attr_type(attr); > + uint8_t len = nftnl_udata_attr_len(attr); > + const struct nftnl_udata **tb = data; > + > + switch (type) { > + case UDATA_TYPE_COMMENT: > + if (value[len - 1] != '\0') > + return -1; > + break; > + default: > + break; > + }; > + > + tb[type] = attr; > + return 1; > +} > + > +static char *udata_get_comment(const void *data, uint32_t data_len) > +{ > + const struct nftnl_udata *tb[UDATA_TYPE_MAX + 1] = {}; > + char *comment = NULL; > + > + if (nftnl_udata_parse(data, data_len, parse_udata_cb, tb) <= 0) > + return NULL; > + > + if (!tb[UDATA_TYPE_COMMENT]) > + return NULL; > + > + comment = xstrdup(nftnl_udata_attr_value(tb[UDATA_TYPE_COMMENT])); No need for char *comment, we can just: return xstrdup(...); -- To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html