libnetfilter_conntrack 1.1.0
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
12static void
13set_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
18static void
19set_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
24static void
25set_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
30static void
31set_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
36static void
37set_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
42static void
43set_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
48static void
49set_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
54static void
55set_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
60static void
61set_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
66static void
67set_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
72static void
73set_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
78static void
79set_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
84static void
85set_attr_orig_zone(struct nf_conntrack *ct, const void *value, size_t len)
86{
87 ct->head.orig.zone = *((uint16_t *) value);
88}
89
90static void
91set_attr_repl_zone(struct nf_conntrack *ct, const void *value, size_t len)
92{
93 ct->repl.zone = *((uint16_t *) value);
94}
95
96static void
97set_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
124static void
125set_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
131static void
132set_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
138static void
139set_attr_orig_l3proto(struct nf_conntrack *ct, const void *value, size_t len)
140{
141 ct->head.orig.l3protonum = *((uint8_t *) value);
142}
143
144static void
145set_attr_repl_l3proto(struct nf_conntrack *ct, const void *value, size_t len)
146{
147 ct->repl.l3protonum = *((uint8_t *) value);
148}
149
150static void
151set_attr_orig_l4proto(struct nf_conntrack *ct, const void *value, size_t len)
152{
153 ct->head.orig.protonum = *((uint8_t *) value);
154}
155
156static void
157set_attr_repl_l4proto(struct nf_conntrack *ct, const void *value, size_t len)
158{
159 ct->repl.protonum = *((uint8_t *) value);
160}
161
162static void
163set_attr_tcp_state(struct nf_conntrack *ct, const void *value, size_t len)
164{
165 ct->protoinfo.tcp.state = *((uint8_t *) value);
166}
167
168static void
169set_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
174static void
175set_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
180static void
181set_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
186static void
187set_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
192static void
193set_attr_sctp_state(struct nf_conntrack *ct, const void *value, size_t len)
194{
195 ct->protoinfo.sctp.state = *((uint8_t *) value);
196}
197
198static void
199set_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
204static void
205set_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
210static void
211set_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
216static void
217set_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
222static void
223set_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
229static void
230set_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
236static void
237set_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
242static void
243set_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
248static void
249set_attr_timeout(struct nf_conntrack *ct, const void *value, size_t len)
250{
251 ct->timeout = *((uint32_t *) value);
252}
253
254static void
255set_attr_mark(struct nf_conntrack *ct, const void *value, size_t len)
256{
257 ct->mark = *((uint32_t *) value);
258}
259
260static void
261set_attr_secmark(struct nf_conntrack *ct, const void *value, size_t len)
262{
263 ct->secmark = *((uint32_t *) value);
264}
265
266static void
267set_attr_status(struct nf_conntrack *ct, const void *value, size_t len)
268{
269 ct->status = *((uint32_t *) value);
270}
271
272static void
273set_attr_id(struct nf_conntrack *ct, const void *value, size_t len)
274{
275 ct->id = *((uint32_t *) value);
276}
277
278static void
279set_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
284static void
285set_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
290static void
291set_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
296static void
297set_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
302static void
303set_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
308static void
309set_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
314static void
315set_attr_master_l3proto(struct nf_conntrack *ct, const void *value, size_t len)
316{
317 ct->master.l3protonum = *((uint8_t *) value);
318}
319
320static void
321set_attr_master_l4proto(struct nf_conntrack *ct, const void *value, size_t len)
322{
323 ct->master.protonum = *((uint8_t *) value);
324}
325
326static void
327set_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
332static void
333set_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
338static void
339set_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
344static void
345set_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
350static void
351set_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
356static void
357set_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
362static void
363set_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
368static void
369set_attr_dccp_state(struct nf_conntrack *ct, const void *value, size_t len)
370{
371 ct->protoinfo.dccp.state = *((uint8_t *) value);
372}
373
374static void
375set_attr_dccp_role(struct nf_conntrack *ct, const void *value, size_t len)
376{
377 ct->protoinfo.dccp.role = *((uint8_t *) value);
378}
379
380static void
381set_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
387static void
388set_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
393static void
394set_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
399static void
400set_attr_zone(struct nf_conntrack *ct, const void *value, size_t len)
401{
402 ct->zone = *((uint16_t *) value);
403}
404
405static void
406set_attr_helper_info(struct nf_conntrack *ct, const void *value, size_t len)
407{
408 if (ct->helper_info == NULL) {
409retry:
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
421static void
422do_set_attr_connlabels(struct nfct_bitmask *current, const void *value)
423{
424 if (current && current != value)
425 nfct_bitmask_destroy(current);
426}
427
428static void
429set_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
435static void
436set_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
442static void
443set_attr_synproxy_isn(struct nf_conntrack *ct, const void *value, size_t len)
444{
445 ct->synproxy.isn = *((uint32_t *) value);
446}
447
448static void
449set_attr_synproxy_its(struct nf_conntrack *ct, const void *value, size_t len)
450{
451 ct->synproxy.its = *((uint32_t *) value);
452}
453
454static void
455set_attr_synproxy_tsoff(struct nf_conntrack *ct, const void *value, size_t len)
456{
457 ct->synproxy.tsoff = *((uint32_t *) value);
458}
459
460static void
461set_attr_do_nothing(struct nf_conntrack *ct, const void *value, size_t len) {}
462
463const 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};