10 #include <arpa/inet.h> 13 #include <libmnl/libmnl.h> 17 static int nftnl_obj_ct_expect_set(
struct nftnl_obj *e, uint16_t type,
18 const void *data, uint32_t data_len)
20 struct nftnl_obj_ct_expect *exp = nftnl_obj_data(e);
23 case NFTNL_OBJ_CT_EXPECT_L3PROTO:
24 memcpy(&exp->l3proto, data,
sizeof(exp->l3proto));
26 case NFTNL_OBJ_CT_EXPECT_L4PROTO:
27 memcpy(&exp->l4proto, data,
sizeof(exp->l4proto));
29 case NFTNL_OBJ_CT_EXPECT_DPORT:
30 memcpy(&exp->dport, data,
sizeof(exp->dport));
32 case NFTNL_OBJ_CT_EXPECT_TIMEOUT:
33 memcpy(&exp->timeout, data,
sizeof(exp->timeout));
35 case NFTNL_OBJ_CT_EXPECT_SIZE:
36 memcpy(&exp->size, data,
sizeof(exp->size));
44 static const void *nftnl_obj_ct_expect_get(
const struct nftnl_obj *e,
45 uint16_t type, uint32_t *data_len)
47 struct nftnl_obj_ct_expect *exp = nftnl_obj_data(e);
50 case NFTNL_OBJ_CT_EXPECT_L3PROTO:
51 *data_len =
sizeof(exp->l3proto);
53 case NFTNL_OBJ_CT_EXPECT_L4PROTO:
54 *data_len =
sizeof(exp->l4proto);
56 case NFTNL_OBJ_CT_EXPECT_DPORT:
57 *data_len =
sizeof(exp->dport);
59 case NFTNL_OBJ_CT_EXPECT_TIMEOUT:
60 *data_len =
sizeof(exp->timeout);
62 case NFTNL_OBJ_CT_EXPECT_SIZE:
63 *data_len =
sizeof(exp->size);
69 static int nftnl_obj_ct_expect_cb(
const struct nlattr *attr,
void *data)
71 int type = mnl_attr_get_type(attr);
72 const struct nlattr **tb = data;
74 if (mnl_attr_type_valid(attr, NFTA_CT_EXPECT_MAX) < 0)
78 case NFTA_CT_EXPECT_L3PROTO:
79 if (mnl_attr_validate(attr, MNL_TYPE_U16) < 0)
82 case NFTA_CT_EXPECT_L4PROTO:
83 if (mnl_attr_validate(attr, MNL_TYPE_U8) < 0)
86 case NFTA_CT_EXPECT_DPORT:
87 if (mnl_attr_validate(attr, MNL_TYPE_U16) < 0)
90 case NFTA_CT_EXPECT_TIMEOUT:
91 if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
94 case NFTA_CT_EXPECT_SIZE:
95 if (mnl_attr_validate(attr, MNL_TYPE_U8) < 0)
105 nftnl_obj_ct_expect_build(
struct nlmsghdr *nlh,
const struct nftnl_obj *e)
107 struct nftnl_obj_ct_expect *exp = nftnl_obj_data(e);
109 if (e->flags & (1 << NFTNL_OBJ_CT_EXPECT_L3PROTO))
110 mnl_attr_put_u16(nlh, NFTA_CT_EXPECT_L3PROTO, htons(exp->l3proto));
111 if (e->flags & (1 << NFTNL_OBJ_CT_EXPECT_L4PROTO))
112 mnl_attr_put_u8(nlh, NFTA_CT_EXPECT_L4PROTO, exp->l4proto);
113 if (e->flags & (1 << NFTNL_OBJ_CT_EXPECT_DPORT))
114 mnl_attr_put_u16(nlh, NFTA_CT_EXPECT_DPORT, htons(exp->dport));
115 if (e->flags & (1 << NFTNL_OBJ_CT_EXPECT_TIMEOUT))
116 mnl_attr_put_u32(nlh, NFTA_CT_EXPECT_TIMEOUT, exp->timeout);
117 if (e->flags & (1 << NFTNL_OBJ_CT_EXPECT_SIZE))
118 mnl_attr_put_u8(nlh, NFTA_CT_EXPECT_SIZE, exp->size);
122 nftnl_obj_ct_expect_parse(
struct nftnl_obj *e,
struct nlattr *attr)
124 struct nftnl_obj_ct_expect *exp = nftnl_obj_data(e);
125 struct nlattr *tb[NFTA_CT_EXPECT_MAX + 1] = {};
127 if (mnl_attr_parse_nested(attr, nftnl_obj_ct_expect_cb, tb) < 0)
130 if (tb[NFTA_CT_EXPECT_L3PROTO]) {
131 exp->l3proto = ntohs(mnl_attr_get_u16(tb[NFTA_CT_EXPECT_L3PROTO]));
132 e->flags |= (1 << NFTNL_OBJ_CT_EXPECT_L3PROTO);
134 if (tb[NFTA_CT_EXPECT_L4PROTO]) {
135 exp->l4proto = mnl_attr_get_u8(tb[NFTA_CT_EXPECT_L4PROTO]);
136 e->flags |= (1 << NFTNL_OBJ_CT_EXPECT_L4PROTO);
138 if (tb[NFTA_CT_EXPECT_DPORT]) {
139 exp->dport = ntohs(mnl_attr_get_u16(tb[NFTA_CT_EXPECT_DPORT]));
140 e->flags |= (1 << NFTNL_OBJ_CT_EXPECT_DPORT);
142 if (tb[NFTA_CT_EXPECT_TIMEOUT]) {
143 exp->timeout = mnl_attr_get_u32(tb[NFTA_CT_EXPECT_TIMEOUT]);
144 e->flags |= (1 << NFTNL_OBJ_CT_EXPECT_TIMEOUT);
146 if (tb[NFTA_CT_EXPECT_SIZE]) {
147 exp->size = mnl_attr_get_u8(tb[NFTA_CT_EXPECT_SIZE]);
148 e->flags |= (1 << NFTNL_OBJ_CT_EXPECT_SIZE);
154 static int nftnl_obj_ct_expect_snprintf_default(
char *buf,
size_t len,
155 const struct nftnl_obj *e)
158 int offset = 0, remain = len;
159 struct nftnl_obj_ct_expect *exp = nftnl_obj_data(e);
161 if (e->flags & (1 << NFTNL_OBJ_CT_EXPECT_L3PROTO)) {
162 ret = snprintf(buf + offset, len,
"family %d ", exp->l3proto);
163 SNPRINTF_BUFFER_SIZE(ret, remain, offset);
165 if (e->flags & (1 << NFTNL_OBJ_CT_EXPECT_L4PROTO)) {
166 ret = snprintf(buf + offset, len,
"protocol %d ", exp->l4proto);
167 SNPRINTF_BUFFER_SIZE(ret, remain, offset);
169 if (e->flags & (1 << NFTNL_OBJ_CT_EXPECT_DPORT)) {
170 ret = snprintf(buf + offset, len,
"dport %d ", exp->dport);
171 SNPRINTF_BUFFER_SIZE(ret, remain, offset);
173 if (e->flags & (1 << NFTNL_OBJ_CT_EXPECT_TIMEOUT)) {
174 ret = snprintf(buf + offset, len,
"timeout %d ", exp->timeout);
175 SNPRINTF_BUFFER_SIZE(ret, remain, offset);
177 if (e->flags & (1 << NFTNL_OBJ_CT_EXPECT_SIZE)) {
178 ret = snprintf(buf + offset, len,
"size %d ", exp->size);
179 SNPRINTF_BUFFER_SIZE(ret, remain, offset);
186 static int nftnl_obj_ct_expect_snprintf(
char *buf,
size_t len, uint32_t type,
188 const struct nftnl_obj *e)
194 case NFTNL_OUTPUT_DEFAULT:
195 return nftnl_obj_ct_expect_snprintf_default(buf, len, e);
196 case NFTNL_OUTPUT_JSON:
203 struct obj_ops obj_ops_ct_expect = {
205 .type = NFT_OBJECT_CT_EXPECT,
206 .alloc_len =
sizeof(
struct nftnl_obj_ct_expect),
207 .max_attr = NFTA_CT_EXPECT_MAX,
208 .set = nftnl_obj_ct_expect_set,
209 .get = nftnl_obj_ct_expect_get,
210 .parse = nftnl_obj_ct_expect_parse,
211 .build = nftnl_obj_ct_expect_build,
212 .snprintf = nftnl_obj_ct_expect_snprintf,