17 #include <netinet/in.h>
20 #include <libmnl/libmnl.h>
21 #include <linux/netfilter/nfnetlink.h>
22 #include <linux/netfilter/nf_tables.h>
24 #include <libnftnl/gen.h>
34 return calloc(1,
sizeof(
struct nftnl_gen));
36 EXPORT_SYMBOL(nftnl_gen_alloc, nft_gen_alloc);
38 void nftnl_gen_free(
struct nftnl_gen *gen)
42 EXPORT_SYMBOL(nftnl_gen_free, nft_gen_free);
44 bool nftnl_gen_is_set(
const struct nftnl_gen *gen, uint16_t attr)
46 return gen->flags & (1 << attr);
48 EXPORT_SYMBOL(nftnl_gen_is_set, nft_gen_attr_is_set);
50 void nftnl_gen_unset(
struct nftnl_gen *gen, uint16_t attr)
52 if (!(gen->flags & (1 << attr)))
59 gen->flags &= ~(1 << attr);
61 EXPORT_SYMBOL(nftnl_gen_unset, nft_gen_attr_unset);
63 static uint32_t nftnl_gen_validate[NFTNL_GEN_MAX + 1] = {
64 [NFTNL_GEN_ID] =
sizeof(uint32_t),
67 void nftnl_gen_set_data(
struct nftnl_gen *gen, uint16_t attr,
68 const void *data, uint32_t data_len)
70 if (attr > NFTNL_GEN_MAX)
73 nftnl_assert_validate(data, nftnl_gen_validate, attr, data_len);
77 gen->id = *((uint32_t *)data);
80 gen->flags |= (1 << attr);
82 EXPORT_SYMBOL(nftnl_gen_set_data, nft_gen_attr_set_data);
84 void nftnl_gen_set(
struct nftnl_gen *gen, uint16_t attr,
const void *data)
86 nftnl_gen_set_data(gen, attr, data, nftnl_gen_validate[attr]);
88 EXPORT_SYMBOL(nftnl_gen_set, nft_gen_attr_set);
90 void nftnl_gen_set_u32(
struct nftnl_gen *gen, uint16_t attr, uint32_t val)
92 nftnl_gen_set_data(gen, attr, &val,
sizeof(uint32_t));
94 EXPORT_SYMBOL(nftnl_gen_set_u32, nft_gen_attr_set_u32);
96 const void *nftnl_gen_get_data(
struct nftnl_gen *gen, uint16_t attr,
99 if (!(gen->flags & (1 << attr)))
108 EXPORT_SYMBOL(nftnl_gen_get_data, nft_gen_attr_get_data);
110 const void *nftnl_gen_get(
struct nftnl_gen *gen, uint16_t attr)
113 return nftnl_gen_get_data(gen, attr, &data_len);
115 EXPORT_SYMBOL(nftnl_gen_get, nft_gen_attr_get);
117 uint32_t nftnl_gen_get_u32(
struct nftnl_gen *gen, uint16_t attr)
119 const void *ret = nftnl_gen_get(gen, attr);
120 return ret == NULL ? 0 : *((uint32_t *)ret);
122 EXPORT_SYMBOL(nftnl_gen_get_u32, nft_gen_attr_get_u32);
124 static int nftnl_gen_parse_attr_cb(
const struct nlattr *attr,
void *data)
126 const struct nlattr **tb = data;
127 int type = mnl_attr_get_type(attr);
129 if (mnl_attr_type_valid(attr, NFTA_GEN_MAX) < 0)
134 if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
143 int nftnl_gen_nlmsg_parse(
const struct nlmsghdr *nlh,
struct nftnl_gen *gen)
145 struct nlattr *tb[NFTA_GEN_MAX + 1] = {};
146 struct nfgenmsg *nfg = mnl_nlmsg_get_payload(nlh);
148 if (mnl_attr_parse(nlh,
sizeof(*nfg), nftnl_gen_parse_attr_cb, tb) < 0)
151 if (tb[NFTA_GEN_ID]) {
152 gen->id = ntohl(mnl_attr_get_u32(tb[NFTA_GEN_ID]));
153 gen->flags |= (1 << NFTNL_GEN_ID);
157 EXPORT_SYMBOL(nftnl_gen_nlmsg_parse, nft_gen_nlmsg_parse);
159 static int nftnl_gen_snprintf_default(
char *buf,
size_t size,
struct nftnl_gen *gen)
161 return snprintf(buf, size,
"ruleset generation ID %u", gen->id);
164 static int nftnl_gen_cmd_snprintf(
char *buf,
size_t size,
struct nftnl_gen *gen,
165 uint32_t cmd, uint32_t type, uint32_t flags)
167 int ret, len = size, offset = 0;
169 ret = nftnl_cmd_header_snprintf(buf + offset, len, cmd, type, flags);
170 SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
173 case NFTNL_OUTPUT_DEFAULT:
174 ret = nftnl_gen_snprintf_default(buf + offset, len, gen);
179 SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
181 ret = nftnl_cmd_footer_snprintf(buf + offset, len, cmd, type, flags);
182 SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
187 int nftnl_gen_snprintf(
char *buf,
size_t size,
struct nftnl_gen *gen, uint32_t type,
190 return nftnl_gen_cmd_snprintf(buf, size, gen, nftnl_flag2cmd(flags), type,
193 EXPORT_SYMBOL(nftnl_gen_snprintf, nft_gen_snprintf);
195 static inline int nftnl_gen_do_snprintf(
char *buf,
size_t size,
void *gen,
196 uint32_t cmd, uint32_t type,
199 return nftnl_gen_snprintf(buf, size, gen, type, flags);
202 int nftnl_gen_fprintf(FILE *fp,
struct nftnl_gen *gen, uint32_t type,
205 return nftnl_fprintf(fp, gen, NFTNL_CMD_UNSPEC, type, flags,
206 nftnl_gen_do_snprintf);
208 EXPORT_SYMBOL(nftnl_gen_fprintf, nft_gen_fprintf);