libnftnl  1.2.6
obj/synproxy.c
1 #include <stdio.h>
2 #include <stdint.h>
3 #include <arpa/inet.h>
4 #include <errno.h>
5 #include <inttypes.h>
6 
7 #include <linux/netfilter/nf_tables.h>
8 
9 #include "internal.h"
10 #include <libmnl/libmnl.h>
11 #include <libnftnl/object.h>
12 
13 #include "obj.h"
14 
15 static int nftnl_obj_synproxy_set(struct nftnl_obj *e, uint16_t type,
16  const void *data, uint32_t data_len)
17 {
18  struct nftnl_obj_synproxy *synproxy = nftnl_obj_data(e);
19 
20  switch (type) {
21  case NFTNL_OBJ_SYNPROXY_MSS:
22  synproxy->mss = *((uint16_t *)data);
23  break;
24  case NFTNL_OBJ_SYNPROXY_WSCALE:
25  synproxy->wscale = *((uint8_t *)data);
26  break;
27  case NFTNL_OBJ_SYNPROXY_FLAGS:
28  synproxy->flags = *((uint32_t *)data);
29  break;
30  default:
31  return -1;
32  }
33  return 0;
34 }
35 
36 static const void *nftnl_obj_synproxy_get(const struct nftnl_obj *e,
37  uint16_t type, uint32_t *data_len)
38 {
39  struct nftnl_obj_synproxy *synproxy = nftnl_obj_data(e);
40 
41  switch (type) {
42  case NFTNL_OBJ_SYNPROXY_MSS:
43  *data_len = sizeof(synproxy->mss);
44  return &synproxy->mss;
45  case NFTNL_OBJ_SYNPROXY_WSCALE:
46  *data_len = sizeof(synproxy->wscale);
47  return &synproxy->wscale;
48  case NFTNL_OBJ_SYNPROXY_FLAGS:
49  *data_len = sizeof(synproxy->flags);
50  return &synproxy->flags;
51  }
52  return NULL;
53 }
54 
55 static int nftnl_obj_synproxy_cb(const struct nlattr *attr, void *data)
56 {
57  int type = mnl_attr_get_type(attr);
58  const struct nlattr **tb = data;
59 
60  if (mnl_attr_type_valid(attr, NFTA_SYNPROXY_MAX) < 0)
61  return MNL_CB_OK;
62 
63  switch (type) {
64  case NFTA_SYNPROXY_MSS:
65  if (mnl_attr_validate(attr, MNL_TYPE_U16) < 0)
66  abi_breakage();
67  break;
68  case NFTA_SYNPROXY_WSCALE:
69  if (mnl_attr_validate(attr, MNL_TYPE_U8) < 0)
70  abi_breakage();
71  break;
72  case NFTA_SYNPROXY_FLAGS:
73  if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
74  abi_breakage();
75  break;
76  }
77 
78  tb[type] = attr;
79  return MNL_CB_OK;
80 }
81 
82 static void nftnl_obj_synproxy_build(struct nlmsghdr *nlh,
83  const struct nftnl_obj *e)
84 {
85  struct nftnl_obj_synproxy *synproxy = nftnl_obj_data(e);
86 
87  if (e->flags & (1 << NFTNL_OBJ_SYNPROXY_MSS))
88  mnl_attr_put_u16(nlh, NFTA_SYNPROXY_MSS, htons(synproxy->mss));
89  if (e->flags & (1 << NFTNL_OBJ_SYNPROXY_WSCALE))
90  mnl_attr_put_u8(nlh, NFTA_SYNPROXY_WSCALE, synproxy->wscale);
91  if (e->flags & (1 << NFTNL_OBJ_SYNPROXY_FLAGS))
92  mnl_attr_put_u32(nlh, NFTA_SYNPROXY_FLAGS,
93  htonl(synproxy->flags));
94 }
95 
96 static int nftnl_obj_synproxy_parse(struct nftnl_obj *e, struct nlattr *attr)
97 {
98  struct nftnl_obj_synproxy *synproxy = nftnl_obj_data(e);
99  struct nlattr *tb[NFTA_SYNPROXY_MAX + 1] = {};
100 
101  if (mnl_attr_parse_nested(attr, nftnl_obj_synproxy_cb, tb) < 0)
102  return -1;
103 
104  if (tb[NFTA_SYNPROXY_MSS]) {
105  synproxy->mss = ntohs(mnl_attr_get_u16(tb[NFTA_SYNPROXY_MSS]));
106  e->flags |= (1 << NFTNL_OBJ_SYNPROXY_MSS);
107  }
108  if (tb[NFTA_SYNPROXY_WSCALE]) {
109  synproxy->wscale = mnl_attr_get_u8(tb[NFTA_SYNPROXY_WSCALE]);
110  e->flags |= (1 << NFTNL_OBJ_SYNPROXY_WSCALE);
111  }
112  if (tb[NFTA_SYNPROXY_FLAGS]) {
113  synproxy->flags = ntohl(mnl_attr_get_u32(tb[NFTA_SYNPROXY_FLAGS]));
114  e->flags |= (1 << NFTNL_OBJ_SYNPROXY_FLAGS);
115  }
116 
117  return 0;
118 }
119 
120 static int nftnl_obj_synproxy_snprintf(char *buf, size_t len,
121  uint32_t flags,
122  const struct nftnl_obj *e)
123 {
124  struct nftnl_obj_synproxy *synproxy = nftnl_obj_data(e);
125  int ret, offset = 0;
126 
127  if (e->flags & (1 << NFTNL_OBJ_SYNPROXY_MSS) &&
128  e->flags & (1 << NFTNL_OBJ_SYNPROXY_WSCALE)) {
129  ret = snprintf(buf, len, "mss %u wscale %u ", synproxy->mss,
130  synproxy->wscale);
131  SNPRINTF_BUFFER_SIZE(ret, len, offset);
132  }
133 
134  return offset;
135 }
136 
137 struct obj_ops obj_ops_synproxy = {
138  .name = "synproxy",
139  .type = NFT_OBJECT_SYNPROXY,
140  .alloc_len = sizeof(struct nftnl_obj_synproxy),
141  .max_attr = NFTA_SYNPROXY_MAX,
142  .set = nftnl_obj_synproxy_set,
143  .get = nftnl_obj_synproxy_get,
144  .parse = nftnl_obj_synproxy_parse,
145  .build = nftnl_obj_synproxy_build,
146  .output = nftnl_obj_synproxy_snprintf,
147 };