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> 32 EXPORT_SYMBOL(nftnl_gen_alloc);
35 return calloc(1,
sizeof(
struct nftnl_gen));
38 EXPORT_SYMBOL(nftnl_gen_free);
39 void nftnl_gen_free(
const struct nftnl_gen *gen)
44 EXPORT_SYMBOL(nftnl_gen_is_set);
45 bool nftnl_gen_is_set(
const struct nftnl_gen *gen, uint16_t attr)
47 return gen->flags & (1 << attr);
50 EXPORT_SYMBOL(nftnl_gen_unset);
51 void nftnl_gen_unset(
struct nftnl_gen *gen, uint16_t attr)
53 if (!(gen->flags & (1 << attr)))
60 gen->flags &= ~(1 << attr);
63 static uint32_t nftnl_gen_validate[NFTNL_GEN_MAX + 1] = {
64 [NFTNL_GEN_ID] =
sizeof(uint32_t),
67 EXPORT_SYMBOL(nftnl_gen_set_data);
68 int 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);
83 int nftnl_gen_set(
struct nftnl_gen *gen, uint16_t attr,
const void *data) __visible;
84 int 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]);
89 EXPORT_SYMBOL(nftnl_gen_set_u32);
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));
95 EXPORT_SYMBOL(nftnl_gen_get_data);
96 const 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);
110 EXPORT_SYMBOL(nftnl_gen_get);
111 const void *nftnl_gen_get(
const struct nftnl_gen *gen, uint16_t attr)
114 return nftnl_gen_get_data(gen, attr, &data_len);
117 EXPORT_SYMBOL(nftnl_gen_get_u32);
118 uint32_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);
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 EXPORT_SYMBOL(nftnl_gen_nlmsg_parse);
144 int 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);
159 static int nftnl_gen_cmd_snprintf(
char *buf,
size_t size,
160 const struct nftnl_gen *gen, uint32_t cmd,
161 uint32_t type, uint32_t flags)
163 int ret, remain = size, offset = 0;
166 case NFTNL_OUTPUT_DEFAULT:
167 ret = snprintf(buf, size,
"ruleset generation ID %u", gen->id);
168 SNPRINTF_BUFFER_SIZE(ret, remain, offset);
177 EXPORT_SYMBOL(nftnl_gen_snprintf);
178 int nftnl_gen_snprintf(
char *buf,
size_t size,
const struct nftnl_gen *gen,
179 uint32_t type, uint32_t flags)
184 return nftnl_gen_cmd_snprintf(buf, size, gen, nftnl_flag2cmd(flags), type,
188 static int nftnl_gen_do_snprintf(
char *buf,
size_t size,
const void *gen,
189 uint32_t cmd, uint32_t type, uint32_t flags)
191 return nftnl_gen_snprintf(buf, size, gen, type, flags);
194 EXPORT_SYMBOL(nftnl_gen_fprintf);
195 int nftnl_gen_fprintf(FILE *fp,
const struct nftnl_gen *gen, uint32_t type,
198 return nftnl_fprintf(fp, gen, NFTNL_CMD_UNSPEC, type, flags,
199 nftnl_gen_do_snprintf);