13#include <netinet/in.h>
16#include <libmnl/libmnl.h>
17#include <linux/netfilter/nfnetlink.h>
18#include <linux/netfilter/nf_tables.h>
20#include <libnftnl/gen.h>
28EXPORT_SYMBOL(nftnl_gen_alloc);
31 return calloc(1,
sizeof(
struct nftnl_gen));
34EXPORT_SYMBOL(nftnl_gen_free);
35void nftnl_gen_free(
const struct nftnl_gen *gen)
40EXPORT_SYMBOL(nftnl_gen_is_set);
41bool nftnl_gen_is_set(
const struct nftnl_gen *gen, uint16_t attr)
43 return gen->flags & (1 << attr);
46EXPORT_SYMBOL(nftnl_gen_unset);
47void nftnl_gen_unset(
struct nftnl_gen *gen, uint16_t attr)
49 if (!(gen->flags & (1 << attr)))
56 gen->flags &= ~(1 << attr);
59static uint32_t nftnl_gen_validate[NFTNL_GEN_MAX + 1] = {
60 [NFTNL_GEN_ID] =
sizeof(uint32_t),
63EXPORT_SYMBOL(nftnl_gen_set_data);
64int nftnl_gen_set_data(
struct nftnl_gen *gen, uint16_t attr,
65 const void *data, uint32_t data_len)
67 nftnl_assert_attr_exists(attr, NFTNL_GEN_MAX);
68 nftnl_assert_validate(data, nftnl_gen_validate, attr, data_len);
72 memcpy(&gen->id, data,
sizeof(gen->id));
75 gen->flags |= (1 << attr);
79int nftnl_gen_set(
struct nftnl_gen *gen, uint16_t attr,
const void *data) __visible;
80int nftnl_gen_set(
struct nftnl_gen *gen, uint16_t attr,
const void *data)
82 return nftnl_gen_set_data(gen, attr, data, nftnl_gen_validate[attr]);
85EXPORT_SYMBOL(nftnl_gen_set_u32);
86void nftnl_gen_set_u32(
struct nftnl_gen *gen, uint16_t attr, uint32_t val)
88 nftnl_gen_set_data(gen, attr, &val,
sizeof(uint32_t));
91EXPORT_SYMBOL(nftnl_gen_get_data);
92const void *nftnl_gen_get_data(
const struct nftnl_gen *gen, uint16_t attr,
95 if (!(gen->flags & (1 << attr)))
100 *data_len =
sizeof(gen->id);
106EXPORT_SYMBOL(nftnl_gen_get);
107const void *nftnl_gen_get(
const struct nftnl_gen *gen, uint16_t attr)
110 return nftnl_gen_get_data(gen, attr, &data_len);
113EXPORT_SYMBOL(nftnl_gen_get_u32);
114uint32_t nftnl_gen_get_u32(
const struct nftnl_gen *gen, uint16_t attr)
116 const void *ret = nftnl_gen_get(gen, attr);
117 return ret == NULL ? 0 : *((uint32_t *)ret);
120static int nftnl_gen_parse_attr_cb(
const struct nlattr *attr,
void *data)
122 const struct nlattr **tb = data;
123 int type = mnl_attr_get_type(attr);
125 if (mnl_attr_type_valid(attr, NFTA_GEN_MAX) < 0)
130 if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
139EXPORT_SYMBOL(nftnl_gen_nlmsg_parse);
140int nftnl_gen_nlmsg_parse(
const struct nlmsghdr *nlh,
struct nftnl_gen *gen)
142 struct nlattr *tb[NFTA_GEN_MAX + 1] = {};
144 if (mnl_attr_parse(nlh,
sizeof(
struct nfgenmsg),
145 nftnl_gen_parse_attr_cb, tb) < 0)
148 if (tb[NFTA_GEN_ID]) {
149 gen->id = ntohl(mnl_attr_get_u32(tb[NFTA_GEN_ID]));
150 gen->flags |= (1 << NFTNL_GEN_ID);
155static int nftnl_gen_cmd_snprintf(
char *buf,
size_t remain,
156 const struct nftnl_gen *gen, uint32_t cmd,
157 uint32_t type, uint32_t flags)
161 if (type != NFTNL_OUTPUT_DEFAULT)
164 ret = snprintf(buf, remain,
"ruleset generation ID %u", gen->id);
165 SNPRINTF_BUFFER_SIZE(ret, remain, offset);
169EXPORT_SYMBOL(nftnl_gen_snprintf);
170int nftnl_gen_snprintf(
char *buf,
size_t size,
const struct nftnl_gen *gen,
171 uint32_t type, uint32_t flags)
176 return nftnl_gen_cmd_snprintf(buf, size, gen, nftnl_flag2cmd(flags), type,
180static int nftnl_gen_do_snprintf(
char *buf,
size_t size,
const void *gen,
181 uint32_t cmd, uint32_t type, uint32_t flags)
183 return nftnl_gen_snprintf(buf, size, gen, type, flags);
186EXPORT_SYMBOL(nftnl_gen_fprintf);
187int nftnl_gen_fprintf(FILE *fp,
const struct nftnl_gen *gen, uint32_t type,
190 return nftnl_fprintf(fp, gen, NFTNL_CMD_UNSPEC, type, flags,
191 nftnl_gen_do_snprintf);