libnetfilter_conntrack  1.0.9
conntrack/setter.c
1 /*
2  * (C) 2005-2011 by Pablo Neira Ayuso <pablo@netfilter.org>
3  *
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  */
9 
10 #include "internal/internal.h"
11 
12 static void
13 set_attr_orig_ipv4_src(struct nf_conntrack *ct, const void *value, size_t len)
14 {
15  ct->head.orig.src.v4 = *((uint32_t *) value);
16 }
17 
18 static void
19 set_attr_orig_ipv4_dst(struct nf_conntrack *ct, const void *value, size_t len)
20 {
21  ct->head.orig.dst.v4 = *((uint32_t *) value);
22 }
23 
24 static void
25 set_attr_repl_ipv4_src(struct nf_conntrack *ct, const void *value, size_t len)
26 {
27  ct->repl.src.v4 = *((uint32_t *) value);
28 }
29 
30 static void
31 set_attr_repl_ipv4_dst(struct nf_conntrack *ct, const void *value, size_t len)
32 {
33  ct->repl.dst.v4 = *((uint32_t *) value);
34 }
35 
36 static void
37 set_attr_orig_ipv6_src(struct nf_conntrack *ct, const void *value, size_t len)
38 {
39  memcpy(&ct->head.orig.src.v6, value, sizeof(uint32_t)*4);
40 }
41 
42 static void
43 set_attr_orig_ipv6_dst(struct nf_conntrack *ct, const void *value, size_t len)
44 {
45  memcpy(&ct->head.orig.dst.v6, value, sizeof(uint32_t)*4);
46 }
47 
48 static void
49 set_attr_repl_ipv6_src(struct nf_conntrack *ct, const void *value, size_t len)
50 {
51  memcpy(&ct->repl.src.v6, value, sizeof(uint32_t)*4);
52 }
53 
54 static void
55 set_attr_repl_ipv6_dst(struct nf_conntrack *ct, const void *value, size_t len)
56 {
57  memcpy(&ct->repl.dst.v6, value, sizeof(uint32_t)*4);
58 }
59 
60 static void
61 set_attr_orig_port_src(struct nf_conntrack *ct, const void *value, size_t len)
62 {
63  ct->head.orig.l4src.all = *((uint16_t *) value);
64 }
65 
66 static void
67 set_attr_orig_port_dst(struct nf_conntrack *ct, const void *value, size_t len)
68 {
69  ct->head.orig.l4dst.all = *((uint16_t *) value);
70 }
71 
72 static void
73 set_attr_repl_port_src(struct nf_conntrack *ct, const void *value, size_t len)
74 {
75  ct->repl.l4src.all = *((uint16_t *) value);
76 }
77 
78 static void
79 set_attr_repl_port_dst(struct nf_conntrack *ct, const void *value, size_t len)
80 {
81  ct->repl.l4dst.all = *((uint16_t *) value);
82 }
83 
84 static void
85 set_attr_orig_zone(struct nf_conntrack *ct, const void *value, size_t len)
86 {
87  ct->head.orig.zone = *((uint16_t *) value);
88 }
89 
90 static void
91 set_attr_repl_zone(struct nf_conntrack *ct, const void *value, size_t len)
92 {
93  ct->repl.zone = *((uint16_t *) value);
94 }
95 
96 static void
97 set_attr_icmp_type(struct nf_conntrack *ct, const void *value, size_t len)
98 {
99  uint8_t type = *((uint8_t *) value);
100  uint8_t rtype = 0;
101 
102  ct->head.orig.l4dst.icmp.type = type;
103 
104  switch(ct->head.orig.l3protonum) {
105  case AF_INET:
106  rtype = __icmp_reply_type(type);
107  break;
108 
109  case AF_INET6:
110  rtype = __icmpv6_reply_type(type);
111  break;
112 
113  default:
114  rtype = 0; /* not found */
115  }
116 
117  if (rtype)
118  ct->repl.l4dst.icmp.type = rtype - 1;
119  else
120  ct->repl.l4dst.icmp.type = 255; /* will fail with -EINVAL */
121 
122 }
123 
124 static void
125 set_attr_icmp_code(struct nf_conntrack *ct, const void *value, size_t len)
126 {
127  ct->head.orig.l4dst.icmp.code = *((uint8_t *) value);
128  ct->repl.l4dst.icmp.code = *((uint8_t *) value);
129 }
130 
131 static void
132 set_attr_icmp_id(struct nf_conntrack *ct, const void *value, size_t len)
133 {
134  ct->head.orig.l4src.icmp.id = *((uint16_t *) value);
135  ct->repl.l4src.icmp.id = *((uint16_t *) value);
136 }
137 
138 static void
139 set_attr_orig_l3proto(struct nf_conntrack *ct, const void *value, size_t len)
140 {
141  ct->head.orig.l3protonum = *((uint8_t *) value);
142 }
143 
144 static void
145 set_attr_repl_l3proto(struct nf_conntrack *ct, const void *value, size_t len)
146 {
147  ct->repl.l3protonum = *((uint8_t *) value);
148 }
149 
150 static void
151 set_attr_orig_l4proto(struct nf_conntrack *ct, const void *value, size_t len)
152 {
153  ct->head.orig.protonum = *((uint8_t *) value);
154 }
155 
156 static void
157 set_attr_repl_l4proto(struct nf_conntrack *ct, const void *value, size_t len)
158 {
159  ct->repl.protonum = *((uint8_t *) value);
160 }
161 
162 static void
163 set_attr_tcp_state(struct nf_conntrack *ct, const void *value, size_t len)
164 {
165  ct->protoinfo.tcp.state = *((uint8_t *) value);
166 }
167 
168 static void
169 set_attr_tcp_flags_orig(struct nf_conntrack *ct, const void *value, size_t len)
170 {
171  ct->protoinfo.tcp.flags[__DIR_ORIG].value = *((uint8_t *) value);
172 }
173 
174 static void
175 set_attr_tcp_mask_orig(struct nf_conntrack *ct, const void *value, size_t len)
176 {
177  ct->protoinfo.tcp.flags[__DIR_ORIG].mask = *((uint8_t *) value);
178 }
179 
180 static void
181 set_attr_tcp_flags_repl(struct nf_conntrack *ct, const void *value, size_t len)
182 {
183  ct->protoinfo.tcp.flags[__DIR_REPL].value = *((uint8_t *) value);
184 }
185 
186 static void
187 set_attr_tcp_mask_repl(struct nf_conntrack *ct, const void *value, size_t len)
188 {
189  ct->protoinfo.tcp.flags[__DIR_REPL].mask = *((uint8_t *) value);
190 }
191 
192 static void
193 set_attr_sctp_state(struct nf_conntrack *ct, const void *value, size_t len)
194 {
195  ct->protoinfo.sctp.state = *((uint8_t *) value);
196 }
197 
198 static void
199 set_attr_sctp_vtag_orig(struct nf_conntrack *ct, const void *value, size_t len)
200 {
201  ct->protoinfo.sctp.vtag[__DIR_ORIG] = *((uint32_t *) value);
202 }
203 
204 static void
205 set_attr_sctp_vtag_repl(struct nf_conntrack *ct, const void *value, size_t len)
206 {
207  ct->protoinfo.sctp.vtag[__DIR_REPL] = *((uint32_t *) value);
208 }
209 
210 static void
211 set_attr_snat_ipv4(struct nf_conntrack *ct, const void *value, size_t len)
212 {
213  ct->snat.min_ip.v4 = ct->snat.max_ip.v4 = *((uint32_t *) value);
214 }
215 
216 static void
217 set_attr_dnat_ipv4(struct nf_conntrack *ct, const void *value, size_t len)
218 {
219  ct->dnat.min_ip.v4 = ct->dnat.max_ip.v4 = *((uint32_t *) value);
220 }
221 
222 static void
223 set_attr_snat_ipv6(struct nf_conntrack *ct, const void *value, size_t len)
224 {
225  memcpy(&ct->snat.min_ip.v6, value, sizeof(struct in6_addr));
226  memcpy(&ct->snat.max_ip.v6, value, sizeof(struct in6_addr));
227 }
228 
229 static void
230 set_attr_dnat_ipv6(struct nf_conntrack *ct, const void *value, size_t len)
231 {
232  memcpy(&ct->dnat.min_ip.v6, value, sizeof(struct in6_addr));
233  memcpy(&ct->dnat.max_ip.v6, value, sizeof(struct in6_addr));
234 }
235 
236 static void
237 set_attr_snat_port(struct nf_conntrack *ct, const void *value, size_t len)
238 {
239  ct->snat.l4min.all = ct->snat.l4max.all = *((uint16_t *) value);
240 }
241 
242 static void
243 set_attr_dnat_port(struct nf_conntrack *ct, const void *value, size_t len)
244 {
245  ct->dnat.l4min.all = ct->dnat.l4max.all = *((uint16_t *) value);
246 }
247 
248 static void
249 set_attr_timeout(struct nf_conntrack *ct, const void *value, size_t len)
250 {
251  ct->timeout = *((uint32_t *) value);
252 }
253 
254 static void
255 set_attr_mark(struct nf_conntrack *ct, const void *value, size_t len)
256 {
257  ct->mark = *((uint32_t *) value);
258 }
259 
260 static void
261 set_attr_secmark(struct nf_conntrack *ct, const void *value, size_t len)
262 {
263  ct->secmark = *((uint32_t *) value);
264 }
265 
266 static void
267 set_attr_status(struct nf_conntrack *ct, const void *value, size_t len)
268 {
269  ct->status = *((uint32_t *) value);
270 }
271 
272 static void
273 set_attr_id(struct nf_conntrack *ct, const void *value, size_t len)
274 {
275  ct->id = *((uint32_t *) value);
276 }
277 
278 static void
279 set_attr_master_ipv4_src(struct nf_conntrack *ct, const void *value, size_t len)
280 {
281  ct->master.src.v4 = *((uint32_t *) value);
282 }
283 
284 static void
285 set_attr_master_ipv4_dst(struct nf_conntrack *ct, const void *value, size_t len)
286 {
287  ct->master.dst.v4 = *((uint32_t *) value);
288 }
289 
290 static void
291 set_attr_master_ipv6_src(struct nf_conntrack *ct, const void *value, size_t len)
292 {
293  memcpy(&ct->master.src.v6, value, sizeof(uint32_t)*4);
294 }
295 
296 static void
297 set_attr_master_ipv6_dst(struct nf_conntrack *ct, const void *value, size_t len)
298 {
299  memcpy(&ct->master.dst.v6, value, sizeof(uint32_t)*4);
300 }
301 
302 static void
303 set_attr_master_port_src(struct nf_conntrack *ct, const void *value, size_t len)
304 {
305  ct->master.l4src.all = *((uint16_t *) value);
306 }
307 
308 static void
309 set_attr_master_port_dst(struct nf_conntrack *ct, const void *value, size_t len)
310 {
311  ct->master.l4dst.all = *((uint16_t *) value);
312 }
313 
314 static void
315 set_attr_master_l3proto(struct nf_conntrack *ct, const void *value, size_t len)
316 {
317  ct->master.l3protonum = *((uint8_t *) value);
318 }
319 
320 static void
321 set_attr_master_l4proto(struct nf_conntrack *ct, const void *value, size_t len)
322 {
323  ct->master.protonum = *((uint8_t *) value);
324 }
325 
326 static void
327 set_attr_orig_cor_pos(struct nf_conntrack *ct, const void *value, size_t len)
328 {
329  ct->natseq[__DIR_ORIG].correction_pos = *((uint32_t *) value);
330 }
331 
332 static void
333 set_attr_orig_off_bfr(struct nf_conntrack *ct, const void *value, size_t len)
334 {
335  ct->natseq[__DIR_ORIG].offset_before = *((uint32_t *) value);
336 }
337 
338 static void
339 set_attr_orig_off_aft(struct nf_conntrack *ct, const void *value, size_t len)
340 {
341  ct->natseq[__DIR_ORIG].offset_after = *((uint32_t *) value);
342 }
343 
344 static void
345 set_attr_repl_cor_pos(struct nf_conntrack *ct, const void *value, size_t len)
346 {
347  ct->natseq[__DIR_REPL].correction_pos = *((uint32_t *) value);
348 }
349 
350 static void
351 set_attr_repl_off_bfr(struct nf_conntrack *ct, const void *value, size_t len)
352 {
353  ct->natseq[__DIR_REPL].offset_before = *((uint32_t *) value);
354 }
355 
356 static void
357 set_attr_repl_off_aft(struct nf_conntrack *ct, const void *value, size_t len)
358 {
359  ct->natseq[__DIR_REPL].offset_after = *((uint32_t *) value);
360 }
361 
362 static void
363 set_attr_helper_name(struct nf_conntrack *ct, const void *value, size_t len)
364 {
365  snprintf(ct->helper_name, NFCT_HELPER_NAME_MAX, "%s", (char *)value);
366 }
367 
368 static void
369 set_attr_dccp_state(struct nf_conntrack *ct, const void *value, size_t len)
370 {
371  ct->protoinfo.dccp.state = *((uint8_t *) value);
372 }
373 
374 static void
375 set_attr_dccp_role(struct nf_conntrack *ct, const void *value, size_t len)
376 {
377  ct->protoinfo.dccp.role = *((uint8_t *) value);
378 }
379 
380 static void
381 set_attr_dccp_handshake_seq(struct nf_conntrack *ct, const void *value,
382  size_t len)
383 {
384  ct->protoinfo.dccp.handshake_seq = *((uint64_t *) value);
385 }
386 
387 static void
388 set_attr_tcp_wscale_orig(struct nf_conntrack *ct, const void *value, size_t len)
389 {
390  ct->protoinfo.tcp.wscale[__DIR_ORIG] = *((uint8_t *) value);
391 }
392 
393 static void
394 set_attr_tcp_wscale_repl(struct nf_conntrack *ct, const void *value, size_t len)
395 {
396  ct->protoinfo.tcp.wscale[__DIR_REPL] = *((uint8_t *) value);
397 }
398 
399 static void
400 set_attr_zone(struct nf_conntrack *ct, const void *value, size_t len)
401 {
402  ct->zone = *((uint16_t *) value);
403 }
404 
405 static void
406 set_attr_helper_info(struct nf_conntrack *ct, const void *value, size_t len)
407 {
408  if (ct->helper_info == NULL) {
409 retry:
410  ct->helper_info = calloc(1, len);
411  if (ct->helper_info == NULL)
412  return;
413 
414  memcpy(ct->helper_info, value, len);
415  } else {
416  free(ct->helper_info);
417  goto retry;
418  }
419 }
420 
421 static void
422 do_set_attr_connlabels(struct nfct_bitmask *current, const void *value)
423 {
424  if (current && current != value)
425  nfct_bitmask_destroy(current);
426 }
427 
428 static void
429 set_attr_connlabels(struct nf_conntrack *ct, const void *value, size_t len)
430 {
431  do_set_attr_connlabels(ct->connlabels, value);
432  ct->connlabels = (void *) value;
433 }
434 
435 static void
436 set_attr_connlabels_mask(struct nf_conntrack *ct, const void *value, size_t len)
437 {
438  do_set_attr_connlabels(ct->connlabels_mask, value);
439  ct->connlabels_mask = (void *) value;
440 }
441 
442 static void
443 set_attr_synproxy_isn(struct nf_conntrack *ct, const void *value, size_t len)
444 {
445  ct->synproxy.isn = *((uint32_t *) value);
446 }
447 
448 static void
449 set_attr_synproxy_its(struct nf_conntrack *ct, const void *value, size_t len)
450 {
451  ct->synproxy.its = *((uint32_t *) value);
452 }
453 
454 static void
455 set_attr_synproxy_tsoff(struct nf_conntrack *ct, const void *value, size_t len)
456 {
457  ct->synproxy.tsoff = *((uint32_t *) value);
458 }
459 
460 static void
461 set_attr_do_nothing(struct nf_conntrack *ct, const void *value, size_t len) {}
462 
463 const set_attr set_attr_array[ATTR_MAX] = {
464  [ATTR_ORIG_IPV4_SRC] = set_attr_orig_ipv4_src,
465  [ATTR_ORIG_IPV4_DST] = set_attr_orig_ipv4_dst,
466  [ATTR_REPL_IPV4_SRC] = set_attr_repl_ipv4_src,
467  [ATTR_REPL_IPV4_DST] = set_attr_repl_ipv4_dst,
468  [ATTR_ORIG_IPV6_SRC] = set_attr_orig_ipv6_src,
469  [ATTR_ORIG_IPV6_DST] = set_attr_orig_ipv6_dst,
470  [ATTR_REPL_IPV6_SRC] = set_attr_repl_ipv6_src,
471  [ATTR_REPL_IPV6_DST] = set_attr_repl_ipv6_dst,
472  [ATTR_ORIG_PORT_SRC] = set_attr_orig_port_src,
473  [ATTR_ORIG_PORT_DST] = set_attr_orig_port_dst,
474  [ATTR_REPL_PORT_SRC] = set_attr_repl_port_src,
475  [ATTR_REPL_PORT_DST] = set_attr_repl_port_dst,
476  [ATTR_ICMP_TYPE] = set_attr_icmp_type,
477  [ATTR_ICMP_CODE] = set_attr_icmp_code,
478  [ATTR_ICMP_ID] = set_attr_icmp_id,
479  [ATTR_ORIG_L3PROTO] = set_attr_orig_l3proto,
480  [ATTR_REPL_L3PROTO] = set_attr_repl_l3proto,
481  [ATTR_ORIG_L4PROTO] = set_attr_orig_l4proto,
482  [ATTR_REPL_L4PROTO] = set_attr_repl_l4proto,
483  [ATTR_TCP_STATE] = set_attr_tcp_state,
484  [ATTR_SNAT_IPV4] = set_attr_snat_ipv4,
485  [ATTR_DNAT_IPV4] = set_attr_dnat_ipv4,
486  [ATTR_SNAT_PORT] = set_attr_snat_port,
487  [ATTR_DNAT_PORT] = set_attr_dnat_port,
488  [ATTR_TIMEOUT] = set_attr_timeout,
489  [ATTR_MARK] = set_attr_mark,
490  [ATTR_ORIG_COUNTER_PACKETS] = set_attr_do_nothing,
491  [ATTR_REPL_COUNTER_PACKETS] = set_attr_do_nothing,
492  [ATTR_ORIG_COUNTER_BYTES] = set_attr_do_nothing,
493  [ATTR_REPL_COUNTER_BYTES] = set_attr_do_nothing,
494  [ATTR_USE] = set_attr_do_nothing,
495  [ATTR_ID] = set_attr_id,
496  [ATTR_STATUS] = set_attr_status,
497  [ATTR_TCP_FLAGS_ORIG] = set_attr_tcp_flags_orig,
498  [ATTR_TCP_FLAGS_REPL] = set_attr_tcp_flags_repl,
499  [ATTR_TCP_MASK_ORIG] = set_attr_tcp_mask_orig,
500  [ATTR_TCP_MASK_REPL] = set_attr_tcp_mask_repl,
501  [ATTR_MASTER_IPV4_SRC] = set_attr_master_ipv4_src,
502  [ATTR_MASTER_IPV4_DST] = set_attr_master_ipv4_dst,
503  [ATTR_MASTER_IPV6_SRC] = set_attr_master_ipv6_src,
504  [ATTR_MASTER_IPV6_DST] = set_attr_master_ipv6_dst,
505  [ATTR_MASTER_PORT_SRC] = set_attr_master_port_src,
506  [ATTR_MASTER_PORT_DST] = set_attr_master_port_dst,
507  [ATTR_MASTER_L3PROTO] = set_attr_master_l3proto,
508  [ATTR_MASTER_L4PROTO] = set_attr_master_l4proto,
509  [ATTR_SECMARK] = set_attr_secmark,
510  [ATTR_ORIG_NAT_SEQ_CORRECTION_POS] = set_attr_orig_cor_pos,
511  [ATTR_ORIG_NAT_SEQ_OFFSET_BEFORE] = set_attr_orig_off_bfr,
512  [ATTR_ORIG_NAT_SEQ_OFFSET_AFTER] = set_attr_orig_off_aft,
513  [ATTR_REPL_NAT_SEQ_CORRECTION_POS] = set_attr_repl_cor_pos,
514  [ATTR_REPL_NAT_SEQ_OFFSET_BEFORE] = set_attr_repl_off_bfr,
515  [ATTR_REPL_NAT_SEQ_OFFSET_AFTER] = set_attr_repl_off_aft,
516  [ATTR_SCTP_STATE] = set_attr_sctp_state,
517  [ATTR_SCTP_VTAG_ORIG] = set_attr_sctp_vtag_orig,
518  [ATTR_SCTP_VTAG_REPL] = set_attr_sctp_vtag_repl,
519  [ATTR_HELPER_NAME] = set_attr_helper_name,
520  [ATTR_DCCP_STATE] = set_attr_dccp_state,
521  [ATTR_DCCP_ROLE] = set_attr_dccp_role,
522  [ATTR_DCCP_HANDSHAKE_SEQ] = set_attr_dccp_handshake_seq,
523  [ATTR_TCP_WSCALE_ORIG] = set_attr_tcp_wscale_orig,
524  [ATTR_TCP_WSCALE_REPL] = set_attr_tcp_wscale_repl,
525  [ATTR_ZONE] = set_attr_zone,
526  [ATTR_ORIG_ZONE] = set_attr_orig_zone,
527  [ATTR_REPL_ZONE] = set_attr_repl_zone,
528  [ATTR_SECCTX] = set_attr_do_nothing,
529  [ATTR_TIMESTAMP_START] = set_attr_do_nothing,
530  [ATTR_TIMESTAMP_STOP] = set_attr_do_nothing,
531  [ATTR_HELPER_INFO] = set_attr_helper_info,
532  [ATTR_CONNLABELS] = set_attr_connlabels,
533  [ATTR_CONNLABELS_MASK] = set_attr_connlabels_mask,
534  [ATTR_SNAT_IPV6] = set_attr_snat_ipv6,
535  [ATTR_DNAT_IPV6] = set_attr_dnat_ipv6,
536  [ATTR_SYNPROXY_ISN] = set_attr_synproxy_isn,
537  [ATTR_SYNPROXY_ITS] = set_attr_synproxy_its,
538  [ATTR_SYNPROXY_TSOFF] = set_attr_synproxy_tsoff,
539 };