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