1 /* $NetBSD: ip_fil_compat.c,v 1.1.1.2 2012/07/22 13:44:16 darrenr 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 __P((tcpinfo_t *, tcpinfo4_t *)); 89 90 static void 91 ipf_v5tcpinfoto4(v5, v4) 92 tcpinfo_t *v5; 93 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 caddr_t 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 caddr_t 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 1203 typedef struct ipfrstat_4_1_1 { 1204 u_long ifs_exists; /* add & already exists */ 1205 u_long ifs_nomem; 1206 u_long ifs_new; 1207 u_long ifs_hits; 1208 u_long ifs_expire; 1209 u_long ifs_inuse; 1210 u_long ifs_retrans0; 1211 u_long ifs_short; 1212 struct ipfr **ifs_table; 1213 struct ipfr **ifs_nattab; 1214 } ipfrstat_4_1_1_t; 1215 1216 /* ------------------------------------------------------------------------ */ 1217 static int ipf_addfrstr __P((char *, int, char *, int)); 1218 static void ipf_v4iptov5 __P((frip4_t *, fr_ip_t *)); 1219 static void ipf_v5iptov4 __P((fr_ip_t *, frip4_t *)); 1220 static void ipfv4tuctov5 __P((frtuc4_t *, frtuc_t *)); 1221 static void ipfv5tuctov4 __P((frtuc_t *, frtuc4_t *)); 1222 static int ipf_v4fripftov5 __P((fripf4_t *, char *)); 1223 static void ipf_v5fripftov4 __P((fripf_t *, fripf4_t *)); 1224 static int fr_frflags4to5 __P((u_32_t)); 1225 static int fr_frflags5to4 __P((u_32_t)); 1226 1227 static void friostat_current_to_4_1_0 __P((void *, friostat_4_1_0_t *, int)); 1228 static void friostat_current_to_4_1_33 __P((void *, friostat_4_1_33_t *, int)); 1229 static void ipstate_current_to_4_1_0 __P((void *, ipstate_4_1_0_t *)); 1230 static void ipstate_current_to_4_1_16 __P((void *, ipstate_4_1_16_t *)); 1231 static void ipnat_current_to_4_1_0 __P((void *, ipnat_4_1_0_t *)); 1232 static void ipnat_current_to_4_1_14 __P((void *, ipnat_4_1_14_t *)); 1233 static void frauth_current_to_4_1_11 __P((void *, frauth_4_1_11_t *)); 1234 static void frauth_current_to_4_1_23 __P((void *, frauth_4_1_23_t *)); 1235 static void frauth_current_to_4_1_24 __P((void *, frauth_4_1_24_t *)); 1236 static void frauth_current_to_4_1_29 __P((void *, frauth_4_1_29_t *)); 1237 static void frentry_current_to_4_1_0 __P((void *, frentry_4_1_0_t *)); 1238 static void frentry_current_to_4_1_16 __P((void *, frentry_4_1_16_t *)); 1239 static void frentry_current_to_4_1_34 __P((void *, frentry_4_1_34_t *)); 1240 static void fr_info_current_to_4_1_11 __P((void *, fr_info_4_1_11_t *)); 1241 static void fr_info_current_to_4_1_23 __P((void *, fr_info_4_1_23_t *)); 1242 static void fr_info_current_to_4_1_24 __P((void *, fr_info_4_1_24_t *)); 1243 static void nat_save_current_to_4_1_3 __P((void *, nat_save_4_1_3_t *)); 1244 static void nat_save_current_to_4_1_14 __P((void *, nat_save_4_1_14_t *)); 1245 static void nat_save_current_to_4_1_16 __P((void *, nat_save_4_1_16_t *)); 1246 static void ipstate_save_current_to_4_1_0 __P((void *, ipstate_save_4_1_0_t *)); 1247 static void ipstate_save_current_to_4_1_16 __P((void *, ipstate_save_4_1_16_t *)); 1248 static void ips_stat_current_to_4_1_0 __P((void *, ips_stat_4_1_0_t *)); 1249 static void ips_stat_current_to_4_1_21 __P((void *, ips_stat_4_1_21_t *)); 1250 static void natstat_current_to_4_1_0 __P((void *, natstat_4_1_0_t *)); 1251 static void natstat_current_to_4_1_16 __P((void *, natstat_4_1_16_t *)); 1252 static void natstat_current_to_4_1_27 __P((void *, natstat_4_1_27_t *)); 1253 static void natstat_current_to_4_1_32 __P((void *, natstat_4_1_32_t *)); 1254 static void nat_current_to_4_1_3 __P((void *, nat_4_1_3_t *)); 1255 static void nat_current_to_4_1_14 __P((void *, nat_4_1_14_t *)); 1256 static void nat_current_to_4_1_25 __P((void *, nat_4_1_25_t *)); 1257 1258 static void friostat_4_1_0_to_current __P((friostat_4_1_0_t *, void *)); 1259 static void friostat_4_1_33_to_current __P((friostat_4_1_33_t *, void *)); 1260 static void ipnat_4_1_0_to_current __P((ipnat_4_1_0_t *, void *, int)); 1261 static void ipnat_4_1_14_to_current __P((ipnat_4_1_14_t *, void *, int)); 1262 static void frauth_4_1_11_to_current __P((frauth_4_1_11_t *, void *)); 1263 static void frauth_4_1_23_to_current __P((frauth_4_1_23_t *, void *)); 1264 static void frauth_4_1_24_to_current __P((frauth_4_1_24_t *, void *)); 1265 static void frauth_4_1_29_to_current __P((frauth_4_1_29_t *, void *)); 1266 static void frauth_4_1_32_to_current __P((frauth_4_1_32_t *, void *)); 1267 static void frentry_4_1_0_to_current __P((ipf_main_softc_t *, frentry_4_1_0_t *, void *, int)); 1268 static void frentry_4_1_16_to_current __P((ipf_main_softc_t *, frentry_4_1_16_t *, void *, int)); 1269 static void frentry_4_1_34_to_current __P((ipf_main_softc_t *, frentry_4_1_34_t *, void *, int)); 1270 static void fr_info_4_1_11_to_current __P((fr_info_4_1_11_t *, void *)); 1271 static void fr_info_4_1_23_to_current __P((fr_info_4_1_23_t *, void *)); 1272 static void fr_info_4_1_24_to_current __P((fr_info_4_1_24_t *, void *)); 1273 static void fr_info_4_1_32_to_current __P((fr_info_4_1_32_t *, void *)); 1274 static void nat_save_4_1_3_to_current __P((ipf_main_softc_t *, nat_save_4_1_3_t *, void *)); 1275 static void nat_save_4_1_14_to_current __P((ipf_main_softc_t *, nat_save_4_1_14_t *, void *)); 1276 static void nat_save_4_1_16_to_current __P((ipf_main_softc_t *, nat_save_4_1_16_t *, void *)); 1277 1278 /* ------------------------------------------------------------------------ */ 1279 /* In this section is a series of short routines that deal with translating */ 1280 /* the smaller data structures used above as their internal changes make */ 1281 /* them inappropriate for simple assignment. */ 1282 /* ------------------------------------------------------------------------ */ 1283 1284 1285 static int 1286 ipf_addfrstr(char *names, int namelen, char *str, int maxlen) 1287 { 1288 char *t; 1289 int i; 1290 1291 for (i = maxlen, t = str; (*t != '\0') && (i > 0); i--) { 1292 names[namelen++] = *t++; 1293 } 1294 names[namelen++] = '\0'; 1295 return namelen; 1296 } 1297 1298 1299 static void 1300 ipf_v4iptov5(v4, v5) 1301 frip4_t *v4; 1302 fr_ip_t *v5; 1303 { 1304 v5->fi_v = v4->fi_v; 1305 v5->fi_p = v4->fi_p; 1306 v5->fi_xx = v4->fi_xx; 1307 v5->fi_tos = v4->fi_tos; 1308 v5->fi_ttl = v4->fi_ttl; 1309 v5->fi_p = v4->fi_p; 1310 v5->fi_optmsk = v4->fi_optmsk; 1311 v5->fi_src = v4->fi_src; 1312 v5->fi_dst = v4->fi_dst; 1313 v5->fi_secmsk = v4->ofi_secmsk; 1314 v5->fi_auth = v4->ofi_auth; 1315 v5->fi_flx = v4->fi_flx; 1316 v5->fi_tcpmsk = v4->fi_tcpmsk; 1317 } 1318 1319 static void 1320 ipf_v5iptov4(v5, v4) 1321 fr_ip_t *v5; 1322 frip4_t *v4; 1323 { 1324 v4->fi_v = v5->fi_v; 1325 v4->fi_p = v5->fi_p; 1326 v4->fi_xx = v5->fi_xx; 1327 v4->fi_tos = v5->fi_tos; 1328 v4->fi_ttl = v5->fi_ttl; 1329 v4->fi_p = v5->fi_p; 1330 v4->fi_optmsk = v5->fi_optmsk; 1331 v4->fi_src = v5->fi_src; 1332 v4->fi_dst = v5->fi_dst; 1333 v4->ofi_secmsk = v5->fi_secmsk; 1334 v4->ofi_auth = v5->fi_auth; 1335 v4->fi_flx = v5->fi_flx; 1336 v4->fi_tcpmsk = v5->fi_tcpmsk; 1337 } 1338 1339 1340 static void 1341 ipfv4tuctov5(v4, v5) 1342 frtuc4_t *v4; 1343 frtuc_t *v5; 1344 { 1345 v5->ftu_src.frp_cmp = v4->ftu_src.frp_cmp; 1346 v5->ftu_src.frp_port = v4->ftu_src.frp_port; 1347 v5->ftu_src.frp_top = v4->ftu_src.frp_top; 1348 v5->ftu_dst.frp_cmp = v4->ftu_dst.frp_cmp; 1349 v5->ftu_dst.frp_port = v4->ftu_dst.frp_port; 1350 v5->ftu_dst.frp_top = v4->ftu_dst.frp_top; 1351 } 1352 1353 1354 static void 1355 ipfv5tuctov4(v5, v4) 1356 frtuc_t *v5; 1357 frtuc4_t *v4; 1358 { 1359 v4->ftu_src.frp_cmp = v5->ftu_src.frp_cmp; 1360 v4->ftu_src.frp_port = v5->ftu_src.frp_port; 1361 v4->ftu_src.frp_top = v5->ftu_src.frp_top; 1362 v4->ftu_dst.frp_cmp = v5->ftu_dst.frp_cmp; 1363 v4->ftu_dst.frp_port = v5->ftu_dst.frp_port; 1364 v4->ftu_dst.frp_top = v5->ftu_dst.frp_top; 1365 } 1366 1367 1368 static int 1369 ipf_v4fripftov5(frp4, dst) 1370 fripf4_t *frp4; 1371 char *dst; 1372 { 1373 fripf_t *frp; 1374 1375 frp = (fripf_t *)dst; 1376 1377 ipf_v4iptov5(&frp4->fri_ip, &frp->fri_ip); 1378 ipf_v4iptov5(&frp4->fri_mip, &frp->fri_mip); 1379 frp->fri_icmpm = frp4->fri_icmpm; 1380 frp->fri_icmp = frp4->fri_icmp; 1381 frp->fri_tuc.ftu_tcpfm = frp4->fri_tuc.ftu_tcpfm; 1382 frp->fri_tuc.ftu_tcpf = frp4->fri_tuc.ftu_tcpf; 1383 ipfv4tuctov5(&frp4->fri_tuc, &frp->fri_tuc); 1384 frp->fri_satype = frp4->fri_satype; 1385 frp->fri_datype = frp4->fri_datype; 1386 frp->fri_sifpidx = frp4->fri_sifpidx; 1387 frp->fri_difpidx = frp4->fri_difpidx; 1388 return 0; 1389 } 1390 1391 1392 static void 1393 ipf_v5fripftov4(frp, frp4) 1394 fripf_t *frp; 1395 fripf4_t *frp4; 1396 { 1397 1398 ipf_v5iptov4(&frp->fri_ip, &frp4->fri_ip); 1399 ipf_v5iptov4(&frp->fri_mip, &frp4->fri_mip); 1400 frp4->fri_icmpm = frp->fri_icmpm; 1401 frp4->fri_icmp = frp->fri_icmp; 1402 frp4->fri_tuc.ftu_tcpfm = frp->fri_tuc.ftu_tcpfm; 1403 frp4->fri_tuc.ftu_tcpf = frp->fri_tuc.ftu_tcpf; 1404 ipfv5tuctov4(&frp->fri_tuc, &frp4->fri_tuc); 1405 frp4->fri_satype = frp->fri_satype; 1406 frp4->fri_datype = frp->fri_datype; 1407 frp4->fri_sifpidx = frp->fri_sifpidx; 1408 frp4->fri_difpidx = frp->fri_difpidx; 1409 } 1410 1411 1412 /* ------------------------------------------------------------------------ */ 1413 /* ipf_in_compat is the first of two service routines. It is responsible for*/ 1414 /* converting data structures from user space into what's required by the */ 1415 /* kernel module. */ 1416 /* ------------------------------------------------------------------------ */ 1417 int 1418 ipf_in_compat(softc, obj, ptr, size) 1419 ipf_main_softc_t *softc; 1420 ipfobj_t *obj; 1421 void *ptr; 1422 int size; 1423 { 1424 int error; 1425 int sz; 1426 1427 IPFERROR(140000); 1428 error = EINVAL; 1429 1430 switch (obj->ipfo_type) 1431 { 1432 default : 1433 break; 1434 1435 case IPFOBJ_FRENTRY : 1436 if (obj->ipfo_rev >= 4013400) { 1437 frentry_4_1_34_t *old; 1438 1439 KMALLOC(old, frentry_4_1_34_t *); 1440 if (old == NULL) { 1441 IPFERROR(140001); 1442 error = ENOMEM; 1443 break; 1444 } 1445 error = COPYIN(obj->ipfo_ptr, old, sizeof(*old)); 1446 if (error == 0) { 1447 if (old->fr_type != FR_T_NONE && 1448 old->fr_type != FR_T_IPF) { 1449 IPFERROR(140002); 1450 error = EINVAL; 1451 KFREE(old); 1452 break; 1453 } 1454 frentry_4_1_34_to_current(softc, old, 1455 ptr, size); 1456 } else { 1457 IPFERROR(140003); 1458 } 1459 KFREE(old); 1460 } else if (obj->ipfo_rev >= 4011600) { 1461 frentry_4_1_16_t *old; 1462 1463 KMALLOC(old, frentry_4_1_16_t *); 1464 if (old == NULL) { 1465 IPFERROR(140004); 1466 error = ENOMEM; 1467 break; 1468 } 1469 error = COPYIN(obj->ipfo_ptr, old, sizeof(*old)); 1470 if (error == 0) { 1471 if (old->fr_type != FR_T_NONE && 1472 old->fr_type != FR_T_IPF) { 1473 IPFERROR(140005); 1474 error = EINVAL; 1475 KFREE(old); 1476 break; 1477 } 1478 frentry_4_1_16_to_current(softc, old, 1479 ptr, size); 1480 } else { 1481 IPFERROR(140006); 1482 } 1483 KFREE(old); 1484 } else { 1485 frentry_4_1_0_t *old; 1486 1487 KMALLOC(old, frentry_4_1_0_t *); 1488 if (old == NULL) { 1489 IPFERROR(140007); 1490 error = ENOMEM; 1491 break; 1492 } 1493 error = COPYIN(obj->ipfo_ptr, old, sizeof(*old)); 1494 if (error == 0) { 1495 if (old->fr_type != FR_T_NONE && 1496 old->fr_type != FR_T_IPF) { 1497 IPFERROR(140008); 1498 error = EINVAL; 1499 KFREE(old); 1500 break; 1501 } 1502 frentry_4_1_0_to_current(softc, old, ptr, size); 1503 } else { 1504 IPFERROR(140009); 1505 } 1506 KFREE(old); 1507 } 1508 break; 1509 1510 case IPFOBJ_IPFSTAT : 1511 if (obj->ipfo_rev >= 4013300) { 1512 friostat_4_1_33_t *old; 1513 1514 KMALLOC(old, friostat_4_1_33_t *); 1515 if (old == NULL) { 1516 IPFERROR(140010); 1517 error = ENOMEM; 1518 break; 1519 } 1520 error = COPYIN(obj->ipfo_ptr, old, sizeof(*old)); 1521 if (error == 0) { 1522 friostat_4_1_33_to_current(old, ptr); 1523 } else { 1524 IPFERROR(140011); 1525 } 1526 } else { 1527 friostat_4_1_0_t *old; 1528 1529 KMALLOC(old, friostat_4_1_0_t *); 1530 if (old == NULL) { 1531 IPFERROR(140012); 1532 error = ENOMEM; 1533 break; 1534 } 1535 error = COPYIN(obj->ipfo_ptr, old, sizeof(*old)); 1536 if (error == 0) { 1537 friostat_4_1_0_to_current(old, ptr); 1538 } else { 1539 IPFERROR(140013); 1540 } 1541 } 1542 break; 1543 1544 case IPFOBJ_IPFINFO : /* unused */ 1545 break; 1546 1547 case IPFOBJ_IPNAT : 1548 if (obj->ipfo_rev >= 4011400) { 1549 ipnat_4_1_14_t *old; 1550 1551 KMALLOC(old, ipnat_4_1_14_t *); 1552 if (old == NULL) { 1553 IPFERROR(140014); 1554 error = ENOMEM; 1555 break; 1556 } 1557 error = COPYIN(obj->ipfo_ptr, old, sizeof(*old)); 1558 if (error == 0) { 1559 ipnat_4_1_14_to_current(old, ptr, size); 1560 } else { 1561 IPFERROR(140015); 1562 } 1563 KFREE(old); 1564 } else { 1565 ipnat_4_1_0_t *old; 1566 1567 KMALLOC(old, ipnat_4_1_0_t *); 1568 if (old == NULL) { 1569 IPFERROR(140016); 1570 error = ENOMEM; 1571 break; 1572 } 1573 error = COPYIN(obj->ipfo_ptr, old, sizeof(*old)); 1574 if (error == 0) { 1575 ipnat_4_1_0_to_current(old, ptr, size); 1576 } else { 1577 IPFERROR(140017); 1578 } 1579 KFREE(old); 1580 } 1581 break; 1582 1583 case IPFOBJ_NATSTAT : 1584 /* 1585 * Statistics are not copied in. 1586 */ 1587 break; 1588 1589 case IPFOBJ_NATSAVE : 1590 if (obj->ipfo_rev >= 4011600) { 1591 nat_save_4_1_16_t *old16; 1592 1593 KMALLOC(old16, nat_save_4_1_16_t *); 1594 if (old16 == NULL) { 1595 IPFERROR(140018); 1596 error = ENOMEM; 1597 break; 1598 } 1599 error = COPYIN(obj->ipfo_ptr, old16, sizeof(*old16)); 1600 if (error == 0) { 1601 nat_save_4_1_16_to_current(softc, old16, ptr); 1602 } else { 1603 IPFERROR(140019); 1604 } 1605 KFREE(old16); 1606 } else if (obj->ipfo_rev >= 4011400) { 1607 nat_save_4_1_14_t *old14; 1608 1609 KMALLOC(old14, nat_save_4_1_14_t *); 1610 if (old14 == NULL) { 1611 IPFERROR(140020); 1612 error = ENOMEM; 1613 break; 1614 } 1615 error = COPYIN(obj->ipfo_ptr, old14, sizeof(*old14)); 1616 if (error == 0) { 1617 nat_save_4_1_14_to_current(softc, old14, ptr); 1618 } else { 1619 IPFERROR(140021); 1620 } 1621 KFREE(old14); 1622 } else if (obj->ipfo_rev >= 4010300) { 1623 nat_save_4_1_3_t *old3; 1624 1625 KMALLOC(old3, nat_save_4_1_3_t *); 1626 if (old3 == NULL) { 1627 IPFERROR(140022); 1628 error = ENOMEM; 1629 break; 1630 } 1631 error = COPYIN(obj->ipfo_ptr, old3, sizeof(*old3)); 1632 if (error == 0) { 1633 nat_save_4_1_3_to_current(softc, old3, ptr); 1634 } else { 1635 IPFERROR(140023); 1636 } 1637 KFREE(old3); 1638 } 1639 break; 1640 1641 case IPFOBJ_STATESAVE : 1642 if (obj->ipfo_rev >= 4013400) { 1643 ipstate_save_4_1_34_t *old; 1644 1645 KMALLOC(old, ipstate_save_4_1_34_t *); 1646 if (old == NULL) { 1647 IPFERROR(140024); 1648 error = ENOMEM; 1649 break; 1650 } 1651 error = COPYIN(obj->ipfo_ptr, old, sizeof(*old)); 1652 if (error != 0) { 1653 IPFERROR(140025); 1654 } 1655 KFREE(old); 1656 } else if (obj->ipfo_rev >= 4011600) { 1657 ipstate_save_4_1_16_t *old; 1658 1659 KMALLOC(old, ipstate_save_4_1_16_t *); 1660 if (old == NULL) { 1661 IPFERROR(140026); 1662 error = ENOMEM; 1663 break; 1664 } 1665 error = COPYIN(obj->ipfo_ptr, old, sizeof(*old)); 1666 if (error != 0) { 1667 IPFERROR(140027); 1668 } 1669 KFREE(old); 1670 } else { 1671 ipstate_save_4_1_0_t *old; 1672 1673 KMALLOC(old, ipstate_save_4_1_0_t *); 1674 if (old == NULL) { 1675 IPFERROR(140028); 1676 error = ENOMEM; 1677 break; 1678 } 1679 error = COPYIN(obj->ipfo_ptr, old, sizeof(*old)); 1680 if (error != 0) { 1681 IPFERROR(140029); 1682 } 1683 KFREE(old); 1684 } 1685 break; 1686 1687 case IPFOBJ_IPSTATE : 1688 /* 1689 * This structure is not copied in by itself. 1690 */ 1691 break; 1692 1693 case IPFOBJ_STATESTAT : 1694 /* 1695 * Statistics are not copied in. 1696 */ 1697 break; 1698 1699 case IPFOBJ_FRAUTH : 1700 if (obj->ipfo_rev >= 4013200) { 1701 frauth_4_1_32_t *old32; 1702 1703 KMALLOC(old32, frauth_4_1_32_t *); 1704 if (old32 == NULL) { 1705 IPFERROR(140030); 1706 error = ENOMEM; 1707 break; 1708 } 1709 error = COPYIN(obj->ipfo_ptr, old32, sizeof(*old32)); 1710 if (error == 0) { 1711 frauth_4_1_32_to_current(old32, ptr); 1712 } else { 1713 IPFERROR(140031); 1714 } 1715 KFREE(old32); 1716 } else if (obj->ipfo_rev >= 4012900) { 1717 frauth_4_1_29_t *old29; 1718 1719 KMALLOC(old29, frauth_4_1_29_t *); 1720 if (old29 == NULL) { 1721 IPFERROR(140032); 1722 error = ENOMEM; 1723 break; 1724 } 1725 error = COPYIN(obj->ipfo_ptr, old29, sizeof(*old29)); 1726 if (error == 0) { 1727 frauth_4_1_29_to_current(old29, ptr); 1728 } else { 1729 IPFERROR(140033); 1730 } 1731 KFREE(old29); 1732 } else if (obj->ipfo_rev >= 4012400) { 1733 frauth_4_1_24_t *old24; 1734 1735 KMALLOC(old24, frauth_4_1_24_t *); 1736 if (old24 == NULL) { 1737 IPFERROR(140034); 1738 error = ENOMEM; 1739 break; 1740 } 1741 error = COPYIN(obj->ipfo_ptr, old24, sizeof(*old24)); 1742 if (error == 0) { 1743 frauth_4_1_24_to_current(old24, ptr); 1744 } else { 1745 IPFERROR(140035); 1746 } 1747 KFREE(old24); 1748 } else if (obj->ipfo_rev >= 4012300) { 1749 frauth_4_1_23_t *old23; 1750 1751 KMALLOC(old23, frauth_4_1_23_t *); 1752 if (old23 == NULL) { 1753 IPFERROR(140036); 1754 error = ENOMEM; 1755 break; 1756 } 1757 error = COPYIN(obj->ipfo_ptr, old23, sizeof(*old23)); 1758 if (error == 0) 1759 frauth_4_1_23_to_current(old23, ptr); 1760 KFREE(old23); 1761 } else if (obj->ipfo_rev >= 4011100) { 1762 frauth_4_1_11_t *old11; 1763 1764 KMALLOC(old11, frauth_4_1_11_t *); 1765 if (old11 == NULL) { 1766 IPFERROR(140037); 1767 error = ENOMEM; 1768 break; 1769 } 1770 error = COPYIN(obj->ipfo_ptr, old11, sizeof(*old11)); 1771 if (error == 0) { 1772 frauth_4_1_11_to_current(old11, ptr); 1773 } else { 1774 IPFERROR(140038); 1775 } 1776 KFREE(old11); 1777 } 1778 break; 1779 1780 case IPFOBJ_NAT : 1781 if (obj->ipfo_rev >= 4011400) { 1782 sz = sizeof(nat_4_1_14_t); 1783 } else if (obj->ipfo_rev >= 4010300) { 1784 sz = sizeof(nat_4_1_3_t); 1785 } else { 1786 break; 1787 } 1788 bzero(ptr, sizeof(nat_t)); 1789 error = COPYIN(obj->ipfo_ptr, ptr, sz); 1790 if (error != 0) { 1791 IPFERROR(140039); 1792 } 1793 break; 1794 1795 case IPFOBJ_FRIPF : 1796 if (obj->ipfo_rev < 5000000) { 1797 fripf4_t *old; 1798 1799 KMALLOC(old, fripf4_t *); 1800 if (old == NULL) { 1801 IPFERROR(140040); 1802 error = ENOMEM; 1803 break; 1804 } 1805 error = COPYIN(obj->ipfo_ptr, old, sizeof(*old)); 1806 if (error == 0) { 1807 ipf_v4fripftov5(old, ptr); 1808 } else { 1809 IPFERROR(140041); 1810 } 1811 KFREE(old); 1812 } 1813 break; 1814 } 1815 1816 return error; 1817 } 1818 /* ------------------------------------------------------------------------ */ 1819 1820 1821 /* 1822 * flags is v4 flags, returns v5 flags. 1823 */ 1824 static int 1825 fr_frflags4to5(flags) 1826 u_32_t flags; 1827 { 1828 u_32_t nflags = 0; 1829 1830 switch (flags & 0xf) { 1831 case 0x0 : 1832 nflags |= FR_CALL; 1833 break; 1834 case 0x1 : 1835 nflags |= FR_BLOCK; 1836 break; 1837 case 0x2 : 1838 nflags |= FR_PASS; 1839 break; 1840 case 0x3 : 1841 nflags |= FR_AUTH; 1842 break; 1843 case 0x4 : 1844 nflags |= FR_PREAUTH; 1845 break; 1846 case 0x5 : 1847 nflags |= FR_ACCOUNT; 1848 break; 1849 case 0x6 : 1850 nflags |= FR_SKIP; 1851 break; 1852 default : 1853 break; 1854 } 1855 1856 if (flags & 0x00010) 1857 nflags |= FR_LOG; 1858 if (flags & 0x00020) 1859 nflags |= FR_CALLNOW; 1860 if (flags & 0x00080) 1861 nflags |= FR_NOTSRCIP; 1862 if (flags & 0x00040) 1863 nflags |= FR_NOTDSTIP; 1864 if (flags & 0x00100) 1865 nflags |= FR_QUICK; 1866 if (flags & 0x00200) 1867 nflags |= FR_KEEPFRAG; 1868 if (flags & 0x00400) 1869 nflags |= FR_KEEPSTATE; 1870 if (flags & 0x00800) 1871 nflags |= FR_FASTROUTE; 1872 if (flags & 0x01000) 1873 nflags |= FR_RETRST; 1874 if (flags & 0x02000) 1875 nflags |= FR_RETICMP; 1876 if (flags & 0x03000) 1877 nflags |= FR_FAKEICMP; 1878 if (flags & 0x04000) 1879 nflags |= FR_OUTQUE; 1880 if (flags & 0x08000) 1881 nflags |= FR_INQUE; 1882 if (flags & 0x10000) 1883 nflags |= FR_LOGBODY; 1884 if (flags & 0x20000) 1885 nflags |= FR_LOGFIRST; 1886 if (flags & 0x40000) 1887 nflags |= FR_LOGORBLOCK; 1888 if (flags & 0x100000) 1889 nflags |= FR_FRSTRICT; 1890 if (flags & 0x200000) 1891 nflags |= FR_STSTRICT; 1892 if (flags & 0x400000) 1893 nflags |= FR_NEWISN; 1894 if (flags & 0x800000) 1895 nflags |= FR_NOICMPERR; 1896 if (flags & 0x1000000) 1897 nflags |= FR_STATESYNC; 1898 if (flags & 0x8000000) 1899 nflags |= FR_NOMATCH; 1900 if (flags & 0x40000000) 1901 nflags |= FR_COPIED; 1902 if (flags & 0x80000000) 1903 nflags |= FR_INACTIVE; 1904 1905 return nflags; 1906 } 1907 1908 static void 1909 frentry_4_1_34_to_current(softc, old, current, size) 1910 ipf_main_softc_t *softc; 1911 frentry_4_1_34_t *old; 1912 void *current; 1913 int size; 1914 { 1915 frentry_t *fr = (frentry_t *)current; 1916 1917 fr->fr_comment = -1; 1918 fr->fr_ref = old->fr_ref; 1919 fr->fr_statecnt = old->fr_statecnt; 1920 fr->fr_hits = old->fr_hits; 1921 fr->fr_bytes = old->fr_bytes; 1922 fr->fr_lastpkt.tv_sec = old->fr_lastpkt.tv_sec; 1923 fr->fr_lastpkt.tv_usec = old->fr_lastpkt.tv_usec; 1924 bcopy(&old->fr_dun, &fr->fr_dun, sizeof(old->fr_dun)); 1925 fr->fr_func = old->fr_func; 1926 fr->fr_dsize = old->fr_dsize; 1927 fr->fr_pps = old->fr_pps; 1928 fr->fr_statemax = old->fr_statemax; 1929 fr->fr_flineno = old->fr_flineno; 1930 fr->fr_type = old->fr_type; 1931 fr->fr_flags = fr_frflags4to5(old->fr_flags); 1932 fr->fr_logtag = old->fr_logtag; 1933 fr->fr_collect = old->fr_collect; 1934 fr->fr_arg = old->fr_arg; 1935 fr->fr_loglevel = old->fr_loglevel; 1936 fr->fr_age[0] = old->fr_age[0]; 1937 fr->fr_age[1] = old->fr_age[1]; 1938 fr->fr_tifs[0].fd_ip6 = old->fr_tifs[0].ofd_ip6; 1939 fr->fr_tifs[0].fd_type = FRD_NORMAL; 1940 fr->fr_tifs[1].fd_ip6 = old->fr_tifs[1].ofd_ip6; 1941 fr->fr_tifs[1].fd_type = FRD_NORMAL; 1942 fr->fr_dif.fd_ip6 = old->fr_dif.ofd_ip6; 1943 fr->fr_dif.fd_type = FRD_NORMAL; 1944 if (old->fr_v == 4) 1945 fr->fr_family = AF_INET; 1946 if (old->fr_v == 6) 1947 fr->fr_family = AF_INET6; 1948 fr->fr_icode = old->fr_icode; 1949 fr->fr_cksum = old->fr_cksum; 1950 fr->fr_namelen = 0; 1951 fr->fr_ifnames[0] = -1; 1952 fr->fr_ifnames[1] = -1; 1953 fr->fr_ifnames[2] = -1; 1954 fr->fr_ifnames[3] = -1; 1955 fr->fr_dif.fd_name = -1; 1956 fr->fr_tifs[0].fd_name = -1; 1957 fr->fr_tifs[1].fd_name = -1; 1958 fr->fr_group = -1; 1959 fr->fr_grhead = -1; 1960 fr->fr_icmphead = -1; 1961 if (size == 0) { 1962 fr->fr_size = sizeof(*fr) + LIFNAMSIZ * 7 + FR_GROUPLEN * 2; 1963 fr->fr_size += sizeof(fripf_t) + 16; 1964 fr->fr_size += 9; /* room for \0's */ 1965 } else { 1966 char *names = fr->fr_names; 1967 int nlen = fr->fr_namelen; 1968 1969 fr->fr_size = size; 1970 if (old->fr_ifnames[0][0] != '\0') { 1971 fr->fr_ifnames[0] = nlen; 1972 nlen = ipf_addfrstr(names, nlen, old->fr_ifnames[0], 1973 LIFNAMSIZ); 1974 } 1975 if (old->fr_ifnames[1][0] != '\0') { 1976 fr->fr_ifnames[1] = nlen; 1977 nlen = ipf_addfrstr(names, nlen, old->fr_ifnames[1], 1978 LIFNAMSIZ); 1979 } 1980 if (old->fr_ifnames[2][0] != '\0') { 1981 fr->fr_ifnames[2] = nlen; 1982 nlen = ipf_addfrstr(names, nlen, old->fr_ifnames[2], 1983 LIFNAMSIZ); 1984 } 1985 if (old->fr_ifnames[3][0] != '\0') { 1986 fr->fr_ifnames[3] = nlen; 1987 nlen = ipf_addfrstr(names, nlen, old->fr_ifnames[3], 1988 LIFNAMSIZ); 1989 } 1990 if (old->fr_tifs[0].fd_ifname[0] != '\0') { 1991 fr->fr_tifs[0].fd_name = nlen; 1992 nlen = ipf_addfrstr(names, nlen, 1993 old->fr_tifs[0].fd_ifname, 1994 LIFNAMSIZ); 1995 } 1996 if (old->fr_tifs[1].fd_ifname[0] != '\0') { 1997 fr->fr_tifs[1].fd_name = nlen; 1998 nlen = ipf_addfrstr(names, nlen, 1999 old->fr_tifs[1].fd_ifname, 2000 LIFNAMSIZ); 2001 } 2002 if (old->fr_dif.fd_ifname[0] != '\0') { 2003 fr->fr_dif.fd_name = nlen; 2004 nlen = ipf_addfrstr(names, nlen, 2005 old->fr_dif.fd_ifname, LIFNAMSIZ); 2006 } 2007 if (old->fr_group[0] != '\0') { 2008 fr->fr_group = nlen; 2009 nlen = ipf_addfrstr(names, nlen, 2010 old->fr_group, LIFNAMSIZ); 2011 } 2012 if (old->fr_grhead[0] != '\0') { 2013 fr->fr_grhead = nlen; 2014 nlen = ipf_addfrstr(names, nlen, 2015 old->fr_grhead, LIFNAMSIZ); 2016 } 2017 fr->fr_namelen = nlen; 2018 2019 if (old->fr_type == FR_T_IPF) { 2020 int offset = fr->fr_namelen; 2021 ipfobj_t obj; 2022 int error; 2023 2024 obj.ipfo_type = IPFOBJ_FRIPF; 2025 obj.ipfo_rev = 4010100; 2026 obj.ipfo_ptr = old->fr_data; 2027 2028 if ((offset & 7) != 0) 2029 offset += 8 - (offset & 7); 2030 error = ipf_in_compat(softc, &obj, 2031 fr->fr_names + offset, 0); 2032 if (error == 0) { 2033 fr->fr_data = fr->fr_names + offset; 2034 fr->fr_dsize = sizeof(fripf_t); 2035 } 2036 } 2037 } 2038 } 2039 2040 static void 2041 frentry_4_1_16_to_current(softc, old, current, size) 2042 ipf_main_softc_t *softc; 2043 frentry_4_1_16_t *old; 2044 void *current; 2045 int size; 2046 { 2047 frentry_t *fr = (frentry_t *)current; 2048 2049 fr->fr_comment = -1; 2050 fr->fr_ref = old->fr_ref; 2051 fr->fr_statecnt = old->fr_statecnt; 2052 fr->fr_hits = old->fr_hits; 2053 fr->fr_bytes = old->fr_bytes; 2054 fr->fr_lastpkt.tv_sec = old->fr_lastpkt.tv_sec; 2055 fr->fr_lastpkt.tv_usec = old->fr_lastpkt.tv_usec; 2056 bcopy(&old->fr_dun, &fr->fr_dun, sizeof(old->fr_dun)); 2057 fr->fr_func = old->fr_func; 2058 fr->fr_dsize = old->fr_dsize; 2059 fr->fr_pps = old->fr_pps; 2060 fr->fr_statemax = old->fr_statemax; 2061 fr->fr_flineno = old->fr_flineno; 2062 fr->fr_type = old->fr_type; 2063 fr->fr_flags = fr_frflags4to5(old->fr_flags); 2064 fr->fr_logtag = old->fr_logtag; 2065 fr->fr_collect = old->fr_collect; 2066 fr->fr_arg = old->fr_arg; 2067 fr->fr_loglevel = old->fr_loglevel; 2068 fr->fr_age[0] = old->fr_age[0]; 2069 fr->fr_age[1] = old->fr_age[1]; 2070 fr->fr_tifs[0].fd_ip6 = old->fr_tifs[0].ofd_ip6; 2071 fr->fr_tifs[0].fd_type = FRD_NORMAL; 2072 fr->fr_tifs[1].fd_ip6 = old->fr_tifs[1].ofd_ip6; 2073 fr->fr_tifs[1].fd_type = FRD_NORMAL; 2074 fr->fr_dif.fd_ip6 = old->fr_dif.ofd_ip6; 2075 fr->fr_dif.fd_type = FRD_NORMAL; 2076 if (old->fr_v == 4) 2077 fr->fr_family = AF_INET; 2078 if (old->fr_v == 6) 2079 fr->fr_family = AF_INET6; 2080 fr->fr_icode = old->fr_icode; 2081 fr->fr_cksum = old->fr_cksum; 2082 fr->fr_namelen = 0; 2083 fr->fr_ifnames[0] = -1; 2084 fr->fr_ifnames[1] = -1; 2085 fr->fr_ifnames[2] = -1; 2086 fr->fr_ifnames[3] = -1; 2087 fr->fr_dif.fd_name = -1; 2088 fr->fr_tifs[0].fd_name = -1; 2089 fr->fr_tifs[1].fd_name = -1; 2090 fr->fr_group = -1; 2091 fr->fr_grhead = -1; 2092 fr->fr_icmphead = -1; 2093 if (size == 0) { 2094 fr->fr_size = sizeof(*fr) + LIFNAMSIZ * 7 + FR_GROUPLEN * 2; 2095 fr->fr_size += 9; /* room for \0's */ 2096 } else { 2097 char *names = fr->fr_names; 2098 int nlen = fr->fr_namelen; 2099 2100 fr->fr_size = size; 2101 if (old->fr_ifnames[0][0] != '\0') { 2102 fr->fr_ifnames[0] = nlen; 2103 nlen = ipf_addfrstr(names, nlen, old->fr_ifnames[0], 2104 LIFNAMSIZ); 2105 } 2106 if (old->fr_ifnames[1][0] != '\0') { 2107 fr->fr_ifnames[1] = nlen; 2108 nlen = ipf_addfrstr(names, nlen, old->fr_ifnames[1], 2109 LIFNAMSIZ); 2110 } 2111 if (old->fr_ifnames[2][0] != '\0') { 2112 fr->fr_ifnames[2] = nlen; 2113 nlen = ipf_addfrstr(names, nlen, old->fr_ifnames[2], 2114 LIFNAMSIZ); 2115 } 2116 if (old->fr_ifnames[3][0] != '\0') { 2117 fr->fr_ifnames[3] = nlen; 2118 nlen = ipf_addfrstr(names, nlen, old->fr_ifnames[3], 2119 LIFNAMSIZ); 2120 } 2121 if (old->fr_tifs[0].fd_ifname[0] != '\0') { 2122 fr->fr_tifs[0].fd_name = nlen; 2123 nlen = ipf_addfrstr(names, nlen, 2124 old->fr_tifs[0].fd_ifname, 2125 LIFNAMSIZ); 2126 } 2127 if (old->fr_tifs[1].fd_ifname[0] != '\0') { 2128 fr->fr_tifs[1].fd_name = nlen; 2129 nlen = ipf_addfrstr(names, nlen, 2130 old->fr_tifs[1].fd_ifname, 2131 LIFNAMSIZ); 2132 } 2133 if (old->fr_dif.fd_ifname[0] != '\0') { 2134 fr->fr_dif.fd_name = nlen; 2135 nlen = ipf_addfrstr(names, nlen, 2136 old->fr_dif.fd_ifname, LIFNAMSIZ); 2137 } 2138 if (old->fr_group[0] != '\0') { 2139 fr->fr_group = nlen; 2140 nlen = ipf_addfrstr(names, nlen, 2141 old->fr_group, LIFNAMSIZ); 2142 } 2143 if (old->fr_grhead[0] != '\0') { 2144 fr->fr_grhead = nlen; 2145 nlen = ipf_addfrstr(names, nlen, 2146 old->fr_grhead, LIFNAMSIZ); 2147 } 2148 fr->fr_namelen = nlen; 2149 2150 if (old->fr_type == FR_T_IPF) { 2151 int offset = fr->fr_namelen; 2152 ipfobj_t obj; 2153 int error; 2154 2155 obj.ipfo_type = IPFOBJ_FRIPF; 2156 obj.ipfo_rev = 4010100; 2157 obj.ipfo_ptr = old->fr_data; 2158 2159 if ((offset & 7) != 0) 2160 offset += 8 - (offset & 7); 2161 error = ipf_in_compat(softc, &obj, 2162 fr->fr_names + offset, 0); 2163 if (error == 0) { 2164 fr->fr_data = fr->fr_names + offset; 2165 fr->fr_dsize = sizeof(fripf_t); 2166 } 2167 } 2168 } 2169 } 2170 2171 2172 static void 2173 frentry_4_1_0_to_current(softc, old, current, size) 2174 ipf_main_softc_t *softc; 2175 frentry_4_1_0_t *old; 2176 void *current; 2177 int size; 2178 { 2179 frentry_t *fr = (frentry_t *)current; 2180 2181 fr->fr_size = sizeof(*fr); 2182 fr->fr_comment = -1; 2183 fr->fr_ref = old->fr_ref; 2184 fr->fr_statecnt = old->fr_statecnt; 2185 fr->fr_hits = old->fr_hits; 2186 fr->fr_bytes = old->fr_bytes; 2187 fr->fr_lastpkt.tv_sec = old->fr_lastpkt.tv_sec; 2188 fr->fr_lastpkt.tv_usec = old->fr_lastpkt.tv_usec; 2189 bcopy(&old->fr_dun, &fr->fr_dun, sizeof(old->fr_dun)); 2190 fr->fr_func = old->fr_func; 2191 fr->fr_dsize = old->fr_dsize; 2192 fr->fr_pps = old->fr_pps; 2193 fr->fr_statemax = old->fr_statemax; 2194 fr->fr_flineno = old->fr_flineno; 2195 fr->fr_type = old->fr_type; 2196 fr->fr_flags = fr_frflags4to5(old->fr_flags); 2197 fr->fr_logtag = old->fr_logtag; 2198 fr->fr_collect = old->fr_collect; 2199 fr->fr_arg = old->fr_arg; 2200 fr->fr_loglevel = old->fr_loglevel; 2201 fr->fr_age[0] = old->fr_age[0]; 2202 fr->fr_age[1] = old->fr_age[1]; 2203 fr->fr_tifs[0].fd_ip6 = old->fr_tifs[0].ofd_ip6; 2204 fr->fr_tifs[0].fd_type = FRD_NORMAL; 2205 fr->fr_tifs[1].fd_ip6 = old->fr_tifs[1].ofd_ip6; 2206 fr->fr_tifs[1].fd_type = FRD_NORMAL; 2207 fr->fr_dif.fd_ip6 = old->fr_dif.ofd_ip6; 2208 fr->fr_dif.fd_type = FRD_NORMAL; 2209 if (old->fr_v == 4) 2210 fr->fr_family = AF_INET; 2211 if (old->fr_v == 6) 2212 fr->fr_family = AF_INET6; 2213 fr->fr_icode = old->fr_icode; 2214 fr->fr_cksum = old->fr_cksum; 2215 fr->fr_namelen = 0; 2216 fr->fr_ifnames[0] = -1; 2217 fr->fr_ifnames[1] = -1; 2218 fr->fr_ifnames[2] = -1; 2219 fr->fr_ifnames[3] = -1; 2220 fr->fr_dif.fd_name = -1; 2221 fr->fr_tifs[0].fd_name = -1; 2222 fr->fr_tifs[1].fd_name = -1; 2223 fr->fr_group = -1; 2224 fr->fr_grhead = -1; 2225 fr->fr_icmphead = -1; 2226 if (size == 0) { 2227 fr->fr_size = sizeof(*fr) + LIFNAMSIZ * 7 + FR_GROUPLEN * 2; 2228 fr->fr_size += 9; /* room for \0's */ 2229 } else { 2230 char *names = fr->fr_names; 2231 int nlen = fr->fr_namelen; 2232 2233 fr->fr_size = size; 2234 if (old->fr_ifnames[0][0] != '\0') { 2235 fr->fr_ifnames[0] = nlen; 2236 nlen = ipf_addfrstr(names, nlen, old->fr_ifnames[0], 2237 LIFNAMSIZ); 2238 } 2239 if (old->fr_ifnames[1][0] != '\0') { 2240 fr->fr_ifnames[1] = nlen; 2241 nlen = ipf_addfrstr(names, nlen, old->fr_ifnames[1], 2242 LIFNAMSIZ); 2243 } 2244 if (old->fr_ifnames[2][0] != '\0') { 2245 fr->fr_ifnames[2] = nlen; 2246 nlen = ipf_addfrstr(names, nlen, old->fr_ifnames[2], 2247 LIFNAMSIZ); 2248 } 2249 if (old->fr_ifnames[3][0] != '\0') { 2250 fr->fr_ifnames[3] = nlen; 2251 nlen = ipf_addfrstr(names, nlen, old->fr_ifnames[3], 2252 LIFNAMSIZ); 2253 } 2254 if (old->fr_tifs[0].fd_ifname[0] != '\0') { 2255 fr->fr_tifs[0].fd_name = nlen; 2256 nlen = ipf_addfrstr(names, nlen, 2257 old->fr_tifs[0].fd_ifname, 2258 LIFNAMSIZ); 2259 } 2260 if (old->fr_tifs[1].fd_ifname[0] != '\0') { 2261 fr->fr_tifs[1].fd_name = nlen; 2262 nlen = ipf_addfrstr(names, nlen, 2263 old->fr_tifs[1].fd_ifname, 2264 LIFNAMSIZ); 2265 } 2266 if (old->fr_dif.fd_ifname[0] != '\0') { 2267 fr->fr_dif.fd_name = nlen; 2268 nlen = ipf_addfrstr(names, nlen, 2269 old->fr_dif.fd_ifname, LIFNAMSIZ); 2270 } 2271 if (old->fr_group[0] != '\0') { 2272 fr->fr_group = nlen; 2273 nlen = ipf_addfrstr(names, nlen, 2274 old->fr_group, LIFNAMSIZ); 2275 } 2276 if (old->fr_grhead[0] != '\0') { 2277 fr->fr_grhead = nlen; 2278 nlen = ipf_addfrstr(names, nlen, 2279 old->fr_grhead, LIFNAMSIZ); 2280 } 2281 fr->fr_namelen = nlen; 2282 2283 if (old->fr_type == FR_T_IPF) { 2284 int offset = fr->fr_namelen; 2285 ipfobj_t obj; 2286 int error; 2287 2288 obj.ipfo_type = IPFOBJ_FRIPF; 2289 obj.ipfo_rev = 4010100; 2290 obj.ipfo_ptr = old->fr_data; 2291 2292 if ((offset & 7) != 0) 2293 offset += 8 - (offset & 7); 2294 offset += 8 - (offset & 7); 2295 error = ipf_in_compat(softc, &obj, 2296 fr->fr_names + offset, 0); 2297 if (error == 0) { 2298 fr->fr_data = fr->fr_names + offset; 2299 fr->fr_dsize = sizeof(fripf_t); 2300 } 2301 } 2302 } 2303 } 2304 2305 2306 static void 2307 friostat_4_1_33_to_current(old, current) 2308 friostat_4_1_33_t *old; 2309 void *current; 2310 { 2311 friostat_t *fiop = (friostat_t *)current; 2312 2313 bcopy(&old->of_st[0], &fiop->f_st[0].fr_pass, sizeof(old->of_st[0])); 2314 bcopy(&old->of_st[1], &fiop->f_st[1].fr_pass, sizeof(old->of_st[1])); 2315 2316 fiop->f_ipf[0][0] = old->f_ipf[0][0]; 2317 fiop->f_ipf[0][1] = old->f_ipf[0][1]; 2318 fiop->f_ipf[1][0] = old->f_ipf[1][0]; 2319 fiop->f_ipf[1][1] = old->f_ipf[1][1]; 2320 fiop->f_acct[0][0] = old->f_acct[0][0]; 2321 fiop->f_acct[0][1] = old->f_acct[0][1]; 2322 fiop->f_acct[1][0] = old->f_acct[1][0]; 2323 fiop->f_acct[1][1] = old->f_acct[1][1]; 2324 fiop->f_auth = fiop->f_auth; 2325 bcopy(&old->f_groups, &fiop->f_groups, sizeof(old->f_groups)); 2326 bcopy(&old->f_froute, &fiop->f_froute, sizeof(old->f_froute)); 2327 fiop->f_ticks = old->f_ticks; 2328 bcopy(&old->f_locks, &fiop->f_locks, sizeof(old->f_locks)); 2329 fiop->f_defpass = old->f_defpass; 2330 fiop->f_active = old->f_active; 2331 fiop->f_running = old->f_running; 2332 fiop->f_logging = old->f_logging; 2333 fiop->f_features = old->f_features; 2334 bcopy(old->f_version, fiop->f_version, sizeof(old->f_version)); 2335 } 2336 2337 2338 static void 2339 friostat_4_1_0_to_current(old, current) 2340 friostat_4_1_0_t *old; 2341 void *current; 2342 { 2343 friostat_t *fiop = (friostat_t *)current; 2344 2345 bcopy(&old->of_st[0], &fiop->f_st[0].fr_pass, sizeof(old->of_st[0])); 2346 bcopy(&old->of_st[1], &fiop->f_st[1].fr_pass, sizeof(old->of_st[1])); 2347 2348 fiop->f_ipf[0][0] = old->f_ipf[0][0]; 2349 fiop->f_ipf[0][1] = old->f_ipf[0][1]; 2350 fiop->f_ipf[1][0] = old->f_ipf[1][0]; 2351 fiop->f_ipf[1][1] = old->f_ipf[1][1]; 2352 fiop->f_acct[0][0] = old->f_acct[0][0]; 2353 fiop->f_acct[0][1] = old->f_acct[0][1]; 2354 fiop->f_acct[1][0] = old->f_acct[1][0]; 2355 fiop->f_acct[1][1] = old->f_acct[1][1]; 2356 fiop->f_auth = fiop->f_auth; 2357 bcopy(&old->f_groups, &fiop->f_groups, sizeof(old->f_groups)); 2358 bcopy(&old->f_froute, &fiop->f_froute, sizeof(old->f_froute)); 2359 fiop->f_ticks = old->f_ticks; 2360 bcopy(&old->f_locks, &fiop->f_locks, sizeof(old->f_locks)); 2361 fiop->f_defpass = old->f_defpass; 2362 fiop->f_active = old->f_active; 2363 fiop->f_running = old->f_running; 2364 fiop->f_logging = old->f_logging; 2365 fiop->f_features = old->f_features; 2366 bcopy(old->f_version, fiop->f_version, sizeof(old->f_version)); 2367 } 2368 2369 2370 static void 2371 ipnat_4_1_14_to_current(old, current, size) 2372 ipnat_4_1_14_t *old; 2373 void *current; 2374 int size; 2375 { 2376 ipnat_t *np = (ipnat_t *)current; 2377 2378 np->in_space = old->in_space; 2379 np->in_hv[0] = old->in_hv; 2380 np->in_hv[1] = old->in_hv; 2381 np->in_flineno = old->in_flineno; 2382 if (old->in_redir == NAT_REDIRECT) 2383 np->in_dpnext = old->in_pnext; 2384 else 2385 np->in_spnext = old->in_pnext; 2386 np->in_v[0] = old->in_v; 2387 np->in_v[1] = old->in_v; 2388 np->in_flags = old->in_flags; 2389 np->in_mssclamp = old->in_mssclamp; 2390 np->in_age[0] = old->in_age[0]; 2391 np->in_age[1] = old->in_age[1]; 2392 np->in_redir = old->in_redir; 2393 np->in_pr[0] = old->in_p; 2394 np->in_pr[1] = old->in_p; 2395 if (np->in_redir == NAT_REDIRECT) { 2396 np->in_ndst.na_nextaddr = old->in_next6; 2397 np->in_ndst.na_addr[0] = old->in_in[0]; 2398 np->in_ndst.na_addr[1] = old->in_in[1]; 2399 np->in_ndst.na_atype = FRI_NORMAL; 2400 np->in_odst.na_addr[0] = old->in_out[0]; 2401 np->in_odst.na_addr[1] = old->in_out[1]; 2402 np->in_odst.na_atype = FRI_NORMAL; 2403 np->in_osrc.na_addr[0] = old->in_src[0]; 2404 np->in_osrc.na_addr[1] = old->in_src[1]; 2405 np->in_osrc.na_atype = FRI_NORMAL; 2406 } else { 2407 np->in_nsrc.na_nextaddr = old->in_next6; 2408 np->in_nsrc.na_addr[0] = old->in_out[0]; 2409 np->in_nsrc.na_addr[1] = old->in_out[1]; 2410 np->in_nsrc.na_atype = FRI_NORMAL; 2411 np->in_osrc.na_addr[0] = old->in_in[0]; 2412 np->in_osrc.na_addr[1] = old->in_in[1]; 2413 np->in_osrc.na_atype = FRI_NORMAL; 2414 np->in_odst.na_addr[0] = old->in_src[0]; 2415 np->in_odst.na_addr[1] = old->in_src[1]; 2416 np->in_odst.na_atype = FRI_NORMAL; 2417 } 2418 ipfv4tuctov5(&old->in_tuc, &np->in_tuc); 2419 if (np->in_redir == NAT_REDIRECT) { 2420 np->in_dpmin = old->in_port[0]; 2421 np->in_dpmax = old->in_port[1]; 2422 } else { 2423 np->in_spmin = old->in_port[0]; 2424 np->in_spmax = old->in_port[1]; 2425 } 2426 np->in_ppip = old->in_ppip; 2427 np->in_ippip = old->in_ippip; 2428 np->in_tag = old->in_tag; 2429 2430 np->in_namelen = 0; 2431 np->in_plabel = -1; 2432 np->in_ifnames[0] = -1; 2433 np->in_ifnames[1] = -1; 2434 2435 if (size == 0) { 2436 np->in_size = sizeof(*np); 2437 np->in_size += LIFNAMSIZ * 2 + APR_LABELLEN; 2438 np->in_size += 3; 2439 } else { 2440 int nlen = np->in_namelen; 2441 char *names = np->in_names; 2442 2443 if (old->in_ifnames[0][0] != '\0') { 2444 np->in_ifnames[0] = nlen; 2445 nlen = ipf_addfrstr(names, nlen, old->in_ifnames[0], 2446 LIFNAMSIZ); 2447 } 2448 if (old->in_ifnames[1][0] != '\0') { 2449 np->in_ifnames[0] = nlen; 2450 nlen = ipf_addfrstr(names, nlen, old->in_ifnames[1], 2451 LIFNAMSIZ); 2452 } 2453 if (old->in_plabel[0] != '\0') { 2454 np->in_plabel = nlen; 2455 nlen = ipf_addfrstr(names, nlen, old->in_plabel, 2456 LIFNAMSIZ); 2457 } 2458 np->in_namelen = nlen; 2459 np->in_size = size; 2460 } 2461 } 2462 2463 2464 static void 2465 ipnat_4_1_0_to_current(old, current, size) 2466 ipnat_4_1_0_t *old; 2467 void *current; 2468 int size; 2469 { 2470 ipnat_t *np = (ipnat_t *)current; 2471 2472 np->in_space = old->in_space; 2473 np->in_hv[0] = old->in_hv; 2474 np->in_hv[1] = old->in_hv; 2475 np->in_flineno = old->in_flineno; 2476 if (old->in_redir == NAT_REDIRECT) 2477 np->in_dpnext = old->in_pnext; 2478 else 2479 np->in_spnext = old->in_pnext; 2480 np->in_v[0] = old->in_v; 2481 np->in_v[1] = old->in_v; 2482 np->in_flags = old->in_flags; 2483 np->in_mssclamp = old->in_mssclamp; 2484 np->in_age[0] = old->in_age[0]; 2485 np->in_age[1] = old->in_age[1]; 2486 np->in_redir = old->in_redir; 2487 np->in_pr[0] = old->in_p; 2488 np->in_pr[1] = old->in_p; 2489 if (np->in_redir == NAT_REDIRECT) { 2490 np->in_ndst.na_nextaddr = old->in_next6; 2491 bcopy(&old->in_in, &np->in_ndst.na_addr, sizeof(old->in_in)); 2492 bcopy(&old->in_out, &np->in_odst.na_addr, sizeof(old->in_out)); 2493 bcopy(&old->in_src, &np->in_osrc.na_addr, sizeof(old->in_src)); 2494 } else { 2495 np->in_nsrc.na_nextaddr = old->in_next6; 2496 bcopy(&old->in_in, &np->in_osrc.na_addr, sizeof(old->in_in)); 2497 bcopy(&old->in_out, &np->in_nsrc.na_addr, sizeof(old->in_out)); 2498 bcopy(&old->in_src, &np->in_odst.na_addr, sizeof(old->in_src)); 2499 } 2500 ipfv4tuctov5(&old->in_tuc, &np->in_tuc); 2501 if (np->in_redir == NAT_REDIRECT) { 2502 np->in_dpmin = old->in_port[0]; 2503 np->in_dpmax = old->in_port[1]; 2504 } else { 2505 np->in_spmin = old->in_port[0]; 2506 np->in_spmax = old->in_port[1]; 2507 } 2508 np->in_ppip = old->in_ppip; 2509 np->in_ippip = old->in_ippip; 2510 bcopy(&old->in_tag, &np->in_tag, sizeof(np->in_tag)); 2511 2512 np->in_namelen = 0; 2513 np->in_plabel = -1; 2514 np->in_ifnames[0] = -1; 2515 np->in_ifnames[1] = -1; 2516 2517 if (size == 0) { 2518 np->in_size = sizeof(*np); 2519 np->in_size += LIFNAMSIZ * 2 + APR_LABELLEN; 2520 np->in_size += 3; 2521 } else { 2522 int nlen = np->in_namelen; 2523 char *names = np->in_names; 2524 2525 if (old->in_ifnames[0][0] != '\0') { 2526 np->in_ifnames[0] = nlen; 2527 nlen = ipf_addfrstr(names, nlen, old->in_ifnames[0], 2528 LIFNAMSIZ); 2529 } 2530 if (old->in_ifnames[1][0] != '\0') { 2531 np->in_ifnames[0] = nlen; 2532 nlen = ipf_addfrstr(names, nlen, old->in_ifnames[1], 2533 LIFNAMSIZ); 2534 } 2535 if (old->in_plabel[0] != '\0') { 2536 np->in_plabel = nlen; 2537 nlen = ipf_addfrstr(names, nlen, old->in_plabel, 2538 LIFNAMSIZ); 2539 } 2540 np->in_namelen = nlen; 2541 np->in_size = size; 2542 } 2543 } 2544 2545 2546 static void 2547 frauth_4_1_32_to_current(old, current) 2548 frauth_4_1_32_t *old; 2549 void *current; 2550 { 2551 frauth_t *fra = (frauth_t *)current; 2552 2553 fra->fra_age = old->fra_age; 2554 fra->fra_len = old->fra_len; 2555 fra->fra_index = old->fra_index; 2556 fra->fra_pass = old->fra_pass; 2557 fr_info_4_1_32_to_current(&old->fra_info, &fra->fra_info); 2558 fra->fra_buf = old->fra_buf; 2559 fra->fra_flx = old->fra_flx; 2560 #ifdef MENTAT 2561 fra->fra_q = old->fra_q; 2562 fra->fra_m = old->fra_m; 2563 #endif 2564 } 2565 2566 2567 static void 2568 frauth_4_1_29_to_current(old, current) 2569 frauth_4_1_29_t *old; 2570 void *current; 2571 { 2572 frauth_t *fra = (frauth_t *)current; 2573 2574 fra->fra_age = old->fra_age; 2575 fra->fra_len = old->fra_len; 2576 fra->fra_index = old->fra_index; 2577 fra->fra_pass = old->fra_pass; 2578 fr_info_4_1_24_to_current(&old->fra_info, &fra->fra_info); 2579 fra->fra_buf = old->fra_buf; 2580 fra->fra_flx = old->fra_flx; 2581 #ifdef MENTAT 2582 fra->fra_q = old->fra_q; 2583 fra->fra_m = old->fra_m; 2584 #endif 2585 } 2586 2587 2588 static void 2589 frauth_4_1_24_to_current(old, current) 2590 frauth_4_1_24_t *old; 2591 void *current; 2592 { 2593 frauth_t *fra = (frauth_t *)current; 2594 2595 fra->fra_age = old->fra_age; 2596 fra->fra_len = old->fra_len; 2597 fra->fra_index = old->fra_index; 2598 fra->fra_pass = old->fra_pass; 2599 fr_info_4_1_24_to_current(&old->fra_info, &fra->fra_info); 2600 fra->fra_buf = old->fra_buf; 2601 #ifdef MENTAT 2602 fra->fra_q = old->fra_q; 2603 fra->fra_m = old->fra_m; 2604 #endif 2605 } 2606 2607 2608 static void 2609 frauth_4_1_23_to_current(old, current) 2610 frauth_4_1_23_t *old; 2611 void *current; 2612 { 2613 frauth_t *fra = (frauth_t *)current; 2614 2615 fra->fra_age = old->fra_age; 2616 fra->fra_len = old->fra_len; 2617 fra->fra_index = old->fra_index; 2618 fra->fra_pass = old->fra_pass; 2619 fr_info_4_1_23_to_current(&old->fra_info, &fra->fra_info); 2620 fra->fra_buf = old->fra_buf; 2621 #ifdef MENTAT 2622 fra->fra_q = old->fra_q; 2623 fra->fra_m = old->fra_m; 2624 #endif 2625 } 2626 2627 2628 static void 2629 frauth_4_1_11_to_current(old, current) 2630 frauth_4_1_11_t *old; 2631 void *current; 2632 { 2633 frauth_t *fra = (frauth_t *)current; 2634 2635 fra->fra_age = old->fra_age; 2636 fra->fra_len = old->fra_len; 2637 fra->fra_index = old->fra_index; 2638 fra->fra_pass = old->fra_pass; 2639 fr_info_4_1_11_to_current(&old->fra_info, &fra->fra_info); 2640 fra->fra_buf = old->fra_buf; 2641 #ifdef MENTAT 2642 fra->fra_q = old->fra_q; 2643 fra->fra_m = old->fra_m; 2644 #endif 2645 } 2646 2647 2648 static void 2649 fr_info_4_1_32_to_current(old, current) 2650 fr_info_4_1_32_t *old; 2651 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_24_to_current(old, current) 2691 fr_info_4_1_24_t *old; 2692 void *current; 2693 { 2694 fr_info_t *fin = (fr_info_t *)current; 2695 2696 fin->fin_ifp = old->fin_ifp; 2697 ipf_v4iptov5(&old->fin_fi, &fin->fin_fi); 2698 bcopy(&old->fin_dat, &fin->fin_dat, sizeof(old->fin_dat)); 2699 fin->fin_out = old->fin_out; 2700 fin->fin_rev = old->fin_rev; 2701 fin->fin_hlen = old->fin_hlen; 2702 fin->fin_tcpf = old->ofin_tcpf; 2703 fin->fin_icode = old->fin_icode; 2704 fin->fin_rule = old->fin_rule; 2705 bcopy(old->fin_group, fin->fin_group, sizeof(old->fin_group)); 2706 fin->fin_fr = old->fin_fr; 2707 fin->fin_dp = old->fin_dp; 2708 fin->fin_dlen = old->fin_dlen; 2709 fin->fin_plen = old->fin_plen; 2710 fin->fin_ipoff = old->fin_ipoff; 2711 fin->fin_id = old->fin_id; 2712 fin->fin_off = old->fin_off; 2713 fin->fin_depth = old->fin_depth; 2714 fin->fin_error = old->fin_error; 2715 fin->fin_cksum = old->fin_cksum; 2716 fin->fin_nattag = old->fin_nattag; 2717 fin->fin_ip = old->ofin_ip; 2718 fin->fin_mp = old->fin_mp; 2719 fin->fin_m = old->fin_m; 2720 #ifdef MENTAT 2721 fin->fin_qfm = old->fin_qfm; 2722 fin->fin_qpi = old->fin_qpi; 2723 #endif 2724 #ifdef __sgi 2725 fin->fin_hbuf = old->fin_hbuf; 2726 #endif 2727 } 2728 2729 2730 static void 2731 fr_info_4_1_23_to_current(old, current) 2732 fr_info_4_1_23_t *old; 2733 void *current; 2734 { 2735 fr_info_t *fin = (fr_info_t *)current; 2736 2737 fin->fin_ifp = old->fin_ifp; 2738 ipf_v4iptov5(&old->fin_fi, &fin->fin_fi); 2739 bcopy(&old->fin_dat, &fin->fin_dat, sizeof(old->fin_dat)); 2740 fin->fin_out = old->fin_out; 2741 fin->fin_rev = old->fin_rev; 2742 fin->fin_hlen = old->fin_hlen; 2743 fin->fin_tcpf = old->ofin_tcpf; 2744 fin->fin_icode = old->fin_icode; 2745 fin->fin_rule = old->fin_rule; 2746 bcopy(old->fin_group, fin->fin_group, sizeof(old->fin_group)); 2747 fin->fin_fr = old->fin_fr; 2748 fin->fin_dp = old->fin_dp; 2749 fin->fin_dlen = old->fin_dlen; 2750 fin->fin_plen = old->fin_plen; 2751 fin->fin_ipoff = old->fin_ipoff; 2752 fin->fin_id = old->fin_id; 2753 fin->fin_off = old->fin_off; 2754 fin->fin_depth = old->fin_depth; 2755 fin->fin_error = old->fin_error; 2756 fin->fin_nattag = old->fin_nattag; 2757 fin->fin_ip = old->ofin_ip; 2758 fin->fin_mp = old->fin_mp; 2759 fin->fin_m = old->fin_m; 2760 #ifdef MENTAT 2761 fin->fin_qfm = old->fin_qfm; 2762 fin->fin_qpi = old->fin_qpi; 2763 #endif 2764 #ifdef __sgi 2765 fin->fin_hbuf = fin->fin_hbuf; 2766 #endif 2767 } 2768 2769 2770 static void 2771 fr_info_4_1_11_to_current(old, current) 2772 fr_info_4_1_11_t *old; 2773 void *current; 2774 { 2775 fr_info_t *fin = (fr_info_t *)current; 2776 2777 fin->fin_ifp = old->fin_ifp; 2778 ipf_v4iptov5(&old->fin_fi, &fin->fin_fi); 2779 bcopy(&old->fin_dat, &fin->fin_dat, sizeof(old->fin_dat)); 2780 fin->fin_out = old->fin_out; 2781 fin->fin_rev = old->fin_rev; 2782 fin->fin_hlen = old->fin_hlen; 2783 fin->fin_tcpf = old->ofin_tcpf; 2784 fin->fin_icode = old->fin_icode; 2785 fin->fin_rule = old->fin_rule; 2786 bcopy(old->fin_group, fin->fin_group, sizeof(old->fin_group)); 2787 fin->fin_fr = old->fin_fr; 2788 fin->fin_dp = old->fin_dp; 2789 fin->fin_dlen = old->fin_dlen; 2790 fin->fin_plen = old->fin_plen; 2791 fin->fin_ipoff = old->fin_ipoff; 2792 fin->fin_id = old->fin_id; 2793 fin->fin_off = old->fin_off; 2794 fin->fin_depth = old->fin_depth; 2795 fin->fin_error = old->fin_error; 2796 fin->fin_nattag = old->fin_nattag; 2797 fin->fin_ip = old->ofin_ip; 2798 fin->fin_mp = old->fin_mp; 2799 fin->fin_m = old->fin_m; 2800 #ifdef MENTAT 2801 fin->fin_qfm = old->fin_qfm; 2802 fin->fin_qpi = old->fin_qpi; 2803 #endif 2804 #ifdef __sgi 2805 fin->fin_hbuf = fin->fin_hbuf; 2806 #endif 2807 } 2808 2809 2810 static void 2811 nat_4_1_3_to_current(nat_4_1_3_t *old, nat_t *current) 2812 { 2813 bzero((void *)current, sizeof(*current)); 2814 bcopy((void *)old, (void *)current, sizeof(*old)); 2815 } 2816 2817 2818 static void 2819 nat_4_1_14_to_current(nat_4_1_14_t *old, nat_t *current) 2820 { 2821 bzero((void *)current, sizeof(*current)); 2822 bcopy((void *)old, (void *)current, sizeof(*old)); 2823 } 2824 2825 2826 static void 2827 nat_save_4_1_16_to_current(softc, old, current) 2828 ipf_main_softc_t *softc; 2829 nat_save_4_1_16_t *old; 2830 void *current; 2831 { 2832 nat_save_t *nats = (nat_save_t *)current; 2833 2834 nats->ipn_next = old->ipn_next; 2835 nat_4_1_14_to_current(&old->ipn_nat, &nats->ipn_nat); 2836 bcopy(&old->ipn_ipnat, &nats->ipn_ipnat, sizeof(old->ipn_ipnat)); 2837 frentry_4_1_16_to_current(softc, &old->ipn_fr, &nats->ipn_fr, 0); 2838 nats->ipn_dsize = old->ipn_dsize; 2839 bcopy(old->ipn_data, nats->ipn_data, sizeof(nats->ipn_data)); 2840 } 2841 2842 2843 static void 2844 nat_save_4_1_14_to_current(softc, old, current) 2845 ipf_main_softc_t *softc; 2846 nat_save_4_1_14_t *old; 2847 void *current; 2848 { 2849 nat_save_t *nats = (nat_save_t *)current; 2850 2851 nats->ipn_next = old->ipn_next; 2852 nat_4_1_14_to_current(&old->ipn_nat, &nats->ipn_nat); 2853 bcopy(&old->ipn_ipnat, &nats->ipn_ipnat, sizeof(old->ipn_ipnat)); 2854 frentry_4_1_0_to_current(softc, &old->ipn_fr, &nats->ipn_fr, 0); 2855 nats->ipn_dsize = old->ipn_dsize; 2856 bcopy(old->ipn_data, nats->ipn_data, sizeof(nats->ipn_data)); 2857 } 2858 2859 2860 static void 2861 nat_save_4_1_3_to_current(softc, old, current) 2862 ipf_main_softc_t *softc; 2863 nat_save_4_1_3_t *old; 2864 void *current; 2865 { 2866 nat_save_t *nats = (nat_save_t *)current; 2867 2868 nats->ipn_next = old->ipn_next; 2869 nat_4_1_3_to_current(&old->ipn_nat, &nats->ipn_nat); 2870 ipnat_4_1_0_to_current(&old->ipn_ipnat, &nats->ipn_ipnat, 0); 2871 frentry_4_1_0_to_current(softc, &old->ipn_fr, &nats->ipn_fr, 0); 2872 nats->ipn_dsize = old->ipn_dsize; 2873 bcopy(old->ipn_data, nats->ipn_data, sizeof(nats->ipn_data)); 2874 } 2875 2876 2877 static void 2878 natstat_current_to_4_1_32(current, old) 2879 void *current; 2880 natstat_4_1_32_t *old; 2881 { 2882 natstat_t *ns = (natstat_t *)current; 2883 2884 old->ns_mapped[0] = ns->ns_side[0].ns_translated; 2885 old->ns_mapped[1] = ns->ns_side[1].ns_translated; 2886 old->ns_rules = ns->ns_side[0].ns_inuse + ns->ns_side[1].ns_inuse; 2887 old->ns_added = ns->ns_side[0].ns_added + ns->ns_side[1].ns_added; 2888 old->ns_expire = ns->ns_expire; 2889 old->ns_inuse = ns->ns_side[0].ns_inuse + ns->ns_side[1].ns_inuse; 2890 old->ns_logged = ns->ns_log_ok; 2891 old->ns_logfail = ns->ns_log_fail; 2892 old->ns_memfail = ns->ns_side[0].ns_memfail + ns->ns_side[1].ns_memfail; 2893 old->ns_badnat = ns->ns_side[0].ns_badnat + ns->ns_side[1].ns_badnat; 2894 old->ns_addtrpnt = ns->ns_addtrpnt; 2895 old->ns_table[0] = ns->ns_side[0].ns_table; 2896 old->ns_table[1] = ns->ns_side[1].ns_table; 2897 old->ns_maptable = NULL; 2898 old->ns_list = ns->ns_list; 2899 old->ns_apslist = NULL; 2900 old->ns_wilds = ns->ns_wilds; 2901 old->ns_nattab_sz = ns->ns_nattab_sz; 2902 old->ns_nattab_max = ns->ns_nattab_max; 2903 old->ns_rultab_sz = ns->ns_rultab_sz; 2904 old->ns_rdrtab_sz = ns->ns_rdrtab_sz; 2905 old->ns_trpntab_sz = ns->ns_trpntab_sz; 2906 old->ns_hostmap_sz = 0; 2907 old->ns_instances = ns->ns_instances; 2908 old->ns_maplist = ns->ns_maplist; 2909 old->ns_bucketlen[0] = (u_long *)ns->ns_side[0].ns_bucketlen; 2910 old->ns_bucketlen[1] = (u_long *)ns->ns_side[1].ns_bucketlen; 2911 old->ns_ticks = ns->ns_ticks; 2912 old->ns_orphans = ns->ns_orphans; 2913 old->ns_uncreate[0][0] = ns->ns_side[0].ns_uncreate[0]; 2914 old->ns_uncreate[0][1] = ns->ns_side[0].ns_uncreate[1]; 2915 old->ns_uncreate[1][0] = ns->ns_side[1].ns_uncreate[0]; 2916 old->ns_uncreate[1][1] = ns->ns_side[1].ns_uncreate[1]; 2917 } 2918 2919 2920 static void 2921 natstat_current_to_4_1_27(current, old) 2922 void *current; 2923 natstat_4_1_27_t *old; 2924 { 2925 natstat_t *ns = (natstat_t *)current; 2926 2927 old->ns_mapped[0] = ns->ns_side[0].ns_translated; 2928 old->ns_mapped[1] = ns->ns_side[1].ns_translated; 2929 old->ns_rules = ns->ns_side[0].ns_inuse + ns->ns_side[1].ns_inuse; 2930 old->ns_added = ns->ns_side[0].ns_added + ns->ns_side[1].ns_added; 2931 old->ns_expire = ns->ns_expire; 2932 old->ns_inuse = ns->ns_side[0].ns_inuse + ns->ns_side[1].ns_inuse; 2933 old->ns_logged = ns->ns_log_ok; 2934 old->ns_logfail = ns->ns_log_fail; 2935 old->ns_memfail = ns->ns_side[0].ns_memfail + ns->ns_side[1].ns_memfail; 2936 old->ns_badnat = ns->ns_side[0].ns_badnat + ns->ns_side[1].ns_badnat; 2937 old->ns_addtrpnt = ns->ns_addtrpnt; 2938 old->ns_table[0] = ns->ns_side[0].ns_table; 2939 old->ns_table[1] = ns->ns_side[1].ns_table; 2940 old->ns_maptable = NULL; 2941 old->ns_list = ns->ns_list; 2942 old->ns_apslist = NULL; 2943 old->ns_wilds = ns->ns_wilds; 2944 old->ns_nattab_sz = ns->ns_nattab_sz; 2945 old->ns_nattab_max = ns->ns_nattab_max; 2946 old->ns_rultab_sz = ns->ns_rultab_sz; 2947 old->ns_rdrtab_sz = ns->ns_rdrtab_sz; 2948 old->ns_trpntab_sz = ns->ns_trpntab_sz; 2949 old->ns_hostmap_sz = 0; 2950 old->ns_instances = ns->ns_instances; 2951 old->ns_maplist = ns->ns_maplist; 2952 old->ns_bucketlen[0] = (u_long *)ns->ns_side[0].ns_bucketlen; 2953 old->ns_bucketlen[1] = (u_long *)ns->ns_side[1].ns_bucketlen; 2954 old->ns_ticks = ns->ns_ticks; 2955 old->ns_orphans = ns->ns_orphans; 2956 } 2957 2958 2959 static void 2960 natstat_current_to_4_1_16(current, old) 2961 void *current; 2962 natstat_4_1_16_t *old; 2963 { 2964 natstat_t *ns = (natstat_t *)current; 2965 2966 old->ns_mapped[0] = ns->ns_side[0].ns_translated; 2967 old->ns_mapped[1] = ns->ns_side[1].ns_translated; 2968 old->ns_rules = ns->ns_side[0].ns_inuse + ns->ns_side[1].ns_inuse; 2969 old->ns_added = ns->ns_side[0].ns_added + ns->ns_side[1].ns_added; 2970 old->ns_expire = ns->ns_expire; 2971 old->ns_inuse = ns->ns_side[0].ns_inuse + ns->ns_side[1].ns_inuse; 2972 old->ns_logged = ns->ns_log_ok; 2973 old->ns_logfail = ns->ns_log_fail; 2974 old->ns_memfail = ns->ns_side[0].ns_memfail + ns->ns_side[1].ns_memfail; 2975 old->ns_badnat = ns->ns_side[0].ns_badnat + ns->ns_side[1].ns_badnat; 2976 old->ns_addtrpnt = ns->ns_addtrpnt; 2977 old->ns_table[0] = ns->ns_side[0].ns_table; 2978 old->ns_table[1] = ns->ns_side[1].ns_table; 2979 old->ns_maptable = NULL; 2980 old->ns_list = ns->ns_list; 2981 old->ns_apslist = NULL; 2982 old->ns_wilds = ns->ns_wilds; 2983 old->ns_nattab_sz = ns->ns_nattab_sz; 2984 old->ns_nattab_max = ns->ns_nattab_max; 2985 old->ns_rultab_sz = ns->ns_rultab_sz; 2986 old->ns_rdrtab_sz = ns->ns_rdrtab_sz; 2987 old->ns_trpntab_sz = ns->ns_trpntab_sz; 2988 old->ns_hostmap_sz = 0; 2989 old->ns_instances = ns->ns_instances; 2990 old->ns_maplist = ns->ns_maplist; 2991 old->ns_bucketlen[0] = (u_long *)ns->ns_side[0].ns_bucketlen; 2992 old->ns_bucketlen[1] = (u_long *)ns->ns_side[1].ns_bucketlen; 2993 old->ns_ticks = ns->ns_ticks; 2994 } 2995 2996 2997 static void 2998 natstat_current_to_4_1_0(current, old) 2999 void *current; 3000 natstat_4_1_0_t *old; 3001 { 3002 natstat_t *ns = (natstat_t *)current; 3003 3004 old->ns_mapped[0] = ns->ns_side[0].ns_translated; 3005 old->ns_mapped[1] = ns->ns_side[1].ns_translated; 3006 old->ns_rules = ns->ns_side[0].ns_inuse + ns->ns_side[1].ns_inuse; 3007 old->ns_added = ns->ns_side[0].ns_added + ns->ns_side[1].ns_added; 3008 old->ns_expire = ns->ns_expire; 3009 old->ns_inuse = ns->ns_side[0].ns_inuse + ns->ns_side[1].ns_inuse; 3010 old->ns_logged = ns->ns_log_ok; 3011 old->ns_logfail = ns->ns_log_fail; 3012 old->ns_memfail = ns->ns_side[0].ns_memfail + ns->ns_side[1].ns_memfail; 3013 old->ns_badnat = ns->ns_side[0].ns_badnat + ns->ns_side[1].ns_badnat; 3014 old->ns_addtrpnt = ns->ns_addtrpnt; 3015 old->ns_table[0] = ns->ns_side[0].ns_table; 3016 old->ns_table[1] = ns->ns_side[1].ns_table; 3017 old->ns_maptable = NULL; 3018 old->ns_list = ns->ns_list; 3019 old->ns_apslist = NULL; 3020 old->ns_wilds = ns->ns_wilds; 3021 old->ns_nattab_sz = ns->ns_nattab_sz; 3022 old->ns_nattab_max = ns->ns_nattab_max; 3023 old->ns_rultab_sz = ns->ns_rultab_sz; 3024 old->ns_rdrtab_sz = ns->ns_rdrtab_sz; 3025 old->ns_trpntab_sz = ns->ns_trpntab_sz; 3026 old->ns_hostmap_sz = 0; 3027 old->ns_instances = ns->ns_instances; 3028 old->ns_maplist = ns->ns_maplist; 3029 old->ns_bucketlen[0] = (u_long *)ns->ns_side[0].ns_bucketlen; 3030 old->ns_bucketlen[1] = (u_long *)ns->ns_side[1].ns_bucketlen; 3031 } 3032 3033 3034 static void 3035 ipstate_save_current_to_4_1_16(current, old) 3036 void *current; 3037 ipstate_save_4_1_16_t *old; 3038 { 3039 ipstate_save_t *ips = (ipstate_save_t *)current; 3040 3041 old->ips_next = ips->ips_next; 3042 ipstate_current_to_4_1_0(&ips->ips_is, &old->ips_is); 3043 frentry_current_to_4_1_16(&ips->ips_fr, &old->ips_fr); 3044 } 3045 3046 3047 static void 3048 ipstate_save_current_to_4_1_0(current, old) 3049 void *current; 3050 ipstate_save_4_1_0_t *old; 3051 { 3052 ipstate_save_t *ips = (ipstate_save_t *)current; 3053 3054 old->ips_next = ips->ips_next; 3055 ipstate_current_to_4_1_0(&ips->ips_is, &old->ips_is); 3056 frentry_current_to_4_1_0(&ips->ips_fr, &old->ips_fr); 3057 } 3058 3059 3060 int 3061 ipf_out_compat(softc, obj, ptr) 3062 ipf_main_softc_t *softc; 3063 ipfobj_t *obj; 3064 void *ptr; 3065 { 3066 frentry_t *fr; 3067 int error; 3068 3069 IPFERROR(140042); 3070 error = EINVAL; 3071 3072 switch (obj->ipfo_type) 3073 { 3074 default : 3075 break; 3076 3077 case IPFOBJ_FRENTRY : 3078 if (obj->ipfo_rev >= 4013400) { 3079 frentry_4_1_34_t *old; 3080 3081 KMALLOC(old, frentry_4_1_34_t *); 3082 if (old == NULL) { 3083 IPFERROR(140043); 3084 error = ENOMEM; 3085 break; 3086 } 3087 frentry_current_to_4_1_34(ptr, old); 3088 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3089 if (error == 0 && old->fr_dsize > 0) { 3090 char *dst = obj->ipfo_ptr; 3091 3092 fr = ptr; 3093 dst += sizeof(*old); 3094 error = COPYOUT(fr->fr_data, dst, 3095 old->fr_dsize); 3096 if (error != 0) { 3097 IPFERROR(140044); 3098 } 3099 } 3100 KFREE(old); 3101 obj->ipfo_size = sizeof(*old); 3102 } else if (obj->ipfo_rev >= 4011600) { 3103 frentry_4_1_16_t *old; 3104 3105 KMALLOC(old, frentry_4_1_16_t *); 3106 if (old == NULL) { 3107 IPFERROR(140045); 3108 error = ENOMEM; 3109 break; 3110 } 3111 frentry_current_to_4_1_16(ptr, old); 3112 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3113 if (error != 0) { 3114 IPFERROR(140046); 3115 } 3116 KFREE(old); 3117 obj->ipfo_size = sizeof(*old); 3118 } else { 3119 frentry_4_1_0_t *old; 3120 3121 KMALLOC(old, frentry_4_1_0_t *); 3122 if (old == NULL) { 3123 IPFERROR(140047); 3124 error = ENOMEM; 3125 break; 3126 } 3127 frentry_current_to_4_1_0(ptr, old); 3128 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3129 if (error != 0) { 3130 IPFERROR(140048); 3131 } 3132 KFREE(old); 3133 obj->ipfo_size = sizeof(*old); 3134 } 3135 break; 3136 3137 case IPFOBJ_IPFSTAT : 3138 if (obj->ipfo_rev >= 4013300) { 3139 friostat_4_1_33_t *old; 3140 3141 KMALLOC(old, friostat_4_1_33_t *); 3142 if (old == NULL) { 3143 IPFERROR(140049); 3144 error = ENOMEM; 3145 break; 3146 } 3147 friostat_current_to_4_1_33(ptr, old, obj->ipfo_rev); 3148 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3149 if (error != 0) { 3150 IPFERROR(140050); 3151 } 3152 KFREE(old); 3153 } else { 3154 friostat_4_1_0_t *old; 3155 3156 KMALLOC(old, friostat_4_1_0_t *); 3157 if (old == NULL) { 3158 IPFERROR(140051); 3159 error = ENOMEM; 3160 break; 3161 } 3162 friostat_current_to_4_1_0(ptr, old, obj->ipfo_rev); 3163 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3164 if (error != 0) { 3165 IPFERROR(140052); 3166 } 3167 KFREE(old); 3168 } 3169 break; 3170 3171 case IPFOBJ_IPFINFO : /* unused */ 3172 break; 3173 3174 case IPFOBJ_IPNAT : 3175 if (obj->ipfo_rev >= 4011400) { 3176 ipnat_4_1_14_t *old; 3177 3178 KMALLOC(old, ipnat_4_1_14_t *); 3179 if (old == NULL) { 3180 IPFERROR(140053); 3181 error = ENOMEM; 3182 break; 3183 } 3184 ipnat_current_to_4_1_14(ptr, old); 3185 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3186 if (error != 0) { 3187 IPFERROR(140054); 3188 } 3189 KFREE(old); 3190 } else { 3191 ipnat_4_1_0_t *old; 3192 3193 KMALLOC(old, ipnat_4_1_0_t *); 3194 if (old == NULL) { 3195 IPFERROR(140055); 3196 error = ENOMEM; 3197 break; 3198 } 3199 ipnat_current_to_4_1_0(ptr, old); 3200 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3201 if (error != 0) { 3202 IPFERROR(140056); 3203 } 3204 KFREE(old); 3205 } 3206 break; 3207 3208 case IPFOBJ_NATSTAT : 3209 if (obj->ipfo_rev >= 4013200) { 3210 natstat_4_1_32_t *old; 3211 3212 KMALLOC(old, natstat_4_1_32_t *); 3213 if (old == NULL) { 3214 IPFERROR(140057); 3215 error = ENOMEM; 3216 break; 3217 } 3218 natstat_current_to_4_1_32(ptr, old); 3219 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3220 if (error != 0) { 3221 IPFERROR(140058); 3222 } 3223 KFREE(old); 3224 } else if (obj->ipfo_rev >= 4012700) { 3225 natstat_4_1_27_t *old; 3226 3227 KMALLOC(old, natstat_4_1_27_t *); 3228 if (old == NULL) { 3229 IPFERROR(140059); 3230 error = ENOMEM; 3231 break; 3232 } 3233 natstat_current_to_4_1_27(ptr, old); 3234 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3235 if (error != 0) { 3236 IPFERROR(140060); 3237 } 3238 KFREE(old); 3239 } else if (obj->ipfo_rev >= 4011600) { 3240 natstat_4_1_16_t *old; 3241 3242 KMALLOC(old, natstat_4_1_16_t *); 3243 if (old == NULL) { 3244 IPFERROR(140061); 3245 error = ENOMEM; 3246 break; 3247 } 3248 natstat_current_to_4_1_16(ptr, old); 3249 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3250 if (error != 0) { 3251 IPFERROR(140062); 3252 } 3253 KFREE(old); 3254 } else { 3255 natstat_4_1_0_t *old; 3256 3257 KMALLOC(old, natstat_4_1_0_t *); 3258 if (old == NULL) { 3259 IPFERROR(140063); 3260 error = ENOMEM; 3261 break; 3262 } 3263 natstat_current_to_4_1_0(ptr, old); 3264 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3265 if (error != 0) { 3266 IPFERROR(140064); 3267 } 3268 KFREE(old); 3269 } 3270 break; 3271 3272 case IPFOBJ_STATESAVE : 3273 if (obj->ipfo_rev >= 4011600) { 3274 ipstate_save_4_1_16_t *old; 3275 3276 KMALLOC(old, ipstate_save_4_1_16_t *); 3277 if (old == NULL) { 3278 IPFERROR(140065); 3279 error = ENOMEM; 3280 break; 3281 } 3282 ipstate_save_current_to_4_1_16(ptr, old); 3283 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3284 if (error != 0) { 3285 IPFERROR(140066); 3286 } 3287 KFREE(old); 3288 } else { 3289 ipstate_save_4_1_0_t *old; 3290 3291 KMALLOC(old, ipstate_save_4_1_0_t *); 3292 if (old == NULL) { 3293 IPFERROR(140067); 3294 error = ENOMEM; 3295 break; 3296 } 3297 ipstate_save_current_to_4_1_0(ptr, old); 3298 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3299 if (error != 0) { 3300 IPFERROR(140068); 3301 } 3302 KFREE(old); 3303 } 3304 break; 3305 3306 case IPFOBJ_NATSAVE : 3307 if (obj->ipfo_rev >= 4011600) { 3308 nat_save_4_1_16_t *old16; 3309 3310 KMALLOC(old16, nat_save_4_1_16_t *); 3311 if (old16 == NULL) { 3312 IPFERROR(140069); 3313 error = ENOMEM; 3314 break; 3315 } 3316 nat_save_current_to_4_1_16(ptr, old16); 3317 error = COPYOUT(&old16, obj->ipfo_ptr, sizeof(*old16)); 3318 if (error != 0) { 3319 IPFERROR(140070); 3320 } 3321 KFREE(old16); 3322 } else if (obj->ipfo_rev >= 4011400) { 3323 nat_save_4_1_14_t *old14; 3324 3325 KMALLOC(old14, nat_save_4_1_14_t *); 3326 if (old14 == NULL) { 3327 IPFERROR(140071); 3328 error = ENOMEM; 3329 break; 3330 } 3331 nat_save_current_to_4_1_14(ptr, old14); 3332 error = COPYOUT(&old14, obj->ipfo_ptr, sizeof(*old14)); 3333 if (error != 0) { 3334 IPFERROR(140072); 3335 } 3336 KFREE(old14); 3337 } else if (obj->ipfo_rev >= 4010300) { 3338 nat_save_4_1_3_t *old3; 3339 3340 KMALLOC(old3, nat_save_4_1_3_t *); 3341 if (old3 == NULL) { 3342 IPFERROR(140073); 3343 error = ENOMEM; 3344 break; 3345 } 3346 nat_save_current_to_4_1_3(ptr, old3); 3347 error = COPYOUT(&old3, obj->ipfo_ptr, sizeof(*old3)); 3348 if (error != 0) { 3349 IPFERROR(140074); 3350 } 3351 KFREE(old3); 3352 } 3353 break; 3354 3355 case IPFOBJ_IPSTATE : 3356 if (obj->ipfo_rev >= 4011600) { 3357 ipstate_4_1_16_t *old; 3358 3359 KMALLOC(old, ipstate_4_1_16_t *); 3360 if (old == NULL) { 3361 IPFERROR(140075); 3362 error = ENOMEM; 3363 break; 3364 } 3365 ipstate_current_to_4_1_16(ptr, old); 3366 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3367 if (error != 0) { 3368 IPFERROR(140076); 3369 } 3370 KFREE(old); 3371 } else { 3372 ipstate_4_1_0_t *old; 3373 3374 KMALLOC(old, ipstate_4_1_0_t *); 3375 if (old == NULL) { 3376 IPFERROR(140077); 3377 error = ENOMEM; 3378 break; 3379 } 3380 ipstate_current_to_4_1_0(ptr, old); 3381 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3382 if (error != 0) { 3383 IPFERROR(140078); 3384 } 3385 KFREE(old); 3386 } 3387 break; 3388 3389 case IPFOBJ_STATESTAT : 3390 if (obj->ipfo_rev >= 4012100) { 3391 ips_stat_4_1_21_t *old; 3392 3393 KMALLOC(old, ips_stat_4_1_21_t *); 3394 if (old == NULL) { 3395 IPFERROR(140079); 3396 error = ENOMEM; 3397 break; 3398 } 3399 ips_stat_current_to_4_1_21(ptr, old); 3400 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3401 if (error != 0) { 3402 IPFERROR(140080); 3403 } 3404 KFREE(old); 3405 } else { 3406 ips_stat_4_1_0_t *old; 3407 3408 KMALLOC(old, ips_stat_4_1_0_t *); 3409 if (old == NULL) { 3410 IPFERROR(140081); 3411 error = ENOMEM; 3412 break; 3413 } 3414 ips_stat_current_to_4_1_0(ptr, old); 3415 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3416 if (error != 0) { 3417 IPFERROR(140082); 3418 } 3419 KFREE(old); 3420 } 3421 break; 3422 3423 case IPFOBJ_FRAUTH : 3424 if (obj->ipfo_rev >= 4012900) { 3425 frauth_4_1_29_t *old29; 3426 3427 KMALLOC(old29, frauth_4_1_29_t *); 3428 if (old29 == NULL) { 3429 IPFERROR(140083); 3430 error = ENOMEM; 3431 break; 3432 } 3433 frauth_current_to_4_1_29(ptr, old29); 3434 error = COPYOUT(old29, obj->ipfo_ptr, sizeof(*old29)); 3435 if (error != 0) { 3436 IPFERROR(140084); 3437 } 3438 KFREE(old29); 3439 } else if (obj->ipfo_rev >= 4012400) { 3440 frauth_4_1_24_t *old24; 3441 3442 KMALLOC(old24, frauth_4_1_24_t *); 3443 if (old24 == NULL) { 3444 IPFERROR(140085); 3445 error = ENOMEM; 3446 break; 3447 } 3448 frauth_current_to_4_1_24(ptr, old24); 3449 error = COPYOUT(old24, obj->ipfo_ptr, sizeof(*old24)); 3450 if (error != 0) { 3451 IPFERROR(140086); 3452 } 3453 KFREE(old24); 3454 } else if (obj->ipfo_rev >= 4012300) { 3455 frauth_4_1_23_t *old23; 3456 3457 KMALLOC(old23, frauth_4_1_23_t *); 3458 if (old23 == NULL) { 3459 IPFERROR(140087); 3460 error = ENOMEM; 3461 break; 3462 } 3463 frauth_current_to_4_1_23(ptr, old23); 3464 error = COPYOUT(old23, obj->ipfo_ptr, sizeof(*old23)); 3465 if (error != 0) { 3466 IPFERROR(140088); 3467 } 3468 KFREE(old23); 3469 } else if (obj->ipfo_rev >= 4011100) { 3470 frauth_4_1_11_t *old11; 3471 3472 KMALLOC(old11, frauth_4_1_11_t *); 3473 if (old11 == NULL) { 3474 IPFERROR(140089); 3475 error = ENOMEM; 3476 break; 3477 } 3478 frauth_current_to_4_1_11(ptr, old11); 3479 error = COPYOUT(old11, obj->ipfo_ptr, sizeof(*old11)); 3480 if (error != 0) { 3481 IPFERROR(140090); 3482 } 3483 KFREE(old11); 3484 } 3485 break; 3486 3487 case IPFOBJ_NAT : 3488 if (obj->ipfo_rev >= 4012500) { 3489 nat_4_1_25_t *old; 3490 3491 KMALLOC(old, nat_4_1_25_t *); 3492 if (old == NULL) { 3493 IPFERROR(140091); 3494 error = ENOMEM; 3495 break; 3496 } 3497 nat_current_to_4_1_25(ptr, old); 3498 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3499 if (error != 0) { 3500 IPFERROR(140092); 3501 } 3502 KFREE(old); 3503 } else if (obj->ipfo_rev >= 4011400) { 3504 nat_4_1_14_t *old; 3505 3506 KMALLOC(old, nat_4_1_14_t *); 3507 if (old == NULL) { 3508 IPFERROR(140093); 3509 error = ENOMEM; 3510 break; 3511 } 3512 nat_current_to_4_1_14(ptr, old); 3513 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3514 if (error != 0) { 3515 IPFERROR(140094); 3516 } 3517 KFREE(old); 3518 } else if (obj->ipfo_rev >= 4010300) { 3519 nat_4_1_3_t *old; 3520 3521 KMALLOC(old, nat_4_1_3_t *); 3522 if (old == NULL) { 3523 IPFERROR(140095); 3524 error = ENOMEM; 3525 break; 3526 } 3527 nat_current_to_4_1_3(ptr, old); 3528 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3529 if (error != 0) { 3530 IPFERROR(140096); 3531 } 3532 KFREE(old); 3533 } 3534 break; 3535 3536 case IPFOBJ_FRIPF : 3537 if (obj->ipfo_rev < 5000000) { 3538 fripf4_t *old; 3539 3540 KMALLOC(old, fripf4_t *); 3541 if (old == NULL) { 3542 IPFERROR(140097); 3543 error = ENOMEM; 3544 break; 3545 } 3546 ipf_v5fripftov4(ptr, old); 3547 error = COPYOUT(old, obj->ipfo_ptr, sizeof(*old)); 3548 if (error != 0) { 3549 IPFERROR(140098); 3550 } 3551 KFREE(old); 3552 } 3553 break; 3554 } 3555 return error; 3556 } 3557 3558 3559 static void 3560 friostat_current_to_4_1_33(current, old, rev) 3561 void *current; 3562 friostat_4_1_33_t *old; 3563 int rev; 3564 { 3565 friostat_t *fiop = (friostat_t *)current; 3566 3567 bcopy(&fiop->f_st[0].fr_pass, &old->of_st[0], sizeof(old->of_st[0])); 3568 bcopy(&fiop->f_st[1].fr_pass, &old->of_st[1], sizeof(old->of_st[1])); 3569 3570 old->f_ipf[0][0] = fiop->f_ipf[0][0]; 3571 old->f_ipf[0][1] = fiop->f_ipf[0][1]; 3572 old->f_ipf[1][0] = fiop->f_ipf[1][0]; 3573 old->f_ipf[1][1] = fiop->f_ipf[1][1]; 3574 old->f_acct[0][0] = fiop->f_acct[0][0]; 3575 old->f_acct[0][1] = fiop->f_acct[0][1]; 3576 old->f_acct[1][0] = fiop->f_acct[1][0]; 3577 old->f_acct[1][1] = fiop->f_acct[1][1]; 3578 old->f_ipf6[0][0] = NULL; 3579 old->f_ipf6[0][1] = NULL; 3580 old->f_ipf6[1][0] = NULL; 3581 old->f_ipf6[1][1] = NULL; 3582 old->f_acct6[0][0] = NULL; 3583 old->f_acct6[0][1] = NULL; 3584 old->f_acct6[1][0] = NULL; 3585 old->f_acct6[1][1] = NULL; 3586 old->f_auth = fiop->f_auth; 3587 bcopy(&fiop->f_groups, &old->f_groups, sizeof(old->f_groups)); 3588 bcopy(&fiop->f_froute, &old->f_froute, sizeof(old->f_froute)); 3589 old->f_ticks = fiop->f_ticks; 3590 bcopy(&fiop->f_locks, &old->f_locks, sizeof(old->f_locks)); 3591 old->f_kmutex_sz = 0; 3592 old->f_krwlock_sz = 0; 3593 old->f_defpass = fiop->f_defpass; 3594 old->f_active = fiop->f_active; 3595 old->f_running = fiop->f_running; 3596 old->f_logging = fiop->f_logging; 3597 old->f_features = fiop->f_features; 3598 sprintf(old->f_version, "IP Filter: v%d.%d.%d", 3599 (rev / 1000000) % 100, 3600 (rev / 10000) % 100, 3601 (rev / 100) % 100); 3602 } 3603 3604 3605 static void 3606 friostat_current_to_4_1_0(current, old, rev) 3607 void *current; 3608 friostat_4_1_0_t *old; 3609 int rev; 3610 { 3611 friostat_t *fiop = (friostat_t *)current; 3612 3613 bcopy(&fiop->f_st[0].fr_pass, &old->of_st[0], sizeof(old->of_st[0])); 3614 bcopy(&fiop->f_st[1].fr_pass, &old->of_st[1], sizeof(old->of_st[1])); 3615 3616 old->f_ipf[0][0] = fiop->f_ipf[0][0]; 3617 old->f_ipf[0][1] = fiop->f_ipf[0][1]; 3618 old->f_ipf[1][0] = fiop->f_ipf[1][0]; 3619 old->f_ipf[1][1] = fiop->f_ipf[1][1]; 3620 old->f_acct[0][0] = fiop->f_acct[0][0]; 3621 old->f_acct[0][1] = fiop->f_acct[0][1]; 3622 old->f_acct[1][0] = fiop->f_acct[1][0]; 3623 old->f_acct[1][1] = fiop->f_acct[1][1]; 3624 old->f_ipf6[0][0] = NULL; 3625 old->f_ipf6[0][1] = NULL; 3626 old->f_ipf6[1][0] = NULL; 3627 old->f_ipf6[1][1] = NULL; 3628 old->f_acct6[0][0] = NULL; 3629 old->f_acct6[0][1] = NULL; 3630 old->f_acct6[1][0] = NULL; 3631 old->f_acct6[1][1] = NULL; 3632 old->f_auth = fiop->f_auth; 3633 bcopy(&fiop->f_groups, &old->f_groups, sizeof(old->f_groups)); 3634 bcopy(&fiop->f_froute, &old->f_froute, sizeof(old->f_froute)); 3635 old->f_ticks = fiop->f_ticks; 3636 old->f_ipf[0][0] = fiop->f_ipf[0][0]; 3637 old->f_ipf[0][1] = fiop->f_ipf[0][1]; 3638 old->f_ipf[1][0] = fiop->f_ipf[1][0]; 3639 old->f_ipf[1][1] = fiop->f_ipf[1][1]; 3640 old->f_acct[0][0] = fiop->f_acct[0][0]; 3641 old->f_acct[0][1] = fiop->f_acct[0][1]; 3642 old->f_acct[1][0] = fiop->f_acct[1][0]; 3643 old->f_acct[1][1] = fiop->f_acct[1][1]; 3644 old->f_ipf6[0][0] = NULL; 3645 old->f_ipf6[0][1] = NULL; 3646 old->f_ipf6[1][0] = NULL; 3647 old->f_ipf6[1][1] = NULL; 3648 old->f_acct6[0][0] = NULL; 3649 old->f_acct6[0][1] = NULL; 3650 old->f_acct6[1][0] = NULL; 3651 old->f_acct6[1][1] = NULL; 3652 old->f_auth = fiop->f_auth; 3653 bcopy(&fiop->f_groups, &old->f_groups, sizeof(old->f_groups)); 3654 bcopy(&fiop->f_froute, &old->f_froute, sizeof(old->f_froute)); 3655 old->f_ticks = fiop->f_ticks; 3656 bcopy(&fiop->f_locks, &old->f_locks, sizeof(old->f_locks)); 3657 old->f_kmutex_sz = 0; 3658 old->f_krwlock_sz = 0; 3659 old->f_defpass = fiop->f_defpass; 3660 old->f_active = fiop->f_active; 3661 old->f_running = fiop->f_running; 3662 old->f_logging = fiop->f_logging; 3663 old->f_features = fiop->f_features; 3664 sprintf(old->f_version, "IP Filter: v%d.%d.%d", 3665 (rev / 1000000) % 100, 3666 (rev / 10000) % 100, 3667 (rev / 100) % 100); 3668 } 3669 3670 3671 /* 3672 * nflags is v5 flags, returns v4 flags. 3673 */ 3674 static int 3675 fr_frflags5to4(nflags) 3676 u_32_t nflags; 3677 { 3678 u_32_t oflags = 0; 3679 3680 switch (nflags & FR_CMDMASK) { 3681 case FR_CALL : 3682 oflags = 0x0; 3683 break; 3684 case FR_BLOCK : 3685 oflags = 0x1; 3686 break; 3687 case FR_PASS : 3688 oflags = 0x2; 3689 break; 3690 case FR_AUTH : 3691 oflags = 0x3; 3692 break; 3693 case FR_PREAUTH : 3694 oflags = 0x4; 3695 break; 3696 case FR_ACCOUNT : 3697 oflags = 0x5; 3698 break; 3699 case FR_SKIP : 3700 oflags = 0x6; 3701 break; 3702 default : 3703 break; 3704 } 3705 3706 if (nflags & FR_LOG) 3707 oflags |= 0x00010; 3708 if (nflags & FR_CALLNOW) 3709 oflags |= 0x00020; 3710 if (nflags & FR_NOTSRCIP) 3711 oflags |= 0x00080; 3712 if (nflags & FR_NOTDSTIP) 3713 oflags |= 0x00040; 3714 if (nflags & FR_QUICK) 3715 oflags |= 0x00100; 3716 if (nflags & FR_KEEPFRAG) 3717 oflags |= 0x00200; 3718 if (nflags & FR_KEEPSTATE) 3719 oflags |= 0x00400; 3720 if (nflags & FR_FASTROUTE) 3721 oflags |= 0x00800; 3722 if (nflags & FR_RETRST) 3723 oflags |= 0x01000; 3724 if (nflags & FR_RETICMP) 3725 oflags |= 0x02000; 3726 if (nflags & FR_FAKEICMP) 3727 oflags |= 0x03000; 3728 if (nflags & FR_OUTQUE) 3729 oflags |= 0x04000; 3730 if (nflags & FR_INQUE) 3731 oflags |= 0x08000; 3732 if (nflags & FR_LOGBODY) 3733 oflags |= 0x10000; 3734 if (nflags & FR_LOGFIRST) 3735 oflags |= 0x20000; 3736 if (nflags & FR_LOGORBLOCK) 3737 oflags |= 0x40000; 3738 if (nflags & FR_FRSTRICT) 3739 oflags |= 0x100000; 3740 if (nflags & FR_STSTRICT) 3741 oflags |= 0x200000; 3742 if (nflags & FR_NEWISN) 3743 oflags |= 0x400000; 3744 if (nflags & FR_NOICMPERR) 3745 oflags |= 0x800000; 3746 if (nflags & FR_STATESYNC) 3747 oflags |= 0x1000000; 3748 if (nflags & FR_NOMATCH) 3749 oflags |= 0x8000000; 3750 if (nflags & FR_COPIED) 3751 oflags |= 0x40000000; 3752 if (nflags & FR_INACTIVE) 3753 oflags |= 0x80000000; 3754 3755 return oflags; 3756 } 3757 3758 3759 static void 3760 frentry_current_to_4_1_34(current, old) 3761 void *current; 3762 frentry_4_1_34_t *old; 3763 { 3764 frentry_t *fr = (frentry_t *)current; 3765 3766 old->fr_lock = fr->fr_lock; 3767 old->fr_next = fr->fr_next; 3768 old->fr_grp = (void *)fr->fr_grp; 3769 old->fr_isc = fr->fr_isc; 3770 old->fr_ifas[0] = fr->fr_ifas[0]; 3771 old->fr_ifas[1] = fr->fr_ifas[1]; 3772 old->fr_ifas[2] = fr->fr_ifas[2]; 3773 old->fr_ifas[3] = fr->fr_ifas[3]; 3774 old->fr_ptr = fr->fr_ptr; 3775 old->fr_comment = NULL; 3776 old->fr_ref = fr->fr_ref; 3777 old->fr_statecnt = fr->fr_statecnt; 3778 old->fr_hits = fr->fr_hits; 3779 old->fr_bytes = fr->fr_bytes; 3780 old->fr_lastpkt.tv_sec = fr->fr_lastpkt.tv_sec; 3781 old->fr_lastpkt.tv_usec = fr->fr_lastpkt.tv_usec; 3782 old->fr_curpps = fr->fr_curpps; 3783 old->fr_dun.fru_data = fr->fr_dun.fru_data; 3784 old->fr_func = fr->fr_func; 3785 old->fr_dsize = fr->fr_dsize; 3786 old->fr_pps = fr->fr_pps; 3787 old->fr_statemax = fr->fr_statemax; 3788 old->fr_flineno = fr->fr_flineno; 3789 old->fr_type = fr->fr_type; 3790 old->fr_flags = fr_frflags5to4(fr->fr_flags); 3791 old->fr_logtag = fr->fr_logtag; 3792 old->fr_collect = fr->fr_collect; 3793 old->fr_arg = fr->fr_arg; 3794 old->fr_loglevel = fr->fr_loglevel; 3795 old->fr_age[0] = fr->fr_age[0]; 3796 old->fr_age[1] = fr->fr_age[1]; 3797 if (fr->fr_family == AF_INET) 3798 old->fr_v = 4; 3799 if (fr->fr_family == AF_INET6) 3800 old->fr_v = 6; 3801 old->fr_icode = fr->fr_icode; 3802 old->fr_cksum = fr->fr_cksum; 3803 old->fr_tifs[0].ofd_ip6 = fr->fr_tifs[0].fd_ip6; 3804 old->fr_tifs[1].ofd_ip6 = fr->fr_tifs[0].fd_ip6; 3805 old->fr_dif.ofd_ip6 = fr->fr_dif.fd_ip6; 3806 if (fr->fr_ifnames[0] >= 0) { 3807 strncpy(old->fr_ifnames[0], fr->fr_names + fr->fr_ifnames[0], 3808 LIFNAMSIZ); 3809 old->fr_ifnames[0][LIFNAMSIZ - 1] = '\0'; 3810 } 3811 if (fr->fr_ifnames[1] >= 0) { 3812 strncpy(old->fr_ifnames[1], fr->fr_names + fr->fr_ifnames[1], 3813 LIFNAMSIZ); 3814 old->fr_ifnames[1][LIFNAMSIZ - 1] = '\0'; 3815 } 3816 if (fr->fr_ifnames[2] >= 0) { 3817 strncpy(old->fr_ifnames[2], fr->fr_names + fr->fr_ifnames[2], 3818 LIFNAMSIZ); 3819 old->fr_ifnames[2][LIFNAMSIZ - 1] = '\0'; 3820 } 3821 if (fr->fr_ifnames[3] >= 0) { 3822 strncpy(old->fr_ifnames[3], fr->fr_names + fr->fr_ifnames[3], 3823 LIFNAMSIZ); 3824 old->fr_ifnames[3][LIFNAMSIZ - 1] = '\0'; 3825 } 3826 if (fr->fr_tifs[0].fd_name >= 0) { 3827 strncpy(old->fr_tifs[0].fd_ifname, 3828 fr->fr_names + fr->fr_tifs[0].fd_name, LIFNAMSIZ); 3829 old->fr_tifs[0].fd_ifname[LIFNAMSIZ - 1] = '\0'; 3830 } 3831 if (fr->fr_tifs[1].fd_name >= 0) { 3832 strncpy(old->fr_tifs[1].fd_ifname, 3833 fr->fr_names + fr->fr_tifs[1].fd_name, LIFNAMSIZ); 3834 old->fr_tifs[1].fd_ifname[LIFNAMSIZ - 1] = '\0'; 3835 } 3836 if (fr->fr_dif.fd_name >= 0) { 3837 strncpy(old->fr_dif.fd_ifname, 3838 fr->fr_names + fr->fr_dif.fd_name, LIFNAMSIZ); 3839 old->fr_dif.fd_ifname[LIFNAMSIZ - 1] = '\0'; 3840 } 3841 if (fr->fr_group >= 0) { 3842 strncpy(old->fr_group, fr->fr_names + fr->fr_group, 3843 FR_GROUPLEN); 3844 old->fr_group[FR_GROUPLEN - 1] = '\0'; 3845 } 3846 if (fr->fr_grhead >= 0) { 3847 strncpy(old->fr_grhead, fr->fr_names + fr->fr_grhead, 3848 FR_GROUPLEN); 3849 old->fr_grhead[FR_GROUPLEN - 1] = '\0'; 3850 } 3851 } 3852 3853 3854 static void 3855 frentry_current_to_4_1_16(current, old) 3856 void *current; 3857 frentry_4_1_16_t *old; 3858 { 3859 frentry_t *fr = (frentry_t *)current; 3860 3861 old->fr_lock = fr->fr_lock; 3862 old->fr_next = fr->fr_next; 3863 old->fr_grp = (void *)fr->fr_grp; 3864 old->fr_isc = fr->fr_isc; 3865 old->fr_ifas[0] = fr->fr_ifas[0]; 3866 old->fr_ifas[1] = fr->fr_ifas[1]; 3867 old->fr_ifas[2] = fr->fr_ifas[2]; 3868 old->fr_ifas[3] = fr->fr_ifas[3]; 3869 old->fr_ptr = fr->fr_ptr; 3870 old->fr_comment = NULL; 3871 old->fr_ref = fr->fr_ref; 3872 old->fr_statecnt = fr->fr_statecnt; 3873 old->fr_hits = fr->fr_hits; 3874 old->fr_bytes = fr->fr_bytes; 3875 old->fr_lastpkt.tv_sec = fr->fr_lastpkt.tv_sec; 3876 old->fr_lastpkt.tv_usec = fr->fr_lastpkt.tv_usec; 3877 old->fr_curpps = fr->fr_curpps; 3878 old->fr_dun.fru_data = fr->fr_dun.fru_data; 3879 old->fr_func = fr->fr_func; 3880 old->fr_dsize = fr->fr_dsize; 3881 old->fr_pps = fr->fr_pps; 3882 old->fr_statemax = fr->fr_statemax; 3883 old->fr_flineno = fr->fr_flineno; 3884 old->fr_type = fr->fr_type; 3885 old->fr_flags = fr_frflags5to4(fr->fr_flags); 3886 old->fr_logtag = fr->fr_logtag; 3887 old->fr_collect = fr->fr_collect; 3888 old->fr_arg = fr->fr_arg; 3889 old->fr_loglevel = fr->fr_loglevel; 3890 old->fr_age[0] = fr->fr_age[0]; 3891 old->fr_age[1] = fr->fr_age[1]; 3892 if (old->fr_v == 4) 3893 fr->fr_family = AF_INET; 3894 if (old->fr_v == 6) 3895 fr->fr_family = AF_INET6; 3896 old->fr_icode = fr->fr_icode; 3897 old->fr_cksum = fr->fr_cksum; 3898 old->fr_tifs[0].ofd_ip6 = fr->fr_tifs[0].fd_ip6; 3899 old->fr_tifs[1].ofd_ip6 = fr->fr_tifs[0].fd_ip6; 3900 old->fr_dif.ofd_ip6 = fr->fr_dif.fd_ip6; 3901 if (fr->fr_ifnames[0] >= 0) { 3902 strncpy(old->fr_ifnames[0], fr->fr_names + fr->fr_ifnames[0], 3903 LIFNAMSIZ); 3904 old->fr_ifnames[0][LIFNAMSIZ - 1] = '\0'; 3905 } 3906 if (fr->fr_ifnames[1] >= 0) { 3907 strncpy(old->fr_ifnames[1], fr->fr_names + fr->fr_ifnames[1], 3908 LIFNAMSIZ); 3909 old->fr_ifnames[1][LIFNAMSIZ - 1] = '\0'; 3910 } 3911 if (fr->fr_ifnames[2] >= 0) { 3912 strncpy(old->fr_ifnames[2], fr->fr_names + fr->fr_ifnames[2], 3913 LIFNAMSIZ); 3914 old->fr_ifnames[2][LIFNAMSIZ - 1] = '\0'; 3915 } 3916 if (fr->fr_ifnames[3] >= 0) { 3917 strncpy(old->fr_ifnames[3], fr->fr_names + fr->fr_ifnames[3], 3918 LIFNAMSIZ); 3919 old->fr_ifnames[3][LIFNAMSIZ - 1] = '\0'; 3920 } 3921 if (fr->fr_tifs[0].fd_name >= 0) { 3922 strncpy(old->fr_tifs[0].fd_ifname, 3923 fr->fr_names + fr->fr_tifs[0].fd_name, LIFNAMSIZ); 3924 old->fr_tifs[0].fd_ifname[LIFNAMSIZ - 1] = '\0'; 3925 } 3926 if (fr->fr_tifs[1].fd_name >= 0) { 3927 strncpy(old->fr_tifs[1].fd_ifname, 3928 fr->fr_names + fr->fr_tifs[1].fd_name, LIFNAMSIZ); 3929 old->fr_tifs[1].fd_ifname[LIFNAMSIZ - 1] = '\0'; 3930 } 3931 if (fr->fr_dif.fd_name >= 0) { 3932 strncpy(old->fr_dif.fd_ifname, 3933 fr->fr_names + fr->fr_dif.fd_name, LIFNAMSIZ); 3934 old->fr_dif.fd_ifname[LIFNAMSIZ - 1] = '\0'; 3935 } 3936 if (fr->fr_group >= 0) { 3937 strncpy(old->fr_group, fr->fr_names + fr->fr_group, 3938 FR_GROUPLEN); 3939 old->fr_group[FR_GROUPLEN - 1] = '\0'; 3940 } 3941 if (fr->fr_grhead >= 0) { 3942 strncpy(old->fr_grhead, fr->fr_names + fr->fr_grhead, 3943 FR_GROUPLEN); 3944 old->fr_grhead[FR_GROUPLEN - 1] = '\0'; 3945 } 3946 } 3947 3948 3949 static void 3950 frentry_current_to_4_1_0(current, old) 3951 void *current; 3952 frentry_4_1_0_t *old; 3953 { 3954 frentry_t *fr = (frentry_t *)current; 3955 3956 old->fr_lock = fr->fr_lock; 3957 old->fr_next = fr->fr_next; 3958 old->fr_grp = (void *)fr->fr_grp; 3959 old->fr_isc = fr->fr_isc; 3960 old->fr_ifas[0] = fr->fr_ifas[0]; 3961 old->fr_ifas[1] = fr->fr_ifas[1]; 3962 old->fr_ifas[2] = fr->fr_ifas[2]; 3963 old->fr_ifas[3] = fr->fr_ifas[3]; 3964 old->fr_ptr = fr->fr_ptr; 3965 old->fr_comment = NULL; 3966 old->fr_ref = fr->fr_ref; 3967 old->fr_statecnt = fr->fr_statecnt; 3968 old->fr_hits = fr->fr_hits; 3969 old->fr_bytes = fr->fr_bytes; 3970 old->fr_lastpkt.tv_sec = fr->fr_lastpkt.tv_sec; 3971 old->fr_lastpkt.tv_usec = fr->fr_lastpkt.tv_usec; 3972 old->fr_curpps = fr->fr_curpps; 3973 old->fr_dun.fru_data = fr->fr_dun.fru_data; 3974 old->fr_func = fr->fr_func; 3975 old->fr_dsize = fr->fr_dsize; 3976 old->fr_pps = fr->fr_pps; 3977 old->fr_statemax = fr->fr_statemax; 3978 old->fr_flineno = fr->fr_flineno; 3979 old->fr_type = fr->fr_type; 3980 old->fr_flags = fr_frflags5to4(fr->fr_flags); 3981 old->fr_logtag = fr->fr_logtag; 3982 old->fr_collect = fr->fr_collect; 3983 old->fr_arg = fr->fr_arg; 3984 old->fr_loglevel = fr->fr_loglevel; 3985 old->fr_age[0] = fr->fr_age[0]; 3986 old->fr_age[1] = fr->fr_age[1]; 3987 if (old->fr_v == 4) 3988 fr->fr_family = AF_INET; 3989 if (old->fr_v == 6) 3990 fr->fr_family = AF_INET6; 3991 old->fr_icode = fr->fr_icode; 3992 old->fr_cksum = fr->fr_cksum; 3993 old->fr_tifs[0].ofd_ip6 = fr->fr_tifs[0].fd_ip6; 3994 old->fr_tifs[1].ofd_ip6 = fr->fr_tifs[0].fd_ip6; 3995 old->fr_dif.ofd_ip6 = fr->fr_dif.fd_ip6; 3996 if (fr->fr_ifnames[0] >= 0) { 3997 strncpy(old->fr_ifnames[0], fr->fr_names + fr->fr_ifnames[0], 3998 LIFNAMSIZ); 3999 old->fr_ifnames[0][LIFNAMSIZ - 1] = '\0'; 4000 } 4001 if (fr->fr_ifnames[1] >= 0) { 4002 strncpy(old->fr_ifnames[1], fr->fr_names + fr->fr_ifnames[1], 4003 LIFNAMSIZ); 4004 old->fr_ifnames[1][LIFNAMSIZ - 1] = '\0'; 4005 } 4006 if (fr->fr_ifnames[2] >= 0) { 4007 strncpy(old->fr_ifnames[2], fr->fr_names + fr->fr_ifnames[2], 4008 LIFNAMSIZ); 4009 old->fr_ifnames[2][LIFNAMSIZ - 1] = '\0'; 4010 } 4011 if (fr->fr_ifnames[3] >= 0) { 4012 strncpy(old->fr_ifnames[3], fr->fr_names + fr->fr_ifnames[3], 4013 LIFNAMSIZ); 4014 old->fr_ifnames[3][LIFNAMSIZ - 1] = '\0'; 4015 } 4016 if (fr->fr_tifs[0].fd_name >= 0) { 4017 strncpy(old->fr_tifs[0].fd_ifname, 4018 fr->fr_names + fr->fr_tifs[0].fd_name, LIFNAMSIZ); 4019 old->fr_tifs[0].fd_ifname[LIFNAMSIZ - 1] = '\0'; 4020 } 4021 if (fr->fr_tifs[1].fd_name >= 0) { 4022 strncpy(old->fr_tifs[1].fd_ifname, 4023 fr->fr_names + fr->fr_tifs[1].fd_name, LIFNAMSIZ); 4024 old->fr_tifs[1].fd_ifname[LIFNAMSIZ - 1] = '\0'; 4025 } 4026 if (fr->fr_dif.fd_name >= 0) { 4027 strncpy(old->fr_dif.fd_ifname, 4028 fr->fr_names + fr->fr_dif.fd_name, LIFNAMSIZ); 4029 old->fr_dif.fd_ifname[LIFNAMSIZ - 1] = '\0'; 4030 } 4031 if (fr->fr_group >= 0) { 4032 strncpy(old->fr_group, fr->fr_names + fr->fr_group, 4033 FR_GROUPLEN); 4034 old->fr_group[FR_GROUPLEN - 1] = '\0'; 4035 } 4036 if (fr->fr_grhead >= 0) { 4037 strncpy(old->fr_grhead, fr->fr_names + fr->fr_grhead, 4038 FR_GROUPLEN); 4039 old->fr_grhead[FR_GROUPLEN - 1] = '\0'; 4040 } 4041 } 4042 4043 4044 static void 4045 fr_info_current_to_4_1_24(current, old) 4046 void *current; 4047 fr_info_4_1_24_t *old; 4048 { 4049 fr_info_t *fin = (fr_info_t *)current; 4050 4051 old->fin_ifp = fin->fin_ifp; 4052 ipf_v5iptov4(&fin->fin_fi, &old->fin_fi); 4053 bcopy(&fin->fin_dat, &old->fin_dat, sizeof(fin->fin_dat)); 4054 old->fin_out = fin->fin_out; 4055 old->fin_rev = fin->fin_rev; 4056 old->fin_hlen = fin->fin_hlen; 4057 old->ofin_tcpf = fin->fin_tcpf; 4058 old->fin_icode = fin->fin_icode; 4059 old->fin_rule = fin->fin_rule; 4060 bcopy(fin->fin_group, old->fin_group, sizeof(fin->fin_group)); 4061 old->fin_fr = fin->fin_fr; 4062 old->fin_dp = fin->fin_dp; 4063 old->fin_dlen = fin->fin_dlen; 4064 old->fin_plen = fin->fin_plen; 4065 old->fin_ipoff = fin->fin_ipoff; 4066 old->fin_id = fin->fin_id; 4067 old->fin_off = fin->fin_off; 4068 old->fin_depth = fin->fin_depth; 4069 old->fin_error = fin->fin_error; 4070 old->fin_cksum = fin->fin_cksum; 4071 old->fin_state = NULL; 4072 old->fin_nat = NULL; 4073 old->fin_nattag = fin->fin_nattag; 4074 old->fin_exthdr = NULL; 4075 old->ofin_ip = fin->fin_ip; 4076 old->fin_mp = fin->fin_mp; 4077 old->fin_m = fin->fin_m; 4078 #ifdef MENTAT 4079 old->fin_qfm = fin->fin_qfm; 4080 old->fin_qpi = fin->fin_qpi; 4081 old->fin_ifname[0] = '\0'; 4082 #endif 4083 #ifdef __sgi 4084 old->fin_hbuf = fin->fin_hbuf; 4085 #endif 4086 } 4087 4088 4089 static void 4090 fr_info_current_to_4_1_23(current, old) 4091 void *current; 4092 fr_info_4_1_23_t *old; 4093 { 4094 fr_info_t *fin = (fr_info_t *)current; 4095 4096 old->fin_ifp = fin->fin_ifp; 4097 ipf_v5iptov4(&fin->fin_fi, &old->fin_fi); 4098 bcopy(&fin->fin_dat, &old->fin_dat, sizeof(fin->fin_dat)); 4099 old->fin_out = fin->fin_out; 4100 old->fin_rev = fin->fin_rev; 4101 old->fin_hlen = fin->fin_hlen; 4102 old->ofin_tcpf = fin->fin_tcpf; 4103 old->fin_icode = fin->fin_icode; 4104 old->fin_rule = fin->fin_rule; 4105 bcopy(fin->fin_group, old->fin_group, sizeof(fin->fin_group)); 4106 old->fin_fr = fin->fin_fr; 4107 old->fin_dp = fin->fin_dp; 4108 old->fin_dlen = fin->fin_dlen; 4109 old->fin_plen = fin->fin_plen; 4110 old->fin_ipoff = fin->fin_ipoff; 4111 old->fin_id = fin->fin_id; 4112 old->fin_off = fin->fin_off; 4113 old->fin_depth = fin->fin_depth; 4114 old->fin_error = fin->fin_error; 4115 old->fin_state = NULL; 4116 old->fin_nat = NULL; 4117 old->fin_nattag = fin->fin_nattag; 4118 old->ofin_ip = fin->fin_ip; 4119 old->fin_mp = fin->fin_mp; 4120 old->fin_m = fin->fin_m; 4121 #ifdef MENTAT 4122 old->fin_qfm = fin->fin_qfm; 4123 old->fin_qpi = fin->fin_qpi; 4124 old->fin_ifname[0] = '\0'; 4125 #endif 4126 #ifdef __sgi 4127 old->fin_hbuf = fin->fin_hbuf; 4128 #endif 4129 } 4130 4131 4132 static void 4133 fr_info_current_to_4_1_11(current, old) 4134 void *current; 4135 fr_info_4_1_11_t *old; 4136 { 4137 fr_info_t *fin = (fr_info_t *)current; 4138 4139 old->fin_ifp = fin->fin_ifp; 4140 ipf_v5iptov4(&fin->fin_fi, &old->fin_fi); 4141 bcopy(&fin->fin_dat, &old->fin_dat, sizeof(fin->fin_dat)); 4142 old->fin_out = fin->fin_out; 4143 old->fin_rev = fin->fin_rev; 4144 old->fin_hlen = fin->fin_hlen; 4145 old->ofin_tcpf = fin->fin_tcpf; 4146 old->fin_icode = fin->fin_icode; 4147 old->fin_rule = fin->fin_rule; 4148 bcopy(fin->fin_group, old->fin_group, sizeof(fin->fin_group)); 4149 old->fin_fr = fin->fin_fr; 4150 old->fin_dp = fin->fin_dp; 4151 old->fin_dlen = fin->fin_dlen; 4152 old->fin_plen = fin->fin_plen; 4153 old->fin_ipoff = fin->fin_ipoff; 4154 old->fin_id = fin->fin_id; 4155 old->fin_off = fin->fin_off; 4156 old->fin_depth = fin->fin_depth; 4157 old->fin_error = fin->fin_error; 4158 old->fin_state = NULL; 4159 old->fin_nat = NULL; 4160 old->fin_nattag = fin->fin_nattag; 4161 old->ofin_ip = fin->fin_ip; 4162 old->fin_mp = fin->fin_mp; 4163 old->fin_m = fin->fin_m; 4164 #ifdef MENTAT 4165 old->fin_qfm = fin->fin_qfm; 4166 old->fin_qpi = fin->fin_qpi; 4167 old->fin_ifname[0] = '\0'; 4168 #endif 4169 #ifdef __sgi 4170 old->fin_hbuf = fin->fin_hbuf; 4171 #endif 4172 } 4173 4174 4175 static void 4176 frauth_current_to_4_1_29(current, old) 4177 void *current; 4178 frauth_4_1_29_t *old; 4179 { 4180 frauth_t *fra = (frauth_t *)current; 4181 4182 old->fra_age = fra->fra_age; 4183 old->fra_len = fra->fra_len; 4184 old->fra_index = fra->fra_index; 4185 old->fra_pass = fra->fra_pass; 4186 fr_info_current_to_4_1_24(&fra->fra_info, &old->fra_info); 4187 old->fra_buf = fra->fra_buf; 4188 old->fra_flx = fra->fra_flx; 4189 #ifdef MENTAT 4190 old->fra_q = fra->fra_q; 4191 old->fra_m = fra->fra_m; 4192 #endif 4193 } 4194 4195 4196 static void 4197 frauth_current_to_4_1_24(current, old) 4198 void *current; 4199 frauth_4_1_24_t *old; 4200 { 4201 frauth_t *fra = (frauth_t *)current; 4202 4203 old->fra_age = fra->fra_age; 4204 old->fra_len = fra->fra_len; 4205 old->fra_index = fra->fra_index; 4206 old->fra_pass = fra->fra_pass; 4207 fr_info_current_to_4_1_24(&fra->fra_info, &old->fra_info); 4208 old->fra_buf = fra->fra_buf; 4209 #ifdef MENTAT 4210 old->fra_q = fra->fra_q; 4211 old->fra_m = fra->fra_m; 4212 #endif 4213 } 4214 4215 4216 static void 4217 frauth_current_to_4_1_23(current, old) 4218 void *current; 4219 frauth_4_1_23_t *old; 4220 { 4221 frauth_t *fra = (frauth_t *)current; 4222 4223 old->fra_age = fra->fra_age; 4224 old->fra_len = fra->fra_len; 4225 old->fra_index = fra->fra_index; 4226 old->fra_pass = fra->fra_pass; 4227 fr_info_current_to_4_1_23(&fra->fra_info, &old->fra_info); 4228 old->fra_buf = fra->fra_buf; 4229 #ifdef MENTAT 4230 old->fra_q = fra->fra_q; 4231 old->fra_m = fra->fra_m; 4232 #endif 4233 } 4234 4235 4236 static void 4237 frauth_current_to_4_1_11(current, old) 4238 void *current; 4239 frauth_4_1_11_t *old; 4240 { 4241 frauth_t *fra = (frauth_t *)current; 4242 4243 old->fra_age = fra->fra_age; 4244 old->fra_len = fra->fra_len; 4245 old->fra_index = fra->fra_index; 4246 old->fra_pass = fra->fra_pass; 4247 fr_info_current_to_4_1_11(&fra->fra_info, &old->fra_info); 4248 old->fra_buf = fra->fra_buf; 4249 #ifdef MENTAT 4250 old->fra_q = fra->fra_q; 4251 old->fra_m = fra->fra_m; 4252 #endif 4253 } 4254 4255 4256 static void 4257 ipnat_current_to_4_1_14(current, old) 4258 void *current; 4259 ipnat_4_1_14_t *old; 4260 { 4261 ipnat_t *np = (ipnat_t *)current; 4262 4263 old->in_next = np->in_next; 4264 old->in_rnext = np->in_rnext; 4265 old->in_prnext = np->in_prnext; 4266 old->in_mnext = np->in_mnext; 4267 old->in_pmnext = np->in_pmnext; 4268 old->in_tqehead[0] = np->in_tqehead[0]; 4269 old->in_tqehead[1] = np->in_tqehead[1]; 4270 old->in_ifps[0] = np->in_ifps[0]; 4271 old->in_ifps[1] = np->in_ifps[1]; 4272 old->in_apr = np->in_apr; 4273 old->in_comment = np->in_comment; 4274 old->in_space = np->in_space; 4275 old->in_hits = np->in_hits; 4276 old->in_use = np->in_use; 4277 old->in_hv = np->in_hv[0]; 4278 old->in_flineno = np->in_flineno; 4279 if (old->in_redir == NAT_REDIRECT) 4280 old->in_pnext = np->in_dpnext; 4281 else 4282 old->in_pnext = np->in_spnext; 4283 old->in_v = np->in_v[0]; 4284 old->in_flags = np->in_flags; 4285 old->in_mssclamp = np->in_mssclamp; 4286 old->in_age[0] = np->in_age[0]; 4287 old->in_age[1] = np->in_age[1]; 4288 old->in_redir = np->in_redir; 4289 old->in_p = np->in_pr[0]; 4290 if (np->in_redir == NAT_REDIRECT) { 4291 old->in_next6 = np->in_ndst.na_nextaddr; 4292 old->in_in[0] = np->in_ndst.na_addr[0]; 4293 old->in_in[1] = np->in_ndst.na_addr[1]; 4294 old->in_out[0] = np->in_odst.na_addr[0]; 4295 old->in_out[1] = np->in_odst.na_addr[1]; 4296 old->in_src[0] = np->in_osrc.na_addr[0]; 4297 old->in_src[1] = np->in_osrc.na_addr[1]; 4298 } else { 4299 old->in_next6 = np->in_nsrc.na_nextaddr; 4300 old->in_out[0] = np->in_nsrc.na_addr[0]; 4301 old->in_out[1] = np->in_nsrc.na_addr[1]; 4302 old->in_in[0] = np->in_osrc.na_addr[0]; 4303 old->in_in[1] = np->in_osrc.na_addr[1]; 4304 old->in_src[0] = np->in_odst.na_addr[0]; 4305 old->in_src[1] = np->in_odst.na_addr[1]; 4306 } 4307 ipfv5tuctov4(&np->in_tuc, &old->in_tuc); 4308 if (np->in_redir == NAT_REDIRECT) { 4309 old->in_port[0] = np->in_dpmin; 4310 old->in_port[1] = np->in_dpmax; 4311 } else { 4312 old->in_port[0] = np->in_spmin; 4313 old->in_port[1] = np->in_spmax; 4314 } 4315 old->in_ppip = np->in_ppip; 4316 old->in_ippip = np->in_ippip; 4317 bcopy(&np->in_tag, &old->in_tag, sizeof(np->in_tag)); 4318 4319 if (np->in_ifnames[0] >= 0) { 4320 strncpy(old->in_ifnames[0], np->in_names + np->in_ifnames[0], 4321 LIFNAMSIZ); 4322 old->in_ifnames[0][LIFNAMSIZ - 1] = '\0'; 4323 } 4324 if (np->in_ifnames[1] >= 0) { 4325 strncpy(old->in_ifnames[1], np->in_names + np->in_ifnames[1], 4326 LIFNAMSIZ); 4327 old->in_ifnames[1][LIFNAMSIZ - 1] = '\0'; 4328 } 4329 if (np->in_plabel >= 0) { 4330 strncpy(old->in_plabel, np->in_names + np->in_plabel, 4331 APR_LABELLEN); 4332 old->in_plabel[APR_LABELLEN - 1] = '\0'; 4333 } 4334 } 4335 4336 4337 static void 4338 ipnat_current_to_4_1_0(current, old) 4339 void *current; 4340 ipnat_4_1_0_t *old; 4341 { 4342 ipnat_t *np = (ipnat_t *)current; 4343 4344 old->in_next = np->in_next; 4345 old->in_rnext = np->in_rnext; 4346 old->in_prnext = np->in_prnext; 4347 old->in_mnext = np->in_mnext; 4348 old->in_pmnext = np->in_pmnext; 4349 old->in_tqehead[0] = np->in_tqehead[0]; 4350 old->in_tqehead[1] = np->in_tqehead[1]; 4351 old->in_ifps[0] = np->in_ifps[0]; 4352 old->in_ifps[1] = np->in_ifps[1]; 4353 old->in_apr = np->in_apr; 4354 old->in_comment = np->in_comment; 4355 old->in_space = np->in_space; 4356 old->in_hits = np->in_hits; 4357 old->in_use = np->in_use; 4358 old->in_hv = np->in_hv[0]; 4359 old->in_flineno = np->in_flineno; 4360 if (old->in_redir == NAT_REDIRECT) 4361 old->in_pnext = np->in_dpnext; 4362 else 4363 old->in_pnext = np->in_spnext; 4364 old->in_v = np->in_v[0]; 4365 old->in_flags = np->in_flags; 4366 old->in_mssclamp = np->in_mssclamp; 4367 old->in_age[0] = np->in_age[0]; 4368 old->in_age[1] = np->in_age[1]; 4369 old->in_redir = np->in_redir; 4370 old->in_p = np->in_pr[0]; 4371 if (np->in_redir == NAT_REDIRECT) { 4372 old->in_next6 = np->in_ndst.na_nextaddr; 4373 old->in_in[0] = np->in_ndst.na_addr[0]; 4374 old->in_in[1] = np->in_ndst.na_addr[1]; 4375 old->in_out[0] = np->in_odst.na_addr[0]; 4376 old->in_out[1] = np->in_odst.na_addr[1]; 4377 old->in_src[0] = np->in_osrc.na_addr[0]; 4378 old->in_src[1] = np->in_osrc.na_addr[1]; 4379 } else { 4380 old->in_next6 = np->in_nsrc.na_nextaddr; 4381 old->in_out[0] = np->in_nsrc.na_addr[0]; 4382 old->in_out[1] = np->in_nsrc.na_addr[1]; 4383 old->in_in[0] = np->in_osrc.na_addr[0]; 4384 old->in_in[1] = np->in_osrc.na_addr[1]; 4385 old->in_src[0] = np->in_odst.na_addr[0]; 4386 old->in_src[1] = np->in_odst.na_addr[1]; 4387 } 4388 ipfv5tuctov4(&np->in_tuc, &old->in_tuc); 4389 if (np->in_redir == NAT_REDIRECT) { 4390 old->in_port[0] = np->in_dpmin; 4391 old->in_port[1] = np->in_dpmax; 4392 } else { 4393 old->in_port[0] = np->in_spmin; 4394 old->in_port[1] = np->in_spmax; 4395 } 4396 old->in_ppip = np->in_ppip; 4397 old->in_ippip = np->in_ippip; 4398 bcopy(&np->in_tag, &old->in_tag, sizeof(np->in_tag)); 4399 4400 if (np->in_ifnames[0] >= 0) { 4401 strncpy(old->in_ifnames[0], np->in_names + np->in_ifnames[0], 4402 LIFNAMSIZ); 4403 old->in_ifnames[0][LIFNAMSIZ - 1] = '\0'; 4404 } 4405 if (np->in_ifnames[1] >= 0) { 4406 strncpy(old->in_ifnames[1], np->in_names + np->in_ifnames[1], 4407 LIFNAMSIZ); 4408 old->in_ifnames[1][LIFNAMSIZ - 1] = '\0'; 4409 } 4410 if (np->in_plabel >= 0) { 4411 strncpy(old->in_plabel, np->in_names + np->in_plabel, 4412 APR_LABELLEN); 4413 old->in_plabel[APR_LABELLEN - 1] = '\0'; 4414 } 4415 } 4416 4417 4418 static void 4419 ipstate_current_to_4_1_16(current, old) 4420 void *current; 4421 ipstate_4_1_16_t *old; 4422 { 4423 ipstate_t *is = (ipstate_t *)current; 4424 4425 old->is_lock = is->is_lock; 4426 old->is_next = is->is_next; 4427 old->is_pnext = is->is_pnext; 4428 old->is_hnext = is->is_hnext; 4429 old->is_phnext = is->is_phnext; 4430 old->is_me = is->is_me; 4431 old->is_ifp[0] = is->is_ifp[0]; 4432 old->is_ifp[1] = is->is_ifp[1]; 4433 old->is_sync = is->is_sync; 4434 old->is_rule = is->is_rule; 4435 old->is_tqehead[0] = is->is_tqehead[0]; 4436 old->is_tqehead[1] = is->is_tqehead[1]; 4437 old->is_isc = is->is_isc; 4438 old->is_pkts[0] = is->is_pkts[0]; 4439 old->is_pkts[1] = is->is_pkts[1]; 4440 old->is_pkts[2] = is->is_pkts[2]; 4441 old->is_pkts[3] = is->is_pkts[3]; 4442 old->is_bytes[0] = is->is_bytes[0]; 4443 old->is_bytes[1] = is->is_bytes[1]; 4444 old->is_bytes[2] = is->is_bytes[2]; 4445 old->is_bytes[3] = is->is_bytes[3]; 4446 old->is_icmppkts[0] = is->is_icmppkts[0]; 4447 old->is_icmppkts[1] = is->is_icmppkts[1]; 4448 old->is_icmppkts[2] = is->is_icmppkts[2]; 4449 old->is_icmppkts[3] = is->is_icmppkts[3]; 4450 old->is_sti = is->is_sti; 4451 old->is_frage[0] = is->is_frage[0]; 4452 old->is_frage[1] = is->is_frage[1]; 4453 old->is_ref = is->is_ref; 4454 old->is_isninc[0] = is->is_isninc[0]; 4455 old->is_isninc[1] = is->is_isninc[1]; 4456 old->is_sumd[0] = is->is_sumd[0]; 4457 old->is_sumd[1] = is->is_sumd[1]; 4458 old->is_src = is->is_src; 4459 old->is_dst = is->is_dst; 4460 old->is_pass = is->is_pass; 4461 old->is_p = is->is_p; 4462 old->is_v = is->is_v; 4463 old->is_hv = is->is_hv; 4464 old->is_tag = is->is_tag; 4465 old->is_opt[0] = is->is_opt[0]; 4466 old->is_opt[1] = is->is_opt[1]; 4467 old->is_optmsk[0] = is->is_optmsk[0]; 4468 old->is_optmsk[1] = is->is_optmsk[1]; 4469 old->is_sec = is->is_sec; 4470 old->is_secmsk = is->is_secmsk; 4471 old->is_auth = is->is_auth; 4472 old->is_authmsk = is->is_authmsk; 4473 ipf_v5tcpinfoto4(&is->is_tcp, &old->is_tcp); 4474 old->is_flags = is->is_flags; 4475 old->is_flx[0][0] = is->is_flx[0][0]; 4476 old->is_flx[0][1] = is->is_flx[0][1]; 4477 old->is_flx[1][0] = is->is_flx[1][0]; 4478 old->is_flx[1][1] = is->is_flx[1][1]; 4479 old->is_rulen = is->is_rulen; 4480 old->is_s0[0] = is->is_s0[0]; 4481 old->is_s0[1] = is->is_s0[1]; 4482 old->is_smsk[0] = is->is_smsk[0]; 4483 old->is_smsk[1] = is->is_smsk[1]; 4484 bcopy(is->is_group, old->is_group, sizeof(is->is_group)); 4485 bcopy(is->is_sbuf, old->is_sbuf, sizeof(is->is_sbuf)); 4486 bcopy(is->is_ifname, old->is_ifname, sizeof(is->is_ifname)); 4487 } 4488 4489 4490 static void 4491 ipstate_current_to_4_1_0(current, old) 4492 void *current; 4493 ipstate_4_1_0_t *old; 4494 { 4495 ipstate_t *is = (ipstate_t *)current; 4496 4497 old->is_lock = is->is_lock; 4498 old->is_next = is->is_next; 4499 old->is_pnext = is->is_pnext; 4500 old->is_hnext = is->is_hnext; 4501 old->is_phnext = is->is_phnext; 4502 old->is_me = is->is_me; 4503 old->is_ifp[0] = is->is_ifp[0]; 4504 old->is_ifp[1] = is->is_ifp[1]; 4505 old->is_sync = is->is_sync; 4506 bzero(&old->is_nat, sizeof(old->is_nat)); 4507 old->is_rule = is->is_rule; 4508 old->is_tqehead[0] = is->is_tqehead[0]; 4509 old->is_tqehead[1] = is->is_tqehead[1]; 4510 old->is_isc = is->is_isc; 4511 old->is_pkts[0] = is->is_pkts[0]; 4512 old->is_pkts[1] = is->is_pkts[1]; 4513 old->is_pkts[2] = is->is_pkts[2]; 4514 old->is_pkts[3] = is->is_pkts[3]; 4515 old->is_bytes[0] = is->is_bytes[0]; 4516 old->is_bytes[1] = is->is_bytes[1]; 4517 old->is_bytes[2] = is->is_bytes[2]; 4518 old->is_bytes[3] = is->is_bytes[3]; 4519 old->is_icmppkts[0] = is->is_icmppkts[0]; 4520 old->is_icmppkts[1] = is->is_icmppkts[1]; 4521 old->is_icmppkts[2] = is->is_icmppkts[2]; 4522 old->is_icmppkts[3] = is->is_icmppkts[3]; 4523 old->is_sti = is->is_sti; 4524 old->is_frage[0] = is->is_frage[0]; 4525 old->is_frage[1] = is->is_frage[1]; 4526 old->is_ref = is->is_ref; 4527 old->is_isninc[0] = is->is_isninc[0]; 4528 old->is_isninc[1] = is->is_isninc[1]; 4529 old->is_sumd[0] = is->is_sumd[0]; 4530 old->is_sumd[1] = is->is_sumd[1]; 4531 old->is_src = is->is_src; 4532 old->is_dst = is->is_dst; 4533 old->is_pass = is->is_pass; 4534 old->is_p = is->is_p; 4535 old->is_v = is->is_v; 4536 old->is_hv = is->is_hv; 4537 old->is_tag = is->is_tag; 4538 old->is_opt[0] = is->is_opt[0]; 4539 old->is_opt[1] = is->is_opt[1]; 4540 old->is_optmsk[0] = is->is_optmsk[0]; 4541 old->is_optmsk[1] = is->is_optmsk[1]; 4542 old->is_sec = is->is_sec; 4543 old->is_secmsk = is->is_secmsk; 4544 old->is_auth = is->is_auth; 4545 old->is_authmsk = is->is_authmsk; 4546 ipf_v5tcpinfoto4(&is->is_tcp, &old->is_tcp); 4547 old->is_flags = is->is_flags; 4548 old->is_flx[0][0] = is->is_flx[0][0]; 4549 old->is_flx[0][1] = is->is_flx[0][1]; 4550 old->is_flx[1][0] = is->is_flx[1][0]; 4551 old->is_flx[1][1] = is->is_flx[1][1]; 4552 old->is_rulen = is->is_rulen; 4553 old->is_s0[0] = is->is_s0[0]; 4554 old->is_s0[1] = is->is_s0[1]; 4555 old->is_smsk[0] = is->is_smsk[0]; 4556 old->is_smsk[1] = is->is_smsk[1]; 4557 bcopy(is->is_group, old->is_group, sizeof(is->is_group)); 4558 bcopy(is->is_sbuf, old->is_sbuf, sizeof(is->is_sbuf)); 4559 bcopy(is->is_ifname, old->is_ifname, sizeof(is->is_ifname)); 4560 } 4561 4562 4563 static void 4564 ips_stat_current_to_4_1_21(current, old) 4565 void *current; 4566 ips_stat_4_1_21_t *old; 4567 { 4568 ips_stat_t *st = (ips_stat_t *)current; 4569 4570 old->iss_hits = st->iss_hits; 4571 old->iss_miss = st->iss_check_miss; 4572 old->iss_max = st->iss_max; 4573 old->iss_maxref = st->iss_max_ref; 4574 old->iss_tcp = st->iss_proto[IPPROTO_TCP]; 4575 old->iss_udp = st->iss_proto[IPPROTO_UDP]; 4576 old->iss_icmp = st->iss_proto[IPPROTO_ICMP]; 4577 old->iss_nomem = st->iss_nomem; 4578 old->iss_expire = st->iss_expire; 4579 old->iss_fin = st->iss_fin; 4580 old->iss_active = st->iss_active; 4581 old->iss_logged = st->iss_log_ok; 4582 old->iss_logfail = st->iss_log_fail; 4583 old->iss_inuse = st->iss_inuse; 4584 old->iss_wild = st->iss_wild; 4585 old->iss_ticks = st->iss_ticks; 4586 old->iss_bucketfull = st->iss_bucket_full; 4587 old->iss_statesize = st->iss_state_size; 4588 old->iss_statemax = st->iss_state_max; 4589 old->iss_table = st->iss_table; 4590 old->iss_list = st->iss_list; 4591 old->iss_bucketlen = (void *)st->iss_bucketlen; 4592 old->iss_tcptab = st->iss_tcptab; 4593 } 4594 4595 4596 static void 4597 ips_stat_current_to_4_1_0(current, old) 4598 void *current; 4599 ips_stat_4_1_0_t *old; 4600 { 4601 ips_stat_t *st = (ips_stat_t *)current; 4602 4603 old->iss_hits = st->iss_hits; 4604 old->iss_miss = st->iss_check_miss; 4605 old->iss_max = st->iss_max; 4606 old->iss_maxref = st->iss_max_ref; 4607 old->iss_tcp = st->iss_proto[IPPROTO_TCP]; 4608 old->iss_udp = st->iss_proto[IPPROTO_UDP]; 4609 old->iss_icmp = st->iss_proto[IPPROTO_ICMP]; 4610 old->iss_nomem = st->iss_nomem; 4611 old->iss_expire = st->iss_expire; 4612 old->iss_fin = st->iss_fin; 4613 old->iss_active = st->iss_active; 4614 old->iss_logged = st->iss_log_ok; 4615 old->iss_logfail = st->iss_log_fail; 4616 old->iss_inuse = st->iss_inuse; 4617 old->iss_wild = st->iss_wild; 4618 old->iss_ticks = st->iss_ticks; 4619 old->iss_bucketfull = st->iss_bucket_full; 4620 old->iss_statesize = st->iss_state_size; 4621 old->iss_statemax = st->iss_state_max; 4622 old->iss_table = st->iss_table; 4623 old->iss_list = st->iss_list; 4624 old->iss_bucketlen = (void *)st->iss_bucketlen; 4625 } 4626 4627 4628 static void 4629 nat_save_current_to_4_1_16(current, old) 4630 void *current; 4631 nat_save_4_1_16_t *old; 4632 { 4633 nat_save_t *nats = (nat_save_t *)current; 4634 4635 old->ipn_next = nats->ipn_next; 4636 bcopy(&nats->ipn_nat, &old->ipn_nat, sizeof(old->ipn_nat)); 4637 bcopy(&nats->ipn_ipnat, &old->ipn_ipnat, sizeof(old->ipn_ipnat)); 4638 frentry_current_to_4_1_16(&nats->ipn_fr, &old->ipn_fr); 4639 old->ipn_dsize = nats->ipn_dsize; 4640 bcopy(nats->ipn_data, old->ipn_data, sizeof(nats->ipn_data)); 4641 } 4642 4643 4644 static void 4645 nat_save_current_to_4_1_14(current, old) 4646 void *current; 4647 nat_save_4_1_14_t *old; 4648 { 4649 nat_save_t *nats = (nat_save_t *)current; 4650 4651 old->ipn_next = nats->ipn_next; 4652 bcopy(&nats->ipn_nat, &old->ipn_nat, sizeof(old->ipn_nat)); 4653 bcopy(&nats->ipn_ipnat, &old->ipn_ipnat, sizeof(old->ipn_ipnat)); 4654 frentry_current_to_4_1_0(&nats->ipn_fr, &old->ipn_fr); 4655 old->ipn_dsize = nats->ipn_dsize; 4656 bcopy(nats->ipn_data, old->ipn_data, sizeof(nats->ipn_data)); 4657 } 4658 4659 4660 static void 4661 nat_save_current_to_4_1_3(current, old) 4662 void *current; 4663 nat_save_4_1_3_t *old; 4664 { 4665 nat_save_t *nats = (nat_save_t *)current; 4666 4667 old->ipn_next = nats->ipn_next; 4668 bcopy(&nats->ipn_nat, &old->ipn_nat, sizeof(old->ipn_nat)); 4669 bcopy(&nats->ipn_ipnat, &old->ipn_ipnat, sizeof(old->ipn_ipnat)); 4670 frentry_current_to_4_1_0(&nats->ipn_fr, &old->ipn_fr); 4671 old->ipn_dsize = nats->ipn_dsize; 4672 bcopy(nats->ipn_data, old->ipn_data, sizeof(nats->ipn_data)); 4673 } 4674 4675 4676 static void 4677 nat_current_to_4_1_25(current, old) 4678 void *current; 4679 nat_4_1_25_t *old; 4680 { 4681 nat_t *nat = (nat_t *)current; 4682 4683 old->nat_lock = nat->nat_lock; 4684 old->nat_next = (void *)nat->nat_next; 4685 old->nat_pnext = (void *)nat->nat_pnext; 4686 old->nat_hnext[0] = (void *)nat->nat_hnext[0]; 4687 old->nat_hnext[1] = (void *)nat->nat_hnext[1]; 4688 old->nat_phnext[0] = (void *)nat->nat_phnext[0]; 4689 old->nat_phnext[1] = (void *)nat->nat_phnext[1]; 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 = (void *)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 old->nat_redir = nat->nat_redir; 4718 bcopy(nat->nat_ifnames[0], old->nat_ifnames[0], LIFNAMSIZ); 4719 bcopy(nat->nat_ifnames[1], old->nat_ifnames[1], LIFNAMSIZ); 4720 4721 if (nat->nat_redir == NAT_REDIRECT) { 4722 old->nat_inip6 = nat->nat_ndst6; 4723 old->nat_outip6 = nat->nat_odst6; 4724 old->nat_oip6 = nat->nat_osrc6; 4725 old->nat_un.nat_unt.ts_sport = nat->nat_ndport; 4726 old->nat_un.nat_unt.ts_dport = nat->nat_odport; 4727 } else { 4728 old->nat_inip6 = nat->nat_osrc6; 4729 old->nat_outip6 = nat->nat_nsrc6; 4730 old->nat_oip6 = nat->nat_odst6; 4731 old->nat_un.nat_unt.ts_sport = nat->nat_osport; 4732 old->nat_un.nat_unt.ts_dport = nat->nat_nsport; 4733 } 4734 } 4735 4736 4737 static void 4738 nat_current_to_4_1_14(current, old) 4739 void *current; 4740 nat_4_1_14_t *old; 4741 { 4742 nat_t *nat = (nat_t *)current; 4743 4744 old->nat_lock = nat->nat_lock; 4745 old->nat_next = nat->nat_next; 4746 old->nat_pnext = NULL; 4747 old->nat_hnext[0] = NULL; 4748 old->nat_hnext[1] = NULL; 4749 old->nat_phnext[0] = NULL; 4750 old->nat_phnext[1] = NULL; 4751 old->nat_hm = nat->nat_hm; 4752 old->nat_data = nat->nat_data; 4753 old->nat_me = (void *)nat->nat_me; 4754 old->nat_state = nat->nat_state; 4755 old->nat_aps = nat->nat_aps; 4756 old->nat_fr = nat->nat_fr; 4757 old->nat_ptr = nat->nat_ptr; 4758 old->nat_ifps[0] = nat->nat_ifps[0]; 4759 old->nat_ifps[1] = nat->nat_ifps[1]; 4760 old->nat_sync = nat->nat_sync; 4761 old->nat_tqe = nat->nat_tqe; 4762 old->nat_flags = nat->nat_flags; 4763 old->nat_sumd[0] = nat->nat_sumd[0]; 4764 old->nat_sumd[1] = nat->nat_sumd[1]; 4765 old->nat_ipsumd = nat->nat_ipsumd; 4766 old->nat_mssclamp = nat->nat_mssclamp; 4767 old->nat_pkts[0] = nat->nat_pkts[0]; 4768 old->nat_pkts[1] = nat->nat_pkts[1]; 4769 old->nat_bytes[0] = nat->nat_bytes[0]; 4770 old->nat_bytes[1] = nat->nat_bytes[1]; 4771 old->nat_ref = nat->nat_ref; 4772 old->nat_dir = nat->nat_dir; 4773 old->nat_p = nat->nat_pr[0]; 4774 old->nat_use = nat->nat_use; 4775 old->nat_hv[0] = nat->nat_hv[0]; 4776 old->nat_hv[1] = nat->nat_hv[1]; 4777 old->nat_rev = nat->nat_rev; 4778 bcopy(nat->nat_ifnames[0], old->nat_ifnames[0], LIFNAMSIZ); 4779 bcopy(nat->nat_ifnames[1], old->nat_ifnames[1], LIFNAMSIZ); 4780 4781 if (nat->nat_redir == NAT_REDIRECT) { 4782 old->nat_inip6 = nat->nat_ndst6; 4783 old->nat_outip6 = nat->nat_odst6; 4784 old->nat_oip6 = nat->nat_osrc6; 4785 old->nat_un.nat_unt.ts_sport = nat->nat_ndport; 4786 old->nat_un.nat_unt.ts_dport = nat->nat_odport; 4787 } else { 4788 old->nat_inip6 = nat->nat_osrc6; 4789 old->nat_outip6 = nat->nat_nsrc6; 4790 old->nat_oip6 = nat->nat_odst6; 4791 old->nat_un.nat_unt.ts_sport = nat->nat_osport; 4792 old->nat_un.nat_unt.ts_dport = nat->nat_nsport; 4793 } 4794 } 4795 4796 4797 static void 4798 nat_current_to_4_1_3(current, old) 4799 void *current; 4800 nat_4_1_3_t *old; 4801 { 4802 nat_t *nat = (nat_t *)current; 4803 4804 old->nat_lock = nat->nat_lock; 4805 old->nat_next = nat->nat_next; 4806 old->nat_pnext = NULL; 4807 old->nat_hnext[0] = NULL; 4808 old->nat_hnext[1] = NULL; 4809 old->nat_phnext[0] = NULL; 4810 old->nat_phnext[1] = NULL; 4811 old->nat_hm = nat->nat_hm; 4812 old->nat_data = nat->nat_data; 4813 old->nat_me = (void *)nat->nat_me; 4814 old->nat_state = nat->nat_state; 4815 old->nat_aps = nat->nat_aps; 4816 old->nat_fr = nat->nat_fr; 4817 old->nat_ptr = nat->nat_ptr; 4818 old->nat_ifps[0] = nat->nat_ifps[0]; 4819 old->nat_ifps[1] = nat->nat_ifps[1]; 4820 old->nat_sync = nat->nat_sync; 4821 old->nat_tqe = nat->nat_tqe; 4822 old->nat_flags = nat->nat_flags; 4823 old->nat_sumd[0] = nat->nat_sumd[0]; 4824 old->nat_sumd[1] = nat->nat_sumd[1]; 4825 old->nat_ipsumd = nat->nat_ipsumd; 4826 old->nat_mssclamp = nat->nat_mssclamp; 4827 old->nat_pkts[0] = nat->nat_pkts[0]; 4828 old->nat_pkts[1] = nat->nat_pkts[1]; 4829 old->nat_bytes[0] = nat->nat_bytes[0]; 4830 old->nat_bytes[1] = nat->nat_bytes[1]; 4831 old->nat_ref = nat->nat_ref; 4832 old->nat_dir = nat->nat_dir; 4833 old->nat_p = nat->nat_pr[0]; 4834 old->nat_use = nat->nat_use; 4835 old->nat_hv[0] = nat->nat_hv[0]; 4836 old->nat_hv[1] = nat->nat_hv[1]; 4837 old->nat_rev = nat->nat_rev; 4838 bcopy(nat->nat_ifnames[0], old->nat_ifnames[0], LIFNAMSIZ); 4839 bcopy(nat->nat_ifnames[1], old->nat_ifnames[1], LIFNAMSIZ); 4840 4841 if (nat->nat_redir == NAT_REDIRECT) { 4842 old->nat_inip6 = nat->nat_ndst6; 4843 old->nat_outip6 = nat->nat_odst6; 4844 old->nat_oip6 = nat->nat_osrc6; 4845 old->nat_un.nat_unt.ts_sport = nat->nat_ndport; 4846 old->nat_un.nat_unt.ts_dport = nat->nat_odport; 4847 } else { 4848 old->nat_inip6 = nat->nat_osrc6; 4849 old->nat_outip6 = nat->nat_nsrc6; 4850 old->nat_oip6 = nat->nat_odst6; 4851 old->nat_un.nat_unt.ts_sport = nat->nat_osport; 4852 old->nat_un.nat_unt.ts_dport = nat->nat_nsport; 4853 } 4854 } 4855 4856 #endif /* IPFILTER_COMPAT */ 4857