1 /* $NetBSD: ip_fil_compat.c,v 1.4 2014/03/20 20:43:12 christos Exp $ */ 2 3 /* 4 * Copyright (C) 2002-2012 by Darren Reed. 5 * 6 * See the IPFILTER.LICENCE file for details on licencing. 7 */ 8 #if defined(KERNEL) || defined(_KERNEL) 9 # undef KERNEL 10 # undef _KERNEL 11 # define KERNEL 1 12 # define _KERNEL 1 13 #endif 14 #if defined(__osf__) 15 # define _PROTO_NET_H_ 16 #endif 17 #include <sys/param.h> 18 #include <sys/errno.h> 19 #include <sys/types.h> 20 #include <sys/time.h> 21 #include <sys/file.h> 22 #if __FreeBSD_version >= 220000 && defined(_KERNEL) 23 # include <sys/fcntl.h> 24 # include <sys/filio.h> 25 #else 26 # include <sys/ioctl.h> 27 #endif 28 #if !defined(_KERNEL) 29 # include <string.h> 30 # define _KERNEL 31 # ifdef __OpenBSD__ 32 struct file; 33 # endif 34 # include <sys/uio.h> 35 # undef _KERNEL 36 #endif 37 #include <sys/socket.h> 38 #if (defined(__osf__) || defined(AIX) || defined(__hpux) || defined(__sgi)) && defined(_KERNEL) 39 # include "radix_ipf_local.h" 40 # define _RADIX_H_ 41 #endif 42 #include <net/if.h> 43 #if defined(__FreeBSD__) 44 # include <sys/cdefs.h> 45 # include <sys/proc.h> 46 #endif 47 #if defined(_KERNEL) 48 # include <sys/systm.h> 49 # if !defined(__SVR4) && !defined(__svr4__) 50 # include <sys/mbuf.h> 51 # endif 52 #endif 53 #include <netinet/in.h> 54 55 #include "netinet/ip_compat.h" 56 #include "netinet/ip_fil.h" 57 #include "netinet/ip_pool.h" 58 #include "netinet/ip_htable.h" 59 #include "netinet/ip_lookup.h" 60 #include "netinet/ip_nat.h" 61 #include "netinet/ip_state.h" 62 #include "netinet/ip_proxy.h" 63 #include "netinet/ip_auth.h" 64 /* END OF INCLUDES */ 65 66 /* 67 * NetBSD has moved to 64bit time_t for all architectures. 68 * For some, such as sparc64, there is no change because long is already 69 * 64bit, but for others (i386), there is... 70 */ 71 #ifdef IPFILTER_COMPAT 72 73 # ifdef __NetBSD__ 74 typedef struct timeval_l { 75 long tv_sec; 76 long tv_usec; 77 } timeval_l_t; 78 # endif 79 80 /* ------------------------------------------------------------------------ */ 81 82 typedef struct tcpinfo4 { 83 u_short ts_sport; 84 u_short ts_dport; 85 tcpdata_t ts_data[2]; 86 } tcpinfo4_t; 87 88 static void ipf_v5tcpinfoto4(tcpinfo_t *, tcpinfo4_t *); 89 90 static void ipf_v5tcpinfoto4(tcpinfo_t *, tcpinfo4_t *); 91 92 static void 93 ipf_v5tcpinfoto4(tcpinfo_t *v5, tcpinfo4_t *v4) 94 { 95 v4->ts_sport = v5->ts_sport; 96 v4->ts_dport = v5->ts_dport; 97 v4->ts_data[0] = v5->ts_data[0]; 98 v4->ts_data[1] = v5->ts_data[1]; 99 } 100 101 typedef struct fr_ip4 { 102 u_32_t fi_v:4; 103 u_32_t fi_xx:4; 104 u_32_t fi_tos:8; 105 u_32_t fi_ttl:8; 106 u_32_t fi_p:8; 107 u_32_t fi_optmsk; 108 i6addr_t fi_src; 109 i6addr_t fi_dst; 110 u_short ofi_secmsk; 111 u_short ofi_auth; 112 u_32_t fi_flx; 113 u_32_t fi_tcpmsk; 114 u_32_t fi_res1; 115 } frip4_t; 116 117 typedef struct frpcmp4 { 118 int frp_cmp; 119 u_short frp_port; 120 u_short frp_top; 121 } frpcmp4_t; 122 123 typedef struct frtuc4 { 124 u_char ftu_tcpfm; 125 u_char ftu_tcpf; 126 frpcmp4_t ftu_src; 127 frpcmp4_t ftu_dst; 128 } frtuc4_t; 129 130 typedef struct fripf4 { 131 frip4_t fri_ip; 132 frip4_t fri_mip; 133 134 u_short fri_icmpm; 135 u_short fri_icmp; 136 137 frtuc4_t fri_tuc; 138 int fri_satype; 139 int fri_datype; 140 int fri_sifpidx; 141 int fri_difpidx; 142 } fripf4_t; 143 144 typedef struct frdest_4 { 145 void *fd_ifp; 146 i6addr_t ofd_ip6; 147 char fd_ifname[LIFNAMSIZ]; 148 } frdest_4_t; 149 150 /* ------------------------------------------------------------------------ */ 151 152 /* 5.1.0 new release (current) 153 * 4.1.34 changed the size of the time structure used for pps 154 * 4.1.16 moved the location of fr_flineno 155 * 4.1.0 base version 156 */ 157 typedef struct frentry_4_1_34 { 158 ipfmutex_t fr_lock; 159 struct frentry *fr_next; 160 struct frentry **fr_grp; 161 struct ipscan *fr_isc; 162 void *fr_ifas[4]; 163 void *fr_ptr; /* for use with fr_arg */ 164 char *fr_comment; /* text comment for rule */ 165 int fr_ref; /* reference count - for grouping */ 166 int fr_statecnt; /* state count - for limit rules */ 167 int fr_flineno; /* line number from conf file */ 168 U_QUAD_T fr_hits; 169 U_QUAD_T fr_bytes; 170 union { 171 struct timeval frp_lastpkt; 172 char frp_bytes[12]; 173 } fr_lpu; 174 int fr_curpps; 175 union { 176 void *fru_data; 177 char *fru_caddr; 178 fripf4_t *fru_ipf; 179 frentfunc_t fru_func; 180 } fr_dun; 181 ipfunc_t fr_func; /* call this function */ 182 int fr_dsize; 183 int fr_pps; 184 int fr_statemax; /* max reference count */ 185 u_32_t fr_type; 186 u_32_t fr_flags; /* per-rule flags && options (see below) */ 187 u_32_t fr_logtag; /* user defined log tag # */ 188 u_32_t fr_collect; /* collection number */ 189 u_int fr_arg; /* misc. numeric arg for rule */ 190 u_int fr_loglevel; /* syslog log facility + priority */ 191 u_int fr_age[2]; /* non-TCP timeouts */ 192 u_char fr_v; 193 u_char fr_icode; /* return ICMP code */ 194 char fr_group[FR_GROUPLEN]; /* group to which this rule belongs */ 195 char fr_grhead[FR_GROUPLEN]; /* group # which this rule starts */ 196 ipftag_t fr_nattag; 197 char fr_ifnames[4][LIFNAMSIZ]; 198 char fr_isctag[16]; 199 frdest_4_t fr_tifs[2]; /* "to"/"reply-to" interface */ 200 frdest_4_t fr_dif; /* duplicate packet interface */ 201 u_int fr_cksum; /* checksum on filter rules for performance */ 202 } frentry_4_1_34_t; 203 204 typedef struct frentry_4_1_16 { 205 ipfmutex_t fr_lock; 206 struct frentry *fr_next; 207 struct frentry **fr_grp; 208 struct ipscan *fr_isc; 209 void *fr_ifas[4]; 210 void *fr_ptr; 211 char *fr_comment; 212 int fr_ref; 213 int fr_statecnt; 214 int fr_flineno; 215 U_QUAD_T fr_hits; 216 U_QUAD_T fr_bytes; 217 union { 218 #ifdef __NetBSD__ 219 timeval_l_t frp_lastpkt; 220 #else 221 struct timeval frp_lastpkt; 222 #endif 223 } fr_lpu; 224 int fr_curpps; 225 union { 226 void *fru_data; 227 char *fru_caddr; 228 fripf4_t *fru_ipf; 229 frentfunc_t fru_func; 230 } fr_dun; 231 ipfunc_t fr_func; 232 int fr_dsize; 233 int fr_pps; 234 int fr_statemax; 235 u_32_t fr_type; 236 u_32_t fr_flags; 237 u_32_t fr_logtag; 238 u_32_t fr_collect; 239 u_int fr_arg; 240 u_int fr_loglevel; 241 u_int fr_age[2]; 242 u_char fr_v; 243 u_char fr_icode; 244 char fr_group[FR_GROUPLEN]; 245 char fr_grhead[FR_GROUPLEN]; 246 ipftag_t fr_nattag; 247 char fr_ifnames[4][LIFNAMSIZ]; 248 char fr_isctag[16]; 249 frdest_4_t fr_tifs[2]; 250 frdest_4_t fr_dif; 251 u_int fr_cksum; 252 } frentry_4_1_16_t; 253 254 typedef struct frentry_4_1_0 { 255 ipfmutex_t fr_lock; 256 struct frentry *fr_next; 257 struct frentry **fr_grp; 258 struct ipscan *fr_isc; 259 void *fr_ifas[4]; 260 void *fr_ptr; 261 char *fr_comment; 262 int fr_ref; 263 int fr_statecnt; 264 U_QUAD_T fr_hits; 265 U_QUAD_T fr_bytes; 266 union { 267 #ifdef __NetBSD__ 268 timeval_l_t frp_lastpkt; 269 #else 270 struct timeval frp_lastpkt; 271 #endif 272 } fr_lpu; 273 int fr_curpps; 274 275 union { 276 void *fru_data; 277 char *fru_caddr; 278 fripf4_t *fru_ipf; 279 frentfunc_t fru_func; 280 } fr_dun; 281 /* 282 * Fields after this may not change whilst in the kernel. 283 */ 284 ipfunc_t fr_func; 285 int fr_dsize; 286 int fr_pps; 287 int fr_statemax; 288 int fr_flineno; 289 u_32_t fr_type; 290 u_32_t fr_flags; 291 u_32_t fr_logtag; 292 u_32_t fr_collect; 293 u_int fr_arg; 294 u_int fr_loglevel; 295 u_int fr_age[2]; 296 u_char fr_v; 297 u_char fr_icode; 298 char fr_group[FR_GROUPLEN]; 299 char fr_grhead[FR_GROUPLEN]; 300 ipftag_t fr_nattag; 301 char fr_ifnames[4][LIFNAMSIZ]; 302 char fr_isctag[16]; 303 frdest_4_t fr_tifs[2]; 304 frdest_4_t fr_dif; 305 u_int fr_cksum; 306 } frentry_4_1_0_t; 307 308 /* ------------------------------------------------------------------------ */ 309 310 /* 311 * 5.1.0 new release (current) 312 * 4.1.32 removed both fin_state and fin_nat, added fin_pktnum 313 * 4.1.24 added fin_cksum 314 * 4.1.23 added fin_exthdr 315 * 4.1.11 added fin_ifname 316 * 4.1.4 added fin_hbuf 317 */ 318 typedef struct fr_info_4_1_32 { 319 void *fin_ifp; /* interface packet is `on' */ 320 frip4_t fin_fi; /* IP Packet summary */ 321 union { 322 u_short fid_16[2]; /* TCP/UDP ports, ICMP code/type */ 323 u_32_t fid_32; 324 } fin_dat; 325 int fin_out; /* in or out ? 1 == out, 0 == in */ 326 int fin_rev; /* state only: 1 = reverse */ 327 u_short fin_hlen; /* length of IP header in bytes */ 328 u_char ofin_tcpf; /* TCP header flags (SYN, ACK, etc) */ 329 u_char fin_icode; /* ICMP error to return */ 330 u_32_t fin_rule; /* rule # last matched */ 331 char fin_group[FR_GROUPLEN]; /* group number, -1 for none */ 332 struct frentry *fin_fr; /* last matching rule */ 333 void *fin_dp; /* start of data past IP header */ 334 int fin_dlen; /* length of data portion of packet */ 335 int fin_plen; 336 int fin_ipoff; /* # bytes from buffer start to hdr */ 337 u_short fin_id; /* IP packet id field */ 338 u_short fin_off; 339 int fin_depth; /* Group nesting depth */ 340 int fin_error; /* Error code to return */ 341 int fin_cksum; /* -1 bad, 1 good, 0 not done */ 342 u_int fin_pktnum; 343 void *fin_nattag; 344 void *fin_exthdr; 345 ip_t *ofin_ip; 346 mb_t **fin_mp; /* pointer to pointer to mbuf */ 347 mb_t *fin_m; /* pointer to mbuf */ 348 #ifdef MENTAT 349 mb_t *fin_qfm; /* pointer to mblk where pkt starts */ 350 void *fin_qpi; 351 char fin_ifname[LIFNAMSIZ]; 352 #endif 353 #ifdef __sgi 354 void *fin_hbuf; 355 #endif 356 } fr_info_4_1_32_t; 357 358 typedef struct fr_info_4_1_24 { 359 void *fin_ifp; 360 frip4_t fin_fi; 361 union { 362 u_short fid_16[2]; 363 u_32_t fid_32; 364 } fin_dat; 365 int fin_out; 366 int fin_rev; 367 u_short fin_hlen; 368 u_char ofin_tcpf; 369 u_char fin_icode; 370 u_32_t fin_rule; 371 char fin_group[FR_GROUPLEN]; 372 struct frentry *fin_fr; 373 void *fin_dp; 374 int fin_dlen; 375 int fin_plen; 376 int fin_ipoff; 377 u_short fin_id; 378 u_short fin_off; 379 int fin_depth; 380 int fin_error; 381 int fin_cksum; 382 void *fin_state; 383 void *fin_nat; 384 void *fin_nattag; 385 void *fin_exthdr; 386 ip_t *ofin_ip; 387 mb_t **fin_mp; 388 mb_t *fin_m; 389 #ifdef MENTAT 390 mb_t *fin_qfm; 391 void *fin_qpi; 392 char fin_ifname[LIFNAMSIZ]; 393 #endif 394 #ifdef __sgi 395 void *fin_hbuf; 396 #endif 397 } fr_info_4_1_24_t; 398 399 typedef struct fr_info_4_1_23 { 400 void *fin_ifp; 401 frip4_t fin_fi; 402 union { 403 u_short fid_16[2]; 404 u_32_t fid_32; 405 } fin_dat; 406 int fin_out; 407 int fin_rev; 408 u_short fin_hlen; 409 u_char ofin_tcpf; 410 u_char fin_icode; 411 u_32_t fin_rule; 412 char fin_group[FR_GROUPLEN]; 413 struct frentry *fin_fr; 414 void *fin_dp; 415 int fin_dlen; 416 int fin_plen; 417 int fin_ipoff; 418 u_short fin_id; 419 u_short fin_off; 420 int fin_depth; 421 int fin_error; 422 void *fin_state; 423 void *fin_nat; 424 void *fin_nattag; 425 void *fin_exthdr; 426 ip_t *ofin_ip; 427 mb_t **fin_mp; 428 mb_t *fin_m; 429 #ifdef MENTAT 430 mb_t *fin_qfm; 431 void *fin_qpi; 432 char fin_ifname[LIFNAMSIZ]; 433 #endif 434 #ifdef __sgi 435 void *fin_hbuf; 436 #endif 437 } fr_info_4_1_23_t; 438 439 typedef struct fr_info_4_1_11 { 440 void *fin_ifp; 441 frip4_t fin_fi; 442 union { 443 u_short fid_16[2]; 444 u_32_t fid_32; 445 } fin_dat; 446 int fin_out; 447 int fin_rev; 448 u_short fin_hlen; 449 u_char ofin_tcpf; 450 u_char fin_icode; 451 u_32_t fin_rule; 452 char fin_group[FR_GROUPLEN]; 453 struct frentry *fin_fr; 454 void *fin_dp; 455 int fin_dlen; 456 int fin_plen; 457 int fin_ipoff; 458 u_short fin_id; 459 u_short fin_off; 460 int fin_depth; 461 int fin_error; 462 void *fin_state; 463 void *fin_nat; 464 void *fin_nattag; 465 ip_t *ofin_ip; 466 mb_t **fin_mp; 467 mb_t *fin_m; 468 #ifdef MENTAT 469 mb_t *fin_qfm; 470 void *fin_qpi; 471 char fin_ifname[LIFNAMSIZ]; 472 #endif 473 #ifdef __sgi 474 void *fin_hbuf; 475 #endif 476 } fr_info_4_1_11_t; 477 478 /* ------------------------------------------------------------------------ */ 479 480 typedef struct filterstats_4_1 { 481 u_long fr_pass; /* packets allowed */ 482 u_long fr_block; /* packets denied */ 483 u_long fr_nom; /* packets which don't match any rule */ 484 u_long fr_short; /* packets which are short */ 485 u_long fr_ppkl; /* packets allowed and logged */ 486 u_long fr_bpkl; /* packets denied and logged */ 487 u_long fr_npkl; /* packets unmatched and logged */ 488 u_long fr_pkl; /* packets logged */ 489 u_long fr_skip; /* packets to be logged but buffer full */ 490 u_long fr_ret; /* packets for which a return is sent */ 491 u_long fr_acct; /* packets for which counting was performed */ 492 u_long fr_bnfr; /* bad attempts to allocate fragment state */ 493 u_long fr_nfr; /* new fragment state kept */ 494 u_long fr_cfr; /* add new fragment state but complete pkt */ 495 u_long fr_bads; /* bad attempts to allocate packet state */ 496 u_long fr_ads; /* new packet state kept */ 497 u_long fr_chit; /* cached hit */ 498 u_long fr_tcpbad; /* TCP checksum check failures */ 499 u_long fr_pull[2]; /* good and bad pullup attempts */ 500 u_long fr_badsrc; /* source received doesn't match route */ 501 u_long fr_badttl; /* TTL in packet doesn't reach minimum */ 502 u_long fr_bad; /* bad IP packets to the filter */ 503 u_long fr_ipv6; /* IPv6 packets in/out */ 504 u_long fr_ppshit; /* dropped because of pps ceiling */ 505 u_long fr_ipud; /* IP id update failures */ 506 } filterstats_4_1_t; 507 508 /* 509 * 5.1.0 new release (current) 510 * 4.1.33 changed the size of f_locks from IPL_LOGMAX to IPL_LOGSIZE 511 */ 512 typedef struct friostat_4_1_33 { 513 struct filterstats_4_1 of_st[2]; 514 struct frentry *f_ipf[2][2]; 515 struct frentry *f_acct[2][2]; 516 struct frentry *f_ipf6[2][2]; 517 struct frentry *f_acct6[2][2]; 518 struct frentry *f_auth; 519 struct frgroup *f_groups[IPL_LOGSIZE][2]; 520 u_long f_froute[2]; 521 u_long f_ticks; 522 int f_locks[IPL_LOGSIZE]; 523 size_t f_kmutex_sz; 524 size_t f_krwlock_sz; 525 int f_defpass; /* default pass - from fr_pass */ 526 int f_active; /* 1 or 0 - active rule set */ 527 int f_running; /* 1 if running, else 0 */ 528 int f_logging; /* 1 if enabled, else 0 */ 529 int f_features; 530 char f_version[32]; /* version string */ 531 } friostat_4_1_33_t; 532 533 typedef struct friostat_4_1_0 { 534 struct filterstats_4_1 of_st[2]; 535 struct frentry *f_ipf[2][2]; 536 struct frentry *f_acct[2][2]; 537 struct frentry *f_ipf6[2][2]; 538 struct frentry *f_acct6[2][2]; 539 struct frentry *f_auth; 540 struct frgroup *f_groups[IPL_LOGSIZE][2]; 541 u_long f_froute[2]; 542 u_long f_ticks; 543 int f_locks[IPL_LOGMAX]; 544 size_t f_kmutex_sz; 545 size_t f_krwlock_sz; 546 int f_defpass; 547 int f_active; 548 int f_running; 549 int f_logging; 550 int f_features; 551 char f_version[32]; 552 } friostat_4_1_0_t; 553 554 /* ------------------------------------------------------------------------ */ 555 556 /* 557 * 5.1.0 new release (current) 558 * 4.1.14 added in_lock 559 */ 560 typedef struct ipnat_4_1_14 { 561 ipfmutex_t in_lock; 562 struct ipnat *in_next; /* NAT rule list next */ 563 struct ipnat *in_rnext; /* rdr rule hash next */ 564 struct ipnat **in_prnext; /* prior rdr next ptr */ 565 struct ipnat *in_mnext; /* map rule hash next */ 566 struct ipnat **in_pmnext; /* prior map next ptr */ 567 struct ipftq *in_tqehead[2]; 568 void *in_ifps[2]; 569 void *in_apr; 570 char *in_comment; 571 i6addr_t in_next6; 572 u_long in_space; 573 u_long in_hits; 574 u_int in_use; 575 u_int in_hv; 576 int in_flineno; /* conf. file line number */ 577 u_short in_pnext; 578 u_char in_v; 579 u_char in_xxx; 580 /* From here to the end is covered by IPN_CMPSIZ */ 581 u_32_t in_flags; 582 u_32_t in_mssclamp; /* if != 0 clamp MSS to this */ 583 u_int in_age[2]; 584 int in_redir; /* see below for values */ 585 int in_p; /* protocol. */ 586 i6addr_t in_in[2]; 587 i6addr_t in_out[2]; 588 i6addr_t in_src[2]; 589 frtuc4_t in_tuc; 590 u_short in_port[2]; 591 u_short in_ppip; /* ports per IP. */ 592 u_short in_ippip; /* IP #'s per IP# */ 593 char in_ifnames[2][LIFNAMSIZ]; 594 char in_plabel[APR_LABELLEN]; /* proxy label. */ 595 ipftag_t in_tag; 596 } ipnat_4_1_14_t; 597 598 typedef struct ipnat_4_1_0 { 599 struct ipnat *in_next; 600 struct ipnat *in_rnext; 601 struct ipnat **in_prnext; 602 struct ipnat *in_mnext; 603 struct ipnat **in_pmnext; 604 struct ipftq *in_tqehead[2]; 605 void *in_ifps[2]; 606 void *in_apr; 607 char *in_comment; 608 i6addr_t in_next6; 609 u_long in_space; 610 u_long in_hits; 611 u_int in_use; 612 u_int in_hv; 613 int in_flineno; 614 u_short in_pnext; 615 u_char in_v; 616 u_char in_xxx; 617 u_32_t in_flags; 618 u_32_t in_mssclamp; 619 u_int in_age[2]; 620 int in_redir; 621 int in_p; 622 i6addr_t in_in[2]; 623 i6addr_t in_out[2]; 624 i6addr_t in_src[2]; 625 frtuc4_t in_tuc; 626 u_short in_port[2]; 627 u_short in_ppip; 628 u_short in_ippip; 629 char in_ifnames[2][LIFNAMSIZ]; 630 char in_plabel[APR_LABELLEN]; 631 ipftag_t in_tag; 632 } ipnat_4_1_0_t; 633 634 /* ------------------------------------------------------------------------ */ 635 636 typedef struct natlookup_4_1_1 { 637 struct in_addr onl_inip; 638 struct in_addr onl_outip; 639 struct in_addr onl_realip; 640 int nl_flags; 641 u_short nl_inport; 642 u_short nl_outport; 643 u_short nl_realport; 644 } natlookup_4_1_1_t; 645 646 /* ------------------------------------------------------------------------ */ 647 648 /* 649 * 4.1.25 added nat_seqnext (current) 650 * 4.1.14 added nat_redir 651 * 4.1.3 moved nat_rev 652 * 4.1.2 added nat_rev 653 */ 654 typedef struct nat_4_1_25 { 655 ipfmutex_t nat_lock; 656 struct nat_4_1_25 *nat_next; 657 struct nat_4_1_25 **nat_pnext; 658 struct nat_4_1_25 *nat_hnext[2]; 659 struct nat_4_1_25 **nat_phnext[2]; 660 struct hostmap *nat_hm; 661 void *nat_data; 662 struct nat_4_1_25 **nat_me; 663 struct ipstate *nat_state; 664 struct ap_session *nat_aps; 665 frentry_t *nat_fr; 666 struct ipnat_4_1_14 *nat_ptr; 667 void *nat_ifps[2]; 668 void *nat_sync; 669 ipftqent_t nat_tqe; 670 u_32_t nat_flags; 671 u_32_t nat_sumd[2]; 672 u_32_t nat_ipsumd; 673 u_32_t nat_mssclamp; 674 i6addr_t nat_inip6; 675 i6addr_t nat_outip6; 676 i6addr_t nat_oip6; 677 U_QUAD_T nat_pkts[2]; 678 U_QUAD_T nat_bytes[2]; 679 union { 680 udpinfo_t nat_unu; 681 tcpinfo4_t nat_unt; 682 icmpinfo_t nat_uni; 683 greinfo_t nat_ugre; 684 } nat_un; 685 u_short nat_oport; 686 u_short nat_use; 687 u_char nat_p; 688 int nat_dir; 689 int nat_ref; 690 int nat_hv[2]; 691 char nat_ifnames[2][LIFNAMSIZ]; 692 int nat_rev; 693 int nat_redir; 694 u_32_t nat_seqnext[2]; 695 } nat_4_1_25_t; 696 697 typedef struct nat_4_1_14 { 698 ipfmutex_t nat_lock; 699 struct nat *nat_next; 700 struct nat **nat_pnext; 701 struct nat *nat_hnext[2]; 702 struct nat **nat_phnext[2]; 703 struct hostmap *nat_hm; 704 void *nat_data; 705 struct nat **nat_me; 706 struct ipstate *nat_state; 707 struct ap_session *nat_aps; 708 frentry_t *nat_fr; 709 struct ipnat *nat_ptr; 710 void *nat_ifps[2]; 711 void *nat_sync; 712 ipftqent_t nat_tqe; 713 u_32_t nat_flags; 714 u_32_t nat_sumd[2]; 715 u_32_t nat_ipsumd; 716 u_32_t nat_mssclamp; 717 i6addr_t nat_inip6; 718 i6addr_t nat_outip6; 719 i6addr_t nat_oip6; 720 U_QUAD_T nat_pkts[2]; 721 U_QUAD_T nat_bytes[2]; 722 union { 723 udpinfo_t nat_unu; 724 tcpinfo4_t nat_unt; 725 icmpinfo_t nat_uni; 726 greinfo_t nat_ugre; 727 } nat_un; 728 u_short nat_oport; 729 u_short nat_use; 730 u_char nat_p; 731 int nat_dir; 732 int nat_ref; 733 int nat_hv[2]; 734 char nat_ifnames[2][LIFNAMSIZ]; 735 int nat_rev; 736 int nat_redir; 737 } nat_4_1_14_t; 738 739 typedef struct nat_4_1_3 { 740 ipfmutex_t nat_lock; 741 struct nat *nat_next; 742 struct nat **nat_pnext; 743 struct nat *nat_hnext[2]; 744 struct nat **nat_phnext[2]; 745 struct hostmap *nat_hm; 746 void *nat_data; 747 struct nat **nat_me; 748 struct ipstate *nat_state; 749 struct ap_session *nat_aps; 750 frentry_t *nat_fr; 751 struct ipnat *nat_ptr; 752 void *nat_ifps[2]; 753 void *nat_sync; 754 ipftqent_t nat_tqe; 755 u_32_t nat_flags; 756 u_32_t nat_sumd[2]; 757 u_32_t nat_ipsumd; 758 u_32_t nat_mssclamp; 759 i6addr_t nat_inip6; 760 i6addr_t nat_outip6; 761 i6addr_t nat_oip6; 762 U_QUAD_T nat_pkts[2]; 763 U_QUAD_T nat_bytes[2]; 764 union { 765 udpinfo_t nat_unu; 766 tcpinfo4_t nat_unt; 767 icmpinfo_t nat_uni; 768 greinfo_t nat_ugre; 769 } nat_un; 770 u_short nat_oport; 771 u_short nat_use; 772 u_char nat_p; 773 int nat_dir; 774 int nat_ref; 775 int nat_hv[2]; 776 char nat_ifnames[2][LIFNAMSIZ]; 777 int nat_rev; 778 } nat_4_1_3_t; 779 780 781 782 typedef struct nat_save_4_1_34 { 783 void *ipn_next; 784 struct nat_4_1_25 ipn_nat; 785 struct ipnat_4_1_14 ipn_ipnat; 786 struct frentry_4_1_34 ipn_fr; 787 int ipn_dsize; 788 char ipn_data[4]; 789 } nat_save_4_1_34_t; 790 791 typedef struct nat_save_4_1_16 { 792 void *ipn_next; 793 nat_4_1_14_t ipn_nat; 794 ipnat_t ipn_ipnat; 795 frentry_4_1_16_t ipn_fr; 796 int ipn_dsize; 797 char ipn_data[4]; 798 } nat_save_4_1_16_t; 799 800 typedef struct nat_save_4_1_14 { 801 void *ipn_next; 802 nat_4_1_14_t ipn_nat; 803 ipnat_t ipn_ipnat; 804 frentry_4_1_0_t ipn_fr; 805 int ipn_dsize; 806 char ipn_data[4]; 807 } nat_save_4_1_14_t; 808 809 typedef struct nat_save_4_1_3 { 810 void *ipn_next; 811 nat_4_1_3_t ipn_nat; 812 ipnat_4_1_0_t ipn_ipnat; 813 frentry_4_1_0_t ipn_fr; 814 int ipn_dsize; 815 char ipn_data[4]; 816 } nat_save_4_1_3_t; 817 818 /* ------------------------------------------------------------------------ */ 819 820 /* 821 * 5.1.0 new release (current) 822 * 4.1.32 added ns_uncreate 823 * 4.1.27 added ns_orphans 824 * 4.1.16 added ns_ticks 825 */ 826 typedef struct natstat_4_1_32 { 827 u_long ns_mapped[2]; 828 u_long ns_rules; 829 u_long ns_added; 830 u_long ns_expire; 831 u_long ns_inuse; 832 u_long ns_logged; 833 u_long ns_logfail; 834 u_long ns_memfail; 835 u_long ns_badnat; 836 u_long ns_addtrpnt; 837 nat_t **ns_table[2]; 838 hostmap_t **ns_maptable; 839 ipnat_t *ns_list; 840 void *ns_apslist; 841 u_int ns_wilds; 842 u_int ns_nattab_sz; 843 u_int ns_nattab_max; 844 u_int ns_rultab_sz; 845 u_int ns_rdrtab_sz; 846 u_int ns_trpntab_sz; 847 u_int ns_hostmap_sz; 848 nat_t *ns_instances; 849 hostmap_t *ns_maplist; 850 u_long *ns_bucketlen[2]; 851 u_long ns_ticks; 852 u_int ns_orphans; 853 u_long ns_uncreate[2][2]; 854 } natstat_4_1_32_t; 855 856 typedef struct natstat_4_1_27 { 857 u_long ns_mapped[2]; 858 u_long ns_rules; 859 u_long ns_added; 860 u_long ns_expire; 861 u_long ns_inuse; 862 u_long ns_logged; 863 u_long ns_logfail; 864 u_long ns_memfail; 865 u_long ns_badnat; 866 u_long ns_addtrpnt; 867 nat_t **ns_table[2]; 868 hostmap_t **ns_maptable; 869 ipnat_t *ns_list; 870 void *ns_apslist; 871 u_int ns_wilds; 872 u_int ns_nattab_sz; 873 u_int ns_nattab_max; 874 u_int ns_rultab_sz; 875 u_int ns_rdrtab_sz; 876 u_int ns_trpntab_sz; 877 u_int ns_hostmap_sz; 878 nat_t *ns_instances; 879 hostmap_t *ns_maplist; 880 u_long *ns_bucketlen[2]; 881 u_long ns_ticks; 882 u_int ns_orphans; 883 } natstat_4_1_27_t; 884 885 typedef struct natstat_4_1_16 { 886 u_long ns_mapped[2]; 887 u_long ns_rules; 888 u_long ns_added; 889 u_long ns_expire; 890 u_long ns_inuse; 891 u_long ns_logged; 892 u_long ns_logfail; 893 u_long ns_memfail; 894 u_long ns_badnat; 895 u_long ns_addtrpnt; 896 nat_t **ns_table[2]; 897 hostmap_t **ns_maptable; 898 ipnat_t *ns_list; 899 void *ns_apslist; 900 u_int ns_wilds; 901 u_int ns_nattab_sz; 902 u_int ns_nattab_max; 903 u_int ns_rultab_sz; 904 u_int ns_rdrtab_sz; 905 u_int ns_trpntab_sz; 906 u_int ns_hostmap_sz; 907 nat_t *ns_instances; 908 hostmap_t *ns_maplist; 909 u_long *ns_bucketlen[2]; 910 u_long ns_ticks; 911 } natstat_4_1_16_t; 912 913 typedef struct natstat_4_1_0 { 914 u_long ns_mapped[2]; 915 u_long ns_rules; 916 u_long ns_added; 917 u_long ns_expire; 918 u_long ns_inuse; 919 u_long ns_logged; 920 u_long ns_logfail; 921 u_long ns_memfail; 922 u_long ns_badnat; 923 u_long ns_addtrpnt; 924 nat_t **ns_table[2]; 925 hostmap_t **ns_maptable; 926 ipnat_t *ns_list; 927 void *ns_apslist; 928 u_int ns_wilds; 929 u_int ns_nattab_sz; 930 u_int ns_nattab_max; 931 u_int ns_rultab_sz; 932 u_int ns_rdrtab_sz; 933 u_int ns_trpntab_sz; 934 u_int ns_hostmap_sz; 935 nat_t *ns_instances; 936 hostmap_t *ns_maplist; 937 u_long *ns_bucketlen[2]; 938 } natstat_4_1_0_t; 939 940 /* ------------------------------------------------------------------------ */ 941 942 /* 943 * 5.1.0 new release (current) 944 * 4.1.32 fra_info:removed both fin_state & fin_nat, added fin_pktnum 945 * 4.1.29 added fra_flx 946 * 4.1.24 fra_info:added fin_cksum 947 * 4.1.23 fra_info:added fin_exthdr 948 * 4.1.11 fra_info:added fin_ifname 949 * 4.1.4 fra_info:added fin_hbuf 950 */ 951 952 typedef struct frauth_4_1_32 { 953 int fra_age; 954 int fra_len; 955 int fra_index; 956 u_32_t fra_pass; 957 fr_info_4_1_32_t fra_info; 958 char *fra_buf; 959 u_32_t fra_flx; 960 #ifdef MENTAT 961 queue_t *fra_q; 962 mb_t *fra_m; 963 #endif 964 } frauth_4_1_32_t; 965 966 typedef struct frauth_4_1_29 { 967 int fra_age; 968 int fra_len; 969 int fra_index; 970 u_32_t fra_pass; 971 fr_info_4_1_24_t fra_info; 972 char *fra_buf; 973 u_32_t fra_flx; 974 #ifdef MENTAT 975 queue_t *fra_q; 976 mb_t *fra_m; 977 #endif 978 } frauth_4_1_29_t; 979 980 typedef struct frauth_4_1_24 { 981 int fra_age; 982 int fra_len; 983 int fra_index; 984 u_32_t fra_pass; 985 fr_info_4_1_24_t fra_info; 986 char *fra_buf; 987 #ifdef MENTAT 988 queue_t *fra_q; 989 mb_t *fra_m; 990 #endif 991 } frauth_4_1_24_t; 992 993 typedef struct frauth_4_1_23 { 994 int fra_age; 995 int fra_len; 996 int fra_index; 997 u_32_t fra_pass; 998 fr_info_4_1_23_t fra_info; 999 char *fra_buf; 1000 #ifdef MENTAT 1001 queue_t *fra_q; 1002 mb_t *fra_m; 1003 #endif 1004 } frauth_4_1_23_t; 1005 1006 typedef struct frauth_4_1_11 { 1007 int fra_age; 1008 int fra_len; 1009 int fra_index; 1010 u_32_t fra_pass; 1011 fr_info_4_1_11_t fra_info; 1012 char *fra_buf; 1013 #ifdef MENTAT 1014 queue_t *fra_q; 1015 mb_t *fra_m; 1016 #endif 1017 } frauth_4_1_11_t; 1018 1019 /* ------------------------------------------------------------------------ */ 1020 1021 /* 1022 * 5.1.0 new release (current) 1023 * 4.1.16 removed is_nat 1024 */ 1025 typedef struct ipstate_4_1_16 { 1026 ipfmutex_t is_lock; 1027 struct ipstate *is_next; 1028 struct ipstate **is_pnext; 1029 struct ipstate *is_hnext; 1030 struct ipstate **is_phnext; 1031 struct ipstate **is_me; 1032 void *is_ifp[4]; 1033 void *is_sync; 1034 frentry_t *is_rule; 1035 struct ipftq *is_tqehead[2]; 1036 struct ipscan *is_isc; 1037 U_QUAD_T is_pkts[4]; 1038 U_QUAD_T is_bytes[4]; 1039 U_QUAD_T is_icmppkts[4]; 1040 struct ipftqent is_sti; 1041 u_int is_frage[2]; 1042 int is_ref; /* reference count */ 1043 int is_isninc[2]; 1044 u_short is_sumd[2]; 1045 i6addr_t is_src; 1046 i6addr_t is_dst; 1047 u_int is_pass; 1048 u_char is_p; /* Protocol */ 1049 u_char is_v; 1050 u_32_t is_hv; 1051 u_32_t is_tag; 1052 u_32_t is_opt[2]; /* packet options set */ 1053 u_32_t is_optmsk[2]; /* " " mask */ 1054 u_short is_sec; /* security options set */ 1055 u_short is_secmsk; /* " " mask */ 1056 u_short is_auth; /* authentication options set */ 1057 u_short is_authmsk; /* " " mask */ 1058 union { 1059 icmpinfo_t is_ics; 1060 tcpinfo4_t is_ts; 1061 udpinfo_t is_us; 1062 greinfo_t is_ug; 1063 } is_ps; 1064 u_32_t is_flags; 1065 int is_flx[2][2]; 1066 u_32_t is_rulen; /* rule number when created */ 1067 u_32_t is_s0[2]; 1068 u_short is_smsk[2]; 1069 char is_group[FR_GROUPLEN]; 1070 char is_sbuf[2][16]; 1071 char is_ifname[4][LIFNAMSIZ]; 1072 } ipstate_4_1_16_t; 1073 1074 typedef struct ipstate_4_1_0 { 1075 ipfmutex_t is_lock; 1076 struct ipstate *is_next; 1077 struct ipstate **is_pnext; 1078 struct ipstate *is_hnext; 1079 struct ipstate **is_phnext; 1080 struct ipstate **is_me; 1081 void *is_ifp[4]; 1082 void *is_sync; 1083 void *is_nat[2]; 1084 frentry_t *is_rule; 1085 struct ipftq *is_tqehead[2]; 1086 struct ipscan *is_isc; 1087 U_QUAD_T is_pkts[4]; 1088 U_QUAD_T is_bytes[4]; 1089 U_QUAD_T is_icmppkts[4]; 1090 struct ipftqent is_sti; 1091 u_int is_frage[2]; 1092 int is_ref; 1093 int is_isninc[2]; 1094 u_short is_sumd[2]; 1095 i6addr_t is_src; 1096 i6addr_t is_dst; 1097 u_int is_pass; 1098 u_char is_p; 1099 u_char is_v; 1100 u_32_t is_hv; 1101 u_32_t is_tag; 1102 u_32_t is_opt[2]; 1103 u_32_t is_optmsk[2]; 1104 u_short is_sec; 1105 u_short is_secmsk; 1106 u_short is_auth; 1107 u_short is_authmsk; 1108 union { 1109 icmpinfo_t is_ics; 1110 tcpinfo4_t is_ts; 1111 udpinfo_t is_us; 1112 greinfo_t is_ug; 1113 } is_ps; 1114 u_32_t is_flags; 1115 int is_flx[2][2]; 1116 u_32_t is_rulen; 1117 u_32_t is_s0[2]; 1118 u_short is_smsk[2]; 1119 char is_group[FR_GROUPLEN]; 1120 char is_sbuf[2][16]; 1121 char is_ifname[4][LIFNAMSIZ]; 1122 } ipstate_4_1_0_t; 1123 1124 typedef struct ipstate_save_4_1_34 { 1125 void *ips_next; 1126 struct ipstate_4_1_16 ips_is; 1127 struct frentry_4_1_34 ips_fr; 1128 } ipstate_save_4_1_34_t; 1129 1130 typedef struct ipstate_save_4_1_16 { 1131 void *ips_next; 1132 ipstate_4_1_0_t ips_is; 1133 frentry_4_1_16_t ips_fr; 1134 } ipstate_save_4_1_16_t; 1135 1136 typedef struct ipstate_save_4_1_0 { 1137 void *ips_next; 1138 ipstate_4_1_0_t ips_is; 1139 frentry_4_1_0_t ips_fr; 1140 } ipstate_save_4_1_0_t; 1141 1142 /* ------------------------------------------------------------------------ */ 1143 1144 /* 1145 * 5.1.0 new release (current) 1146 * 4.1.21 added iss_tcptab 1147 */ 1148 typedef struct ips_stat_4_1_21 { 1149 u_long iss_hits; 1150 u_long iss_miss; 1151 u_long iss_max; 1152 u_long iss_maxref; 1153 u_long iss_tcp; 1154 u_long iss_udp; 1155 u_long iss_icmp; 1156 u_long iss_nomem; 1157 u_long iss_expire; 1158 u_long iss_fin; 1159 u_long iss_active; 1160 u_long iss_logged; 1161 u_long iss_logfail; 1162 u_long iss_inuse; 1163 u_long iss_wild; 1164 u_long iss_killed; 1165 u_long iss_ticks; 1166 u_long iss_bucketfull; 1167 int iss_statesize; 1168 int iss_statemax; 1169 ipstate_t **iss_table; 1170 ipstate_t *iss_list; 1171 u_long *iss_bucketlen; 1172 ipftq_t *iss_tcptab; 1173 } ips_stat_4_1_21_t; 1174 1175 typedef struct ips_stat_4_1_0 { 1176 u_long iss_hits; 1177 u_long iss_miss; 1178 u_long iss_max; 1179 u_long iss_maxref; 1180 u_long iss_tcp; 1181 u_long iss_udp; 1182 u_long iss_icmp; 1183 u_long iss_nomem; 1184 u_long iss_expire; 1185 u_long iss_fin; 1186 u_long iss_active; 1187 u_long iss_logged; 1188 u_long iss_logfail; 1189 u_long iss_inuse; 1190 u_long iss_wild; 1191 u_long iss_killed; 1192 u_long iss_ticks; 1193 u_long iss_bucketfull; 1194 int iss_statesize; 1195 int iss_statemax; 1196 ipstate_t **iss_table; 1197 ipstate_t *iss_list; 1198 u_long *iss_bucketlen; 1199 } ips_stat_4_1_0_t; 1200 1201 /* ------------------------------------------------------------------------ */ 1202 static int ipf_addfrstr(char *, int, char *, int); 1203 static void ipf_v4iptov5(frip4_t *, fr_ip_t *); 1204 static void ipf_v5iptov4(fr_ip_t *, frip4_t *); 1205 static void ipfv4tuctov5(frtuc4_t *, frtuc_t *); 1206 static void ipfv5tuctov4(frtuc_t *, frtuc4_t *); 1207 static int ipf_v4fripftov5(fripf4_t *, char *); 1208 static void ipf_v5fripftov4(fripf_t *, fripf4_t *); 1209 static int fr_frflags4to5(u_32_t); 1210 static int fr_frflags5to4(u_32_t); 1211 1212 typedef struct ipfrstat_4_1_1 { 1213 u_long ifs_exists; /* add & already exists */ 1214 u_long ifs_nomem; 1215 u_long ifs_new; 1216 u_long ifs_hits; 1217 u_long ifs_expire; 1218 u_long ifs_inuse; 1219 u_long ifs_retrans0; 1220 u_long ifs_short; 1221 struct ipfr **ifs_table; 1222 struct ipfr **ifs_nattab; 1223 } ipfrstat_4_1_1_t; 1224 1225 /* ------------------------------------------------------------------------ */ 1226 static int ipf_addfrstr(char *, int, char *, int); 1227 static void ipf_v4iptov5(frip4_t *, fr_ip_t *); 1228 static void ipf_v5iptov4(fr_ip_t *, frip4_t *); 1229 static void ipfv4tuctov5(frtuc4_t *, frtuc_t *); 1230 static void ipfv5tuctov4(frtuc_t *, frtuc4_t *); 1231 static int ipf_v4fripftov5(fripf4_t *, char *); 1232 static void ipf_v5fripftov4(fripf_t *, fripf4_t *); 1233 static int fr_frflags4to5(u_32_t); 1234 static int fr_frflags5to4(u_32_t); 1235 1236 static void friostat_current_to_4_1_0(void *, friostat_4_1_0_t *, int); 1237 static void friostat_current_to_4_1_33(void *, friostat_4_1_33_t *, int); 1238 static void ipstate_current_to_4_1_0(void *, ipstate_4_1_0_t *); 1239 static void ipstate_current_to_4_1_16(void *, ipstate_4_1_16_t *); 1240 static void ipnat_current_to_4_1_0(void *, ipnat_4_1_0_t *); 1241 static void ipnat_current_to_4_1_14(void *, ipnat_4_1_14_t *); 1242 static void frauth_current_to_4_1_11(void *, frauth_4_1_11_t *); 1243 static void frauth_current_to_4_1_23(void *, frauth_4_1_23_t *); 1244 static void frauth_current_to_4_1_24(void *, frauth_4_1_24_t *); 1245 static void frauth_current_to_4_1_29(void *, frauth_4_1_29_t *); 1246 static void frentry_current_to_4_1_0(void *, frentry_4_1_0_t *); 1247 static void frentry_current_to_4_1_16(void *, frentry_4_1_16_t *); 1248 static void frentry_current_to_4_1_34(void *, frentry_4_1_34_t *); 1249 static void fr_info_current_to_4_1_11(void *, fr_info_4_1_11_t *); 1250 static void fr_info_current_to_4_1_23(void *, fr_info_4_1_23_t *); 1251 static void fr_info_current_to_4_1_24(void *, fr_info_4_1_24_t *); 1252 static void nat_save_current_to_4_1_3(void *, nat_save_4_1_3_t *); 1253 static void nat_save_current_to_4_1_14(void *, nat_save_4_1_14_t *); 1254 static void nat_save_current_to_4_1_16(void *, nat_save_4_1_16_t *); 1255 static void ipstate_save_current_to_4_1_0(void *, ipstate_save_4_1_0_t *); 1256 static void ipstate_save_current_to_4_1_16(void *, ipstate_save_4_1_16_t *); 1257 static void ips_stat_current_to_4_1_0(void *, ips_stat_4_1_0_t *); 1258 static void ips_stat_current_to_4_1_21(void *, ips_stat_4_1_21_t *); 1259 static void natstat_current_to_4_1_0(void *, natstat_4_1_0_t *); 1260 static void natstat_current_to_4_1_16(void *, natstat_4_1_16_t *); 1261 static void natstat_current_to_4_1_27(void *, natstat_4_1_27_t *); 1262 static void natstat_current_to_4_1_32(void *, natstat_4_1_32_t *); 1263 static void nat_current_to_4_1_3(void *, nat_4_1_3_t *); 1264 static void nat_current_to_4_1_14(void *, nat_4_1_14_t *); 1265 static void nat_current_to_4_1_25(void *, nat_4_1_25_t *); 1266 1267 static void friostat_4_1_0_to_current(friostat_4_1_0_t *, void *); 1268 static void friostat_4_1_33_to_current(friostat_4_1_33_t *, void *); 1269 static void ipnat_4_1_0_to_current(ipnat_4_1_0_t *, void *, int); 1270 static void ipnat_4_1_14_to_current(ipnat_4_1_14_t *, void *, int); 1271 static void frauth_4_1_11_to_current(frauth_4_1_11_t *, void *); 1272 static void frauth_4_1_23_to_current(frauth_4_1_23_t *, void *); 1273 static void frauth_4_1_24_to_current(frauth_4_1_24_t *, void *); 1274 static void frauth_4_1_29_to_current(frauth_4_1_29_t *, void *); 1275 static void frauth_4_1_32_to_current(frauth_4_1_32_t *, void *); 1276 static void frentry_4_1_0_to_current(ipf_main_softc_t *, frentry_4_1_0_t *, void *, int); 1277 static void frentry_4_1_16_to_current(ipf_main_softc_t *, frentry_4_1_16_t *, void *, int); 1278 static void frentry_4_1_34_to_current(ipf_main_softc_t *, frentry_4_1_34_t *, void *, int); 1279 static void fr_info_4_1_11_to_current(fr_info_4_1_11_t *, void *); 1280 static void fr_info_4_1_23_to_current(fr_info_4_1_23_t *, void *); 1281 static void fr_info_4_1_24_to_current(fr_info_4_1_24_t *, void *); 1282 static void fr_info_4_1_32_to_current(fr_info_4_1_32_t *, void *); 1283 static void nat_save_4_1_3_to_current(ipf_main_softc_t *, nat_save_4_1_3_t *, void *); 1284 static void nat_save_4_1_14_to_current(ipf_main_softc_t *, nat_save_4_1_14_t *, void *); 1285 static void nat_save_4_1_16_to_current(ipf_main_softc_t *, nat_save_4_1_16_t *, void *); 1286 1287 /* ------------------------------------------------------------------------ */ 1288 /* In this section is a series of short routines that deal with translating */ 1289 /* the smaller data structures used above as their internal changes make */ 1290 /* them inappropriate for simple assignment. */ 1291 /* ------------------------------------------------------------------------ */ 1292 1293 1294 static int 1295 ipf_addfrstr(char *names, int namelen, char *str, int maxlen) 1296 { 1297 char *t; 1298 int i; 1299 1300 for (i = maxlen, t = str; (*t != '\0') && (i > 0); i--) { 1301 names[namelen++] = *t++; 1302 } 1303 names[namelen++] = '\0'; 1304 return namelen; 1305 } 1306 1307 1308 static void 1309 ipf_v4iptov5(frip4_t *v4, fr_ip_t *v5) 1310 { 1311 v5->fi_v = v4->fi_v; 1312 v5->fi_p = v4->fi_p; 1313 v5->fi_xx = v4->fi_xx; 1314 v5->fi_tos = v4->fi_tos; 1315 v5->fi_ttl = v4->fi_ttl; 1316 v5->fi_p = v4->fi_p; 1317 v5->fi_optmsk = v4->fi_optmsk; 1318 v5->fi_src = v4->fi_src; 1319 v5->fi_dst = v4->fi_dst; 1320 v5->fi_secmsk = v4->ofi_secmsk; 1321 v5->fi_auth = v4->ofi_auth; 1322 v5->fi_flx = v4->fi_flx; 1323 v5->fi_tcpmsk = v4->fi_tcpmsk; 1324 } 1325 1326 static void 1327 ipf_v5iptov4(fr_ip_t *v5, frip4_t *v4) 1328 { 1329 v4->fi_v = v5->fi_v; 1330 v4->fi_p = v5->fi_p; 1331 v4->fi_xx = v5->fi_xx; 1332 v4->fi_tos = v5->fi_tos; 1333 v4->fi_ttl = v5->fi_ttl; 1334 v4->fi_p = v5->fi_p; 1335 v4->fi_optmsk = v5->fi_optmsk; 1336 v4->fi_src = v5->fi_src; 1337 v4->fi_dst = v5->fi_dst; 1338 v4->ofi_secmsk = v5->fi_secmsk; 1339 v4->ofi_auth = v5->fi_auth; 1340 v4->fi_flx = v5->fi_flx; 1341 v4->fi_tcpmsk = v5->fi_tcpmsk; 1342 } 1343 1344 1345 static void 1346 ipfv4tuctov5(frtuc4_t *v4, frtuc_t *v5) 1347 { 1348 v5->ftu_src.frp_cmp = v4->ftu_src.frp_cmp; 1349 v5->ftu_src.frp_port = v4->ftu_src.frp_port; 1350 v5->ftu_src.frp_top = v4->ftu_src.frp_top; 1351 v5->ftu_dst.frp_cmp = v4->ftu_dst.frp_cmp; 1352 v5->ftu_dst.frp_port = v4->ftu_dst.frp_port; 1353 v5->ftu_dst.frp_top = v4->ftu_dst.frp_top; 1354 } 1355 1356 1357 static void 1358 ipfv5tuctov4(frtuc_t *v5, frtuc4_t *v4) 1359 { 1360 v4->ftu_src.frp_cmp = v5->ftu_src.frp_cmp; 1361 v4->ftu_src.frp_port = v5->ftu_src.frp_port; 1362 v4->ftu_src.frp_top = v5->ftu_src.frp_top; 1363 v4->ftu_dst.frp_cmp = v5->ftu_dst.frp_cmp; 1364 v4->ftu_dst.frp_port = v5->ftu_dst.frp_port; 1365 v4->ftu_dst.frp_top = v5->ftu_dst.frp_top; 1366 } 1367 1368 1369 static int 1370 ipf_v4fripftov5(fripf4_t *frp4, char *dst) 1371 { 1372 fripf_t *frp; 1373 1374 frp = (fripf_t *)dst; 1375 1376 ipf_v4iptov5(&frp4->fri_ip, &frp->fri_ip); 1377 ipf_v4iptov5(&frp4->fri_mip, &frp->fri_mip); 1378 frp->fri_icmpm = frp4->fri_icmpm; 1379 frp->fri_icmp = frp4->fri_icmp; 1380 frp->fri_tuc.ftu_tcpfm = frp4->fri_tuc.ftu_tcpfm; 1381 frp->fri_tuc.ftu_tcpf = frp4->fri_tuc.ftu_tcpf; 1382 ipfv4tuctov5(&frp4->fri_tuc, &frp->fri_tuc); 1383 frp->fri_satype = frp4->fri_satype; 1384 frp->fri_datype = frp4->fri_datype; 1385 frp->fri_sifpidx = frp4->fri_sifpidx; 1386 frp->fri_difpidx = frp4->fri_difpidx; 1387 return 0; 1388 } 1389 1390 1391 static void 1392 ipf_v5fripftov4(fripf_t *frp, fripf4_t *frp4) 1393 { 1394 1395 ipf_v5iptov4(&frp->fri_ip, &frp4->fri_ip); 1396 ipf_v5iptov4(&frp->fri_mip, &frp4->fri_mip); 1397 frp4->fri_icmpm = frp->fri_icmpm; 1398 frp4->fri_icmp = frp->fri_icmp; 1399 frp4->fri_tuc.ftu_tcpfm = frp->fri_tuc.ftu_tcpfm; 1400 frp4->fri_tuc.ftu_tcpf = frp->fri_tuc.ftu_tcpf; 1401 ipfv5tuctov4(&frp->fri_tuc, &frp4->fri_tuc); 1402 frp4->fri_satype = frp->fri_satype; 1403 frp4->fri_datype = frp->fri_datype; 1404 frp4->fri_sifpidx = frp->fri_sifpidx; 1405 frp4->fri_difpidx = frp->fri_difpidx; 1406 } 1407 1408 1409 /* ------------------------------------------------------------------------ */ 1410 /* ipf_in_compat is the first of two service routines. It is responsible for*/ 1411 /* converting data structures from user space into what's required by the */ 1412 /* kernel module. */ 1413 /* ------------------------------------------------------------------------ */ 1414 int 1415 ipf_in_compat(ipf_main_softc_t *softc, ipfobj_t *obj, void *ptr, int size) 1416 { 1417 int error; 1418 int sz; 1419 1420 IPFERROR(140000); 1421 error = EINVAL; 1422 1423 switch (obj->ipfo_type) 1424 { 1425 default : 1426 break; 1427 1428 case IPFOBJ_FRENTRY : 1429 if (obj->ipfo_rev >= 4013400) { 1430 frentry_4_1_34_t *old; 1431 1432 KMALLOC(old, frentry_4_1_34_t *); 1433 if (old == NULL) { 1434 IPFERROR(140001); 1435 error = ENOMEM; 1436 break; 1437 } 1438 error = COPYIN(obj->ipfo_ptr, old, sizeof(*old)); 1439 if (error == 0) { 1440 if (old->fr_type != FR_T_NONE && 1441 old->fr_type != FR_T_IPF) { 1442 IPFERROR(140002); 1443 error = EINVAL; 1444 KFREE(old); 1445 break; 1446 } 1447 frentry_4_1_34_to_current(softc, old, 1448 ptr, size); 1449 } else { 1450 IPFERROR(140003); 1451 } 1452 KFREE(old); 1453 } else if (obj->ipfo_rev >= 4011600) { 1454 frentry_4_1_16_t *old; 1455 1456 KMALLOC(old, frentry_4_1_16_t *); 1457 if (old == NULL) { 1458 IPFERROR(140004); 1459 error = ENOMEM; 1460 break; 1461 } 1462 error = COPYIN(obj->ipfo_ptr, old, sizeof(*old)); 1463 if (error == 0) { 1464 if (old->fr_type != FR_T_NONE && 1465 old->fr_type != FR_T_IPF) { 1466 IPFERROR(140005); 1467 error = EINVAL; 1468 KFREE(old); 1469 break; 1470 } 1471 frentry_4_1_16_to_current(softc, old, 1472 ptr, size); 1473 } else { 1474 IPFERROR(140006); 1475 } 1476 KFREE(old); 1477 } else { 1478 frentry_4_1_0_t *old; 1479 1480 KMALLOC(old, frentry_4_1_0_t *); 1481 if (old == NULL) { 1482 IPFERROR(140007); 1483 error = ENOMEM; 1484 break; 1485 } 1486 error = COPYIN(obj->ipfo_ptr, old, sizeof(*old)); 1487 if (error == 0) { 1488 if (old->fr_type != FR_T_NONE && 1489 old->fr_type != FR_T_IPF) { 1490 IPFERROR(140008); 1491 error = EINVAL; 1492 KFREE(old); 1493 break; 1494 } 1495 frentry_4_1_0_to_current(softc, old, ptr, size); 1496 } else { 1497 IPFERROR(140009); 1498 } 1499 KFREE(old); 1500 } 1501 break; 1502 1503 case IPFOBJ_IPFSTAT : 1504 if (obj->ipfo_rev >= 4013300) { 1505 friostat_4_1_33_t *old; 1506 1507 KMALLOC(old, friostat_4_1_33_t *); 1508 if (old == NULL) { 1509 IPFERROR(140010); 1510 error = ENOMEM; 1511 break; 1512 } 1513 error = COPYIN(obj->ipfo_ptr, old, sizeof(*old)); 1514 if (error == 0) { 1515 friostat_4_1_33_to_current(old, ptr); 1516 } else { 1517 IPFERROR(140011); 1518 } 1519 } else { 1520 friostat_4_1_0_t *old; 1521 1522 KMALLOC(old, friostat_4_1_0_t *); 1523 if (old == NULL) { 1524 IPFERROR(140012); 1525 error = ENOMEM; 1526 break; 1527 } 1528 error = COPYIN(obj->ipfo_ptr, old, sizeof(*old)); 1529 if (error == 0) { 1530 friostat_4_1_0_to_current(old, ptr); 1531 } else { 1532 IPFERROR(140013); 1533 } 1534 } 1535 break; 1536 1537 case IPFOBJ_IPFINFO : /* unused */ 1538 break; 1539 1540 case IPFOBJ_IPNAT : 1541 if (obj->ipfo_rev >= 4011400) { 1542 ipnat_4_1_14_t *old; 1543 1544 KMALLOC(old, ipnat_4_1_14_t *); 1545 if (old == NULL) { 1546 IPFERROR(140014); 1547 error = ENOMEM; 1548 break; 1549 } 1550 error = COPYIN(obj->ipfo_ptr, old, sizeof(*old)); 1551 if (error == 0) { 1552 ipnat_4_1_14_to_current(old, ptr, size); 1553 } else { 1554 IPFERROR(140015); 1555 } 1556 KFREE(old); 1557 } else { 1558 ipnat_4_1_0_t *old; 1559 1560 KMALLOC(old, ipnat_4_1_0_t *); 1561 if (old == NULL) { 1562 IPFERROR(140016); 1563 error = ENOMEM; 1564 break; 1565 } 1566 error = COPYIN(obj->ipfo_ptr, old, sizeof(*old)); 1567 if (error == 0) { 1568 ipnat_4_1_0_to_current(old, ptr, size); 1569 } else { 1570 IPFERROR(140017); 1571 } 1572 KFREE(old); 1573 } 1574 break; 1575 1576 case IPFOBJ_NATSTAT : 1577 /* 1578 * Statistics are not copied in. 1579 */ 1580 break; 1581 1582 case IPFOBJ_NATSAVE : 1583 if (obj->ipfo_rev >= 4011600) { 1584 nat_save_4_1_16_t *old16; 1585 1586 KMALLOC(old16, nat_save_4_1_16_t *); 1587 if (old16 == NULL) { 1588 IPFERROR(140018); 1589 error = ENOMEM; 1590 break; 1591 } 1592 error = COPYIN(obj->ipfo_ptr, old16, sizeof(*old16)); 1593 if (error == 0) { 1594 nat_save_4_1_16_to_current(softc, old16, ptr); 1595 } else { 1596 IPFERROR(140019); 1597 } 1598 KFREE(old16); 1599 } else if (obj->ipfo_rev >= 4011400) { 1600 nat_save_4_1_14_t *old14; 1601 1602 KMALLOC(old14, nat_save_4_1_14_t *); 1603 if (old14 == NULL) { 1604 IPFERROR(140020); 1605 error = ENOMEM; 1606 break; 1607 } 1608 error = COPYIN(obj->ipfo_ptr, old14, sizeof(*old14)); 1609 if (error == 0) { 1610 nat_save_4_1_14_to_current(softc, old14, ptr); 1611 } else { 1612 IPFERROR(140021); 1613 } 1614 KFREE(old14); 1615 } else if (obj->ipfo_rev >= 4010300) { 1616 nat_save_4_1_3_t *old3; 1617 1618 KMALLOC(old3, nat_save_4_1_3_t *); 1619 if (old3 == NULL) { 1620 IPFERROR(140022); 1621 error = ENOMEM; 1622 break; 1623 } 1624 error = COPYIN(obj->ipfo_ptr, old3, sizeof(*old3)); 1625 if (error == 0) { 1626 nat_save_4_1_3_to_current(softc, old3, ptr); 1627 } else { 1628 IPFERROR(140023); 1629 } 1630 KFREE(old3); 1631 } 1632 break; 1633 1634 case IPFOBJ_STATESAVE : 1635 if (obj->ipfo_rev >= 4013400) { 1636 ipstate_save_4_1_34_t *old; 1637 1638 KMALLOC(old, ipstate_save_4_1_34_t *); 1639 if (old == NULL) { 1640 IPFERROR(140024); 1641 error = ENOMEM; 1642 break; 1643 } 1644 error = COPYIN(obj->ipfo_ptr, old, sizeof(*old)); 1645 if (error != 0) { 1646 IPFERROR(140025); 1647 } 1648 KFREE(old); 1649 } else if (obj->ipfo_rev >= 4011600) { 1650 ipstate_save_4_1_16_t *old; 1651 1652 KMALLOC(old, ipstate_save_4_1_16_t *); 1653 if (old == NULL) { 1654 IPFERROR(140026); 1655 error = ENOMEM; 1656 break; 1657 } 1658 error = COPYIN(obj->ipfo_ptr, old, sizeof(*old)); 1659 if (error != 0) { 1660 IPFERROR(140027); 1661 } 1662 KFREE(old); 1663 } else { 1664 ipstate_save_4_1_0_t *old; 1665 1666 KMALLOC(old, ipstate_save_4_1_0_t *); 1667 if (old == NULL) { 1668 IPFERROR(140028); 1669 error = ENOMEM; 1670 break; 1671 } 1672 error = COPYIN(obj->ipfo_ptr, old, sizeof(*old)); 1673 if (error != 0) { 1674 IPFERROR(140029); 1675 } 1676 KFREE(old); 1677 } 1678 break; 1679 1680 case IPFOBJ_IPSTATE : 1681 /* 1682 * This structure is not copied in by itself. 1683 */ 1684 break; 1685 1686 case IPFOBJ_STATESTAT : 1687 /* 1688 * Statistics are not copied in. 1689 */ 1690 break; 1691 1692 case IPFOBJ_FRAUTH : 1693 if (obj->ipfo_rev >= 4013200) { 1694 frauth_4_1_32_t *old32; 1695 1696 KMALLOC(old32, frauth_4_1_32_t *); 1697 if (old32 == NULL) { 1698 IPFERROR(140030); 1699 error = ENOMEM; 1700 break; 1701 } 1702 error = COPYIN(obj->ipfo_ptr, old32, sizeof(*old32)); 1703 if (error == 0) { 1704 frauth_4_1_32_to_current(old32, ptr); 1705 } else { 1706 IPFERROR(140031); 1707 } 1708 KFREE(old32); 1709 } else if (obj->ipfo_rev >= 4012900) { 1710 frauth_4_1_29_t *old29; 1711 1712 KMALLOC(old29, frauth_4_1_29_t *); 1713 if (old29 == NULL) { 1714 IPFERROR(140032); 1715 error = ENOMEM; 1716 break; 1717 } 1718 error = COPYIN(obj->ipfo_ptr, old29, sizeof(*old29)); 1719 if (error == 0) { 1720 frauth_4_1_29_to_current(old29, ptr); 1721 } else { 1722 IPFERROR(140033); 1723 } 1724 KFREE(old29); 1725 } else if (obj->ipfo_rev >= 4012400) { 1726 frauth_4_1_24_t *old24; 1727 1728 KMALLOC(old24, frauth_4_1_24_t *); 1729 if (old24 == NULL) { 1730 IPFERROR(140034); 1731 error = ENOMEM; 1732 break; 1733 } 1734 error = COPYIN(obj->ipfo_ptr, old24, sizeof(*old24)); 1735 if (error == 0) { 1736 frauth_4_1_24_to_current(old24, ptr); 1737 } else { 1738 IPFERROR(140035); 1739 } 1740 KFREE(old24); 1741 } else if (obj->ipfo_rev >= 4012300) { 1742 frauth_4_1_23_t *old23; 1743 1744 KMALLOC(old23, frauth_4_1_23_t *); 1745 if (old23 == NULL) { 1746 IPFERROR(140036); 1747 error = ENOMEM; 1748 break; 1749 } 1750 error = COPYIN(obj->ipfo_ptr, old23, sizeof(*old23)); 1751 if (error == 0) 1752 frauth_4_1_23_to_current(old23, ptr); 1753 KFREE(old23); 1754 } else if (obj->ipfo_rev >= 4011100) { 1755 frauth_4_1_11_t *old11; 1756 1757 KMALLOC(old11, frauth_4_1_11_t *); 1758 if (old11 == NULL) { 1759 IPFERROR(140037); 1760 error = ENOMEM; 1761 break; 1762 } 1763 error = COPYIN(obj->ipfo_ptr, old11, sizeof(*old11)); 1764 if (error == 0) { 1765 frauth_4_1_11_to_current(old11, ptr); 1766 } else { 1767 IPFERROR(140038); 1768 } 1769 KFREE(old11); 1770 } 1771 break; 1772 1773 case IPFOBJ_NAT : 1774 if (obj->ipfo_rev >= 4011400) { 1775 sz = sizeof(nat_4_1_14_t); 1776 } else if (obj->ipfo_rev >= 4010300) { 1777 sz = sizeof(nat_4_1_3_t); 1778 } else { 1779 break; 1780 } 1781 bzero(ptr, sizeof(nat_t)); 1782 error = COPYIN(obj->ipfo_ptr, ptr, sz); 1783 if (error != 0) { 1784 IPFERROR(140039); 1785 } 1786 break; 1787 1788 case IPFOBJ_FRIPF : 1789 if (obj->ipfo_rev < 5000000) { 1790 fripf4_t *old; 1791 1792 KMALLOC(old, fripf4_t *); 1793 if (old == NULL) { 1794 IPFERROR(140040); 1795 error = ENOMEM; 1796 break; 1797 } 1798 error = COPYIN(obj->ipfo_ptr, old, sizeof(*old)); 1799 if (error == 0) { 1800 ipf_v4fripftov5(old, ptr); 1801 } else { 1802 IPFERROR(140041); 1803 } 1804 KFREE(old); 1805 } 1806 break; 1807 } 1808 1809 return error; 1810 } 1811 /* ------------------------------------------------------------------------ */ 1812 1813 1814 /* 1815 * flags is v4 flags, returns v5 flags. 1816 */ 1817 static int 1818 fr_frflags4to5(u_32_t flags) 1819 { 1820 u_32_t nflags = 0; 1821 1822 switch (flags & 0xf) { 1823 case 0x0 : 1824 nflags |= FR_CALL; 1825 break; 1826 case 0x1 : 1827 nflags |= FR_BLOCK; 1828 break; 1829 case 0x2 : 1830 nflags |= FR_PASS; 1831 break; 1832 case 0x3 : 1833 nflags |= FR_AUTH; 1834 break; 1835 case 0x4 : 1836 nflags |= FR_PREAUTH; 1837 break; 1838 case 0x5 : 1839 nflags |= FR_ACCOUNT; 1840 break; 1841 case 0x6 : 1842 nflags |= FR_SKIP; 1843 break; 1844 default : 1845 break; 1846 } 1847 1848 if (flags & 0x00010) 1849 nflags |= FR_LOG; 1850 if (flags & 0x00020) 1851 nflags |= FR_CALLNOW; 1852 if (flags & 0x00080) 1853 nflags |= FR_NOTSRCIP; 1854 if (flags & 0x00040) 1855 nflags |= FR_NOTDSTIP; 1856 if (flags & 0x00100) 1857 nflags |= FR_QUICK; 1858 if (flags & 0x00200) 1859 nflags |= FR_KEEPFRAG; 1860 if (flags & 0x00400) 1861 nflags |= FR_KEEPSTATE; 1862 if (flags & 0x00800) 1863 nflags |= FR_FASTROUTE; 1864 if (flags & 0x01000) 1865 nflags |= FR_RETRST; 1866 if (flags & 0x02000) 1867 nflags |= FR_RETICMP; 1868 if (flags & 0x03000) 1869 nflags |= FR_FAKEICMP; 1870 if (flags & 0x04000) 1871 nflags |= FR_OUTQUE; 1872 if (flags & 0x08000) 1873 nflags |= FR_INQUE; 1874 if (flags & 0x10000) 1875 nflags |= FR_LOGBODY; 1876 if (flags & 0x20000) 1877 nflags |= FR_LOGFIRST; 1878 if (flags & 0x40000) 1879 nflags |= FR_LOGORBLOCK; 1880 if (flags & 0x100000) 1881 nflags |= FR_FRSTRICT; 1882 if (flags & 0x200000) 1883 nflags |= FR_STSTRICT; 1884 if (flags & 0x400000) 1885 nflags |= FR_NEWISN; 1886 if (flags & 0x800000) 1887 nflags |= FR_NOICMPERR; 1888 if (flags & 0x1000000) 1889 nflags |= FR_STATESYNC; 1890 if (flags & 0x8000000) 1891 nflags |= FR_NOMATCH; 1892 if (flags & 0x40000000) 1893 nflags |= FR_COPIED; 1894 if (flags & 0x80000000) 1895 nflags |= FR_INACTIVE; 1896 1897 return nflags; 1898 } 1899 1900 static void 1901 frentry_4_1_34_to_current(ipf_main_softc_t *softc, frentry_4_1_34_t *old, 1902 void *current, int size) 1903 { 1904 frentry_t *fr = (frentry_t *)current; 1905 1906 fr->fr_comment = -1; 1907 fr->fr_ref = old->fr_ref; 1908 fr->fr_statecnt = old->fr_statecnt; 1909 fr->fr_hits = old->fr_hits; 1910 fr->fr_bytes = old->fr_bytes; 1911 fr->fr_lastpkt.tv_sec = old->fr_lastpkt.tv_sec; 1912 fr->fr_lastpkt.tv_usec = old->fr_lastpkt.tv_usec; 1913 bcopy(&old->fr_dun, &fr->fr_dun, sizeof(old->fr_dun)); 1914 fr->fr_func = old->fr_func; 1915 fr->fr_dsize = old->fr_dsize; 1916 fr->fr_pps = old->fr_pps; 1917 fr->fr_statemax = old->fr_statemax; 1918 fr->fr_flineno = old->fr_flineno; 1919 fr->fr_type = old->fr_type; 1920 fr->fr_flags = fr_frflags4to5(old->fr_flags); 1921 fr->fr_logtag = old->fr_logtag; 1922 fr->fr_collect = old->fr_collect; 1923 fr->fr_arg = old->fr_arg; 1924 fr->fr_loglevel = old->fr_loglevel; 1925 fr->fr_age[0] = old->fr_age[0]; 1926 fr->fr_age[1] = old->fr_age[1]; 1927 fr->fr_tifs[0].fd_ip6 = old->fr_tifs[0].ofd_ip6; 1928 fr->fr_tifs[0].fd_type = FRD_NORMAL; 1929 fr->fr_tifs[1].fd_ip6 = old->fr_tifs[1].ofd_ip6; 1930 fr->fr_tifs[1].fd_type = FRD_NORMAL; 1931 fr->fr_dif.fd_ip6 = old->fr_dif.ofd_ip6; 1932 fr->fr_dif.fd_type = FRD_NORMAL; 1933 if (old->fr_v == 4) 1934 fr->fr_family = AF_INET; 1935 if (old->fr_v == 6) 1936 fr->fr_family = AF_INET6; 1937 fr->fr_icode = old->fr_icode; 1938 fr->fr_cksum = old->fr_cksum; 1939 fr->fr_namelen = 0; 1940 fr->fr_ifnames[0] = -1; 1941 fr->fr_ifnames[1] = -1; 1942 fr->fr_ifnames[2] = -1; 1943 fr->fr_ifnames[3] = -1; 1944 fr->fr_dif.fd_name = -1; 1945 fr->fr_tifs[0].fd_name = -1; 1946 fr->fr_tifs[1].fd_name = -1; 1947 fr->fr_group = -1; 1948 fr->fr_grhead = -1; 1949 fr->fr_icmphead = -1; 1950 if (size == 0) { 1951 fr->fr_size = sizeof(*fr) + LIFNAMSIZ * 7 + FR_GROUPLEN * 2; 1952 fr->fr_size += sizeof(fripf_t) + 16; 1953 fr->fr_size += 9; /* room for \0's */ 1954 } else { 1955 char *names = fr->fr_names; 1956 int nlen = fr->fr_namelen; 1957 1958 fr->fr_size = size; 1959 if (old->fr_ifnames[0][0] != '\0') { 1960 fr->fr_ifnames[0] = nlen; 1961 nlen = ipf_addfrstr(names, nlen, old->fr_ifnames[0], 1962 LIFNAMSIZ); 1963 } 1964 if (old->fr_ifnames[1][0] != '\0') { 1965 fr->fr_ifnames[1] = nlen; 1966 nlen = ipf_addfrstr(names, nlen, old->fr_ifnames[1], 1967 LIFNAMSIZ); 1968 } 1969 if (old->fr_ifnames[2][0] != '\0') { 1970 fr->fr_ifnames[2] = nlen; 1971 nlen = ipf_addfrstr(names, nlen, old->fr_ifnames[2], 1972 LIFNAMSIZ); 1973 } 1974 if (old->fr_ifnames[3][0] != '\0') { 1975 fr->fr_ifnames[3] = nlen; 1976 nlen = ipf_addfrstr(names, nlen, old->fr_ifnames[3], 1977 LIFNAMSIZ); 1978 } 1979 if (old->fr_tifs[0].fd_ifname[0] != '\0') { 1980 fr->fr_tifs[0].fd_name = nlen; 1981 nlen = ipf_addfrstr(names, nlen, 1982 old->fr_tifs[0].fd_ifname, 1983 LIFNAMSIZ); 1984 } 1985 if (old->fr_tifs[1].fd_ifname[0] != '\0') { 1986 fr->fr_tifs[1].fd_name = nlen; 1987 nlen = ipf_addfrstr(names, nlen, 1988 old->fr_tifs[1].fd_ifname, 1989 LIFNAMSIZ); 1990 } 1991 if (old->fr_dif.fd_ifname[0] != '\0') { 1992 fr->fr_dif.fd_name = nlen; 1993 nlen = ipf_addfrstr(names, nlen, 1994 old->fr_dif.fd_ifname, LIFNAMSIZ); 1995 } 1996 if (old->fr_group[0] != '\0') { 1997 fr->fr_group = nlen; 1998 nlen = ipf_addfrstr(names, nlen, 1999 old->fr_group, LIFNAMSIZ); 2000 } 2001 if (old->fr_grhead[0] != '\0') { 2002 fr->fr_grhead = nlen; 2003 nlen = ipf_addfrstr(names, nlen, 2004 old->fr_grhead, LIFNAMSIZ); 2005 } 2006 fr->fr_namelen = nlen; 2007 2008 if (old->fr_type == FR_T_IPF) { 2009 int offset = fr->fr_namelen; 2010 ipfobj_t obj; 2011 int error; 2012 2013 obj.ipfo_type = IPFOBJ_FRIPF; 2014 obj.ipfo_rev = 4010100; 2015 obj.ipfo_ptr = old->fr_data; 2016 2017 if ((offset & 7) != 0) 2018 offset += 8 - (offset & 7); 2019 error = ipf_in_compat(softc, &obj, 2020 fr->fr_names + offset, 0); 2021 if (error == 0) { 2022 fr->fr_data = fr->fr_names + offset; 2023 fr->fr_dsize = sizeof(fripf_t); 2024 } 2025 } 2026 } 2027 } 2028 2029 static void 2030 frentry_4_1_16_to_current(ipf_main_softc_t *softc, frentry_4_1_16_t *old, 2031 void *current, int size) 2032 { 2033 frentry_t *fr = (frentry_t *)current; 2034 2035 fr->fr_comment = -1; 2036 fr->fr_ref = old->fr_ref; 2037 fr->fr_statecnt = old->fr_statecnt; 2038 fr->fr_hits = old->fr_hits; 2039 fr->fr_bytes = old->fr_bytes; 2040 fr->fr_lastpkt.tv_sec = old->fr_lastpkt.tv_sec; 2041 fr->fr_lastpkt.tv_usec = old->fr_lastpkt.tv_usec; 2042 bcopy(&old->fr_dun, &fr->fr_dun, sizeof(old->fr_dun)); 2043 fr->fr_func = old->fr_func; 2044 fr->fr_dsize = old->fr_dsize; 2045 fr->fr_pps = old->fr_pps; 2046 fr->fr_statemax = old->fr_statemax; 2047 fr->fr_flineno = old->fr_flineno; 2048 fr->fr_type = old->fr_type; 2049 fr->fr_flags = fr_frflags4to5(old->fr_flags); 2050 fr->fr_logtag = old->fr_logtag; 2051 fr->fr_collect = old->fr_collect; 2052 fr->fr_arg = old->fr_arg; 2053 fr->fr_loglevel = old->fr_loglevel; 2054 fr->fr_age[0] = old->fr_age[0]; 2055 fr->fr_age[1] = old->fr_age[1]; 2056 fr->fr_tifs[0].fd_ip6 = old->fr_tifs[0].ofd_ip6; 2057 fr->fr_tifs[0].fd_type = FRD_NORMAL; 2058 fr->fr_tifs[1].fd_ip6 = old->fr_tifs[1].ofd_ip6; 2059 fr->fr_tifs[1].fd_type = FRD_NORMAL; 2060 fr->fr_dif.fd_ip6 = old->fr_dif.ofd_ip6; 2061 fr->fr_dif.fd_type = FRD_NORMAL; 2062 if (old->fr_v == 4) 2063 fr->fr_family = AF_INET; 2064 if (old->fr_v == 6) 2065 fr->fr_family = AF_INET6; 2066 fr->fr_icode = old->fr_icode; 2067 fr->fr_cksum = old->fr_cksum; 2068 fr->fr_namelen = 0; 2069 fr->fr_ifnames[0] = -1; 2070 fr->fr_ifnames[1] = -1; 2071 fr->fr_ifnames[2] = -1; 2072 fr->fr_ifnames[3] = -1; 2073 fr->fr_dif.fd_name = -1; 2074 fr->fr_tifs[0].fd_name = -1; 2075 fr->fr_tifs[1].fd_name = -1; 2076 fr->fr_group = -1; 2077 fr->fr_grhead = -1; 2078 fr->fr_icmphead = -1; 2079 if (size == 0) { 2080 fr->fr_size = sizeof(*fr) + LIFNAMSIZ * 7 + FR_GROUPLEN * 2; 2081 fr->fr_size += 9; /* room for \0's */ 2082 } else { 2083 char *names = fr->fr_names; 2084 int nlen = fr->fr_namelen; 2085 2086 fr->fr_size = size; 2087 if (old->fr_ifnames[0][0] != '\0') { 2088 fr->fr_ifnames[0] = nlen; 2089 nlen = ipf_addfrstr(names, nlen, old->fr_ifnames[0], 2090 LIFNAMSIZ); 2091 } 2092 if (old->fr_ifnames[1][0] != '\0') { 2093 fr->fr_ifnames[1] = nlen; 2094 nlen = ipf_addfrstr(names, nlen, old->fr_ifnames[1], 2095 LIFNAMSIZ); 2096 } 2097 if (old->fr_ifnames[2][0] != '\0') { 2098 fr->fr_ifnames[2] = nlen; 2099 nlen = ipf_addfrstr(names, nlen, old->fr_ifnames[2], 2100 LIFNAMSIZ); 2101 } 2102 if (old->fr_ifnames[3][0] != '\0') { 2103 fr->fr_ifnames[3] = nlen; 2104 nlen = ipf_addfrstr(names, nlen, old->fr_ifnames[3], 2105 LIFNAMSIZ); 2106 } 2107 if (old->fr_tifs[0].fd_ifname[0] != '\0') { 2108 fr->fr_tifs[0].fd_name = nlen; 2109 nlen = ipf_addfrstr(names, nlen, 2110 old->fr_tifs[0].fd_ifname, 2111 LIFNAMSIZ); 2112 } 2113 if (old->fr_tifs[1].fd_ifname[0] != '\0') { 2114 fr->fr_tifs[1].fd_name = nlen; 2115 nlen = ipf_addfrstr(names, nlen, 2116 old->fr_tifs[1].fd_ifname, 2117 LIFNAMSIZ); 2118 } 2119 if (old->fr_dif.fd_ifname[0] != '\0') { 2120 fr->fr_dif.fd_name = nlen; 2121 nlen = ipf_addfrstr(names, nlen, 2122 old->fr_dif.fd_ifname, LIFNAMSIZ); 2123 } 2124 if (old->fr_group[0] != '\0') { 2125 fr->fr_group = nlen; 2126 nlen = ipf_addfrstr(names, nlen, 2127 old->fr_group, LIFNAMSIZ); 2128 } 2129 if (old->fr_grhead[0] != '\0') { 2130 fr->fr_grhead = nlen; 2131 nlen = ipf_addfrstr(names, nlen, 2132 old->fr_grhead, LIFNAMSIZ); 2133 } 2134 fr->fr_namelen = nlen; 2135 2136 if (old->fr_type == FR_T_IPF) { 2137 int offset = fr->fr_namelen; 2138 ipfobj_t obj; 2139 int error; 2140 2141 obj.ipfo_type = IPFOBJ_FRIPF; 2142 obj.ipfo_rev = 4010100; 2143 obj.ipfo_ptr = old->fr_data; 2144 2145 if ((offset & 7) != 0) 2146 offset += 8 - (offset & 7); 2147 error = ipf_in_compat(softc, &obj, 2148 fr->fr_names + offset, 0); 2149 if (error == 0) { 2150 fr->fr_data = fr->fr_names + offset; 2151 fr->fr_dsize = sizeof(fripf_t); 2152 } 2153 } 2154 } 2155 } 2156 2157 2158 static void 2159 frentry_4_1_0_to_current(ipf_main_softc_t *softc, frentry_4_1_0_t *old, 2160 void *current, int size) 2161 { 2162 frentry_t *fr = (frentry_t *)current; 2163 2164 fr->fr_size = sizeof(*fr); 2165 fr->fr_comment = -1; 2166 fr->fr_ref = old->fr_ref; 2167 fr->fr_statecnt = old->fr_statecnt; 2168 fr->fr_hits = old->fr_hits; 2169 fr->fr_bytes = old->fr_bytes; 2170 fr->fr_lastpkt.tv_sec = old->fr_lastpkt.tv_sec; 2171 fr->fr_lastpkt.tv_usec = old->fr_lastpkt.tv_usec; 2172 bcopy(&old->fr_dun, &fr->fr_dun, sizeof(old->fr_dun)); 2173 fr->fr_func = old->fr_func; 2174 fr->fr_dsize = old->fr_dsize; 2175 fr->fr_pps = old->fr_pps; 2176 fr->fr_statemax = old->fr_statemax; 2177 fr->fr_flineno = old->fr_flineno; 2178 fr->fr_type = old->fr_type; 2179 fr->fr_flags = fr_frflags4to5(old->fr_flags); 2180 fr->fr_logtag = old->fr_logtag; 2181 fr->fr_collect = old->fr_collect; 2182 fr->fr_arg = old->fr_arg; 2183 fr->fr_loglevel = old->fr_loglevel; 2184 fr->fr_age[0] = old->fr_age[0]; 2185 fr->fr_age[1] = old->fr_age[1]; 2186 fr->fr_tifs[0].fd_ip6 = old->fr_tifs[0].ofd_ip6; 2187 fr->fr_tifs[0].fd_type = FRD_NORMAL; 2188 fr->fr_tifs[1].fd_ip6 = old->fr_tifs[1].ofd_ip6; 2189 fr->fr_tifs[1].fd_type = FRD_NORMAL; 2190 fr->fr_dif.fd_ip6 = old->fr_dif.ofd_ip6; 2191 fr->fr_dif.fd_type = FRD_NORMAL; 2192 if (old->fr_v == 4) 2193 fr->fr_family = AF_INET; 2194 if (old->fr_v == 6) 2195 fr->fr_family = AF_INET6; 2196 fr->fr_icode = old->fr_icode; 2197 fr->fr_cksum = old->fr_cksum; 2198 fr->fr_namelen = 0; 2199 fr->fr_ifnames[0] = -1; 2200 fr->fr_ifnames[1] = -1; 2201 fr->fr_ifnames[2] = -1; 2202 fr->fr_ifnames[3] = -1; 2203 fr->fr_dif.fd_name = -1; 2204 fr->fr_tifs[0].fd_name = -1; 2205 fr->fr_tifs[1].fd_name = -1; 2206 fr->fr_group = -1; 2207 fr->fr_grhead = -1; 2208 fr->fr_icmphead = -1; 2209 if (size == 0) { 2210 fr->fr_size = sizeof(*fr) + LIFNAMSIZ * 7 + FR_GROUPLEN * 2; 2211 fr->fr_size += 9; /* room for \0's */ 2212 } else { 2213 char *names = fr->fr_names; 2214 int nlen = fr->fr_namelen; 2215 2216 fr->fr_size = size; 2217 if (old->fr_ifnames[0][0] != '\0') { 2218 fr->fr_ifnames[0] = nlen; 2219 nlen = ipf_addfrstr(names, nlen, old->fr_ifnames[0], 2220 LIFNAMSIZ); 2221 } 2222 if (old->fr_ifnames[1][0] != '\0') { 2223 fr->fr_ifnames[1] = nlen; 2224 nlen = ipf_addfrstr(names, nlen, old->fr_ifnames[1], 2225 LIFNAMSIZ); 2226 } 2227 if (old->fr_ifnames[2][0] != '\0') { 2228 fr->fr_ifnames[2] = nlen; 2229 nlen = ipf_addfrstr(names, nlen, old->fr_ifnames[2], 2230 LIFNAMSIZ); 2231 } 2232 if (old->fr_ifnames[3][0] != '\0') { 2233 fr->fr_ifnames[3] = nlen; 2234 nlen = ipf_addfrstr(names, nlen, old->fr_ifnames[3], 2235 LIFNAMSIZ); 2236 } 2237 if (old->fr_tifs[0].fd_ifname[0] != '\0') { 2238 fr->fr_tifs[0].fd_name = nlen; 2239 nlen = ipf_addfrstr(names, nlen, 2240 old->fr_tifs[0].fd_ifname, 2241 LIFNAMSIZ); 2242 } 2243 if (old->fr_tifs[1].fd_ifname[0] != '\0') { 2244 fr->fr_tifs[1].fd_name = nlen; 2245 nlen = ipf_addfrstr(names, nlen, 2246 old->fr_tifs[1].fd_ifname, 2247 LIFNAMSIZ); 2248 } 2249 if (old->fr_dif.fd_ifname[0] != '\0') { 2250 fr->fr_dif.fd_name = nlen; 2251 nlen = ipf_addfrstr(names, nlen, 2252 old->fr_dif.fd_ifname, LIFNAMSIZ); 2253 } 2254 if (old->fr_group[0] != '\0') { 2255 fr->fr_group = nlen; 2256 nlen = ipf_addfrstr(names, nlen, 2257 old->fr_group, LIFNAMSIZ); 2258 } 2259 if (old->fr_grhead[0] != '\0') { 2260 fr->fr_grhead = nlen; 2261 nlen = ipf_addfrstr(names, nlen, 2262 old->fr_grhead, LIFNAMSIZ); 2263 } 2264 fr->fr_namelen = nlen; 2265 2266 if (old->fr_type == FR_T_IPF) { 2267 int offset = fr->fr_namelen; 2268 ipfobj_t obj; 2269 int error; 2270 2271 obj.ipfo_type = IPFOBJ_FRIPF; 2272 obj.ipfo_rev = 4010100; 2273 obj.ipfo_ptr = old->fr_data; 2274 2275 if ((offset & 7) != 0) 2276 offset += 8 - (offset & 7); 2277 offset += 8 - (offset & 7); 2278 error = ipf_in_compat(softc, &obj, 2279 fr->fr_names + offset, 0); 2280 if (error == 0) { 2281 fr->fr_data = fr->fr_names + offset; 2282 fr->fr_dsize = sizeof(fripf_t); 2283 } 2284 } 2285 } 2286 } 2287 2288 2289 static void 2290 friostat_4_1_33_to_current(friostat_4_1_33_t *old, void *current) 2291 { 2292 friostat_t *fiop = (friostat_t *)current; 2293 2294 bcopy(&old->of_st[0], &fiop->f_st[0].fr_pass, sizeof(old->of_st[0])); 2295 bcopy(&old->of_st[1], &fiop->f_st[1].fr_pass, sizeof(old->of_st[1])); 2296 2297 fiop->f_ipf[0][0] = old->f_ipf[0][0]; 2298 fiop->f_ipf[0][1] = old->f_ipf[0][1]; 2299 fiop->f_ipf[1][0] = old->f_ipf[1][0]; 2300 fiop->f_ipf[1][1] = old->f_ipf[1][1]; 2301 fiop->f_acct[0][0] = old->f_acct[0][0]; 2302 fiop->f_acct[0][1] = old->f_acct[0][1]; 2303 fiop->f_acct[1][0] = old->f_acct[1][0]; 2304 fiop->f_acct[1][1] = old->f_acct[1][1]; 2305 fiop->f_auth = fiop->f_auth; 2306 bcopy(&old->f_groups, &fiop->f_groups, sizeof(old->f_groups)); 2307 bcopy(&old->f_froute, &fiop->f_froute, sizeof(old->f_froute)); 2308 fiop->f_ticks = old->f_ticks; 2309 bcopy(&old->f_locks, &fiop->f_locks, sizeof(old->f_locks)); 2310 fiop->f_defpass = old->f_defpass; 2311 fiop->f_active = old->f_active; 2312 fiop->f_running = old->f_running; 2313 fiop->f_logging = old->f_logging; 2314 fiop->f_features = old->f_features; 2315 bcopy(old->f_version, fiop->f_version, sizeof(old->f_version)); 2316 } 2317 2318 2319 static void 2320 friostat_4_1_0_to_current(friostat_4_1_0_t *old, void *current) 2321 { 2322 friostat_t *fiop = (friostat_t *)current; 2323 2324 bcopy(&old->of_st[0], &fiop->f_st[0].fr_pass, sizeof(old->of_st[0])); 2325 bcopy(&old->of_st[1], &fiop->f_st[1].fr_pass, sizeof(old->of_st[1])); 2326 2327 fiop->f_ipf[0][0] = old->f_ipf[0][0]; 2328 fiop->f_ipf[0][1] = old->f_ipf[0][1]; 2329 fiop->f_ipf[1][0] = old->f_ipf[1][0]; 2330 fiop->f_ipf[1][1] = old->f_ipf[1][1]; 2331 fiop->f_acct[0][0] = old->f_acct[0][0]; 2332 fiop->f_acct[0][1] = old->f_acct[0][1]; 2333 fiop->f_acct[1][0] = old->f_acct[1][0]; 2334 fiop->f_acct[1][1] = old->f_acct[1][1]; 2335 fiop->f_auth = fiop->f_auth; 2336 bcopy(&old->f_groups, &fiop->f_groups, sizeof(old->f_groups)); 2337 bcopy(&old->f_froute, &fiop->f_froute, sizeof(old->f_froute)); 2338 fiop->f_ticks = old->f_ticks; 2339 bcopy(&old->f_locks, &fiop->f_locks, sizeof(old->f_locks)); 2340 fiop->f_defpass = old->f_defpass; 2341 fiop->f_active = old->f_active; 2342 fiop->f_running = old->f_running; 2343 fiop->f_logging = old->f_logging; 2344 fiop->f_features = old->f_features; 2345 bcopy(old->f_version, fiop->f_version, sizeof(old->f_version)); 2346 } 2347 2348 2349 static void 2350 ipnat_4_1_14_to_current(ipnat_4_1_14_t *old, void *current, int size) 2351 { 2352 ipnat_t *np = (ipnat_t *)current; 2353 2354 np->in_space = old->in_space; 2355 np->in_hv[0] = old->in_hv; 2356 np->in_hv[1] = old->in_hv; 2357 np->in_flineno = old->in_flineno; 2358 if (old->in_redir == NAT_REDIRECT) 2359 np->in_dpnext = old->in_pnext; 2360 else 2361 np->in_spnext = old->in_pnext; 2362 np->in_v[0] = old->in_v; 2363 np->in_v[1] = old->in_v; 2364 np->in_flags = old->in_flags; 2365 np->in_mssclamp = old->in_mssclamp; 2366 np->in_age[0] = old->in_age[0]; 2367 np->in_age[1] = old->in_age[1]; 2368 np->in_redir = old->in_redir; 2369 np->in_pr[0] = old->in_p; 2370 np->in_pr[1] = old->in_p; 2371 if (np->in_redir == NAT_REDIRECT) { 2372 np->in_ndst.na_nextaddr = old->in_next6; 2373 np->in_ndst.na_addr[0] = old->in_in[0]; 2374 np->in_ndst.na_addr[1] = old->in_in[1]; 2375 np->in_ndst.na_atype = FRI_NORMAL; 2376 np->in_odst.na_addr[0] = old->in_out[0]; 2377 np->in_odst.na_addr[1] = old->in_out[1]; 2378 np->in_odst.na_atype = FRI_NORMAL; 2379 np->in_osrc.na_addr[0] = old->in_src[0]; 2380 np->in_osrc.na_addr[1] = old->in_src[1]; 2381 np->in_osrc.na_atype = FRI_NORMAL; 2382 } else { 2383 np->in_nsrc.na_nextaddr = old->in_next6; 2384 np->in_nsrc.na_addr[0] = old->in_out[0]; 2385 np->in_nsrc.na_addr[1] = old->in_out[1]; 2386 np->in_nsrc.na_atype = FRI_NORMAL; 2387 np->in_osrc.na_addr[0] = old->in_in[0]; 2388 np->in_osrc.na_addr[1] = old->in_in[1]; 2389 np->in_osrc.na_atype = FRI_NORMAL; 2390 np->in_odst.na_addr[0] = old->in_src[0]; 2391 np->in_odst.na_addr[1] = old->in_src[1]; 2392 np->in_odst.na_atype = FRI_NORMAL; 2393 } 2394 ipfv4tuctov5(&old->in_tuc, &np->in_tuc); 2395 if (np->in_redir == NAT_REDIRECT) { 2396 np->in_dpmin = old->in_port[0]; 2397 np->in_dpmax = old->in_port[1]; 2398 } else { 2399 np->in_spmin = old->in_port[0]; 2400 np->in_spmax = old->in_port[1]; 2401 } 2402 np->in_ppip = old->in_ppip; 2403 np->in_ippip = old->in_ippip; 2404 np->in_tag = old->in_tag; 2405 2406 np->in_namelen = 0; 2407 np->in_plabel = -1; 2408 np->in_ifnames[0] = -1; 2409 np->in_ifnames[1] = -1; 2410 2411 if (size == 0) { 2412 np->in_size = sizeof(*np); 2413 np->in_size += LIFNAMSIZ * 2 + APR_LABELLEN; 2414 np->in_size += 3; 2415 } else { 2416 int nlen = np->in_namelen; 2417 char *names = np->in_names; 2418 2419 if (old->in_ifnames[0][0] != '\0') { 2420 np->in_ifnames[0] = nlen; 2421 nlen = ipf_addfrstr(names, nlen, old->in_ifnames[0], 2422 LIFNAMSIZ); 2423 } 2424 if (old->in_ifnames[1][0] != '\0') { 2425 np->in_ifnames[0] = nlen; 2426 nlen = ipf_addfrstr(names, nlen, old->in_ifnames[1], 2427 LIFNAMSIZ); 2428 } 2429 if (old->in_plabel[0] != '\0') { 2430 np->in_plabel = nlen; 2431 nlen = ipf_addfrstr(names, nlen, old->in_plabel, 2432 LIFNAMSIZ); 2433 } 2434 np->in_namelen = nlen; 2435 np->in_size = size; 2436 } 2437 } 2438 2439 2440 static void 2441 ipnat_4_1_0_to_current(ipnat_4_1_0_t *old, void *current, int size) 2442 { 2443 ipnat_t *np = (ipnat_t *)current; 2444 2445 np->in_space = old->in_space; 2446 np->in_hv[0] = old->in_hv; 2447 np->in_hv[1] = old->in_hv; 2448 np->in_flineno = old->in_flineno; 2449 if (old->in_redir == NAT_REDIRECT) 2450 np->in_dpnext = old->in_pnext; 2451 else 2452 np->in_spnext = old->in_pnext; 2453 np->in_v[0] = old->in_v; 2454 np->in_v[1] = old->in_v; 2455 np->in_flags = old->in_flags; 2456 np->in_mssclamp = old->in_mssclamp; 2457 np->in_age[0] = old->in_age[0]; 2458 np->in_age[1] = old->in_age[1]; 2459 np->in_redir = old->in_redir; 2460 np->in_pr[0] = old->in_p; 2461 np->in_pr[1] = old->in_p; 2462 if (np->in_redir == NAT_REDIRECT) { 2463 np->in_ndst.na_nextaddr = old->in_next6; 2464 bcopy(&old->in_in, &np->in_ndst.na_addr, sizeof(old->in_in)); 2465 bcopy(&old->in_out, &np->in_odst.na_addr, sizeof(old->in_out)); 2466 bcopy(&old->in_src, &np->in_osrc.na_addr, sizeof(old->in_src)); 2467 } else { 2468 np->in_nsrc.na_nextaddr = old->in_next6; 2469 bcopy(&old->in_in, &np->in_osrc.na_addr, sizeof(old->in_in)); 2470 bcopy(&old->in_out, &np->in_nsrc.na_addr, sizeof(old->in_out)); 2471 bcopy(&old->in_src, &np->in_odst.na_addr, sizeof(old->in_src)); 2472 } 2473 ipfv4tuctov5(&old->in_tuc, &np->in_tuc); 2474 if (np->in_redir == NAT_REDIRECT) { 2475 np->in_dpmin = old->in_port[0]; 2476 np->in_dpmax = old->in_port[1]; 2477 } else { 2478 np->in_spmin = old->in_port[0]; 2479 np->in_spmax = old->in_port[1]; 2480 } 2481 np->in_ppip = old->in_ppip; 2482 np->in_ippip = old->in_ippip; 2483 bcopy(&old->in_tag, &np->in_tag, sizeof(np->in_tag)); 2484 2485 np->in_namelen = 0; 2486 np->in_plabel = -1; 2487 np->in_ifnames[0] = -1; 2488 np->in_ifnames[1] = -1; 2489 2490 if (size == 0) { 2491 np->in_size = sizeof(*np); 2492 np->in_size += LIFNAMSIZ * 2 + APR_LABELLEN; 2493 np->in_size += 3; 2494 } else { 2495 int nlen = np->in_namelen; 2496 char *names = np->in_names; 2497 2498 if (old->in_ifnames[0][0] != '\0') { 2499 np->in_ifnames[0] = nlen; 2500 nlen = ipf_addfrstr(names, nlen, old->in_ifnames[0], 2501 LIFNAMSIZ); 2502 } 2503 if (old->in_ifnames[1][0] != '\0') { 2504 np->in_ifnames[0] = nlen; 2505 nlen = ipf_addfrstr(names, nlen, old->in_ifnames[1], 2506 LIFNAMSIZ); 2507 } 2508 if (old->in_plabel[0] != '\0') { 2509 np->in_plabel = nlen; 2510 nlen = ipf_addfrstr(names, nlen, old->in_plabel, 2511 LIFNAMSIZ); 2512 } 2513 np->in_namelen = nlen; 2514 np->in_size = size; 2515 } 2516 } 2517 2518 2519 static void 2520 frauth_4_1_32_to_current(frauth_4_1_32_t *old, void *current) 2521 { 2522 frauth_t *fra = (frauth_t *)current; 2523 2524 fra->fra_age = old->fra_age; 2525 fra->fra_len = old->fra_len; 2526 fra->fra_index = old->fra_index; 2527 fra->fra_pass = old->fra_pass; 2528 fr_info_4_1_32_to_current(&old->fra_info, &fra->fra_info); 2529 fra->fra_buf = old->fra_buf; 2530 fra->fra_flx = old->fra_flx; 2531 #ifdef MENTAT 2532 fra->fra_q = old->fra_q; 2533 fra->fra_m = old->fra_m; 2534 #endif 2535 } 2536 2537 2538 static void 2539 frauth_4_1_29_to_current(frauth_4_1_29_t *old, void *current) 2540 { 2541 frauth_t *fra = (frauth_t *)current; 2542 2543 fra->fra_age = old->fra_age; 2544 fra->fra_len = old->fra_len; 2545 fra->fra_index = old->fra_index; 2546 fra->fra_pass = old->fra_pass; 2547 fr_info_4_1_24_to_current(&old->fra_info, &fra->fra_info); 2548 fra->fra_buf = old->fra_buf; 2549 fra->fra_flx = old->fra_flx; 2550 #ifdef MENTAT 2551 fra->fra_q = old->fra_q; 2552 fra->fra_m = old->fra_m; 2553 #endif 2554 } 2555 2556 2557 static void 2558 frauth_4_1_24_to_current(frauth_4_1_24_t *old, void *current) 2559 { 2560 frauth_t *fra = (frauth_t *)current; 2561 2562 fra->fra_age = old->fra_age; 2563 fra->fra_len = old->fra_len; 2564 fra->fra_index = old->fra_index; 2565 fra->fra_pass = old->fra_pass; 2566 fr_info_4_1_24_to_current(&old->fra_info, &fra->fra_info); 2567 fra->fra_buf = old->fra_buf; 2568 #ifdef MENTAT 2569 fra->fra_q = old->fra_q; 2570 fra->fra_m = old->fra_m; 2571 #endif 2572 } 2573 2574 2575 static void 2576 frauth_4_1_23_to_current(frauth_4_1_23_t *old, void *current) 2577 { 2578 frauth_t *fra = (frauth_t *)current; 2579 2580 fra->fra_age = old->fra_age; 2581 fra->fra_len = old->fra_len; 2582 fra->fra_index = old->fra_index; 2583 fra->fra_pass = old->fra_pass; 2584 fr_info_4_1_23_to_current(&old->fra_info, &fra->fra_info); 2585 fra->fra_buf = old->fra_buf; 2586 #ifdef MENTAT 2587 fra->fra_q = old->fra_q; 2588 fra->fra_m = old->fra_m; 2589 #endif 2590 } 2591 2592 2593 static void 2594 frauth_4_1_11_to_current(frauth_4_1_11_t *old, void *current) 2595 { 2596 frauth_t *fra = (frauth_t *)current; 2597 2598 fra->fra_age = old->fra_age; 2599 fra->fra_len = old->fra_len; 2600 fra->fra_index = old->fra_index; 2601 fra->fra_pass = old->fra_pass; 2602 fr_info_4_1_11_to_current(&old->fra_info, &fra->fra_info); 2603 fra->fra_buf = old->fra_buf; 2604 #ifdef MENTAT 2605 fra->fra_q = old->fra_q; 2606 fra->fra_m = old->fra_m; 2607 #endif 2608 } 2609 2610 2611 static void 2612 fr_info_4_1_32_to_current(fr_info_4_1_32_t *old, void *current) 2613 { 2614 fr_info_t *fin = (fr_info_t *)current; 2615 2616 fin->fin_ifp = old->fin_ifp; 2617 ipf_v4iptov5(&old->fin_fi, &fin->fin_fi); 2618 bcopy(&old->fin_dat, &fin->fin_dat, sizeof(old->fin_dat)); 2619 fin->fin_out = old->fin_out; 2620 fin->fin_rev = old->fin_rev; 2621 fin->fin_hlen = old->fin_hlen; 2622 fin->fin_tcpf = old->ofin_tcpf; 2623 fin->fin_icode = old->fin_icode; 2624 fin->fin_rule = old->fin_rule; 2625 bcopy(old->fin_group, fin->fin_group, sizeof(old->fin_group)); 2626 fin->fin_fr = old->fin_fr; 2627 fin->fin_dp = old->fin_dp; 2628 fin->fin_dlen = old->fin_dlen; 2629 fin->fin_plen = old->fin_plen; 2630 fin->fin_ipoff = old->fin_ipoff; 2631 fin->fin_id = old->fin_id; 2632 fin->fin_off = old->fin_off; 2633 fin->fin_depth = old->fin_depth; 2634 fin->fin_error = old->fin_error; 2635 fin->fin_cksum = old->fin_cksum; 2636 fin->fin_nattag = old->fin_nattag; 2637 fin->fin_ip = old->ofin_ip; 2638 fin->fin_mp = old->fin_mp; 2639 fin->fin_m = old->fin_m; 2640 #ifdef MENTAT 2641 fin->fin_qfm = old->fin_qfm; 2642 fin->fin_qpi = old->fin_qpi; 2643 #endif 2644 #ifdef __sgi 2645 fin->fin_hbuf = old->fin_hbuf; 2646 #endif 2647 } 2648 2649 2650 static void 2651 fr_info_4_1_24_to_current(fr_info_4_1_24_t *old, void *current) 2652 { 2653 fr_info_t *fin = (fr_info_t *)current; 2654 2655 fin->fin_ifp = old->fin_ifp; 2656 ipf_v4iptov5(&old->fin_fi, &fin->fin_fi); 2657 bcopy(&old->fin_dat, &fin->fin_dat, sizeof(old->fin_dat)); 2658 fin->fin_out = old->fin_out; 2659 fin->fin_rev = old->fin_rev; 2660 fin->fin_hlen = old->fin_hlen; 2661 fin->fin_tcpf = old->ofin_tcpf; 2662 fin->fin_icode = old->fin_icode; 2663 fin->fin_rule = old->fin_rule; 2664 bcopy(old->fin_group, fin->fin_group, sizeof(old->fin_group)); 2665 fin->fin_fr = old->fin_fr; 2666 fin->fin_dp = old->fin_dp; 2667 fin->fin_dlen = old->fin_dlen; 2668 fin->fin_plen = old->fin_plen; 2669 fin->fin_ipoff = old->fin_ipoff; 2670 fin->fin_id = old->fin_id; 2671 fin->fin_off = old->fin_off; 2672 fin->fin_depth = old->fin_depth; 2673 fin->fin_error = old->fin_error; 2674 fin->fin_cksum = old->fin_cksum; 2675 fin->fin_nattag = old->fin_nattag; 2676 fin->fin_ip = old->ofin_ip; 2677 fin->fin_mp = old->fin_mp; 2678 fin->fin_m = old->fin_m; 2679 #ifdef MENTAT 2680 fin->fin_qfm = old->fin_qfm; 2681 fin->fin_qpi = old->fin_qpi; 2682 #endif 2683 #ifdef __sgi 2684 fin->fin_hbuf = old->fin_hbuf; 2685 #endif 2686 } 2687 2688 2689 static void 2690 fr_info_4_1_23_to_current(fr_info_4_1_23_t *old, void *current) 2691 { 2692 fr_info_t *fin = (fr_info_t *)current; 2693 2694 fin->fin_ifp = old->fin_ifp; 2695 ipf_v4iptov5(&old->fin_fi, &fin->fin_fi); 2696 bcopy(&old->fin_dat, &fin->fin_dat, sizeof(old->fin_dat)); 2697 fin->fin_out = old->fin_out; 2698 fin->fin_rev = old->fin_rev; 2699 fin->fin_hlen = old->fin_hlen; 2700 fin->fin_tcpf = old->ofin_tcpf; 2701 fin->fin_icode = old->fin_icode; 2702 fin->fin_rule = old->fin_rule; 2703 bcopy(old->fin_group, fin->fin_group, sizeof(old->fin_group)); 2704 fin->fin_fr = old->fin_fr; 2705 fin->fin_dp = old->fin_dp; 2706 fin->fin_dlen = old->fin_dlen; 2707 fin->fin_plen = old->fin_plen; 2708 fin->fin_ipoff = old->fin_ipoff; 2709 fin->fin_id = old->fin_id; 2710 fin->fin_off = old->fin_off; 2711 fin->fin_depth = old->fin_depth; 2712 fin->fin_error = old->fin_error; 2713 fin->fin_nattag = old->fin_nattag; 2714 fin->fin_ip = old->ofin_ip; 2715 fin->fin_mp = old->fin_mp; 2716 fin->fin_m = old->fin_m; 2717 #ifdef MENTAT 2718 fin->fin_qfm = old->fin_qfm; 2719 fin->fin_qpi = old->fin_qpi; 2720 #endif 2721 #ifdef __sgi 2722 fin->fin_hbuf = fin->fin_hbuf; 2723 #endif 2724 } 2725 2726 2727 static void 2728 fr_info_4_1_11_to_current(fr_info_4_1_11_t *old, void *current) 2729 { 2730 fr_info_t *fin = (fr_info_t *)current; 2731 2732 fin->fin_ifp = old->fin_ifp; 2733 ipf_v4iptov5(&old->fin_fi, &fin->fin_fi); 2734 bcopy(&old->fin_dat, &fin->fin_dat, sizeof(old->fin_dat)); 2735 fin->fin_out = old->fin_out; 2736 fin->fin_rev = old->fin_rev; 2737 fin->fin_hlen = old->fin_hlen; 2738 fin->fin_tcpf = old->ofin_tcpf; 2739 fin->fin_icode = old->fin_icode; 2740 fin->fin_rule = old->fin_rule; 2741 bcopy(old->fin_group, fin->fin_group, sizeof(old->fin_group)); 2742 fin->fin_fr = old->fin_fr; 2743 fin->fin_dp = old->fin_dp; 2744 fin->fin_dlen = old->fin_dlen; 2745 fin->fin_plen = old->fin_plen; 2746 fin->fin_ipoff = old->fin_ipoff; 2747 fin->fin_id = old->fin_id; 2748 fin->fin_off = old->fin_off; 2749 fin->fin_depth = old->fin_depth; 2750 fin->fin_error = old->fin_error; 2751 fin->fin_nattag = old->fin_nattag; 2752 fin->fin_ip = old->ofin_ip; 2753 fin->fin_mp = old->fin_mp; 2754 fin->fin_m = old->fin_m; 2755 #ifdef MENTAT 2756 fin->fin_qfm = old->fin_qfm; 2757 fin->fin_qpi = old->fin_qpi; 2758 #endif 2759 #ifdef __sgi 2760 fin->fin_hbuf = fin->fin_hbuf; 2761 #endif 2762 } 2763 2764 2765 static void 2766 nat_4_1_3_to_current(nat_4_1_3_t *old, nat_t *current) 2767 { 2768 bzero((void *)current, sizeof(*current)); 2769 bcopy((void *)old, (void *)current, sizeof(*old)); 2770 } 2771 2772 2773 static void 2774 nat_4_1_14_to_current(nat_4_1_14_t *old, nat_t *current) 2775 { 2776 bzero((void *)current, sizeof(*current)); 2777 bcopy((void *)old, (void *)current, sizeof(*old)); 2778 } 2779 2780 2781 static void 2782 nat_save_4_1_16_to_current(ipf_main_softc_t *softc, nat_save_4_1_16_t *old, 2783 void *current) 2784 { 2785 nat_save_t *nats = (nat_save_t *)current; 2786 2787 nats->ipn_next = old->ipn_next; 2788 nat_4_1_14_to_current(&old->ipn_nat, &nats->ipn_nat); 2789 bcopy(&old->ipn_ipnat, &nats->ipn_ipnat, sizeof(old->ipn_ipnat)); 2790 frentry_4_1_16_to_current(softc, &old->ipn_fr, &nats->ipn_fr, 0); 2791 nats->ipn_dsize = old->ipn_dsize; 2792 bcopy(old->ipn_data, nats->ipn_data, sizeof(nats->ipn_data)); 2793 } 2794 2795 2796 static void 2797 nat_save_4_1_14_to_current(ipf_main_softc_t *softc, nat_save_4_1_14_t *old, 2798 void *current) 2799 { 2800 nat_save_t *nats = (nat_save_t *)current; 2801 2802 nats->ipn_next = old->ipn_next; 2803 nat_4_1_14_to_current(&old->ipn_nat, &nats->ipn_nat); 2804 bcopy(&old->ipn_ipnat, &nats->ipn_ipnat, sizeof(old->ipn_ipnat)); 2805 frentry_4_1_0_to_current(softc, &old->ipn_fr, &nats->ipn_fr, 0); 2806 nats->ipn_dsize = old->ipn_dsize; 2807 bcopy(old->ipn_data, nats->ipn_data, sizeof(nats->ipn_data)); 2808 } 2809 2810 2811 static void 2812 nat_save_4_1_3_to_current(ipf_main_softc_t *softc, nat_save_4_1_3_t *old, 2813 void *current) 2814 { 2815 nat_save_t *nats = (nat_save_t *)current; 2816 2817 nats->ipn_next = old->ipn_next; 2818 nat_4_1_3_to_current(&old->ipn_nat, &nats->ipn_nat); 2819 ipnat_4_1_0_to_current(&old->ipn_ipnat, &nats->ipn_ipnat, 0); 2820 frentry_4_1_0_to_current(softc, &old->ipn_fr, &nats->ipn_fr, 0); 2821 nats->ipn_dsize = old->ipn_dsize; 2822 bcopy(old->ipn_data, nats->ipn_data, sizeof(nats->ipn_data)); 2823 } 2824 2825 2826 static void 2827 natstat_current_to_4_1_32(void *current, natstat_4_1_32_t *old) 2828 { 2829 natstat_t *ns = (natstat_t *)current; 2830 2831 old->ns_mapped[0] = ns->ns_side[0].ns_translated; 2832 old->ns_mapped[1] = ns->ns_side[1].ns_translated; 2833 old->ns_rules = ns->ns_side[0].ns_inuse + ns->ns_side[1].ns_inuse; 2834 old->ns_added = ns->ns_side[0].ns_added + ns->ns_side[1].ns_added; 2835 old->ns_expire = ns->ns_expire; 2836 old->ns_inuse = ns->ns_side[0].ns_inuse + ns->ns_side[1].ns_inuse; 2837 old->ns_logged = ns->ns_log_ok; 2838 old->ns_logfail = ns->ns_log_fail; 2839 old->ns_memfail = ns->ns_side[0].ns_memfail + ns->ns_side[1].ns_memfail; 2840 old->ns_badnat = ns->ns_side[0].ns_badnat + ns->ns_side[1].ns_badnat; 2841 old->ns_addtrpnt = ns->ns_addtrpnt; 2842 old->ns_table[0] = ns->ns_side[0].ns_table; 2843 old->ns_table[1] = ns->ns_side[1].ns_table; 2844 old->ns_maptable = NULL; 2845 old->ns_list = ns->ns_list; 2846 old->ns_apslist = NULL; 2847 old->ns_wilds = ns->ns_wilds; 2848 old->ns_nattab_sz = ns->ns_nattab_sz; 2849 old->ns_nattab_max = ns->ns_nattab_max; 2850 old->ns_rultab_sz = ns->ns_rultab_sz; 2851 old->ns_rdrtab_sz = ns->ns_rdrtab_sz; 2852 old->ns_trpntab_sz = ns->ns_trpntab_sz; 2853 old->ns_hostmap_sz = 0; 2854 old->ns_instances = ns->ns_instances; 2855 old->ns_maplist = ns->ns_maplist; 2856 old->ns_bucketlen[0] = (u_long *)ns->ns_side[0].ns_bucketlen; 2857 old->ns_bucketlen[1] = (u_long *)ns->ns_side[1].ns_bucketlen; 2858 old->ns_ticks = ns->ns_ticks; 2859 old->ns_orphans = ns->ns_orphans; 2860 old->ns_uncreate[0][0] = ns->ns_side[0].ns_uncreate[0]; 2861 old->ns_uncreate[0][1] = ns->ns_side[0].ns_uncreate[1]; 2862 old->ns_uncreate[1][0] = ns->ns_side[1].ns_uncreate[0]; 2863 old->ns_uncreate[1][1] = ns->ns_side[1].ns_uncreate[1]; 2864 } 2865 2866 2867 static void 2868 natstat_current_to_4_1_27(void *current, natstat_4_1_27_t *old) 2869 { 2870 natstat_t *ns = (natstat_t *)current; 2871 2872 old->ns_mapped[0] = ns->ns_side[0].ns_translated; 2873 old->ns_mapped[1] = ns->ns_side[1].ns_translated; 2874 old->ns_rules = ns->ns_side[0].ns_inuse + ns->ns_side[1].ns_inuse; 2875 old->ns_added = ns->ns_side[0].ns_added + ns->ns_side[1].ns_added; 2876 old->ns_expire = ns->ns_expire; 2877 old->ns_inuse = ns->ns_side[0].ns_inuse + ns->ns_side[1].ns_inuse; 2878 old->ns_logged = ns->ns_log_ok; 2879 old->ns_logfail = ns->ns_log_fail; 2880 old->ns_memfail = ns->ns_side[0].ns_memfail + ns->ns_side[1].ns_memfail; 2881 old->ns_badnat = ns->ns_side[0].ns_badnat + ns->ns_side[1].ns_badnat; 2882 old->ns_addtrpnt = ns->ns_addtrpnt; 2883 old->ns_table[0] = ns->ns_side[0].ns_table; 2884 old->ns_table[1] = ns->ns_side[1].ns_table; 2885 old->ns_maptable = NULL; 2886 old->ns_list = ns->ns_list; 2887 old->ns_apslist = NULL; 2888 old->ns_wilds = ns->ns_wilds; 2889 old->ns_nattab_sz = ns->ns_nattab_sz; 2890 old->ns_nattab_max = ns->ns_nattab_max; 2891 old->ns_rultab_sz = ns->ns_rultab_sz; 2892 old->ns_rdrtab_sz = ns->ns_rdrtab_sz; 2893 old->ns_trpntab_sz = ns->ns_trpntab_sz; 2894 old->ns_hostmap_sz = 0; 2895 old->ns_instances = ns->ns_instances; 2896 old->ns_maplist = ns->ns_maplist; 2897 old->ns_bucketlen[0] = (u_long *)ns->ns_side[0].ns_bucketlen; 2898 old->ns_bucketlen[1] = (u_long *)ns->ns_side[1].ns_bucketlen; 2899 old->ns_ticks = ns->ns_ticks; 2900 old->ns_orphans = ns->ns_orphans; 2901 } 2902 2903 2904 static void 2905 natstat_current_to_4_1_16(void *current, natstat_4_1_16_t *old) 2906 { 2907 natstat_t *ns = (natstat_t *)current; 2908 2909 old->ns_mapped[0] = ns->ns_side[0].ns_translated; 2910 old->ns_mapped[1] = ns->ns_side[1].ns_translated; 2911 old->ns_rules = ns->ns_side[0].ns_inuse + ns->ns_side[1].ns_inuse; 2912 old->ns_added = ns->ns_side[0].ns_added + ns->ns_side[1].ns_added; 2913 old->ns_expire = ns->ns_expire; 2914 old->ns_inuse = ns->ns_side[0].ns_inuse + ns->ns_side[1].ns_inuse; 2915 old->ns_logged = ns->ns_log_ok; 2916 old->ns_logfail = ns->ns_log_fail; 2917 old->ns_memfail = ns->ns_side[0].ns_memfail + ns->ns_side[1].ns_memfail; 2918 old->ns_badnat = ns->ns_side[0].ns_badnat + ns->ns_side[1].ns_badnat; 2919 old->ns_addtrpnt = ns->ns_addtrpnt; 2920 old->ns_table[0] = ns->ns_side[0].ns_table; 2921 old->ns_table[1] = ns->ns_side[1].ns_table; 2922 old->ns_maptable = NULL; 2923 old->ns_list = ns->ns_list; 2924 old->ns_apslist = NULL; 2925 old->ns_wilds = ns->ns_wilds; 2926 old->ns_nattab_sz = ns->ns_nattab_sz; 2927 old->ns_nattab_max = ns->ns_nattab_max; 2928 old->ns_rultab_sz = ns->ns_rultab_sz; 2929 old->ns_rdrtab_sz = ns->ns_rdrtab_sz; 2930 old->ns_trpntab_sz = ns->ns_trpntab_sz; 2931 old->ns_hostmap_sz = 0; 2932 old->ns_instances = ns->ns_instances; 2933 old->ns_maplist = ns->ns_maplist; 2934 old->ns_bucketlen[0] = (u_long *)ns->ns_side[0].ns_bucketlen; 2935 old->ns_bucketlen[1] = (u_long *)ns->ns_side[1].ns_bucketlen; 2936 old->ns_ticks = ns->ns_ticks; 2937 } 2938 2939 2940 static void 2941 natstat_current_to_4_1_0(void *current, natstat_4_1_0_t *old) 2942 { 2943 natstat_t *ns = (natstat_t *)current; 2944 2945 old->ns_mapped[0] = ns->ns_side[0].ns_translated; 2946 old->ns_mapped[1] = ns->ns_side[1].ns_translated; 2947 old->ns_rules = ns->ns_side[0].ns_inuse + ns->ns_side[1].ns_inuse; 2948 old->ns_added = ns->ns_side[0].ns_added + ns->ns_side[1].ns_added; 2949 old->ns_expire = ns->ns_expire; 2950 old->ns_inuse = ns->ns_side[0].ns_inuse + ns->ns_side[1].ns_inuse; 2951 old->ns_logged = ns->ns_log_ok; 2952 old->ns_logfail = ns->ns_log_fail; 2953 old->ns_memfail = ns->ns_side[0].ns_memfail + ns->ns_side[1].ns_memfail; 2954 old->ns_badnat = ns->ns_side[0].ns_badnat + ns->ns_side[1].ns_badnat; 2955 old->ns_addtrpnt = ns->ns_addtrpnt; 2956 old->ns_table[0] = ns->ns_side[0].ns_table; 2957 old->ns_table[1] = ns->ns_side[1].ns_table; 2958 old->ns_maptable = NULL; 2959 old->ns_list = ns->ns_list; 2960 old->ns_apslist = NULL; 2961 old->ns_wilds = ns->ns_wilds; 2962 old->ns_nattab_sz = ns->ns_nattab_sz; 2963 old->ns_nattab_max = ns->ns_nattab_max; 2964 old->ns_rultab_sz = ns->ns_rultab_sz; 2965 old->ns_rdrtab_sz = ns->ns_rdrtab_sz; 2966 old->ns_trpntab_sz = ns->ns_trpntab_sz; 2967 old->ns_hostmap_sz = 0; 2968 old->ns_instances = ns->ns_instances; 2969 old->ns_maplist = ns->ns_maplist; 2970 old->ns_bucketlen[0] = (u_long *)ns->ns_side[0].ns_bucketlen; 2971 old->ns_bucketlen[1] = (u_long *)ns->ns_side[1].ns_bucketlen; 2972 } 2973 2974 2975 static void 2976 ipstate_save_current_to_4_1_16(void *current, ipstate_save_4_1_16_t *old) 2977 { 2978 ipstate_save_t *ips = (ipstate_save_t *)current; 2979 2980 old->ips_next = ips->ips_next; 2981 ipstate_current_to_4_1_0(&ips->ips_is, &old->ips_is); 2982 frentry_current_to_4_1_16(&ips->ips_fr, &old->ips_fr); 2983 } 2984 2985 2986 static void 2987 ipstate_save_current_to_4_1_0(void *current, ipstate_save_4_1_0_t *old) 2988 { 2989 ipstate_save_t *ips = (ipstate_save_t *)current; 2990 2991 old->ips_next = ips->ips_next; 2992 ipstate_current_to_4_1_0(&ips->ips_is, &old->ips_is); 2993 frentry_current_to_4_1_0(&ips->ips_fr, &old->ips_fr); 2994 } 2995 2996 2997 int 2998 ipf_out_compat(ipf_main_softc_t *softc, ipfobj_t *obj, void *ptr) 2999 { 3000 frentry_t *fr; 3001 int error; 3002 3003 IPFERROR(140042); 3004 error = EINVAL; 3005 3006 switch (obj->ipfo_type) 3007 { 3008 default : 3009 break; 3010 3011 case IPFOBJ_FRENTRY : 3012 if (obj->ipfo_rev >= 4013400) { 3013 frentry_4_1_34_t *old; 3014 3015 KMALLOC(old, frentry_4_1_34_t *); 3016 if (old == NULL) { 3017 IPFERROR(140043); 3018 error = ENOMEM; 3019 break; 3020 } 3021 frentry_current_to_4_1_34(ptr, old); 3022 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3023 if (error == 0 && old->fr_dsize > 0) { 3024 char *dst = obj->ipfo_ptr; 3025 3026 fr = ptr; 3027 dst += sizeof(*old); 3028 error = COPYOUT(fr->fr_data, dst, 3029 old->fr_dsize); 3030 if (error != 0) { 3031 IPFERROR(140044); 3032 } 3033 } 3034 KFREE(old); 3035 obj->ipfo_size = sizeof(*old); 3036 } else if (obj->ipfo_rev >= 4011600) { 3037 frentry_4_1_16_t *old; 3038 3039 KMALLOC(old, frentry_4_1_16_t *); 3040 if (old == NULL) { 3041 IPFERROR(140045); 3042 error = ENOMEM; 3043 break; 3044 } 3045 frentry_current_to_4_1_16(ptr, old); 3046 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3047 if (error != 0) { 3048 IPFERROR(140046); 3049 } 3050 KFREE(old); 3051 obj->ipfo_size = sizeof(*old); 3052 } else { 3053 frentry_4_1_0_t *old; 3054 3055 KMALLOC(old, frentry_4_1_0_t *); 3056 if (old == NULL) { 3057 IPFERROR(140047); 3058 error = ENOMEM; 3059 break; 3060 } 3061 frentry_current_to_4_1_0(ptr, old); 3062 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3063 if (error != 0) { 3064 IPFERROR(140048); 3065 } 3066 KFREE(old); 3067 obj->ipfo_size = sizeof(*old); 3068 } 3069 break; 3070 3071 case IPFOBJ_IPFSTAT : 3072 if (obj->ipfo_rev >= 4013300) { 3073 friostat_4_1_33_t *old; 3074 3075 KMALLOC(old, friostat_4_1_33_t *); 3076 if (old == NULL) { 3077 IPFERROR(140049); 3078 error = ENOMEM; 3079 break; 3080 } 3081 friostat_current_to_4_1_33(ptr, old, obj->ipfo_rev); 3082 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3083 if (error != 0) { 3084 IPFERROR(140050); 3085 } 3086 KFREE(old); 3087 } else { 3088 friostat_4_1_0_t *old; 3089 3090 KMALLOC(old, friostat_4_1_0_t *); 3091 if (old == NULL) { 3092 IPFERROR(140051); 3093 error = ENOMEM; 3094 break; 3095 } 3096 friostat_current_to_4_1_0(ptr, old, obj->ipfo_rev); 3097 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3098 if (error != 0) { 3099 IPFERROR(140052); 3100 } 3101 KFREE(old); 3102 } 3103 break; 3104 3105 case IPFOBJ_IPFINFO : /* unused */ 3106 break; 3107 3108 case IPFOBJ_IPNAT : 3109 if (obj->ipfo_rev >= 4011400) { 3110 ipnat_4_1_14_t *old; 3111 3112 KMALLOC(old, ipnat_4_1_14_t *); 3113 if (old == NULL) { 3114 IPFERROR(140053); 3115 error = ENOMEM; 3116 break; 3117 } 3118 ipnat_current_to_4_1_14(ptr, old); 3119 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3120 if (error != 0) { 3121 IPFERROR(140054); 3122 } 3123 KFREE(old); 3124 } else { 3125 ipnat_4_1_0_t *old; 3126 3127 KMALLOC(old, ipnat_4_1_0_t *); 3128 if (old == NULL) { 3129 IPFERROR(140055); 3130 error = ENOMEM; 3131 break; 3132 } 3133 ipnat_current_to_4_1_0(ptr, old); 3134 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3135 if (error != 0) { 3136 IPFERROR(140056); 3137 } 3138 KFREE(old); 3139 } 3140 break; 3141 3142 case IPFOBJ_NATSTAT : 3143 if (obj->ipfo_rev >= 4013200) { 3144 natstat_4_1_32_t *old; 3145 3146 KMALLOC(old, natstat_4_1_32_t *); 3147 if (old == NULL) { 3148 IPFERROR(140057); 3149 error = ENOMEM; 3150 break; 3151 } 3152 natstat_current_to_4_1_32(ptr, old); 3153 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3154 if (error != 0) { 3155 IPFERROR(140058); 3156 } 3157 KFREE(old); 3158 } else if (obj->ipfo_rev >= 4012700) { 3159 natstat_4_1_27_t *old; 3160 3161 KMALLOC(old, natstat_4_1_27_t *); 3162 if (old == NULL) { 3163 IPFERROR(140059); 3164 error = ENOMEM; 3165 break; 3166 } 3167 natstat_current_to_4_1_27(ptr, old); 3168 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3169 if (error != 0) { 3170 IPFERROR(140060); 3171 } 3172 KFREE(old); 3173 } else if (obj->ipfo_rev >= 4011600) { 3174 natstat_4_1_16_t *old; 3175 3176 KMALLOC(old, natstat_4_1_16_t *); 3177 if (old == NULL) { 3178 IPFERROR(140061); 3179 error = ENOMEM; 3180 break; 3181 } 3182 natstat_current_to_4_1_16(ptr, old); 3183 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3184 if (error != 0) { 3185 IPFERROR(140062); 3186 } 3187 KFREE(old); 3188 } else { 3189 natstat_4_1_0_t *old; 3190 3191 KMALLOC(old, natstat_4_1_0_t *); 3192 if (old == NULL) { 3193 IPFERROR(140063); 3194 error = ENOMEM; 3195 break; 3196 } 3197 natstat_current_to_4_1_0(ptr, old); 3198 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3199 if (error != 0) { 3200 IPFERROR(140064); 3201 } 3202 KFREE(old); 3203 } 3204 break; 3205 3206 case IPFOBJ_STATESAVE : 3207 if (obj->ipfo_rev >= 4011600) { 3208 ipstate_save_4_1_16_t *old; 3209 3210 KMALLOC(old, ipstate_save_4_1_16_t *); 3211 if (old == NULL) { 3212 IPFERROR(140065); 3213 error = ENOMEM; 3214 break; 3215 } 3216 ipstate_save_current_to_4_1_16(ptr, old); 3217 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3218 if (error != 0) { 3219 IPFERROR(140066); 3220 } 3221 KFREE(old); 3222 } else { 3223 ipstate_save_4_1_0_t *old; 3224 3225 KMALLOC(old, ipstate_save_4_1_0_t *); 3226 if (old == NULL) { 3227 IPFERROR(140067); 3228 error = ENOMEM; 3229 break; 3230 } 3231 ipstate_save_current_to_4_1_0(ptr, old); 3232 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3233 if (error != 0) { 3234 IPFERROR(140068); 3235 } 3236 KFREE(old); 3237 } 3238 break; 3239 3240 case IPFOBJ_NATSAVE : 3241 if (obj->ipfo_rev >= 4011600) { 3242 nat_save_4_1_16_t *old16; 3243 3244 KMALLOC(old16, nat_save_4_1_16_t *); 3245 if (old16 == NULL) { 3246 IPFERROR(140069); 3247 error = ENOMEM; 3248 break; 3249 } 3250 nat_save_current_to_4_1_16(ptr, old16); 3251 error = COPYOUT(&old16, obj->ipfo_ptr, sizeof(*old16)); 3252 if (error != 0) { 3253 IPFERROR(140070); 3254 } 3255 KFREE(old16); 3256 } else if (obj->ipfo_rev >= 4011400) { 3257 nat_save_4_1_14_t *old14; 3258 3259 KMALLOC(old14, nat_save_4_1_14_t *); 3260 if (old14 == NULL) { 3261 IPFERROR(140071); 3262 error = ENOMEM; 3263 break; 3264 } 3265 nat_save_current_to_4_1_14(ptr, old14); 3266 error = COPYOUT(&old14, obj->ipfo_ptr, sizeof(*old14)); 3267 if (error != 0) { 3268 IPFERROR(140072); 3269 } 3270 KFREE(old14); 3271 } else if (obj->ipfo_rev >= 4010300) { 3272 nat_save_4_1_3_t *old3; 3273 3274 KMALLOC(old3, nat_save_4_1_3_t *); 3275 if (old3 == NULL) { 3276 IPFERROR(140073); 3277 error = ENOMEM; 3278 break; 3279 } 3280 nat_save_current_to_4_1_3(ptr, old3); 3281 error = COPYOUT(&old3, obj->ipfo_ptr, sizeof(*old3)); 3282 if (error != 0) { 3283 IPFERROR(140074); 3284 } 3285 KFREE(old3); 3286 } 3287 break; 3288 3289 case IPFOBJ_IPSTATE : 3290 if (obj->ipfo_rev >= 4011600) { 3291 ipstate_4_1_16_t *old; 3292 3293 KMALLOC(old, ipstate_4_1_16_t *); 3294 if (old == NULL) { 3295 IPFERROR(140075); 3296 error = ENOMEM; 3297 break; 3298 } 3299 ipstate_current_to_4_1_16(ptr, old); 3300 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3301 if (error != 0) { 3302 IPFERROR(140076); 3303 } 3304 KFREE(old); 3305 } else { 3306 ipstate_4_1_0_t *old; 3307 3308 KMALLOC(old, ipstate_4_1_0_t *); 3309 if (old == NULL) { 3310 IPFERROR(140077); 3311 error = ENOMEM; 3312 break; 3313 } 3314 ipstate_current_to_4_1_0(ptr, old); 3315 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3316 if (error != 0) { 3317 IPFERROR(140078); 3318 } 3319 KFREE(old); 3320 } 3321 break; 3322 3323 case IPFOBJ_STATESTAT : 3324 if (obj->ipfo_rev >= 4012100) { 3325 ips_stat_4_1_21_t *old; 3326 3327 KMALLOC(old, ips_stat_4_1_21_t *); 3328 if (old == NULL) { 3329 IPFERROR(140079); 3330 error = ENOMEM; 3331 break; 3332 } 3333 ips_stat_current_to_4_1_21(ptr, old); 3334 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3335 if (error != 0) { 3336 IPFERROR(140080); 3337 } 3338 KFREE(old); 3339 } else { 3340 ips_stat_4_1_0_t *old; 3341 3342 KMALLOC(old, ips_stat_4_1_0_t *); 3343 if (old == NULL) { 3344 IPFERROR(140081); 3345 error = ENOMEM; 3346 break; 3347 } 3348 ips_stat_current_to_4_1_0(ptr, old); 3349 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3350 if (error != 0) { 3351 IPFERROR(140082); 3352 } 3353 KFREE(old); 3354 } 3355 break; 3356 3357 case IPFOBJ_FRAUTH : 3358 if (obj->ipfo_rev >= 4012900) { 3359 frauth_4_1_29_t *old29; 3360 3361 KMALLOC(old29, frauth_4_1_29_t *); 3362 if (old29 == NULL) { 3363 IPFERROR(140083); 3364 error = ENOMEM; 3365 break; 3366 } 3367 frauth_current_to_4_1_29(ptr, old29); 3368 error = COPYOUT(old29, obj->ipfo_ptr, sizeof(*old29)); 3369 if (error != 0) { 3370 IPFERROR(140084); 3371 } 3372 KFREE(old29); 3373 } else if (obj->ipfo_rev >= 4012400) { 3374 frauth_4_1_24_t *old24; 3375 3376 KMALLOC(old24, frauth_4_1_24_t *); 3377 if (old24 == NULL) { 3378 IPFERROR(140085); 3379 error = ENOMEM; 3380 break; 3381 } 3382 frauth_current_to_4_1_24(ptr, old24); 3383 error = COPYOUT(old24, obj->ipfo_ptr, sizeof(*old24)); 3384 if (error != 0) { 3385 IPFERROR(140086); 3386 } 3387 KFREE(old24); 3388 } else if (obj->ipfo_rev >= 4012300) { 3389 frauth_4_1_23_t *old23; 3390 3391 KMALLOC(old23, frauth_4_1_23_t *); 3392 if (old23 == NULL) { 3393 IPFERROR(140087); 3394 error = ENOMEM; 3395 break; 3396 } 3397 frauth_current_to_4_1_23(ptr, old23); 3398 error = COPYOUT(old23, obj->ipfo_ptr, sizeof(*old23)); 3399 if (error != 0) { 3400 IPFERROR(140088); 3401 } 3402 KFREE(old23); 3403 } else if (obj->ipfo_rev >= 4011100) { 3404 frauth_4_1_11_t *old11; 3405 3406 KMALLOC(old11, frauth_4_1_11_t *); 3407 if (old11 == NULL) { 3408 IPFERROR(140089); 3409 error = ENOMEM; 3410 break; 3411 } 3412 frauth_current_to_4_1_11(ptr, old11); 3413 error = COPYOUT(old11, obj->ipfo_ptr, sizeof(*old11)); 3414 if (error != 0) { 3415 IPFERROR(140090); 3416 } 3417 KFREE(old11); 3418 } 3419 break; 3420 3421 case IPFOBJ_NAT : 3422 if (obj->ipfo_rev >= 4012500) { 3423 nat_4_1_25_t *old; 3424 3425 KMALLOC(old, nat_4_1_25_t *); 3426 if (old == NULL) { 3427 IPFERROR(140091); 3428 error = ENOMEM; 3429 break; 3430 } 3431 nat_current_to_4_1_25(ptr, old); 3432 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3433 if (error != 0) { 3434 IPFERROR(140092); 3435 } 3436 KFREE(old); 3437 } else if (obj->ipfo_rev >= 4011400) { 3438 nat_4_1_14_t *old; 3439 3440 KMALLOC(old, nat_4_1_14_t *); 3441 if (old == NULL) { 3442 IPFERROR(140093); 3443 error = ENOMEM; 3444 break; 3445 } 3446 nat_current_to_4_1_14(ptr, old); 3447 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3448 if (error != 0) { 3449 IPFERROR(140094); 3450 } 3451 KFREE(old); 3452 } else if (obj->ipfo_rev >= 4010300) { 3453 nat_4_1_3_t *old; 3454 3455 KMALLOC(old, nat_4_1_3_t *); 3456 if (old == NULL) { 3457 IPFERROR(140095); 3458 error = ENOMEM; 3459 break; 3460 } 3461 nat_current_to_4_1_3(ptr, old); 3462 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3463 if (error != 0) { 3464 IPFERROR(140096); 3465 } 3466 KFREE(old); 3467 } 3468 break; 3469 3470 case IPFOBJ_FRIPF : 3471 if (obj->ipfo_rev < 5000000) { 3472 fripf4_t *old; 3473 3474 KMALLOC(old, fripf4_t *); 3475 if (old == NULL) { 3476 IPFERROR(140097); 3477 error = ENOMEM; 3478 break; 3479 } 3480 ipf_v5fripftov4(ptr, old); 3481 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3482 if (error != 0) { 3483 IPFERROR(140098); 3484 } 3485 KFREE(old); 3486 } 3487 break; 3488 } 3489 return error; 3490 } 3491 3492 3493 static void 3494 friostat_current_to_4_1_33(void *current, friostat_4_1_33_t *old, int rev) 3495 { 3496 friostat_t *fiop = (friostat_t *)current; 3497 3498 bcopy(&fiop->f_st[0].fr_pass, &old->of_st[0], sizeof(old->of_st[0])); 3499 bcopy(&fiop->f_st[1].fr_pass, &old->of_st[1], sizeof(old->of_st[1])); 3500 3501 old->f_ipf[0][0] = fiop->f_ipf[0][0]; 3502 old->f_ipf[0][1] = fiop->f_ipf[0][1]; 3503 old->f_ipf[1][0] = fiop->f_ipf[1][0]; 3504 old->f_ipf[1][1] = fiop->f_ipf[1][1]; 3505 old->f_acct[0][0] = fiop->f_acct[0][0]; 3506 old->f_acct[0][1] = fiop->f_acct[0][1]; 3507 old->f_acct[1][0] = fiop->f_acct[1][0]; 3508 old->f_acct[1][1] = fiop->f_acct[1][1]; 3509 old->f_ipf6[0][0] = NULL; 3510 old->f_ipf6[0][1] = NULL; 3511 old->f_ipf6[1][0] = NULL; 3512 old->f_ipf6[1][1] = NULL; 3513 old->f_acct6[0][0] = NULL; 3514 old->f_acct6[0][1] = NULL; 3515 old->f_acct6[1][0] = NULL; 3516 old->f_acct6[1][1] = NULL; 3517 old->f_auth = fiop->f_auth; 3518 bcopy(&fiop->f_groups, &old->f_groups, sizeof(old->f_groups)); 3519 bcopy(&fiop->f_froute, &old->f_froute, sizeof(old->f_froute)); 3520 old->f_ticks = fiop->f_ticks; 3521 bcopy(&fiop->f_locks, &old->f_locks, sizeof(old->f_locks)); 3522 old->f_kmutex_sz = 0; 3523 old->f_krwlock_sz = 0; 3524 old->f_defpass = fiop->f_defpass; 3525 old->f_active = fiop->f_active; 3526 old->f_running = fiop->f_running; 3527 old->f_logging = fiop->f_logging; 3528 old->f_features = fiop->f_features; 3529 snprintf(old->f_version, sizeof(old->f_version), "IP Filter: v%d.%d.%d", 3530 (rev / 1000000) % 100, (rev / 10000) % 100, (rev / 100) % 100); 3531 } 3532 3533 3534 static void 3535 friostat_current_to_4_1_0(void *current, friostat_4_1_0_t *old, int rev) 3536 { 3537 friostat_t *fiop = (friostat_t *)current; 3538 3539 bcopy(&fiop->f_st[0].fr_pass, &old->of_st[0], sizeof(old->of_st[0])); 3540 bcopy(&fiop->f_st[1].fr_pass, &old->of_st[1], sizeof(old->of_st[1])); 3541 3542 old->f_ipf[0][0] = fiop->f_ipf[0][0]; 3543 old->f_ipf[0][1] = fiop->f_ipf[0][1]; 3544 old->f_ipf[1][0] = fiop->f_ipf[1][0]; 3545 old->f_ipf[1][1] = fiop->f_ipf[1][1]; 3546 old->f_acct[0][0] = fiop->f_acct[0][0]; 3547 old->f_acct[0][1] = fiop->f_acct[0][1]; 3548 old->f_acct[1][0] = fiop->f_acct[1][0]; 3549 old->f_acct[1][1] = fiop->f_acct[1][1]; 3550 old->f_ipf6[0][0] = NULL; 3551 old->f_ipf6[0][1] = NULL; 3552 old->f_ipf6[1][0] = NULL; 3553 old->f_ipf6[1][1] = NULL; 3554 old->f_acct6[0][0] = NULL; 3555 old->f_acct6[0][1] = NULL; 3556 old->f_acct6[1][0] = NULL; 3557 old->f_acct6[1][1] = NULL; 3558 old->f_auth = fiop->f_auth; 3559 bcopy(&fiop->f_groups, &old->f_groups, sizeof(old->f_groups)); 3560 bcopy(&fiop->f_froute, &old->f_froute, sizeof(old->f_froute)); 3561 old->f_ticks = fiop->f_ticks; 3562 old->f_ipf[0][0] = fiop->f_ipf[0][0]; 3563 old->f_ipf[0][1] = fiop->f_ipf[0][1]; 3564 old->f_ipf[1][0] = fiop->f_ipf[1][0]; 3565 old->f_ipf[1][1] = fiop->f_ipf[1][1]; 3566 old->f_acct[0][0] = fiop->f_acct[0][0]; 3567 old->f_acct[0][1] = fiop->f_acct[0][1]; 3568 old->f_acct[1][0] = fiop->f_acct[1][0]; 3569 old->f_acct[1][1] = fiop->f_acct[1][1]; 3570 old->f_ipf6[0][0] = NULL; 3571 old->f_ipf6[0][1] = NULL; 3572 old->f_ipf6[1][0] = NULL; 3573 old->f_ipf6[1][1] = NULL; 3574 old->f_acct6[0][0] = NULL; 3575 old->f_acct6[0][1] = NULL; 3576 old->f_acct6[1][0] = NULL; 3577 old->f_acct6[1][1] = NULL; 3578 old->f_auth = fiop->f_auth; 3579 bcopy(&fiop->f_groups, &old->f_groups, sizeof(old->f_groups)); 3580 bcopy(&fiop->f_froute, &old->f_froute, sizeof(old->f_froute)); 3581 old->f_ticks = fiop->f_ticks; 3582 bcopy(&fiop->f_locks, &old->f_locks, sizeof(old->f_locks)); 3583 old->f_kmutex_sz = 0; 3584 old->f_krwlock_sz = 0; 3585 old->f_defpass = fiop->f_defpass; 3586 old->f_active = fiop->f_active; 3587 old->f_running = fiop->f_running; 3588 old->f_logging = fiop->f_logging; 3589 old->f_features = fiop->f_features; 3590 snprintf(old->f_version, sizeof(old->f_version), "IP Filter: v%d.%d.%d", 3591 (rev / 1000000) % 100, (rev / 10000) % 100, (rev / 100) % 100); 3592 } 3593 3594 3595 /* 3596 * nflags is v5 flags, returns v4 flags. 3597 */ 3598 static int 3599 fr_frflags5to4(u_32_t nflags) 3600 { 3601 u_32_t oflags = 0; 3602 3603 switch (nflags & FR_CMDMASK) { 3604 case FR_CALL : 3605 oflags = 0x0; 3606 break; 3607 case FR_BLOCK : 3608 oflags = 0x1; 3609 break; 3610 case FR_PASS : 3611 oflags = 0x2; 3612 break; 3613 case FR_AUTH : 3614 oflags = 0x3; 3615 break; 3616 case FR_PREAUTH : 3617 oflags = 0x4; 3618 break; 3619 case FR_ACCOUNT : 3620 oflags = 0x5; 3621 break; 3622 case FR_SKIP : 3623 oflags = 0x6; 3624 break; 3625 default : 3626 break; 3627 } 3628 3629 if (nflags & FR_LOG) 3630 oflags |= 0x00010; 3631 if (nflags & FR_CALLNOW) 3632 oflags |= 0x00020; 3633 if (nflags & FR_NOTSRCIP) 3634 oflags |= 0x00080; 3635 if (nflags & FR_NOTDSTIP) 3636 oflags |= 0x00040; 3637 if (nflags & FR_QUICK) 3638 oflags |= 0x00100; 3639 if (nflags & FR_KEEPFRAG) 3640 oflags |= 0x00200; 3641 if (nflags & FR_KEEPSTATE) 3642 oflags |= 0x00400; 3643 if (nflags & FR_FASTROUTE) 3644 oflags |= 0x00800; 3645 if (nflags & FR_RETRST) 3646 oflags |= 0x01000; 3647 if (nflags & FR_RETICMP) 3648 oflags |= 0x02000; 3649 if (nflags & FR_FAKEICMP) 3650 oflags |= 0x03000; 3651 if (nflags & FR_OUTQUE) 3652 oflags |= 0x04000; 3653 if (nflags & FR_INQUE) 3654 oflags |= 0x08000; 3655 if (nflags & FR_LOGBODY) 3656 oflags |= 0x10000; 3657 if (nflags & FR_LOGFIRST) 3658 oflags |= 0x20000; 3659 if (nflags & FR_LOGORBLOCK) 3660 oflags |= 0x40000; 3661 if (nflags & FR_FRSTRICT) 3662 oflags |= 0x100000; 3663 if (nflags & FR_STSTRICT) 3664 oflags |= 0x200000; 3665 if (nflags & FR_NEWISN) 3666 oflags |= 0x400000; 3667 if (nflags & FR_NOICMPERR) 3668 oflags |= 0x800000; 3669 if (nflags & FR_STATESYNC) 3670 oflags |= 0x1000000; 3671 if (nflags & FR_NOMATCH) 3672 oflags |= 0x8000000; 3673 if (nflags & FR_COPIED) 3674 oflags |= 0x40000000; 3675 if (nflags & FR_INACTIVE) 3676 oflags |= 0x80000000; 3677 3678 return oflags; 3679 } 3680 3681 3682 static void 3683 frentry_current_to_4_1_34(void *current, frentry_4_1_34_t *old) 3684 { 3685 frentry_t *fr = (frentry_t *)current; 3686 3687 old->fr_lock = fr->fr_lock; 3688 old->fr_next = fr->fr_next; 3689 old->fr_grp = (void *)fr->fr_grp; 3690 old->fr_isc = fr->fr_isc; 3691 old->fr_ifas[0] = fr->fr_ifas[0]; 3692 old->fr_ifas[1] = fr->fr_ifas[1]; 3693 old->fr_ifas[2] = fr->fr_ifas[2]; 3694 old->fr_ifas[3] = fr->fr_ifas[3]; 3695 old->fr_ptr = fr->fr_ptr; 3696 old->fr_comment = NULL; 3697 old->fr_ref = fr->fr_ref; 3698 old->fr_statecnt = fr->fr_statecnt; 3699 old->fr_hits = fr->fr_hits; 3700 old->fr_bytes = fr->fr_bytes; 3701 old->fr_lastpkt.tv_sec = fr->fr_lastpkt.tv_sec; 3702 old->fr_lastpkt.tv_usec = fr->fr_lastpkt.tv_usec; 3703 old->fr_curpps = fr->fr_curpps; 3704 old->fr_dun.fru_data = fr->fr_dun.fru_data; 3705 old->fr_func = fr->fr_func; 3706 old->fr_dsize = fr->fr_dsize; 3707 old->fr_pps = fr->fr_pps; 3708 old->fr_statemax = fr->fr_statemax; 3709 old->fr_flineno = fr->fr_flineno; 3710 old->fr_type = fr->fr_type; 3711 old->fr_flags = fr_frflags5to4(fr->fr_flags); 3712 old->fr_logtag = fr->fr_logtag; 3713 old->fr_collect = fr->fr_collect; 3714 old->fr_arg = fr->fr_arg; 3715 old->fr_loglevel = fr->fr_loglevel; 3716 old->fr_age[0] = fr->fr_age[0]; 3717 old->fr_age[1] = fr->fr_age[1]; 3718 if (fr->fr_family == AF_INET) 3719 old->fr_v = 4; 3720 if (fr->fr_family == AF_INET6) 3721 old->fr_v = 6; 3722 old->fr_icode = fr->fr_icode; 3723 old->fr_cksum = fr->fr_cksum; 3724 old->fr_tifs[0].ofd_ip6 = fr->fr_tifs[0].fd_ip6; 3725 old->fr_tifs[1].ofd_ip6 = fr->fr_tifs[0].fd_ip6; 3726 old->fr_dif.ofd_ip6 = fr->fr_dif.fd_ip6; 3727 if (fr->fr_ifnames[0] >= 0) { 3728 strncpy(old->fr_ifnames[0], fr->fr_names + fr->fr_ifnames[0], 3729 LIFNAMSIZ); 3730 old->fr_ifnames[0][LIFNAMSIZ - 1] = '\0'; 3731 } 3732 if (fr->fr_ifnames[1] >= 0) { 3733 strncpy(old->fr_ifnames[1], fr->fr_names + fr->fr_ifnames[1], 3734 LIFNAMSIZ); 3735 old->fr_ifnames[1][LIFNAMSIZ - 1] = '\0'; 3736 } 3737 if (fr->fr_ifnames[2] >= 0) { 3738 strncpy(old->fr_ifnames[2], fr->fr_names + fr->fr_ifnames[2], 3739 LIFNAMSIZ); 3740 old->fr_ifnames[2][LIFNAMSIZ - 1] = '\0'; 3741 } 3742 if (fr->fr_ifnames[3] >= 0) { 3743 strncpy(old->fr_ifnames[3], fr->fr_names + fr->fr_ifnames[3], 3744 LIFNAMSIZ); 3745 old->fr_ifnames[3][LIFNAMSIZ - 1] = '\0'; 3746 } 3747 if (fr->fr_tifs[0].fd_name >= 0) { 3748 strncpy(old->fr_tifs[0].fd_ifname, 3749 fr->fr_names + fr->fr_tifs[0].fd_name, LIFNAMSIZ); 3750 old->fr_tifs[0].fd_ifname[LIFNAMSIZ - 1] = '\0'; 3751 } 3752 if (fr->fr_tifs[1].fd_name >= 0) { 3753 strncpy(old->fr_tifs[1].fd_ifname, 3754 fr->fr_names + fr->fr_tifs[1].fd_name, LIFNAMSIZ); 3755 old->fr_tifs[1].fd_ifname[LIFNAMSIZ - 1] = '\0'; 3756 } 3757 if (fr->fr_dif.fd_name >= 0) { 3758 strncpy(old->fr_dif.fd_ifname, 3759 fr->fr_names + fr->fr_dif.fd_name, LIFNAMSIZ); 3760 old->fr_dif.fd_ifname[LIFNAMSIZ - 1] = '\0'; 3761 } 3762 if (fr->fr_group >= 0) { 3763 strncpy(old->fr_group, fr->fr_names + fr->fr_group, 3764 FR_GROUPLEN); 3765 old->fr_group[FR_GROUPLEN - 1] = '\0'; 3766 } 3767 if (fr->fr_grhead >= 0) { 3768 strncpy(old->fr_grhead, fr->fr_names + fr->fr_grhead, 3769 FR_GROUPLEN); 3770 old->fr_grhead[FR_GROUPLEN - 1] = '\0'; 3771 } 3772 } 3773 3774 3775 static void 3776 frentry_current_to_4_1_16(void *current, frentry_4_1_16_t *old) 3777 { 3778 frentry_t *fr = (frentry_t *)current; 3779 3780 old->fr_lock = fr->fr_lock; 3781 old->fr_next = fr->fr_next; 3782 old->fr_grp = (void *)fr->fr_grp; 3783 old->fr_isc = fr->fr_isc; 3784 old->fr_ifas[0] = fr->fr_ifas[0]; 3785 old->fr_ifas[1] = fr->fr_ifas[1]; 3786 old->fr_ifas[2] = fr->fr_ifas[2]; 3787 old->fr_ifas[3] = fr->fr_ifas[3]; 3788 old->fr_ptr = fr->fr_ptr; 3789 old->fr_comment = NULL; 3790 old->fr_ref = fr->fr_ref; 3791 old->fr_statecnt = fr->fr_statecnt; 3792 old->fr_hits = fr->fr_hits; 3793 old->fr_bytes = fr->fr_bytes; 3794 old->fr_lastpkt.tv_sec = fr->fr_lastpkt.tv_sec; 3795 old->fr_lastpkt.tv_usec = fr->fr_lastpkt.tv_usec; 3796 old->fr_curpps = fr->fr_curpps; 3797 old->fr_dun.fru_data = fr->fr_dun.fru_data; 3798 old->fr_func = fr->fr_func; 3799 old->fr_dsize = fr->fr_dsize; 3800 old->fr_pps = fr->fr_pps; 3801 old->fr_statemax = fr->fr_statemax; 3802 old->fr_flineno = fr->fr_flineno; 3803 old->fr_type = fr->fr_type; 3804 old->fr_flags = fr_frflags5to4(fr->fr_flags); 3805 old->fr_logtag = fr->fr_logtag; 3806 old->fr_collect = fr->fr_collect; 3807 old->fr_arg = fr->fr_arg; 3808 old->fr_loglevel = fr->fr_loglevel; 3809 old->fr_age[0] = fr->fr_age[0]; 3810 old->fr_age[1] = fr->fr_age[1]; 3811 if (old->fr_v == 4) 3812 fr->fr_family = AF_INET; 3813 if (old->fr_v == 6) 3814 fr->fr_family = AF_INET6; 3815 old->fr_icode = fr->fr_icode; 3816 old->fr_cksum = fr->fr_cksum; 3817 old->fr_tifs[0].ofd_ip6 = fr->fr_tifs[0].fd_ip6; 3818 old->fr_tifs[1].ofd_ip6 = fr->fr_tifs[0].fd_ip6; 3819 old->fr_dif.ofd_ip6 = fr->fr_dif.fd_ip6; 3820 if (fr->fr_ifnames[0] >= 0) { 3821 strncpy(old->fr_ifnames[0], fr->fr_names + fr->fr_ifnames[0], 3822 LIFNAMSIZ); 3823 old->fr_ifnames[0][LIFNAMSIZ - 1] = '\0'; 3824 } 3825 if (fr->fr_ifnames[1] >= 0) { 3826 strncpy(old->fr_ifnames[1], fr->fr_names + fr->fr_ifnames[1], 3827 LIFNAMSIZ); 3828 old->fr_ifnames[1][LIFNAMSIZ - 1] = '\0'; 3829 } 3830 if (fr->fr_ifnames[2] >= 0) { 3831 strncpy(old->fr_ifnames[2], fr->fr_names + fr->fr_ifnames[2], 3832 LIFNAMSIZ); 3833 old->fr_ifnames[2][LIFNAMSIZ - 1] = '\0'; 3834 } 3835 if (fr->fr_ifnames[3] >= 0) { 3836 strncpy(old->fr_ifnames[3], fr->fr_names + fr->fr_ifnames[3], 3837 LIFNAMSIZ); 3838 old->fr_ifnames[3][LIFNAMSIZ - 1] = '\0'; 3839 } 3840 if (fr->fr_tifs[0].fd_name >= 0) { 3841 strncpy(old->fr_tifs[0].fd_ifname, 3842 fr->fr_names + fr->fr_tifs[0].fd_name, LIFNAMSIZ); 3843 old->fr_tifs[0].fd_ifname[LIFNAMSIZ - 1] = '\0'; 3844 } 3845 if (fr->fr_tifs[1].fd_name >= 0) { 3846 strncpy(old->fr_tifs[1].fd_ifname, 3847 fr->fr_names + fr->fr_tifs[1].fd_name, LIFNAMSIZ); 3848 old->fr_tifs[1].fd_ifname[LIFNAMSIZ - 1] = '\0'; 3849 } 3850 if (fr->fr_dif.fd_name >= 0) { 3851 strncpy(old->fr_dif.fd_ifname, 3852 fr->fr_names + fr->fr_dif.fd_name, LIFNAMSIZ); 3853 old->fr_dif.fd_ifname[LIFNAMSIZ - 1] = '\0'; 3854 } 3855 if (fr->fr_group >= 0) { 3856 strncpy(old->fr_group, fr->fr_names + fr->fr_group, 3857 FR_GROUPLEN); 3858 old->fr_group[FR_GROUPLEN - 1] = '\0'; 3859 } 3860 if (fr->fr_grhead >= 0) { 3861 strncpy(old->fr_grhead, fr->fr_names + fr->fr_grhead, 3862 FR_GROUPLEN); 3863 old->fr_grhead[FR_GROUPLEN - 1] = '\0'; 3864 } 3865 } 3866 3867 3868 static void 3869 frentry_current_to_4_1_0(void *current, frentry_4_1_0_t *old) 3870 { 3871 frentry_t *fr = (frentry_t *)current; 3872 3873 old->fr_lock = fr->fr_lock; 3874 old->fr_next = fr->fr_next; 3875 old->fr_grp = (void *)fr->fr_grp; 3876 old->fr_isc = fr->fr_isc; 3877 old->fr_ifas[0] = fr->fr_ifas[0]; 3878 old->fr_ifas[1] = fr->fr_ifas[1]; 3879 old->fr_ifas[2] = fr->fr_ifas[2]; 3880 old->fr_ifas[3] = fr->fr_ifas[3]; 3881 old->fr_ptr = fr->fr_ptr; 3882 old->fr_comment = NULL; 3883 old->fr_ref = fr->fr_ref; 3884 old->fr_statecnt = fr->fr_statecnt; 3885 old->fr_hits = fr->fr_hits; 3886 old->fr_bytes = fr->fr_bytes; 3887 old->fr_lastpkt.tv_sec = fr->fr_lastpkt.tv_sec; 3888 old->fr_lastpkt.tv_usec = fr->fr_lastpkt.tv_usec; 3889 old->fr_curpps = fr->fr_curpps; 3890 old->fr_dun.fru_data = fr->fr_dun.fru_data; 3891 old->fr_func = fr->fr_func; 3892 old->fr_dsize = fr->fr_dsize; 3893 old->fr_pps = fr->fr_pps; 3894 old->fr_statemax = fr->fr_statemax; 3895 old->fr_flineno = fr->fr_flineno; 3896 old->fr_type = fr->fr_type; 3897 old->fr_flags = fr_frflags5to4(fr->fr_flags); 3898 old->fr_logtag = fr->fr_logtag; 3899 old->fr_collect = fr->fr_collect; 3900 old->fr_arg = fr->fr_arg; 3901 old->fr_loglevel = fr->fr_loglevel; 3902 old->fr_age[0] = fr->fr_age[0]; 3903 old->fr_age[1] = fr->fr_age[1]; 3904 if (old->fr_v == 4) 3905 fr->fr_family = AF_INET; 3906 if (old->fr_v == 6) 3907 fr->fr_family = AF_INET6; 3908 old->fr_icode = fr->fr_icode; 3909 old->fr_cksum = fr->fr_cksum; 3910 old->fr_tifs[0].ofd_ip6 = fr->fr_tifs[0].fd_ip6; 3911 old->fr_tifs[1].ofd_ip6 = fr->fr_tifs[0].fd_ip6; 3912 old->fr_dif.ofd_ip6 = fr->fr_dif.fd_ip6; 3913 if (fr->fr_ifnames[0] >= 0) { 3914 strncpy(old->fr_ifnames[0], fr->fr_names + fr->fr_ifnames[0], 3915 LIFNAMSIZ); 3916 old->fr_ifnames[0][LIFNAMSIZ - 1] = '\0'; 3917 } 3918 if (fr->fr_ifnames[1] >= 0) { 3919 strncpy(old->fr_ifnames[1], fr->fr_names + fr->fr_ifnames[1], 3920 LIFNAMSIZ); 3921 old->fr_ifnames[1][LIFNAMSIZ - 1] = '\0'; 3922 } 3923 if (fr->fr_ifnames[2] >= 0) { 3924 strncpy(old->fr_ifnames[2], fr->fr_names + fr->fr_ifnames[2], 3925 LIFNAMSIZ); 3926 old->fr_ifnames[2][LIFNAMSIZ - 1] = '\0'; 3927 } 3928 if (fr->fr_ifnames[3] >= 0) { 3929 strncpy(old->fr_ifnames[3], fr->fr_names + fr->fr_ifnames[3], 3930 LIFNAMSIZ); 3931 old->fr_ifnames[3][LIFNAMSIZ - 1] = '\0'; 3932 } 3933 if (fr->fr_tifs[0].fd_name >= 0) { 3934 strncpy(old->fr_tifs[0].fd_ifname, 3935 fr->fr_names + fr->fr_tifs[0].fd_name, LIFNAMSIZ); 3936 old->fr_tifs[0].fd_ifname[LIFNAMSIZ - 1] = '\0'; 3937 } 3938 if (fr->fr_tifs[1].fd_name >= 0) { 3939 strncpy(old->fr_tifs[1].fd_ifname, 3940 fr->fr_names + fr->fr_tifs[1].fd_name, LIFNAMSIZ); 3941 old->fr_tifs[1].fd_ifname[LIFNAMSIZ - 1] = '\0'; 3942 } 3943 if (fr->fr_dif.fd_name >= 0) { 3944 strncpy(old->fr_dif.fd_ifname, 3945 fr->fr_names + fr->fr_dif.fd_name, LIFNAMSIZ); 3946 old->fr_dif.fd_ifname[LIFNAMSIZ - 1] = '\0'; 3947 } 3948 if (fr->fr_group >= 0) { 3949 strncpy(old->fr_group, fr->fr_names + fr->fr_group, 3950 FR_GROUPLEN); 3951 old->fr_group[FR_GROUPLEN - 1] = '\0'; 3952 } 3953 if (fr->fr_grhead >= 0) { 3954 strncpy(old->fr_grhead, fr->fr_names + fr->fr_grhead, 3955 FR_GROUPLEN); 3956 old->fr_grhead[FR_GROUPLEN - 1] = '\0'; 3957 } 3958 } 3959 3960 3961 static void 3962 fr_info_current_to_4_1_24(void *current, fr_info_4_1_24_t *old) 3963 { 3964 fr_info_t *fin = (fr_info_t *)current; 3965 3966 old->fin_ifp = fin->fin_ifp; 3967 ipf_v5iptov4(&fin->fin_fi, &old->fin_fi); 3968 bcopy(&fin->fin_dat, &old->fin_dat, sizeof(fin->fin_dat)); 3969 old->fin_out = fin->fin_out; 3970 old->fin_rev = fin->fin_rev; 3971 old->fin_hlen = fin->fin_hlen; 3972 old->ofin_tcpf = fin->fin_tcpf; 3973 old->fin_icode = fin->fin_icode; 3974 old->fin_rule = fin->fin_rule; 3975 bcopy(fin->fin_group, old->fin_group, sizeof(fin->fin_group)); 3976 old->fin_fr = fin->fin_fr; 3977 old->fin_dp = fin->fin_dp; 3978 old->fin_dlen = fin->fin_dlen; 3979 old->fin_plen = fin->fin_plen; 3980 old->fin_ipoff = fin->fin_ipoff; 3981 old->fin_id = fin->fin_id; 3982 old->fin_off = fin->fin_off; 3983 old->fin_depth = fin->fin_depth; 3984 old->fin_error = fin->fin_error; 3985 old->fin_cksum = fin->fin_cksum; 3986 old->fin_state = NULL; 3987 old->fin_nat = NULL; 3988 old->fin_nattag = fin->fin_nattag; 3989 old->fin_exthdr = NULL; 3990 old->ofin_ip = fin->fin_ip; 3991 old->fin_mp = fin->fin_mp; 3992 old->fin_m = fin->fin_m; 3993 #ifdef MENTAT 3994 old->fin_qfm = fin->fin_qfm; 3995 old->fin_qpi = fin->fin_qpi; 3996 old->fin_ifname[0] = '\0'; 3997 #endif 3998 #ifdef __sgi 3999 old->fin_hbuf = fin->fin_hbuf; 4000 #endif 4001 } 4002 4003 4004 static void 4005 fr_info_current_to_4_1_23(void *current, fr_info_4_1_23_t *old) 4006 { 4007 fr_info_t *fin = (fr_info_t *)current; 4008 4009 old->fin_ifp = fin->fin_ifp; 4010 ipf_v5iptov4(&fin->fin_fi, &old->fin_fi); 4011 bcopy(&fin->fin_dat, &old->fin_dat, sizeof(fin->fin_dat)); 4012 old->fin_out = fin->fin_out; 4013 old->fin_rev = fin->fin_rev; 4014 old->fin_hlen = fin->fin_hlen; 4015 old->ofin_tcpf = fin->fin_tcpf; 4016 old->fin_icode = fin->fin_icode; 4017 old->fin_rule = fin->fin_rule; 4018 bcopy(fin->fin_group, old->fin_group, sizeof(fin->fin_group)); 4019 old->fin_fr = fin->fin_fr; 4020 old->fin_dp = fin->fin_dp; 4021 old->fin_dlen = fin->fin_dlen; 4022 old->fin_plen = fin->fin_plen; 4023 old->fin_ipoff = fin->fin_ipoff; 4024 old->fin_id = fin->fin_id; 4025 old->fin_off = fin->fin_off; 4026 old->fin_depth = fin->fin_depth; 4027 old->fin_error = fin->fin_error; 4028 old->fin_state = NULL; 4029 old->fin_nat = NULL; 4030 old->fin_nattag = fin->fin_nattag; 4031 old->ofin_ip = fin->fin_ip; 4032 old->fin_mp = fin->fin_mp; 4033 old->fin_m = fin->fin_m; 4034 #ifdef MENTAT 4035 old->fin_qfm = fin->fin_qfm; 4036 old->fin_qpi = fin->fin_qpi; 4037 old->fin_ifname[0] = '\0'; 4038 #endif 4039 #ifdef __sgi 4040 old->fin_hbuf = fin->fin_hbuf; 4041 #endif 4042 } 4043 4044 4045 static void 4046 fr_info_current_to_4_1_11(void *current, fr_info_4_1_11_t *old) 4047 { 4048 fr_info_t *fin = (fr_info_t *)current; 4049 4050 old->fin_ifp = fin->fin_ifp; 4051 ipf_v5iptov4(&fin->fin_fi, &old->fin_fi); 4052 bcopy(&fin->fin_dat, &old->fin_dat, sizeof(fin->fin_dat)); 4053 old->fin_out = fin->fin_out; 4054 old->fin_rev = fin->fin_rev; 4055 old->fin_hlen = fin->fin_hlen; 4056 old->ofin_tcpf = fin->fin_tcpf; 4057 old->fin_icode = fin->fin_icode; 4058 old->fin_rule = fin->fin_rule; 4059 bcopy(fin->fin_group, old->fin_group, sizeof(fin->fin_group)); 4060 old->fin_fr = fin->fin_fr; 4061 old->fin_dp = fin->fin_dp; 4062 old->fin_dlen = fin->fin_dlen; 4063 old->fin_plen = fin->fin_plen; 4064 old->fin_ipoff = fin->fin_ipoff; 4065 old->fin_id = fin->fin_id; 4066 old->fin_off = fin->fin_off; 4067 old->fin_depth = fin->fin_depth; 4068 old->fin_error = fin->fin_error; 4069 old->fin_state = NULL; 4070 old->fin_nat = NULL; 4071 old->fin_nattag = fin->fin_nattag; 4072 old->ofin_ip = fin->fin_ip; 4073 old->fin_mp = fin->fin_mp; 4074 old->fin_m = fin->fin_m; 4075 #ifdef MENTAT 4076 old->fin_qfm = fin->fin_qfm; 4077 old->fin_qpi = fin->fin_qpi; 4078 old->fin_ifname[0] = '\0'; 4079 #endif 4080 #ifdef __sgi 4081 old->fin_hbuf = fin->fin_hbuf; 4082 #endif 4083 } 4084 4085 4086 static void 4087 frauth_current_to_4_1_29(void *current, frauth_4_1_29_t *old) 4088 { 4089 frauth_t *fra = (frauth_t *)current; 4090 4091 old->fra_age = fra->fra_age; 4092 old->fra_len = fra->fra_len; 4093 old->fra_index = fra->fra_index; 4094 old->fra_pass = fra->fra_pass; 4095 fr_info_current_to_4_1_24(&fra->fra_info, &old->fra_info); 4096 old->fra_buf = fra->fra_buf; 4097 old->fra_flx = fra->fra_flx; 4098 #ifdef MENTAT 4099 old->fra_q = fra->fra_q; 4100 old->fra_m = fra->fra_m; 4101 #endif 4102 } 4103 4104 4105 static void 4106 frauth_current_to_4_1_24(void *current, frauth_4_1_24_t *old) 4107 { 4108 frauth_t *fra = (frauth_t *)current; 4109 4110 old->fra_age = fra->fra_age; 4111 old->fra_len = fra->fra_len; 4112 old->fra_index = fra->fra_index; 4113 old->fra_pass = fra->fra_pass; 4114 fr_info_current_to_4_1_24(&fra->fra_info, &old->fra_info); 4115 old->fra_buf = fra->fra_buf; 4116 #ifdef MENTAT 4117 old->fra_q = fra->fra_q; 4118 old->fra_m = fra->fra_m; 4119 #endif 4120 } 4121 4122 4123 static void 4124 frauth_current_to_4_1_23(void *current, frauth_4_1_23_t *old) 4125 { 4126 frauth_t *fra = (frauth_t *)current; 4127 4128 old->fra_age = fra->fra_age; 4129 old->fra_len = fra->fra_len; 4130 old->fra_index = fra->fra_index; 4131 old->fra_pass = fra->fra_pass; 4132 fr_info_current_to_4_1_23(&fra->fra_info, &old->fra_info); 4133 old->fra_buf = fra->fra_buf; 4134 #ifdef MENTAT 4135 old->fra_q = fra->fra_q; 4136 old->fra_m = fra->fra_m; 4137 #endif 4138 } 4139 4140 4141 static void 4142 frauth_current_to_4_1_11(void *current, frauth_4_1_11_t *old) 4143 { 4144 frauth_t *fra = (frauth_t *)current; 4145 4146 old->fra_age = fra->fra_age; 4147 old->fra_len = fra->fra_len; 4148 old->fra_index = fra->fra_index; 4149 old->fra_pass = fra->fra_pass; 4150 fr_info_current_to_4_1_11(&fra->fra_info, &old->fra_info); 4151 old->fra_buf = fra->fra_buf; 4152 #ifdef MENTAT 4153 old->fra_q = fra->fra_q; 4154 old->fra_m = fra->fra_m; 4155 #endif 4156 } 4157 4158 4159 static void 4160 ipnat_current_to_4_1_14(void *current, ipnat_4_1_14_t *old) 4161 { 4162 ipnat_t *np = (ipnat_t *)current; 4163 4164 old->in_next = np->in_next; 4165 old->in_rnext = np->in_rnext; 4166 old->in_prnext = np->in_prnext; 4167 old->in_mnext = np->in_mnext; 4168 old->in_pmnext = np->in_pmnext; 4169 old->in_tqehead[0] = np->in_tqehead[0]; 4170 old->in_tqehead[1] = np->in_tqehead[1]; 4171 old->in_ifps[0] = np->in_ifps[0]; 4172 old->in_ifps[1] = np->in_ifps[1]; 4173 old->in_apr = np->in_apr; 4174 old->in_comment = np->in_comment; 4175 old->in_space = np->in_space; 4176 old->in_hits = np->in_hits; 4177 old->in_use = np->in_use; 4178 old->in_hv = np->in_hv[0]; 4179 old->in_flineno = np->in_flineno; 4180 if (old->in_redir == NAT_REDIRECT) 4181 old->in_pnext = np->in_dpnext; 4182 else 4183 old->in_pnext = np->in_spnext; 4184 old->in_v = np->in_v[0]; 4185 old->in_flags = np->in_flags; 4186 old->in_mssclamp = np->in_mssclamp; 4187 old->in_age[0] = np->in_age[0]; 4188 old->in_age[1] = np->in_age[1]; 4189 old->in_redir = np->in_redir; 4190 old->in_p = np->in_pr[0]; 4191 if (np->in_redir == NAT_REDIRECT) { 4192 old->in_next6 = np->in_ndst.na_nextaddr; 4193 old->in_in[0] = np->in_ndst.na_addr[0]; 4194 old->in_in[1] = np->in_ndst.na_addr[1]; 4195 old->in_out[0] = np->in_odst.na_addr[0]; 4196 old->in_out[1] = np->in_odst.na_addr[1]; 4197 old->in_src[0] = np->in_osrc.na_addr[0]; 4198 old->in_src[1] = np->in_osrc.na_addr[1]; 4199 } else { 4200 old->in_next6 = np->in_nsrc.na_nextaddr; 4201 old->in_out[0] = np->in_nsrc.na_addr[0]; 4202 old->in_out[1] = np->in_nsrc.na_addr[1]; 4203 old->in_in[0] = np->in_osrc.na_addr[0]; 4204 old->in_in[1] = np->in_osrc.na_addr[1]; 4205 old->in_src[0] = np->in_odst.na_addr[0]; 4206 old->in_src[1] = np->in_odst.na_addr[1]; 4207 } 4208 ipfv5tuctov4(&np->in_tuc, &old->in_tuc); 4209 if (np->in_redir == NAT_REDIRECT) { 4210 old->in_port[0] = np->in_dpmin; 4211 old->in_port[1] = np->in_dpmax; 4212 } else { 4213 old->in_port[0] = np->in_spmin; 4214 old->in_port[1] = np->in_spmax; 4215 } 4216 old->in_ppip = np->in_ppip; 4217 old->in_ippip = np->in_ippip; 4218 bcopy(&np->in_tag, &old->in_tag, sizeof(np->in_tag)); 4219 4220 if (np->in_ifnames[0] >= 0) { 4221 strncpy(old->in_ifnames[0], np->in_names + np->in_ifnames[0], 4222 LIFNAMSIZ); 4223 old->in_ifnames[0][LIFNAMSIZ - 1] = '\0'; 4224 } 4225 if (np->in_ifnames[1] >= 0) { 4226 strncpy(old->in_ifnames[1], np->in_names + np->in_ifnames[1], 4227 LIFNAMSIZ); 4228 old->in_ifnames[1][LIFNAMSIZ - 1] = '\0'; 4229 } 4230 if (np->in_plabel >= 0) { 4231 strncpy(old->in_plabel, np->in_names + np->in_plabel, 4232 APR_LABELLEN); 4233 old->in_plabel[APR_LABELLEN - 1] = '\0'; 4234 } 4235 } 4236 4237 4238 static void 4239 ipnat_current_to_4_1_0(void *current, ipnat_4_1_0_t *old) 4240 { 4241 ipnat_t *np = (ipnat_t *)current; 4242 4243 old->in_next = np->in_next; 4244 old->in_rnext = np->in_rnext; 4245 old->in_prnext = np->in_prnext; 4246 old->in_mnext = np->in_mnext; 4247 old->in_pmnext = np->in_pmnext; 4248 old->in_tqehead[0] = np->in_tqehead[0]; 4249 old->in_tqehead[1] = np->in_tqehead[1]; 4250 old->in_ifps[0] = np->in_ifps[0]; 4251 old->in_ifps[1] = np->in_ifps[1]; 4252 old->in_apr = np->in_apr; 4253 old->in_comment = np->in_comment; 4254 old->in_space = np->in_space; 4255 old->in_hits = np->in_hits; 4256 old->in_use = np->in_use; 4257 old->in_hv = np->in_hv[0]; 4258 old->in_flineno = np->in_flineno; 4259 if (old->in_redir == NAT_REDIRECT) 4260 old->in_pnext = np->in_dpnext; 4261 else 4262 old->in_pnext = np->in_spnext; 4263 old->in_v = np->in_v[0]; 4264 old->in_flags = np->in_flags; 4265 old->in_mssclamp = np->in_mssclamp; 4266 old->in_age[0] = np->in_age[0]; 4267 old->in_age[1] = np->in_age[1]; 4268 old->in_redir = np->in_redir; 4269 old->in_p = np->in_pr[0]; 4270 if (np->in_redir == NAT_REDIRECT) { 4271 old->in_next6 = np->in_ndst.na_nextaddr; 4272 old->in_in[0] = np->in_ndst.na_addr[0]; 4273 old->in_in[1] = np->in_ndst.na_addr[1]; 4274 old->in_out[0] = np->in_odst.na_addr[0]; 4275 old->in_out[1] = np->in_odst.na_addr[1]; 4276 old->in_src[0] = np->in_osrc.na_addr[0]; 4277 old->in_src[1] = np->in_osrc.na_addr[1]; 4278 } else { 4279 old->in_next6 = np->in_nsrc.na_nextaddr; 4280 old->in_out[0] = np->in_nsrc.na_addr[0]; 4281 old->in_out[1] = np->in_nsrc.na_addr[1]; 4282 old->in_in[0] = np->in_osrc.na_addr[0]; 4283 old->in_in[1] = np->in_osrc.na_addr[1]; 4284 old->in_src[0] = np->in_odst.na_addr[0]; 4285 old->in_src[1] = np->in_odst.na_addr[1]; 4286 } 4287 ipfv5tuctov4(&np->in_tuc, &old->in_tuc); 4288 if (np->in_redir == NAT_REDIRECT) { 4289 old->in_port[0] = np->in_dpmin; 4290 old->in_port[1] = np->in_dpmax; 4291 } else { 4292 old->in_port[0] = np->in_spmin; 4293 old->in_port[1] = np->in_spmax; 4294 } 4295 old->in_ppip = np->in_ppip; 4296 old->in_ippip = np->in_ippip; 4297 bcopy(&np->in_tag, &old->in_tag, sizeof(np->in_tag)); 4298 4299 if (np->in_ifnames[0] >= 0) { 4300 strncpy(old->in_ifnames[0], np->in_names + np->in_ifnames[0], 4301 LIFNAMSIZ); 4302 old->in_ifnames[0][LIFNAMSIZ - 1] = '\0'; 4303 } 4304 if (np->in_ifnames[1] >= 0) { 4305 strncpy(old->in_ifnames[1], np->in_names + np->in_ifnames[1], 4306 LIFNAMSIZ); 4307 old->in_ifnames[1][LIFNAMSIZ - 1] = '\0'; 4308 } 4309 if (np->in_plabel >= 0) { 4310 strncpy(old->in_plabel, np->in_names + np->in_plabel, 4311 APR_LABELLEN); 4312 old->in_plabel[APR_LABELLEN - 1] = '\0'; 4313 } 4314 } 4315 4316 4317 static void 4318 ipstate_current_to_4_1_16(void *current, ipstate_4_1_16_t *old) 4319 { 4320 ipstate_t *is = (ipstate_t *)current; 4321 4322 old->is_lock = is->is_lock; 4323 old->is_next = is->is_next; 4324 old->is_pnext = is->is_pnext; 4325 old->is_hnext = is->is_hnext; 4326 old->is_phnext = is->is_phnext; 4327 old->is_me = is->is_me; 4328 old->is_ifp[0] = is->is_ifp[0]; 4329 old->is_ifp[1] = is->is_ifp[1]; 4330 old->is_sync = is->is_sync; 4331 old->is_rule = is->is_rule; 4332 old->is_tqehead[0] = is->is_tqehead[0]; 4333 old->is_tqehead[1] = is->is_tqehead[1]; 4334 old->is_isc = is->is_isc; 4335 old->is_pkts[0] = is->is_pkts[0]; 4336 old->is_pkts[1] = is->is_pkts[1]; 4337 old->is_pkts[2] = is->is_pkts[2]; 4338 old->is_pkts[3] = is->is_pkts[3]; 4339 old->is_bytes[0] = is->is_bytes[0]; 4340 old->is_bytes[1] = is->is_bytes[1]; 4341 old->is_bytes[2] = is->is_bytes[2]; 4342 old->is_bytes[3] = is->is_bytes[3]; 4343 old->is_icmppkts[0] = is->is_icmppkts[0]; 4344 old->is_icmppkts[1] = is->is_icmppkts[1]; 4345 old->is_icmppkts[2] = is->is_icmppkts[2]; 4346 old->is_icmppkts[3] = is->is_icmppkts[3]; 4347 old->is_sti = is->is_sti; 4348 old->is_frage[0] = is->is_frage[0]; 4349 old->is_frage[1] = is->is_frage[1]; 4350 old->is_ref = is->is_ref; 4351 old->is_isninc[0] = is->is_isninc[0]; 4352 old->is_isninc[1] = is->is_isninc[1]; 4353 old->is_sumd[0] = is->is_sumd[0]; 4354 old->is_sumd[1] = is->is_sumd[1]; 4355 old->is_src = is->is_src; 4356 old->is_dst = is->is_dst; 4357 old->is_pass = is->is_pass; 4358 old->is_p = is->is_p; 4359 old->is_v = is->is_v; 4360 old->is_hv = is->is_hv; 4361 old->is_tag = is->is_tag; 4362 old->is_opt[0] = is->is_opt[0]; 4363 old->is_opt[1] = is->is_opt[1]; 4364 old->is_optmsk[0] = is->is_optmsk[0]; 4365 old->is_optmsk[1] = is->is_optmsk[1]; 4366 old->is_sec = is->is_sec; 4367 old->is_secmsk = is->is_secmsk; 4368 old->is_auth = is->is_auth; 4369 old->is_authmsk = is->is_authmsk; 4370 ipf_v5tcpinfoto4(&is->is_tcp, &old->is_tcp); 4371 old->is_flags = is->is_flags; 4372 old->is_flx[0][0] = is->is_flx[0][0]; 4373 old->is_flx[0][1] = is->is_flx[0][1]; 4374 old->is_flx[1][0] = is->is_flx[1][0]; 4375 old->is_flx[1][1] = is->is_flx[1][1]; 4376 old->is_rulen = is->is_rulen; 4377 old->is_s0[0] = is->is_s0[0]; 4378 old->is_s0[1] = is->is_s0[1]; 4379 old->is_smsk[0] = is->is_smsk[0]; 4380 old->is_smsk[1] = is->is_smsk[1]; 4381 bcopy(is->is_group, old->is_group, sizeof(is->is_group)); 4382 bcopy(is->is_sbuf, old->is_sbuf, sizeof(is->is_sbuf)); 4383 bcopy(is->is_ifname, old->is_ifname, sizeof(is->is_ifname)); 4384 } 4385 4386 4387 static void 4388 ipstate_current_to_4_1_0(void *current, ipstate_4_1_0_t *old) 4389 { 4390 ipstate_t *is = (ipstate_t *)current; 4391 4392 old->is_lock = is->is_lock; 4393 old->is_next = is->is_next; 4394 old->is_pnext = is->is_pnext; 4395 old->is_hnext = is->is_hnext; 4396 old->is_phnext = is->is_phnext; 4397 old->is_me = is->is_me; 4398 old->is_ifp[0] = is->is_ifp[0]; 4399 old->is_ifp[1] = is->is_ifp[1]; 4400 old->is_sync = is->is_sync; 4401 bzero(&old->is_nat, sizeof(old->is_nat)); 4402 old->is_rule = is->is_rule; 4403 old->is_tqehead[0] = is->is_tqehead[0]; 4404 old->is_tqehead[1] = is->is_tqehead[1]; 4405 old->is_isc = is->is_isc; 4406 old->is_pkts[0] = is->is_pkts[0]; 4407 old->is_pkts[1] = is->is_pkts[1]; 4408 old->is_pkts[2] = is->is_pkts[2]; 4409 old->is_pkts[3] = is->is_pkts[3]; 4410 old->is_bytes[0] = is->is_bytes[0]; 4411 old->is_bytes[1] = is->is_bytes[1]; 4412 old->is_bytes[2] = is->is_bytes[2]; 4413 old->is_bytes[3] = is->is_bytes[3]; 4414 old->is_icmppkts[0] = is->is_icmppkts[0]; 4415 old->is_icmppkts[1] = is->is_icmppkts[1]; 4416 old->is_icmppkts[2] = is->is_icmppkts[2]; 4417 old->is_icmppkts[3] = is->is_icmppkts[3]; 4418 old->is_sti = is->is_sti; 4419 old->is_frage[0] = is->is_frage[0]; 4420 old->is_frage[1] = is->is_frage[1]; 4421 old->is_ref = is->is_ref; 4422 old->is_isninc[0] = is->is_isninc[0]; 4423 old->is_isninc[1] = is->is_isninc[1]; 4424 old->is_sumd[0] = is->is_sumd[0]; 4425 old->is_sumd[1] = is->is_sumd[1]; 4426 old->is_src = is->is_src; 4427 old->is_dst = is->is_dst; 4428 old->is_pass = is->is_pass; 4429 old->is_p = is->is_p; 4430 old->is_v = is->is_v; 4431 old->is_hv = is->is_hv; 4432 old->is_tag = is->is_tag; 4433 old->is_opt[0] = is->is_opt[0]; 4434 old->is_opt[1] = is->is_opt[1]; 4435 old->is_optmsk[0] = is->is_optmsk[0]; 4436 old->is_optmsk[1] = is->is_optmsk[1]; 4437 old->is_sec = is->is_sec; 4438 old->is_secmsk = is->is_secmsk; 4439 old->is_auth = is->is_auth; 4440 old->is_authmsk = is->is_authmsk; 4441 ipf_v5tcpinfoto4(&is->is_tcp, &old->is_tcp); 4442 old->is_flags = is->is_flags; 4443 old->is_flx[0][0] = is->is_flx[0][0]; 4444 old->is_flx[0][1] = is->is_flx[0][1]; 4445 old->is_flx[1][0] = is->is_flx[1][0]; 4446 old->is_flx[1][1] = is->is_flx[1][1]; 4447 old->is_rulen = is->is_rulen; 4448 old->is_s0[0] = is->is_s0[0]; 4449 old->is_s0[1] = is->is_s0[1]; 4450 old->is_smsk[0] = is->is_smsk[0]; 4451 old->is_smsk[1] = is->is_smsk[1]; 4452 bcopy(is->is_group, old->is_group, sizeof(is->is_group)); 4453 bcopy(is->is_sbuf, old->is_sbuf, sizeof(is->is_sbuf)); 4454 bcopy(is->is_ifname, old->is_ifname, sizeof(is->is_ifname)); 4455 } 4456 4457 4458 static void 4459 ips_stat_current_to_4_1_21(void *current, ips_stat_4_1_21_t *old) 4460 { 4461 ips_stat_t *st = (ips_stat_t *)current; 4462 4463 old->iss_hits = st->iss_hits; 4464 old->iss_miss = st->iss_check_miss; 4465 old->iss_max = st->iss_max; 4466 old->iss_maxref = st->iss_max_ref; 4467 old->iss_tcp = st->iss_proto[IPPROTO_TCP]; 4468 old->iss_udp = st->iss_proto[IPPROTO_UDP]; 4469 old->iss_icmp = st->iss_proto[IPPROTO_ICMP]; 4470 old->iss_nomem = st->iss_nomem; 4471 old->iss_expire = st->iss_expire; 4472 old->iss_fin = st->iss_fin; 4473 old->iss_active = st->iss_active; 4474 old->iss_logged = st->iss_log_ok; 4475 old->iss_logfail = st->iss_log_fail; 4476 old->iss_inuse = st->iss_inuse; 4477 old->iss_wild = st->iss_wild; 4478 old->iss_ticks = st->iss_ticks; 4479 old->iss_bucketfull = st->iss_bucket_full; 4480 old->iss_statesize = st->iss_state_size; 4481 old->iss_statemax = st->iss_state_max; 4482 old->iss_table = st->iss_table; 4483 old->iss_list = st->iss_list; 4484 old->iss_bucketlen = (void *)st->iss_bucketlen; 4485 old->iss_tcptab = st->iss_tcptab; 4486 } 4487 4488 4489 static void 4490 ips_stat_current_to_4_1_0(void *current, ips_stat_4_1_0_t *old) 4491 { 4492 ips_stat_t *st = (ips_stat_t *)current; 4493 4494 old->iss_hits = st->iss_hits; 4495 old->iss_miss = st->iss_check_miss; 4496 old->iss_max = st->iss_max; 4497 old->iss_maxref = st->iss_max_ref; 4498 old->iss_tcp = st->iss_proto[IPPROTO_TCP]; 4499 old->iss_udp = st->iss_proto[IPPROTO_UDP]; 4500 old->iss_icmp = st->iss_proto[IPPROTO_ICMP]; 4501 old->iss_nomem = st->iss_nomem; 4502 old->iss_expire = st->iss_expire; 4503 old->iss_fin = st->iss_fin; 4504 old->iss_active = st->iss_active; 4505 old->iss_logged = st->iss_log_ok; 4506 old->iss_logfail = st->iss_log_fail; 4507 old->iss_inuse = st->iss_inuse; 4508 old->iss_wild = st->iss_wild; 4509 old->iss_ticks = st->iss_ticks; 4510 old->iss_bucketfull = st->iss_bucket_full; 4511 old->iss_statesize = st->iss_state_size; 4512 old->iss_statemax = st->iss_state_max; 4513 old->iss_table = st->iss_table; 4514 old->iss_list = st->iss_list; 4515 old->iss_bucketlen = (void *)st->iss_bucketlen; 4516 } 4517 4518 4519 static void 4520 nat_save_current_to_4_1_16(void *current, nat_save_4_1_16_t *old) 4521 { 4522 nat_save_t *nats = (nat_save_t *)current; 4523 4524 old->ipn_next = nats->ipn_next; 4525 bcopy(&nats->ipn_nat, &old->ipn_nat, sizeof(old->ipn_nat)); 4526 bcopy(&nats->ipn_ipnat, &old->ipn_ipnat, sizeof(old->ipn_ipnat)); 4527 frentry_current_to_4_1_16(&nats->ipn_fr, &old->ipn_fr); 4528 old->ipn_dsize = nats->ipn_dsize; 4529 bcopy(nats->ipn_data, old->ipn_data, sizeof(nats->ipn_data)); 4530 } 4531 4532 4533 static void 4534 nat_save_current_to_4_1_14(void *current, nat_save_4_1_14_t *old) 4535 { 4536 nat_save_t *nats = (nat_save_t *)current; 4537 4538 old->ipn_next = nats->ipn_next; 4539 bcopy(&nats->ipn_nat, &old->ipn_nat, sizeof(old->ipn_nat)); 4540 bcopy(&nats->ipn_ipnat, &old->ipn_ipnat, sizeof(old->ipn_ipnat)); 4541 frentry_current_to_4_1_0(&nats->ipn_fr, &old->ipn_fr); 4542 old->ipn_dsize = nats->ipn_dsize; 4543 bcopy(nats->ipn_data, old->ipn_data, sizeof(nats->ipn_data)); 4544 } 4545 4546 4547 static void 4548 nat_save_current_to_4_1_3(void *current, nat_save_4_1_3_t *old) 4549 { 4550 nat_save_t *nats = (nat_save_t *)current; 4551 4552 old->ipn_next = nats->ipn_next; 4553 bcopy(&nats->ipn_nat, &old->ipn_nat, sizeof(old->ipn_nat)); 4554 bcopy(&nats->ipn_ipnat, &old->ipn_ipnat, sizeof(old->ipn_ipnat)); 4555 frentry_current_to_4_1_0(&nats->ipn_fr, &old->ipn_fr); 4556 old->ipn_dsize = nats->ipn_dsize; 4557 bcopy(nats->ipn_data, old->ipn_data, sizeof(nats->ipn_data)); 4558 } 4559 4560 4561 static void 4562 nat_current_to_4_1_25(void *current, nat_4_1_25_t *old) 4563 { 4564 nat_t *nat = (nat_t *)current; 4565 4566 old->nat_lock = nat->nat_lock; 4567 old->nat_next = (void *)nat->nat_next; 4568 old->nat_pnext = (void *)nat->nat_pnext; 4569 old->nat_hnext[0] = (void *)nat->nat_hnext[0]; 4570 old->nat_hnext[1] = (void *)nat->nat_hnext[1]; 4571 old->nat_phnext[0] = (void *)nat->nat_phnext[0]; 4572 old->nat_phnext[1] = (void *)nat->nat_phnext[1]; 4573 old->nat_hm = nat->nat_hm; 4574 old->nat_data = nat->nat_data; 4575 old->nat_me = (void *)nat->nat_me; 4576 old->nat_state = nat->nat_state; 4577 old->nat_aps = nat->nat_aps; 4578 old->nat_fr = nat->nat_fr; 4579 old->nat_ptr = (void *)nat->nat_ptr; 4580 old->nat_ifps[0] = nat->nat_ifps[0]; 4581 old->nat_ifps[1] = nat->nat_ifps[1]; 4582 old->nat_sync = nat->nat_sync; 4583 old->nat_tqe = nat->nat_tqe; 4584 old->nat_flags = nat->nat_flags; 4585 old->nat_sumd[0] = nat->nat_sumd[0]; 4586 old->nat_sumd[1] = nat->nat_sumd[1]; 4587 old->nat_ipsumd = nat->nat_ipsumd; 4588 old->nat_mssclamp = nat->nat_mssclamp; 4589 old->nat_pkts[0] = nat->nat_pkts[0]; 4590 old->nat_pkts[1] = nat->nat_pkts[1]; 4591 old->nat_bytes[0] = nat->nat_bytes[0]; 4592 old->nat_bytes[1] = nat->nat_bytes[1]; 4593 old->nat_ref = nat->nat_ref; 4594 old->nat_dir = nat->nat_dir; 4595 old->nat_p = nat->nat_pr[0]; 4596 old->nat_use = nat->nat_use; 4597 old->nat_hv[0] = nat->nat_hv[0]; 4598 old->nat_hv[1] = nat->nat_hv[1]; 4599 old->nat_rev = nat->nat_rev; 4600 old->nat_redir = nat->nat_redir; 4601 bcopy(nat->nat_ifnames[0], old->nat_ifnames[0], LIFNAMSIZ); 4602 bcopy(nat->nat_ifnames[1], old->nat_ifnames[1], LIFNAMSIZ); 4603 4604 if (nat->nat_redir == NAT_REDIRECT) { 4605 old->nat_inip6 = nat->nat_ndst6; 4606 old->nat_outip6 = nat->nat_odst6; 4607 old->nat_oip6 = nat->nat_osrc6; 4608 old->nat_un.nat_unt.ts_sport = nat->nat_ndport; 4609 old->nat_un.nat_unt.ts_dport = nat->nat_odport; 4610 } else { 4611 old->nat_inip6 = nat->nat_osrc6; 4612 old->nat_outip6 = nat->nat_nsrc6; 4613 old->nat_oip6 = nat->nat_odst6; 4614 old->nat_un.nat_unt.ts_sport = nat->nat_osport; 4615 old->nat_un.nat_unt.ts_dport = nat->nat_nsport; 4616 } 4617 } 4618 4619 4620 static void 4621 nat_current_to_4_1_14(void *current, nat_4_1_14_t *old) 4622 { 4623 nat_t *nat = (nat_t *)current; 4624 4625 old->nat_lock = nat->nat_lock; 4626 old->nat_next = nat->nat_next; 4627 old->nat_pnext = NULL; 4628 old->nat_hnext[0] = NULL; 4629 old->nat_hnext[1] = NULL; 4630 old->nat_phnext[0] = NULL; 4631 old->nat_phnext[1] = NULL; 4632 old->nat_hm = nat->nat_hm; 4633 old->nat_data = nat->nat_data; 4634 old->nat_me = (void *)nat->nat_me; 4635 old->nat_state = nat->nat_state; 4636 old->nat_aps = nat->nat_aps; 4637 old->nat_fr = nat->nat_fr; 4638 old->nat_ptr = nat->nat_ptr; 4639 old->nat_ifps[0] = nat->nat_ifps[0]; 4640 old->nat_ifps[1] = nat->nat_ifps[1]; 4641 old->nat_sync = nat->nat_sync; 4642 old->nat_tqe = nat->nat_tqe; 4643 old->nat_flags = nat->nat_flags; 4644 old->nat_sumd[0] = nat->nat_sumd[0]; 4645 old->nat_sumd[1] = nat->nat_sumd[1]; 4646 old->nat_ipsumd = nat->nat_ipsumd; 4647 old->nat_mssclamp = nat->nat_mssclamp; 4648 old->nat_pkts[0] = nat->nat_pkts[0]; 4649 old->nat_pkts[1] = nat->nat_pkts[1]; 4650 old->nat_bytes[0] = nat->nat_bytes[0]; 4651 old->nat_bytes[1] = nat->nat_bytes[1]; 4652 old->nat_ref = nat->nat_ref; 4653 old->nat_dir = nat->nat_dir; 4654 old->nat_p = nat->nat_pr[0]; 4655 old->nat_use = nat->nat_use; 4656 old->nat_hv[0] = nat->nat_hv[0]; 4657 old->nat_hv[1] = nat->nat_hv[1]; 4658 old->nat_rev = nat->nat_rev; 4659 bcopy(nat->nat_ifnames[0], old->nat_ifnames[0], LIFNAMSIZ); 4660 bcopy(nat->nat_ifnames[1], old->nat_ifnames[1], LIFNAMSIZ); 4661 4662 if (nat->nat_redir == NAT_REDIRECT) { 4663 old->nat_inip6 = nat->nat_ndst6; 4664 old->nat_outip6 = nat->nat_odst6; 4665 old->nat_oip6 = nat->nat_osrc6; 4666 old->nat_un.nat_unt.ts_sport = nat->nat_ndport; 4667 old->nat_un.nat_unt.ts_dport = nat->nat_odport; 4668 } else { 4669 old->nat_inip6 = nat->nat_osrc6; 4670 old->nat_outip6 = nat->nat_nsrc6; 4671 old->nat_oip6 = nat->nat_odst6; 4672 old->nat_un.nat_unt.ts_sport = nat->nat_osport; 4673 old->nat_un.nat_unt.ts_dport = nat->nat_nsport; 4674 } 4675 } 4676 4677 4678 static void 4679 nat_current_to_4_1_3(void *current, nat_4_1_3_t *old) 4680 { 4681 nat_t *nat = (nat_t *)current; 4682 4683 old->nat_lock = nat->nat_lock; 4684 old->nat_next = nat->nat_next; 4685 old->nat_pnext = NULL; 4686 old->nat_hnext[0] = NULL; 4687 old->nat_hnext[1] = NULL; 4688 old->nat_phnext[0] = NULL; 4689 old->nat_phnext[1] = NULL; 4690 old->nat_hm = nat->nat_hm; 4691 old->nat_data = nat->nat_data; 4692 old->nat_me = (void *)nat->nat_me; 4693 old->nat_state = nat->nat_state; 4694 old->nat_aps = nat->nat_aps; 4695 old->nat_fr = nat->nat_fr; 4696 old->nat_ptr = nat->nat_ptr; 4697 old->nat_ifps[0] = nat->nat_ifps[0]; 4698 old->nat_ifps[1] = nat->nat_ifps[1]; 4699 old->nat_sync = nat->nat_sync; 4700 old->nat_tqe = nat->nat_tqe; 4701 old->nat_flags = nat->nat_flags; 4702 old->nat_sumd[0] = nat->nat_sumd[0]; 4703 old->nat_sumd[1] = nat->nat_sumd[1]; 4704 old->nat_ipsumd = nat->nat_ipsumd; 4705 old->nat_mssclamp = nat->nat_mssclamp; 4706 old->nat_pkts[0] = nat->nat_pkts[0]; 4707 old->nat_pkts[1] = nat->nat_pkts[1]; 4708 old->nat_bytes[0] = nat->nat_bytes[0]; 4709 old->nat_bytes[1] = nat->nat_bytes[1]; 4710 old->nat_ref = nat->nat_ref; 4711 old->nat_dir = nat->nat_dir; 4712 old->nat_p = nat->nat_pr[0]; 4713 old->nat_use = nat->nat_use; 4714 old->nat_hv[0] = nat->nat_hv[0]; 4715 old->nat_hv[1] = nat->nat_hv[1]; 4716 old->nat_rev = nat->nat_rev; 4717 bcopy(nat->nat_ifnames[0], old->nat_ifnames[0], LIFNAMSIZ); 4718 bcopy(nat->nat_ifnames[1], old->nat_ifnames[1], LIFNAMSIZ); 4719 4720 if (nat->nat_redir == NAT_REDIRECT) { 4721 old->nat_inip6 = nat->nat_ndst6; 4722 old->nat_outip6 = nat->nat_odst6; 4723 old->nat_oip6 = nat->nat_osrc6; 4724 old->nat_un.nat_unt.ts_sport = nat->nat_ndport; 4725 old->nat_un.nat_unt.ts_dport = nat->nat_odport; 4726 } else { 4727 old->nat_inip6 = nat->nat_osrc6; 4728 old->nat_outip6 = nat->nat_nsrc6; 4729 old->nat_oip6 = nat->nat_odst6; 4730 old->nat_un.nat_unt.ts_sport = nat->nat_osport; 4731 old->nat_un.nat_unt.ts_dport = nat->nat_nsport; 4732 } 4733 } 4734 4735 #endif /* IPFILTER_COMPAT */ 4736