10 #include "internal/internal.h"
13 set_attr_orig_ipv4_src(
struct nf_conntrack *ct,
const void *value,
size_t len)
15 ct->head.orig.src.v4 = *((uint32_t *) value);
19 set_attr_orig_ipv4_dst(
struct nf_conntrack *ct,
const void *value,
size_t len)
21 ct->head.orig.dst.v4 = *((uint32_t *) value);
25 set_attr_repl_ipv4_src(
struct nf_conntrack *ct,
const void *value,
size_t len)
27 ct->repl.src.v4 = *((uint32_t *) value);
31 set_attr_repl_ipv4_dst(
struct nf_conntrack *ct,
const void *value,
size_t len)
33 ct->repl.dst.v4 = *((uint32_t *) value);
37 set_attr_orig_ipv6_src(
struct nf_conntrack *ct,
const void *value,
size_t len)
39 memcpy(&ct->head.orig.src.v6, value,
sizeof(uint32_t)*4);
43 set_attr_orig_ipv6_dst(
struct nf_conntrack *ct,
const void *value,
size_t len)
45 memcpy(&ct->head.orig.dst.v6, value,
sizeof(uint32_t)*4);
49 set_attr_repl_ipv6_src(
struct nf_conntrack *ct,
const void *value,
size_t len)
51 memcpy(&ct->repl.src.v6, value,
sizeof(uint32_t)*4);
55 set_attr_repl_ipv6_dst(
struct nf_conntrack *ct,
const void *value,
size_t len)
57 memcpy(&ct->repl.dst.v6, value,
sizeof(uint32_t)*4);
61 set_attr_orig_port_src(
struct nf_conntrack *ct,
const void *value,
size_t len)
63 ct->head.orig.l4src.all = *((uint16_t *) value);
67 set_attr_orig_port_dst(
struct nf_conntrack *ct,
const void *value,
size_t len)
69 ct->head.orig.l4dst.all = *((uint16_t *) value);
73 set_attr_repl_port_src(
struct nf_conntrack *ct,
const void *value,
size_t len)
75 ct->repl.l4src.all = *((uint16_t *) value);
79 set_attr_repl_port_dst(
struct nf_conntrack *ct,
const void *value,
size_t len)
81 ct->repl.l4dst.all = *((uint16_t *) value);
85 set_attr_orig_zone(
struct nf_conntrack *ct,
const void *value,
size_t len)
87 ct->head.orig.zone = *((uint16_t *) value);
91 set_attr_repl_zone(
struct nf_conntrack *ct,
const void *value,
size_t len)
93 ct->repl.zone = *((uint16_t *) value);
97 set_attr_icmp_type(
struct nf_conntrack *ct,
const void *value,
size_t len)
99 uint8_t type = *((uint8_t *) value);
102 ct->head.orig.l4dst.icmp.type = type;
104 switch(ct->head.orig.l3protonum) {
106 rtype = __icmp_reply_type(type);
110 rtype = __icmpv6_reply_type(type);
118 ct->repl.l4dst.icmp.type = rtype - 1;
120 ct->repl.l4dst.icmp.type = 255;
125 set_attr_icmp_code(
struct nf_conntrack *ct,
const void *value,
size_t len)
127 ct->head.orig.l4dst.icmp.code = *((uint8_t *) value);
128 ct->repl.l4dst.icmp.code = *((uint8_t *) value);
132 set_attr_icmp_id(
struct nf_conntrack *ct,
const void *value,
size_t len)
134 ct->head.orig.l4src.icmp.id = *((uint16_t *) value);
135 ct->repl.l4src.icmp.id = *((uint16_t *) value);
139 set_attr_orig_l3proto(
struct nf_conntrack *ct,
const void *value,
size_t len)
141 ct->head.orig.l3protonum = *((uint8_t *) value);
145 set_attr_repl_l3proto(
struct nf_conntrack *ct,
const void *value,
size_t len)
147 ct->repl.l3protonum = *((uint8_t *) value);
151 set_attr_orig_l4proto(
struct nf_conntrack *ct,
const void *value,
size_t len)
153 ct->head.orig.protonum = *((uint8_t *) value);
157 set_attr_repl_l4proto(
struct nf_conntrack *ct,
const void *value,
size_t len)
159 ct->repl.protonum = *((uint8_t *) value);
163 set_attr_tcp_state(
struct nf_conntrack *ct,
const void *value,
size_t len)
165 ct->protoinfo.tcp.state = *((uint8_t *) value);
169 set_attr_tcp_flags_orig(
struct nf_conntrack *ct,
const void *value,
size_t len)
171 ct->protoinfo.tcp.flags[__DIR_ORIG].value = *((uint8_t *) value);
175 set_attr_tcp_mask_orig(
struct nf_conntrack *ct,
const void *value,
size_t len)
177 ct->protoinfo.tcp.flags[__DIR_ORIG].mask = *((uint8_t *) value);
181 set_attr_tcp_flags_repl(
struct nf_conntrack *ct,
const void *value,
size_t len)
183 ct->protoinfo.tcp.flags[__DIR_REPL].value = *((uint8_t *) value);
187 set_attr_tcp_mask_repl(
struct nf_conntrack *ct,
const void *value,
size_t len)
189 ct->protoinfo.tcp.flags[__DIR_REPL].mask = *((uint8_t *) value);
193 set_attr_sctp_state(
struct nf_conntrack *ct,
const void *value,
size_t len)
195 ct->protoinfo.sctp.state = *((uint8_t *) value);
199 set_attr_sctp_vtag_orig(
struct nf_conntrack *ct,
const void *value,
size_t len)
201 ct->protoinfo.sctp.vtag[__DIR_ORIG] = *((uint32_t *) value);
205 set_attr_sctp_vtag_repl(
struct nf_conntrack *ct,
const void *value,
size_t len)
207 ct->protoinfo.sctp.vtag[__DIR_REPL] = *((uint32_t *) value);
211 set_attr_snat_ipv4(
struct nf_conntrack *ct,
const void *value,
size_t len)
213 ct->snat.min_ip.v4 = ct->snat.max_ip.v4 = *((uint32_t *) value);
217 set_attr_dnat_ipv4(
struct nf_conntrack *ct,
const void *value,
size_t len)
219 ct->dnat.min_ip.v4 = ct->dnat.max_ip.v4 = *((uint32_t *) value);
223 set_attr_snat_ipv6(
struct nf_conntrack *ct,
const void *value,
size_t len)
225 memcpy(&ct->snat.min_ip.v6, value,
sizeof(
struct in6_addr));
226 memcpy(&ct->snat.max_ip.v6, value,
sizeof(
struct in6_addr));
230 set_attr_dnat_ipv6(
struct nf_conntrack *ct,
const void *value,
size_t len)
232 memcpy(&ct->dnat.min_ip.v6, value,
sizeof(
struct in6_addr));
233 memcpy(&ct->dnat.max_ip.v6, value,
sizeof(
struct in6_addr));
237 set_attr_snat_port(
struct nf_conntrack *ct,
const void *value,
size_t len)
239 ct->snat.l4min.all = ct->snat.l4max.all = *((uint16_t *) value);
243 set_attr_dnat_port(
struct nf_conntrack *ct,
const void *value,
size_t len)
245 ct->dnat.l4min.all = ct->dnat.l4max.all = *((uint16_t *) value);
249 set_attr_timeout(
struct nf_conntrack *ct,
const void *value,
size_t len)
251 ct->timeout = *((uint32_t *) value);
255 set_attr_mark(
struct nf_conntrack *ct,
const void *value,
size_t len)
257 ct->mark = *((uint32_t *) value);
261 set_attr_secmark(
struct nf_conntrack *ct,
const void *value,
size_t len)
263 ct->secmark = *((uint32_t *) value);
267 set_attr_status(
struct nf_conntrack *ct,
const void *value,
size_t len)
269 ct->status = *((uint32_t *) value);
273 set_attr_id(
struct nf_conntrack *ct,
const void *value,
size_t len)
275 ct->id = *((uint32_t *) value);
279 set_attr_master_ipv4_src(
struct nf_conntrack *ct,
const void *value,
size_t len)
281 ct->master.src.v4 = *((uint32_t *) value);
285 set_attr_master_ipv4_dst(
struct nf_conntrack *ct,
const void *value,
size_t len)
287 ct->master.dst.v4 = *((uint32_t *) value);
291 set_attr_master_ipv6_src(
struct nf_conntrack *ct,
const void *value,
size_t len)
293 memcpy(&ct->master.src.v6, value,
sizeof(uint32_t)*4);
297 set_attr_master_ipv6_dst(
struct nf_conntrack *ct,
const void *value,
size_t len)
299 memcpy(&ct->master.dst.v6, value,
sizeof(uint32_t)*4);
303 set_attr_master_port_src(
struct nf_conntrack *ct,
const void *value,
size_t len)
305 ct->master.l4src.all = *((uint16_t *) value);
309 set_attr_master_port_dst(
struct nf_conntrack *ct,
const void *value,
size_t len)
311 ct->master.l4dst.all = *((uint16_t *) value);
315 set_attr_master_l3proto(
struct nf_conntrack *ct,
const void *value,
size_t len)
317 ct->master.l3protonum = *((uint8_t *) value);
321 set_attr_master_l4proto(
struct nf_conntrack *ct,
const void *value,
size_t len)
323 ct->master.protonum = *((uint8_t *) value);
327 set_attr_orig_cor_pos(
struct nf_conntrack *ct,
const void *value,
size_t len)
329 ct->natseq[__DIR_ORIG].correction_pos = *((uint32_t *) value);
333 set_attr_orig_off_bfr(
struct nf_conntrack *ct,
const void *value,
size_t len)
335 ct->natseq[__DIR_ORIG].offset_before = *((uint32_t *) value);
339 set_attr_orig_off_aft(
struct nf_conntrack *ct,
const void *value,
size_t len)
341 ct->natseq[__DIR_ORIG].offset_after = *((uint32_t *) value);
345 set_attr_repl_cor_pos(
struct nf_conntrack *ct,
const void *value,
size_t len)
347 ct->natseq[__DIR_REPL].correction_pos = *((uint32_t *) value);
351 set_attr_repl_off_bfr(
struct nf_conntrack *ct,
const void *value,
size_t len)
353 ct->natseq[__DIR_REPL].offset_before = *((uint32_t *) value);
357 set_attr_repl_off_aft(
struct nf_conntrack *ct,
const void *value,
size_t len)
359 ct->natseq[__DIR_REPL].offset_after = *((uint32_t *) value);
363 set_attr_helper_name(
struct nf_conntrack *ct,
const void *value,
size_t len)
365 snprintf(ct->helper_name, NFCT_HELPER_NAME_MAX,
"%s", (
char *)value);
369 set_attr_dccp_state(
struct nf_conntrack *ct,
const void *value,
size_t len)
371 ct->protoinfo.dccp.state = *((uint8_t *) value);
375 set_attr_dccp_role(
struct nf_conntrack *ct,
const void *value,
size_t len)
377 ct->protoinfo.dccp.role = *((uint8_t *) value);
381 set_attr_dccp_handshake_seq(
struct nf_conntrack *ct,
const void *value,
384 ct->protoinfo.dccp.handshake_seq = *((uint64_t *) value);
388 set_attr_tcp_wscale_orig(
struct nf_conntrack *ct,
const void *value,
size_t len)
390 ct->protoinfo.tcp.wscale[__DIR_ORIG] = *((uint8_t *) value);
394 set_attr_tcp_wscale_repl(
struct nf_conntrack *ct,
const void *value,
size_t len)
396 ct->protoinfo.tcp.wscale[__DIR_REPL] = *((uint8_t *) value);
400 set_attr_zone(
struct nf_conntrack *ct,
const void *value,
size_t len)
402 ct->zone = *((uint16_t *) value);
406 set_attr_helper_info(
struct nf_conntrack *ct,
const void *value,
size_t len)
408 if (ct->helper_info == NULL) {
410 ct->helper_info = calloc(1, len);
411 if (ct->helper_info == NULL)
414 memcpy(ct->helper_info, value, len);
416 free(ct->helper_info);
422 do_set_attr_connlabels(
struct nfct_bitmask *current,
const void *value)
424 if (current && current != value)
425 nfct_bitmask_destroy(current);
429 set_attr_connlabels(
struct nf_conntrack *ct,
const void *value,
size_t len)
431 do_set_attr_connlabels(ct->connlabels, value);
432 ct->connlabels = (
void *) value;
436 set_attr_connlabels_mask(
struct nf_conntrack *ct,
const void *value,
size_t len)
438 do_set_attr_connlabels(ct->connlabels_mask, value);
439 ct->connlabels_mask = (
void *) value;
443 set_attr_synproxy_isn(
struct nf_conntrack *ct,
const void *value,
size_t len)
445 ct->synproxy.isn = *((uint32_t *) value);
449 set_attr_synproxy_its(
struct nf_conntrack *ct,
const void *value,
size_t len)
451 ct->synproxy.its = *((uint32_t *) value);
455 set_attr_synproxy_tsoff(
struct nf_conntrack *ct,
const void *value,
size_t len)
457 ct->synproxy.tsoff = *((uint32_t *) value);
461 set_attr_do_nothing(
struct nf_conntrack *ct,
const void *value,
size_t len) {}
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,