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