libnftnl  1.1.8
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_default(char *buf, size_t size,
121  const struct nftnl_obj *e)
122 {
123  struct nftnl_obj_synproxy *synproxy = nftnl_obj_data(e);
124  int ret, offset = 0, len = size;
125 
126  if (e->flags & (1 << NFTNL_OBJ_SYNPROXY_MSS) &&
127  e->flags & (1 << NFTNL_OBJ_SYNPROXY_WSCALE)) {
128  ret = snprintf(buf, len, "mss %u wscale %u ", synproxy->mss,
129  synproxy->wscale);
130  SNPRINTF_BUFFER_SIZE(ret, len, offset);
131  }
132 
133  return offset;
134 }
135 
136 static int nftnl_obj_synproxy_snprintf(char *buf, size_t len, uint32_t type,
137  uint32_t flags,
138  const struct nftnl_obj *e)
139 {
140  switch (type) {
141  case NFTNL_OUTPUT_DEFAULT:
142  return nftnl_obj_synproxy_snprintf_default(buf, len, e);
143  case NFTNL_OUTPUT_XML:
144  case NFTNL_OUTPUT_JSON:
145  default:
146  break;
147  }
148  return -1;
149 }
150 
151 struct obj_ops obj_ops_synproxy = {
152  .name = "synproxy",
153  .type = NFT_OBJECT_SYNPROXY,
154  .alloc_len = sizeof(struct nftnl_obj_synproxy),
155  .max_attr = NFTA_SYNPROXY_MAX,
156  .set = nftnl_obj_synproxy_set,
157  .get = nftnl_obj_synproxy_get,
158  .parse = nftnl_obj_synproxy_parse,
159  .build = nftnl_obj_synproxy_build,
160  .snprintf = nftnl_obj_synproxy_snprintf,
161 };