00001
00002
00003
00004
00005
00006
00007
00008 #include "internal/internal.h"
00009
00010 static void copy_attr_orig_ipv4_src(struct nf_conntrack *dest,
00011 const struct nf_conntrack *orig)
00012 {
00013 dest->tuple[__DIR_ORIG].src.v4 = orig->tuple[__DIR_ORIG].src.v4;
00014 }
00015
00016 static void copy_attr_orig_ipv4_dst(struct nf_conntrack *dest,
00017 const struct nf_conntrack *orig)
00018 {
00019 dest->tuple[__DIR_ORIG].dst.v4 = orig->tuple[__DIR_ORIG].dst.v4;
00020 }
00021
00022 static void copy_attr_repl_ipv4_src(struct nf_conntrack *dest,
00023 const struct nf_conntrack *orig)
00024 {
00025 dest->tuple[__DIR_REPL].src.v4 = orig->tuple[__DIR_REPL].src.v4;
00026 }
00027
00028 static void copy_attr_repl_ipv4_dst(struct nf_conntrack *dest,
00029 const struct nf_conntrack *orig)
00030 {
00031 dest->tuple[__DIR_REPL].dst.v4 = orig->tuple[__DIR_REPL].dst.v4;
00032 }
00033
00034 static void copy_attr_orig_ipv6_src(struct nf_conntrack *dest,
00035 const struct nf_conntrack *orig)
00036 {
00037 memcpy(&dest->tuple[__DIR_ORIG].src,
00038 &orig->tuple[__DIR_ORIG].src,
00039 sizeof(union __nfct_address));
00040 }
00041
00042 static void copy_attr_orig_ipv6_dst(struct nf_conntrack *dest,
00043 const struct nf_conntrack *orig)
00044 {
00045 memcpy(&dest->tuple[__DIR_ORIG].dst,
00046 &orig->tuple[__DIR_ORIG].dst,
00047 sizeof(union __nfct_address));
00048 }
00049
00050 static void copy_attr_repl_ipv6_src(struct nf_conntrack *dest,
00051 const struct nf_conntrack *orig)
00052 {
00053 memcpy(&dest->tuple[__DIR_REPL].src,
00054 &orig->tuple[__DIR_REPL].src,
00055 sizeof(union __nfct_address));
00056 }
00057
00058 static void copy_attr_repl_ipv6_dst(struct nf_conntrack *dest,
00059 const struct nf_conntrack *orig)
00060 {
00061 memcpy(&dest->tuple[__DIR_REPL].dst,
00062 &orig->tuple[__DIR_REPL].dst,
00063 sizeof(union __nfct_address));
00064 }
00065
00066 static void copy_attr_orig_port_src(struct nf_conntrack *dest,
00067 const struct nf_conntrack *orig)
00068 {
00069 dest->tuple[__DIR_ORIG].l4src.all = orig->tuple[__DIR_ORIG].l4src.all;
00070 }
00071
00072 static void copy_attr_orig_port_dst(struct nf_conntrack *dest,
00073 const struct nf_conntrack *orig)
00074 {
00075 dest->tuple[__DIR_ORIG].l4dst.all = orig->tuple[__DIR_ORIG].l4dst.all;
00076 }
00077
00078 static void copy_attr_repl_port_src(struct nf_conntrack *dest,
00079 const struct nf_conntrack *orig)
00080 {
00081 dest->tuple[__DIR_REPL].l4src.all = orig->tuple[__DIR_REPL].l4src.all;
00082 }
00083
00084 static void copy_attr_repl_port_dst(struct nf_conntrack *dest,
00085 const struct nf_conntrack *orig)
00086 {
00087 dest->tuple[__DIR_REPL].l4dst.all = orig->tuple[__DIR_REPL].l4dst.all;
00088 }
00089
00090 static void copy_attr_icmp_type(struct nf_conntrack *dest,
00091 const struct nf_conntrack *orig)
00092 {
00093 dest->tuple[__DIR_ORIG].l4dst.icmp.type =
00094 orig->tuple[__DIR_ORIG].l4dst.icmp.type;
00095
00096 }
00097
00098 static void copy_attr_icmp_code(struct nf_conntrack *dest,
00099 const struct nf_conntrack *orig)
00100 {
00101 dest->tuple[__DIR_ORIG].l4dst.icmp.code =
00102 orig->tuple[__DIR_ORIG].l4dst.icmp.code;
00103
00104 }
00105
00106 static void copy_attr_icmp_id(struct nf_conntrack *dest,
00107 const struct nf_conntrack *orig)
00108 {
00109 dest->tuple[__DIR_ORIG].l4src.icmp.id =
00110 orig->tuple[__DIR_ORIG].l4src.icmp.id;
00111 }
00112
00113 static void copy_attr_orig_l3proto(struct nf_conntrack *dest,
00114 const struct nf_conntrack *orig)
00115 {
00116 dest->tuple[__DIR_ORIG].l3protonum = orig->tuple[__DIR_ORIG].l3protonum;
00117 }
00118
00119 static void copy_attr_repl_l3proto(struct nf_conntrack *dest,
00120 const struct nf_conntrack *orig)
00121 {
00122 dest->tuple[__DIR_REPL].l3protonum = orig->tuple[__DIR_REPL].l3protonum;
00123 }
00124
00125 static void copy_attr_orig_l4proto(struct nf_conntrack *dest,
00126 const struct nf_conntrack *orig)
00127 {
00128 dest->tuple[__DIR_ORIG].protonum = orig->tuple[__DIR_ORIG].protonum;
00129 }
00130
00131 static void copy_attr_repl_l4proto(struct nf_conntrack *dest,
00132 const struct nf_conntrack *orig)
00133 {
00134 dest->tuple[__DIR_REPL].protonum = orig->tuple[__DIR_REPL].protonum;
00135 }
00136
00137 static void copy_attr_master_ipv4_src(struct nf_conntrack *dest,
00138 const struct nf_conntrack *orig)
00139 {
00140 dest->tuple[__DIR_MASTER].src.v4 = orig->tuple[__DIR_MASTER].src.v4;
00141 }
00142
00143 static void copy_attr_master_ipv4_dst(struct nf_conntrack *dest,
00144 const struct nf_conntrack *orig)
00145 {
00146 dest->tuple[__DIR_MASTER].dst.v4 = orig->tuple[__DIR_MASTER].dst.v4;
00147 }
00148
00149 static void copy_attr_master_ipv6_src(struct nf_conntrack *dest,
00150 const struct nf_conntrack *orig)
00151 {
00152 memcpy(&dest->tuple[__DIR_MASTER].src,
00153 &orig->tuple[__DIR_MASTER].src,
00154 sizeof(union __nfct_address));
00155 }
00156
00157 static void copy_attr_master_ipv6_dst(struct nf_conntrack *dest,
00158 const struct nf_conntrack *orig)
00159 {
00160 memcpy(&dest->tuple[__DIR_MASTER].dst,
00161 &orig->tuple[__DIR_MASTER].dst,
00162 sizeof(union __nfct_address));
00163 }
00164
00165 static void copy_attr_master_port_src(struct nf_conntrack *dest,
00166 const struct nf_conntrack *orig)
00167 {
00168 dest->tuple[__DIR_MASTER].l4src.all =
00169 orig->tuple[__DIR_MASTER].l4src.all;
00170 }
00171
00172 static void copy_attr_master_port_dst(struct nf_conntrack *dest,
00173 const struct nf_conntrack *orig)
00174 {
00175 dest->tuple[__DIR_MASTER].l4dst.all =
00176 orig->tuple[__DIR_MASTER].l4dst.all;
00177 }
00178
00179 static void copy_attr_master_l3proto(struct nf_conntrack *dest,
00180 const struct nf_conntrack *orig)
00181 {
00182 dest->tuple[__DIR_MASTER].l3protonum =
00183 orig->tuple[__DIR_MASTER].l3protonum;
00184 }
00185
00186 static void copy_attr_master_l4proto(struct nf_conntrack *dest,
00187 const struct nf_conntrack *orig)
00188 {
00189 dest->tuple[__DIR_MASTER].protonum =
00190 orig->tuple[__DIR_MASTER].protonum;
00191 }
00192
00193 static void copy_attr_tcp_state(struct nf_conntrack *dest,
00194 const struct nf_conntrack *orig)
00195 {
00196 dest->protoinfo.tcp.state = orig->protoinfo.tcp.state;
00197 }
00198
00199 static void copy_attr_tcp_flags_orig(struct nf_conntrack *dest,
00200 const struct nf_conntrack *orig)
00201 {
00202 dest->protoinfo.tcp.flags[__DIR_ORIG].value =
00203 orig->protoinfo.tcp.flags[__DIR_ORIG].value;
00204 }
00205
00206 static void copy_attr_tcp_flags_repl(struct nf_conntrack *dest,
00207 const struct nf_conntrack *orig)
00208 {
00209 dest->protoinfo.tcp.flags[__DIR_REPL].value =
00210 orig->protoinfo.tcp.flags[__DIR_REPL].value;
00211 }
00212
00213 static void copy_attr_tcp_mask_orig(struct nf_conntrack *dest,
00214 const struct nf_conntrack *orig)
00215 {
00216 dest->protoinfo.tcp.flags[__DIR_ORIG].mask =
00217 orig->protoinfo.tcp.flags[__DIR_ORIG].mask;
00218 }
00219
00220 static void copy_attr_tcp_mask_repl(struct nf_conntrack *dest,
00221 const struct nf_conntrack *orig)
00222 {
00223 dest->protoinfo.tcp.flags[__DIR_REPL].mask =
00224 orig->protoinfo.tcp.flags[__DIR_REPL].mask;
00225 }
00226
00227 static void copy_attr_tcp_wscale_orig(struct nf_conntrack *dest,
00228 const struct nf_conntrack *orig)
00229 {
00230 dest->protoinfo.tcp.wscale[__DIR_ORIG] =
00231 orig->protoinfo.tcp.wscale[__DIR_ORIG];
00232 }
00233
00234 static void copy_attr_tcp_wscale_repl(struct nf_conntrack *dest,
00235 const struct nf_conntrack *orig)
00236 {
00237 dest->protoinfo.tcp.wscale[__DIR_REPL] =
00238 orig->protoinfo.tcp.wscale[__DIR_REPL];
00239 }
00240
00241 static void copy_attr_sctp_state(struct nf_conntrack *dest,
00242 const struct nf_conntrack *orig)
00243 {
00244 dest->protoinfo.sctp.state = orig->protoinfo.sctp.state;
00245 }
00246
00247 static void copy_attr_sctp_vtag_orig(struct nf_conntrack *dest,
00248 const struct nf_conntrack *orig)
00249 {
00250 dest->protoinfo.sctp.vtag[__DIR_ORIG] =
00251 orig->protoinfo.sctp.vtag[__DIR_ORIG];
00252 }
00253
00254 static void copy_attr_sctp_vtag_repl(struct nf_conntrack *dest,
00255 const struct nf_conntrack *orig)
00256 {
00257 dest->protoinfo.sctp.vtag[__DIR_REPL] =
00258 orig->protoinfo.sctp.vtag[__DIR_REPL];
00259 }
00260
00261 static void copy_attr_dccp_state(struct nf_conntrack *dest,
00262 const struct nf_conntrack *orig)
00263 {
00264 dest->protoinfo.dccp.state = orig->protoinfo.dccp.state;
00265 }
00266
00267 static void copy_attr_dccp_role(struct nf_conntrack *dest,
00268 const struct nf_conntrack *orig)
00269 {
00270 dest->protoinfo.dccp.role = orig->protoinfo.dccp.role;
00271 }
00272
00273 static void copy_attr_dccp_handshake_seq(struct nf_conntrack *dest,
00274 const struct nf_conntrack *orig)
00275 {
00276 dest->protoinfo.dccp.handshake_seq = orig->protoinfo.dccp.handshake_seq;
00277 }
00278
00279 static void copy_attr_snat_ipv4(struct nf_conntrack *dest,
00280 const struct nf_conntrack *orig)
00281 {
00282 dest->snat.min_ip = orig->snat.min_ip;
00283 }
00284
00285 static void copy_attr_dnat_ipv4(struct nf_conntrack *dest,
00286 const struct nf_conntrack *orig)
00287 {
00288 dest->dnat.min_ip = orig->dnat.min_ip;
00289 }
00290
00291 static void copy_attr_snat_port(struct nf_conntrack *dest,
00292 const struct nf_conntrack *orig)
00293 {
00294 dest->snat.l4min.all = orig->snat.l4min.all;
00295 }
00296
00297 static void copy_attr_dnat_port(struct nf_conntrack *dest,
00298 const struct nf_conntrack *orig)
00299 {
00300 dest->dnat.l4min.all = orig->dnat.l4min.all;
00301 }
00302
00303 static void copy_attr_timeout(struct nf_conntrack *dest,
00304 const struct nf_conntrack *orig)
00305 {
00306 dest->timeout = orig->timeout;
00307 }
00308
00309 static void copy_attr_mark(struct nf_conntrack *dest,
00310 const struct nf_conntrack *orig)
00311 {
00312 dest->mark = orig->mark;
00313 }
00314
00315 static void copy_attr_secmark(struct nf_conntrack *dest,
00316 const struct nf_conntrack *orig)
00317 {
00318 dest->secmark = orig->secmark;
00319 }
00320
00321 static void copy_attr_orig_counter_packets(struct nf_conntrack *dest,
00322 const struct nf_conntrack *orig)
00323 {
00324 dest->counters[__DIR_ORIG].packets = orig->counters[__DIR_ORIG].packets;
00325 }
00326
00327 static void copy_attr_repl_counter_packets(struct nf_conntrack *dest,
00328 const struct nf_conntrack *orig)
00329 {
00330 dest->counters[__DIR_REPL].packets = orig->counters[__DIR_REPL].packets;
00331 }
00332
00333 static void copy_attr_orig_counter_bytes(struct nf_conntrack *dest,
00334 const struct nf_conntrack *orig)
00335 {
00336 dest->counters[__DIR_ORIG].bytes = orig->counters[__DIR_ORIG].bytes;
00337 }
00338
00339 static void copy_attr_repl_counter_bytes(struct nf_conntrack *dest,
00340 const struct nf_conntrack *orig)
00341 {
00342 dest->counters[__DIR_REPL].bytes = orig->counters[__DIR_REPL].bytes;
00343 }
00344
00345 static void copy_attr_status(struct nf_conntrack *dest,
00346 const struct nf_conntrack *orig)
00347 {
00348 dest->status = orig->status;
00349 }
00350
00351 static void copy_attr_use(struct nf_conntrack *dest,
00352 const struct nf_conntrack *orig)
00353 {
00354 dest->use = orig->use;
00355 }
00356
00357 static void copy_attr_id(struct nf_conntrack *dest,
00358 const struct nf_conntrack *orig)
00359 {
00360 dest->id = orig->id;
00361 }
00362
00363 static void copy_attr_orig_cor_pos(struct nf_conntrack *dest,
00364 const struct nf_conntrack *orig)
00365 {
00366 dest->tuple[__DIR_ORIG].natseq.correction_pos =
00367 orig->tuple[__DIR_ORIG].natseq.correction_pos;
00368 }
00369
00370 static void copy_attr_orig_off_bfr(struct nf_conntrack *dest,
00371 const struct nf_conntrack *orig)
00372 {
00373 dest->tuple[__DIR_ORIG].natseq.offset_before =
00374 orig->tuple[__DIR_ORIG].natseq.offset_before;
00375 }
00376
00377 static void copy_attr_orig_off_aft(struct nf_conntrack *dest,
00378 const struct nf_conntrack *orig)
00379 {
00380 dest->tuple[__DIR_ORIG].natseq.offset_after =
00381 orig->tuple[__DIR_ORIG].natseq.offset_after;
00382 }
00383
00384 static void copy_attr_repl_cor_pos(struct nf_conntrack *dest,
00385 const struct nf_conntrack *orig)
00386 {
00387 dest->tuple[__DIR_REPL].natseq.correction_pos =
00388 orig->tuple[__DIR_REPL].natseq.correction_pos;
00389 }
00390
00391 static void copy_attr_repl_off_bfr(struct nf_conntrack *dest,
00392 const struct nf_conntrack *orig)
00393 {
00394 dest->tuple[__DIR_REPL].natseq.offset_before =
00395 orig->tuple[__DIR_REPL].natseq.offset_before;
00396 }
00397
00398 static void copy_attr_repl_off_aft(struct nf_conntrack *dest,
00399 const struct nf_conntrack *orig)
00400 {
00401 dest->tuple[__DIR_REPL].natseq.offset_after =
00402 orig->tuple[__DIR_REPL].natseq.offset_after;
00403 }
00404
00405 static void copy_attr_helper_name(struct nf_conntrack *dest,
00406 const struct nf_conntrack *orig)
00407 {
00408 strncpy(dest->helper_name, orig->helper_name, __NFCT_HELPER_NAMELEN);
00409 dest->helper_name[__NFCT_HELPER_NAMELEN-1] = '\0';
00410 }
00411
00412 static void copy_attr_zone(struct nf_conntrack *dest,
00413 const struct nf_conntrack *orig)
00414 {
00415 dest->zone = orig->zone;
00416 }
00417
00418 static void copy_attr_secctx(struct nf_conntrack *dest,
00419 const struct nf_conntrack *orig)
00420 {
00421 if (dest->secctx)
00422 free(dest->secctx);
00423 dest->secctx = strdup(orig->secctx);
00424 }
00425
00426 const copy_attr copy_attr_array[ATTR_MAX] = {
00427 [ATTR_ORIG_IPV4_SRC] = copy_attr_orig_ipv4_src,
00428 [ATTR_ORIG_IPV4_DST] = copy_attr_orig_ipv4_dst,
00429 [ATTR_REPL_IPV4_SRC] = copy_attr_repl_ipv4_src,
00430 [ATTR_REPL_IPV4_DST] = copy_attr_repl_ipv4_dst,
00431 [ATTR_ORIG_IPV6_SRC] = copy_attr_orig_ipv6_src,
00432 [ATTR_ORIG_IPV6_DST] = copy_attr_orig_ipv6_dst,
00433 [ATTR_REPL_IPV6_SRC] = copy_attr_repl_ipv6_src,
00434 [ATTR_REPL_IPV6_DST] = copy_attr_repl_ipv6_dst,
00435 [ATTR_ORIG_PORT_SRC] = copy_attr_orig_port_src,
00436 [ATTR_ORIG_PORT_DST] = copy_attr_orig_port_dst,
00437 [ATTR_REPL_PORT_SRC] = copy_attr_repl_port_src,
00438 [ATTR_REPL_PORT_DST] = copy_attr_repl_port_dst,
00439 [ATTR_ICMP_TYPE] = copy_attr_icmp_type,
00440 [ATTR_ICMP_CODE] = copy_attr_icmp_code,
00441 [ATTR_ICMP_ID] = copy_attr_icmp_id,
00442 [ATTR_ORIG_L3PROTO] = copy_attr_orig_l3proto,
00443 [ATTR_REPL_L3PROTO] = copy_attr_repl_l3proto,
00444 [ATTR_ORIG_L4PROTO] = copy_attr_orig_l4proto,
00445 [ATTR_REPL_L4PROTO] = copy_attr_repl_l4proto,
00446 [ATTR_TCP_STATE] = copy_attr_tcp_state,
00447 [ATTR_SNAT_IPV4] = copy_attr_snat_ipv4,
00448 [ATTR_DNAT_IPV4] = copy_attr_dnat_ipv4,
00449 [ATTR_SNAT_PORT] = copy_attr_snat_port,
00450 [ATTR_DNAT_PORT] = copy_attr_dnat_port,
00451 [ATTR_TIMEOUT] = copy_attr_timeout,
00452 [ATTR_MARK] = copy_attr_mark,
00453 [ATTR_ORIG_COUNTER_PACKETS] = copy_attr_orig_counter_packets,
00454 [ATTR_ORIG_COUNTER_BYTES] = copy_attr_orig_counter_bytes,
00455 [ATTR_REPL_COUNTER_PACKETS] = copy_attr_repl_counter_packets,
00456 [ATTR_REPL_COUNTER_BYTES] = copy_attr_repl_counter_bytes,
00457 [ATTR_USE] = copy_attr_use,
00458 [ATTR_ID] = copy_attr_id,
00459 [ATTR_STATUS] = copy_attr_status,
00460 [ATTR_TCP_FLAGS_ORIG] = copy_attr_tcp_flags_orig,
00461 [ATTR_TCP_FLAGS_REPL] = copy_attr_tcp_flags_repl,
00462 [ATTR_TCP_MASK_ORIG] = copy_attr_tcp_mask_orig,
00463 [ATTR_TCP_MASK_REPL] = copy_attr_tcp_mask_repl,
00464 [ATTR_MASTER_IPV4_SRC] = copy_attr_master_ipv4_src,
00465 [ATTR_MASTER_IPV4_DST] = copy_attr_master_ipv4_dst,
00466 [ATTR_MASTER_IPV6_SRC] = copy_attr_master_ipv6_src,
00467 [ATTR_MASTER_IPV6_DST] = copy_attr_master_ipv6_dst,
00468 [ATTR_MASTER_PORT_SRC] = copy_attr_master_port_src,
00469 [ATTR_MASTER_PORT_DST] = copy_attr_master_port_dst,
00470 [ATTR_MASTER_L3PROTO] = copy_attr_master_l3proto,
00471 [ATTR_MASTER_L4PROTO] = copy_attr_master_l4proto,
00472 [ATTR_SECMARK] = copy_attr_secmark,
00473 [ATTR_ORIG_NAT_SEQ_CORRECTION_POS] = copy_attr_orig_cor_pos,
00474 [ATTR_ORIG_NAT_SEQ_OFFSET_BEFORE] = copy_attr_orig_off_bfr,
00475 [ATTR_ORIG_NAT_SEQ_OFFSET_AFTER] = copy_attr_orig_off_aft,
00476 [ATTR_REPL_NAT_SEQ_CORRECTION_POS] = copy_attr_repl_cor_pos,
00477 [ATTR_REPL_NAT_SEQ_OFFSET_BEFORE] = copy_attr_repl_off_bfr,
00478 [ATTR_REPL_NAT_SEQ_OFFSET_AFTER] = copy_attr_repl_off_aft,
00479 [ATTR_SCTP_STATE] = copy_attr_sctp_state,
00480 [ATTR_SCTP_VTAG_ORIG] = copy_attr_sctp_vtag_orig,
00481 [ATTR_SCTP_VTAG_REPL] = copy_attr_sctp_vtag_repl,
00482 [ATTR_HELPER_NAME] = copy_attr_helper_name,
00483 [ATTR_DCCP_STATE] = copy_attr_dccp_state,
00484 [ATTR_DCCP_ROLE] = copy_attr_dccp_role,
00485 [ATTR_DCCP_HANDSHAKE_SEQ] = copy_attr_dccp_handshake_seq,
00486 [ATTR_TCP_WSCALE_ORIG] = copy_attr_tcp_wscale_orig,
00487 [ATTR_TCP_WSCALE_REPL] = copy_attr_tcp_wscale_repl,
00488 [ATTR_ZONE] = copy_attr_zone,
00489 [ATTR_SECCTX] = copy_attr_secctx,
00490 };