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