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