6#include <linux/netfilter/nf_tables.h>
9#include <libmnl/libmnl.h>
10#include <libnftnl/expr.h>
11#include <libnftnl/rule.h>
20nftnl_expr_synproxy_set(
struct nftnl_expr *e, uint16_t type,
21 const void *data, uint32_t data_len, uint32_t byteorder)
26 case NFTNL_EXPR_SYNPROXY_MSS:
27 memcpy(&synproxy->mss, data, data_len);
29 case NFTNL_EXPR_SYNPROXY_WSCALE:
30 memcpy(&synproxy->wscale, data, data_len);
32 case NFTNL_EXPR_SYNPROXY_FLAGS:
33 memcpy(&synproxy->flags, data, data_len);
40nftnl_expr_synproxy_get(
const struct nftnl_expr *e, uint16_t type,
46 case NFTNL_EXPR_SYNPROXY_MSS:
47 *data_len =
sizeof(synproxy->mss);
48 return &synproxy->mss;
49 case NFTNL_EXPR_SYNPROXY_WSCALE:
50 *data_len =
sizeof(synproxy->wscale);
51 return &synproxy->wscale;
52 case NFTNL_EXPR_SYNPROXY_FLAGS:
53 *data_len =
sizeof(synproxy->flags);
54 return &synproxy->flags;
59static int nftnl_expr_synproxy_cb(
const struct nlattr *attr,
void *data)
61 const struct nlattr **tb = data;
62 int type = mnl_attr_get_type(attr);
64 if (mnl_attr_type_valid(attr, NFTA_SYNPROXY_MAX) < 0)
68 case NFTNL_EXPR_SYNPROXY_MSS:
69 if (mnl_attr_validate(attr, MNL_TYPE_U16) < 0)
73 case NFTNL_EXPR_SYNPROXY_WSCALE:
74 if (mnl_attr_validate(attr, MNL_TYPE_U8) < 0)
78 case NFTNL_EXPR_SYNPROXY_FLAGS:
79 if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
89nftnl_expr_synproxy_build(
struct nlmsghdr *nlh,
const struct nftnl_expr *e)
93 if (e->flags & (1 << NFTNL_EXPR_SYNPROXY_MSS))
94 mnl_attr_put_u16(nlh, NFTA_SYNPROXY_MSS,
95 htons(synproxy->mss));
96 if (e->flags & (1 << NFTNL_EXPR_SYNPROXY_WSCALE))
97 mnl_attr_put_u8(nlh, NFTA_SYNPROXY_WSCALE,
99 if (e->flags & (1 << NFTNL_EXPR_SYNPROXY_FLAGS))
100 mnl_attr_put_u32(nlh, NFTA_SYNPROXY_FLAGS,
101 htonl(synproxy->flags));
105nftnl_expr_synproxy_parse(
struct nftnl_expr *e,
struct nlattr *attr)
108 struct nlattr *tb[NFTA_SYNPROXY_MAX + 1] = {};
110 if (mnl_attr_parse_nested(attr, nftnl_expr_synproxy_cb, tb) < 0)
113 if (tb[NFTA_SYNPROXY_MSS]) {
114 synproxy->mss = ntohs(mnl_attr_get_u16(tb[NFTA_SYNPROXY_MSS]));
115 e->flags |= (1 << NFTNL_EXPR_SYNPROXY_MSS);
118 if (tb[NFTA_SYNPROXY_WSCALE]) {
119 synproxy->wscale = mnl_attr_get_u8(tb[NFTA_SYNPROXY_WSCALE]);
120 e->flags |= (1 << NFTNL_EXPR_SYNPROXY_WSCALE);
123 if (tb[NFTA_SYNPROXY_FLAGS]) {
124 synproxy->flags = ntohl(mnl_attr_get_u32(tb[NFTA_SYNPROXY_FLAGS]));
125 e->flags |= (1 << NFTNL_EXPR_SYNPROXY_FLAGS);
132nftnl_expr_synproxy_snprintf(
char *buf,
size_t len,
133 uint32_t flags,
const struct nftnl_expr *e)
138 if (e->flags & (1 << NFTNL_EXPR_SYNPROXY_MSS) &&
139 e->flags & (1 << NFTNL_EXPR_SYNPROXY_WSCALE)) {
140 ret = snprintf(buf, len,
"mss %u wscale %u ", synproxy->mss,
142 SNPRINTF_BUFFER_SIZE(ret, len, offset);
148static struct attr_policy synproxy_attr_policy[__NFTNL_EXPR_SYNPROXY_MAX] = {
149 [NFTNL_EXPR_SYNPROXY_MSS] = { .maxlen =
sizeof(uint16_t) },
150 [NFTNL_EXPR_SYNPROXY_WSCALE] = { .maxlen =
sizeof(uint8_t) },
151 [NFTNL_EXPR_SYNPROXY_FLAGS] = { .maxlen =
sizeof(uint32_t) },
154struct expr_ops expr_ops_synproxy = {
157 .nftnl_max_attr = __NFTNL_EXPR_SYNPROXY_MAX - 1,
158 .attr_policy = synproxy_attr_policy,
159 .set = nftnl_expr_synproxy_set,
160 .get = nftnl_expr_synproxy_get,
161 .parse = nftnl_expr_synproxy_parse,
162 .build = nftnl_expr_synproxy_build,
163 .output = nftnl_expr_synproxy_snprintf,