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>
32EXPORT_SYMBOL(nftnl_gen_alloc);
35 return calloc(1,
sizeof(
struct nftnl_gen));
38EXPORT_SYMBOL(nftnl_gen_free);
39void nftnl_gen_free(
const struct nftnl_gen *gen)
44EXPORT_SYMBOL(nftnl_gen_is_set);
45bool nftnl_gen_is_set(
const struct nftnl_gen *gen, uint16_t attr)
47 return gen->flags & (1 << attr);
50EXPORT_SYMBOL(nftnl_gen_unset);
51void nftnl_gen_unset(
struct nftnl_gen *gen, uint16_t attr)
53 if (!(gen->flags & (1 << attr)))
60 gen->flags &= ~(1 << attr);
63static uint32_t nftnl_gen_validate[NFTNL_GEN_MAX + 1] = {
64 [NFTNL_GEN_ID] =
sizeof(uint32_t),
67EXPORT_SYMBOL(nftnl_gen_set_data);
68int nftnl_gen_set_data(
struct nftnl_gen *gen, uint16_t attr,
69 const void *data, uint32_t data_len)
71 nftnl_assert_attr_exists(attr, NFTNL_GEN_MAX);
72 nftnl_assert_validate(data, nftnl_gen_validate, attr, data_len);
76 memcpy(&gen->id, data,
sizeof(gen->id));
79 gen->flags |= (1 << attr);
83int nftnl_gen_set(
struct nftnl_gen *gen, uint16_t attr,
const void *data) __visible;
84int nftnl_gen_set(
struct nftnl_gen *gen, uint16_t attr,
const void *data)
86 return nftnl_gen_set_data(gen, attr, data, nftnl_gen_validate[attr]);
89EXPORT_SYMBOL(nftnl_gen_set_u32);
90void 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));
95EXPORT_SYMBOL(nftnl_gen_get_data);
96const void *nftnl_gen_get_data(
const struct nftnl_gen *gen, uint16_t attr,
99 if (!(gen->flags & (1 << attr)))
104 *data_len =
sizeof(gen->id);
110EXPORT_SYMBOL(nftnl_gen_get);
111const void *nftnl_gen_get(
const struct nftnl_gen *gen, uint16_t attr)
114 return nftnl_gen_get_data(gen, attr, &data_len);
117EXPORT_SYMBOL(nftnl_gen_get_u32);
118uint32_t nftnl_gen_get_u32(
const struct nftnl_gen *gen, uint16_t attr)
120 const void *ret = nftnl_gen_get(gen, attr);
121 return ret == NULL ? 0 : *((uint32_t *)ret);
124static 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)
143EXPORT_SYMBOL(nftnl_gen_nlmsg_parse);
144int nftnl_gen_nlmsg_parse(
const struct nlmsghdr *nlh,
struct nftnl_gen *gen)
146 struct nlattr *tb[NFTA_GEN_MAX + 1] = {};
148 if (mnl_attr_parse(nlh,
sizeof(
struct nfgenmsg),
149 nftnl_gen_parse_attr_cb, tb) < 0)
152 if (tb[NFTA_GEN_ID]) {
153 gen->id = ntohl(mnl_attr_get_u32(tb[NFTA_GEN_ID]));
154 gen->flags |= (1 << NFTNL_GEN_ID);
159static int nftnl_gen_cmd_snprintf(
char *buf,
size_t remain,
160 const struct nftnl_gen *gen, uint32_t cmd,
161 uint32_t type, uint32_t flags)
165 if (type != NFTNL_OUTPUT_DEFAULT)
168 ret = snprintf(buf, remain,
"ruleset generation ID %u", gen->id);
169 SNPRINTF_BUFFER_SIZE(ret, remain, offset);
173EXPORT_SYMBOL(nftnl_gen_snprintf);
174int nftnl_gen_snprintf(
char *buf,
size_t size,
const struct nftnl_gen *gen,
175 uint32_t type, uint32_t flags)
180 return nftnl_gen_cmd_snprintf(buf, size, gen, nftnl_flag2cmd(flags), type,
184static int nftnl_gen_do_snprintf(
char *buf,
size_t size,
const void *gen,
185 uint32_t cmd, uint32_t type, uint32_t flags)
187 return nftnl_gen_snprintf(buf, size, gen, type, flags);
190EXPORT_SYMBOL(nftnl_gen_fprintf);
191int nftnl_gen_fprintf(FILE *fp,
const struct nftnl_gen *gen, uint32_t type,
194 return nftnl_fprintf(fp, gen, NFTNL_CMD_UNSPEC, type, flags,
195 nftnl_gen_do_snprintf);