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);
38 void nftnl_gen_free(
const struct nftnl_gen *gen)
42 EXPORT_SYMBOL(nftnl_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);
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);
63 static uint32_t nftnl_gen_validate[NFTNL_GEN_MAX + 1] = {
64 [NFTNL_GEN_ID] =
sizeof(uint32_t),
67 int nftnl_gen_set_data(
struct nftnl_gen *gen, uint16_t attr,
68 const void *data, uint32_t data_len)
70 nftnl_assert_attr_exists(attr, NFTNL_GEN_MAX);
71 nftnl_assert_validate(data, nftnl_gen_validate, attr, data_len);
75 gen->id = *((uint32_t *)data);
78 gen->flags |= (1 << attr);
81 EXPORT_SYMBOL(nftnl_gen_set_data);
83 int nftnl_gen_set(
struct nftnl_gen *gen, uint16_t attr,
const void *data)
85 return nftnl_gen_set_data(gen, attr, data, nftnl_gen_validate[attr]);
87 EXPORT_SYMBOL(nftnl_gen_set);
89 void nftnl_gen_set_u32(
struct nftnl_gen *gen, uint16_t attr, uint32_t val)
91 nftnl_gen_set_data(gen, attr, &val,
sizeof(uint32_t));
93 EXPORT_SYMBOL(nftnl_gen_set_u32);
95 const void *nftnl_gen_get_data(
const struct nftnl_gen *gen, uint16_t attr,
98 if (!(gen->flags & (1 << attr)))
103 *data_len =
sizeof(gen->id);
108 EXPORT_SYMBOL(nftnl_gen_get_data);
110 const void *nftnl_gen_get(
const struct nftnl_gen *gen, uint16_t attr)
113 return nftnl_gen_get_data(gen, attr, &data_len);
115 EXPORT_SYMBOL(nftnl_gen_get);
117 uint32_t nftnl_gen_get_u32(
const 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);
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);
159 static int nftnl_gen_snprintf_default(
char *buf,
size_t size,
162 return snprintf(buf, size,
"ruleset generation ID %u", gen->id);
165 static int nftnl_gen_cmd_snprintf(
char *buf,
size_t size,
166 const struct nftnl_gen *gen, uint32_t cmd,
167 uint32_t type, uint32_t flags)
169 int ret, remain = size, offset = 0;
171 ret = nftnl_cmd_header_snprintf(buf + offset, remain, cmd, type, flags);
172 SNPRINTF_BUFFER_SIZE(ret, remain, offset);
175 case NFTNL_OUTPUT_DEFAULT:
176 ret = nftnl_gen_snprintf_default(buf + offset, remain, gen);
181 SNPRINTF_BUFFER_SIZE(ret, remain, offset);
183 ret = nftnl_cmd_footer_snprintf(buf + offset, remain, cmd, type, flags);
184 SNPRINTF_BUFFER_SIZE(ret, remain, offset);
189 int nftnl_gen_snprintf(
char *buf,
size_t size,
const struct nftnl_gen *gen,
190 uint32_t type, uint32_t flags)
195 return nftnl_gen_cmd_snprintf(buf, size, gen, nftnl_flag2cmd(flags), type,
198 EXPORT_SYMBOL(nftnl_gen_snprintf);
200 static int nftnl_gen_do_snprintf(
char *buf,
size_t size,
const void *gen,
201 uint32_t cmd, uint32_t type, uint32_t flags)
203 return nftnl_gen_snprintf(buf, size, gen, type, flags);
206 int nftnl_gen_fprintf(FILE *fp,
const struct nftnl_gen *gen, uint32_t type,
209 return nftnl_fprintf(fp, gen, NFTNL_CMD_UNSPEC, type, flags,
210 nftnl_gen_do_snprintf);
212 EXPORT_SYMBOL(nftnl_gen_fprintf);