16#include <linux/netfilter/nf_tables.h>
19#include <libmnl/libmnl.h>
20#include <libnftnl/object.h>
24static int nftnl_obj_secmark_set(
struct nftnl_obj *e, uint16_t type,
25 const void *data, uint32_t data_len)
27 struct nftnl_obj_secmark *secmark = nftnl_obj_data(e);
30 case NFTNL_OBJ_SECMARK_CTX:
31 snprintf(secmark->ctx,
sizeof(secmark->ctx),
"%s", (
const char *)data);
37static const void *nftnl_obj_secmark_get(
const struct nftnl_obj *e,
38 uint16_t type, uint32_t *data_len)
40 struct nftnl_obj_secmark *secmark = nftnl_obj_data(e);
43 case NFTNL_OBJ_SECMARK_CTX:
44 *data_len = strlen(secmark->ctx);
50static int nftnl_obj_secmark_cb(
const struct nlattr *attr,
void *data)
52 const struct nftnl_obj_secmark *secmark = NULL;
53 int type = mnl_attr_get_type(attr);
54 const struct nlattr **tb = data;
56 if (mnl_attr_type_valid(attr, NFTA_SECMARK_MAX) < 0)
60 case NFTA_SECMARK_CTX:
61 if (mnl_attr_validate(attr, MNL_TYPE_STRING) < 0)
63 if (mnl_attr_get_payload_len(attr) >=
sizeof(secmark->ctx))
73nftnl_obj_secmark_build(
struct nlmsghdr *nlh,
const struct nftnl_obj *e)
75 struct nftnl_obj_secmark *secmark = nftnl_obj_data(e);
77 if (e->flags & (1 << NFTNL_OBJ_SECMARK_CTX))
78 mnl_attr_put_str(nlh, NFTA_SECMARK_CTX, secmark->ctx);
82nftnl_obj_secmark_parse(
struct nftnl_obj *e,
struct nlattr *attr)
84 struct nftnl_obj_secmark *secmark = nftnl_obj_data(e);
85 struct nlattr *tb[NFTA_SECMARK_MAX + 1] = {};
87 if (mnl_attr_parse_nested(attr, nftnl_obj_secmark_cb, tb) < 0)
90 if (tb[NFTA_SECMARK_CTX]) {
91 snprintf(secmark->ctx,
sizeof(secmark->ctx),
"%s",
92 mnl_attr_get_str(tb[NFTA_SECMARK_CTX]));
93 e->flags |= (1 << NFTNL_OBJ_SECMARK_CTX);
99static int nftnl_obj_secmark_snprintf(
char *buf,
size_t len,
101 const struct nftnl_obj *e)
103 struct nftnl_obj_secmark *secmark = nftnl_obj_data(e);
105 return snprintf(buf, len,
"context %s ", secmark->ctx);
108static struct attr_policy obj_secmark_attr_policy[__NFTNL_OBJ_SECMARK_MAX] = {
109 [NFTNL_OBJ_SECMARK_CTX] = { .maxlen = NFT_SECMARK_CTX_MAXLEN },
112struct obj_ops obj_ops_secmark = {
114 .type = NFT_OBJECT_SECMARK,
115 .alloc_len =
sizeof(
struct nftnl_obj_secmark),
116 .nftnl_max_attr = __NFTNL_OBJ_SECMARK_MAX - 1,
117 .attr_policy = obj_secmark_attr_policy,
118 .set = nftnl_obj_secmark_set,
119 .get = nftnl_obj_secmark_get,
120 .parse = nftnl_obj_secmark_parse,
121 .build = nftnl_obj_secmark_build,
122 .output = nftnl_obj_secmark_snprintf,