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