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