13 #include <arpa/inet.h>
17 #include <linux/netfilter/nf_tables.h>
20 #include <libmnl/libmnl.h>
21 #include <libnftnl/object.h>
25 static int nftnl_obj_ct_helper_set(
struct nftnl_obj *e, uint16_t type,
26 const void *data, uint32_t data_len)
28 struct nftnl_obj_ct_helper *helper = nftnl_obj_data(e);
31 case NFTNL_OBJ_CT_HELPER_NAME:
32 snprintf(helper->name,
sizeof(helper->name),
"%s", (
const char *)data);
34 case NFTNL_OBJ_CT_HELPER_L3PROTO:
35 helper->l3proto = *((uint16_t *)data);
37 case NFTNL_OBJ_CT_HELPER_L4PROTO:
38 helper->l4proto = *((uint8_t *)data);
46 static const void *nftnl_obj_ct_helper_get(
const struct nftnl_obj *e,
47 uint16_t type, uint32_t *data_len)
49 struct nftnl_obj_ct_helper *helper = nftnl_obj_data(e);
52 case NFTNL_OBJ_CT_HELPER_NAME:
53 *data_len = strlen(helper->name);
55 case NFTNL_OBJ_CT_HELPER_L3PROTO:
56 *data_len =
sizeof(helper->l3proto);
57 return &helper->l3proto;
58 case NFTNL_OBJ_CT_HELPER_L4PROTO:
59 *data_len =
sizeof(helper->l4proto);
60 return &helper->l4proto;
65 static int nftnl_obj_ct_helper_cb(
const struct nlattr *attr,
void *data)
67 const struct nftnl_obj_ct_helper *helper = NULL;
68 int type = mnl_attr_get_type(attr);
69 const struct nlattr **tb = data;
71 if (mnl_attr_type_valid(attr, NFTA_CT_HELPER_MAX) < 0)
75 case NFTA_CT_HELPER_NAME:
76 if (mnl_attr_validate(attr, MNL_TYPE_STRING) < 0)
78 if (mnl_attr_get_payload_len(attr) >=
sizeof(helper->name))
81 case NFTA_CT_HELPER_L3PROTO:
82 if (mnl_attr_validate(attr, MNL_TYPE_U16) < 0)
85 case NFTA_CT_HELPER_L4PROTO:
86 if (mnl_attr_validate(attr, MNL_TYPE_U8) < 0)
96 nftnl_obj_ct_helper_build(
struct nlmsghdr *nlh,
const struct nftnl_obj *e)
98 struct nftnl_obj_ct_helper *helper = nftnl_obj_data(e);
100 if (e->flags & (1 << NFTNL_OBJ_CT_HELPER_NAME))
101 mnl_attr_put_str(nlh, NFTA_CT_HELPER_NAME, helper->name);
102 if (e->flags & (1 << NFTNL_OBJ_CT_HELPER_L3PROTO))
103 mnl_attr_put_u16(nlh, NFTA_CT_HELPER_L3PROTO, htons(helper->l3proto));
104 if (e->flags & (1 << NFTNL_OBJ_CT_HELPER_L4PROTO))
105 mnl_attr_put_u8(nlh, NFTA_CT_HELPER_L4PROTO, helper->l4proto);
109 nftnl_obj_ct_helper_parse(
struct nftnl_obj *e,
struct nlattr *attr)
111 struct nftnl_obj_ct_helper *helper = nftnl_obj_data(e);
112 struct nlattr *tb[NFTA_CT_HELPER_MAX + 1] = {};
114 if (mnl_attr_parse_nested(attr, nftnl_obj_ct_helper_cb, tb) < 0)
117 if (tb[NFTA_CT_HELPER_NAME]) {
118 snprintf(helper->name,
sizeof(helper->name),
"%s",
119 mnl_attr_get_str(tb[NFTA_CT_HELPER_NAME]));
120 e->flags |= (1 << NFTNL_OBJ_CT_HELPER_NAME);
122 if (tb[NFTA_CT_HELPER_L3PROTO]) {
123 helper->l3proto = ntohs(mnl_attr_get_u16(tb[NFTA_CT_HELPER_L3PROTO]));
124 e->flags |= (1 << NFTNL_OBJ_CT_HELPER_L3PROTO);
126 if (tb[NFTA_CT_HELPER_L4PROTO]) {
127 helper->l4proto = mnl_attr_get_u8(tb[NFTA_CT_HELPER_L4PROTO]);
128 e->flags |= (1 << NFTNL_OBJ_CT_HELPER_L4PROTO);
135 nftnl_obj_quota_json_parse(
struct nftnl_obj *e, json_t *root,
136 struct nftnl_parse_err *err)
142 if (nftnl_jansson_parse_val(root,
"bytes", NFTNL_TYPE_U64, &bytes,
144 nftnl_obj_set_u64(e, NFTNL_OBJ_QUOTA_BYTES, bytes);
145 if (nftnl_jansson_parse_val(root,
"consumed", NFTNL_TYPE_U64, &bytes,
147 nftnl_obj_set_u64(e, NFTNL_OBJ_QUOTA_CONSUMED, bytes);
148 if (nftnl_jansson_parse_val(root,
"flags", NFTNL_TYPE_U32, &flags,
150 nftnl_obj_set_u32(e, NFTNL_OBJ_QUOTA_FLAGS, flags);
159 static int nftnl_obj_ct_helper_export(
char *buf,
size_t size,
160 const struct nftnl_obj *e,
int type)
162 struct nftnl_obj_ct_helper *helper = nftnl_obj_data(e);
163 NFTNL_BUF_INIT(b, buf, size);
165 if (e->flags & (1 << NFTNL_OBJ_CT_HELPER_NAME))
166 nftnl_buf_str(&b, type, helper->name, NAME);
167 if (e->flags & (1 << NFTNL_OBJ_CT_HELPER_L3PROTO))
168 nftnl_buf_u32(&b, type, helper->l3proto, FAMILY);
169 if (e->flags & (1 << NFTNL_OBJ_CT_HELPER_L4PROTO))
170 nftnl_buf_u32(&b, type, helper->l4proto,
"service");
172 return nftnl_buf_done(&b);
175 static int nftnl_obj_ct_helper_snprintf_default(
char *buf,
size_t len,
176 const struct nftnl_obj *e)
178 struct nftnl_obj_ct_helper *helper = nftnl_obj_data(e);
180 return snprintf(buf, len,
"name %s family %d protocol %d ",
181 helper->name, helper->l3proto, helper->l4proto);
184 static int nftnl_obj_ct_helper_snprintf(
char *buf,
size_t len, uint32_t type,
186 const struct nftnl_obj *e)
192 case NFTNL_OUTPUT_DEFAULT:
193 return nftnl_obj_ct_helper_snprintf_default(buf, len, e);
194 case NFTNL_OUTPUT_JSON:
195 return nftnl_obj_ct_helper_export(buf, len, e, type);
202 struct obj_ops obj_ops_ct_helper = {
204 .type = NFT_OBJECT_CT_HELPER,
205 .alloc_len =
sizeof(
struct nftnl_obj_ct_helper),
206 .max_attr = NFTA_CT_HELPER_MAX,
207 .set = nftnl_obj_ct_helper_set,
208 .get = nftnl_obj_ct_helper_get,
209 .parse = nftnl_obj_ct_helper_parse,
210 .build = nftnl_obj_ct_helper_build,
211 .snprintf = nftnl_obj_ct_helper_snprintf,
212 .json_parse = nftnl_obj_quota_json_parse,