12#include <linux/netfilter/nf_tables.h>
15#include <libmnl/libmnl.h>
16#include <libnftnl/object.h>
20static int nftnl_obj_secmark_set(
struct nftnl_obj *e, uint16_t type,
21 const void *data, uint32_t data_len)
23 struct nftnl_obj_secmark *secmark = nftnl_obj_data(e);
26 case NFTNL_OBJ_SECMARK_CTX:
27 snprintf(secmark->ctx,
sizeof(secmark->ctx),
"%s", (
const char *)data);
33static const void *nftnl_obj_secmark_get(
const struct nftnl_obj *e,
34 uint16_t type, uint32_t *data_len)
36 struct nftnl_obj_secmark *secmark = nftnl_obj_data(e);
39 case NFTNL_OBJ_SECMARK_CTX:
40 *data_len = strlen(secmark->ctx);
46static int nftnl_obj_secmark_cb(
const struct nlattr *attr,
void *data)
48 const struct nftnl_obj_secmark *secmark = NULL;
49 int type = mnl_attr_get_type(attr);
50 const struct nlattr **tb = data;
52 if (mnl_attr_type_valid(attr, NFTA_SECMARK_MAX) < 0)
56 case NFTA_SECMARK_CTX:
57 if (mnl_attr_validate(attr, MNL_TYPE_STRING) < 0)
59 if (mnl_attr_get_payload_len(attr) >=
sizeof(secmark->ctx))
69nftnl_obj_secmark_build(
struct nlmsghdr *nlh,
const struct nftnl_obj *e)
71 struct nftnl_obj_secmark *secmark = nftnl_obj_data(e);
73 if (e->flags & (1 << NFTNL_OBJ_SECMARK_CTX))
74 mnl_attr_put_str(nlh, NFTA_SECMARK_CTX, secmark->ctx);
78nftnl_obj_secmark_parse(
struct nftnl_obj *e,
struct nlattr *attr)
80 struct nftnl_obj_secmark *secmark = nftnl_obj_data(e);
81 struct nlattr *tb[NFTA_SECMARK_MAX + 1] = {};
83 if (mnl_attr_parse_nested(attr, nftnl_obj_secmark_cb, tb) < 0)
86 if (tb[NFTA_SECMARK_CTX]) {
87 snprintf(secmark->ctx,
sizeof(secmark->ctx),
"%s",
88 mnl_attr_get_str(tb[NFTA_SECMARK_CTX]));
89 e->flags |= (1 << NFTNL_OBJ_SECMARK_CTX);
95static int nftnl_obj_secmark_snprintf(
char *buf,
size_t len,
97 const struct nftnl_obj *e)
99 struct nftnl_obj_secmark *secmark = nftnl_obj_data(e);
101 return snprintf(buf, len,
"context %s ", secmark->ctx);
104static struct attr_policy obj_secmark_attr_policy[__NFTNL_OBJ_SECMARK_MAX] = {
105 [NFTNL_OBJ_SECMARK_CTX] = { .maxlen = NFT_SECMARK_CTX_MAXLEN },
108struct obj_ops obj_ops_secmark = {
110 .type = NFT_OBJECT_SECMARK,
111 .alloc_len =
sizeof(
struct nftnl_obj_secmark),
112 .nftnl_max_attr = __NFTNL_OBJ_SECMARK_MAX - 1,
113 .attr_policy = obj_secmark_attr_policy,
114 .set = nftnl_obj_secmark_set,
115 .get = nftnl_obj_secmark_get,
116 .parse = nftnl_obj_secmark_parse,
117 .build = nftnl_obj_secmark_build,
118 .output = nftnl_obj_secmark_snprintf,