diff -cr ip_fil3.4.7/HISTORY ip_fil3.4.8/HISTORY *** ip_fil3.4.7/HISTORY Sat Jul 8 12:35:27 2000 --- ip_fil3.4.8/HISTORY Wed Jul 19 23:40:03 2000 *************** *** 20,25 **** --- 20,35 ---- # and especially those who have found the time to port IP Filter to new # platforms. # + 3.4.8 19/07/2000 - Released + + create fake opt_inet6.h for FreeBSD-4 compile as LKM + + add #ifdef's for KLD_MODULE sanity + + NAT fastroute'd packets which come out of return-* + + fix upper/lower case crap in ftp proxy and get seq# checking fixed up. + 3.4.7 08/07/2000 - Released make "ipf -y" lookup NAT if's which are unknown diff -cr ip_fil3.4.7/Makefile ip_fil3.4.8/Makefile *** ip_fil3.4.7/Makefile Wed Apr 26 22:14:58 2000 --- ip_fil3.4.8/Makefile Tue Jul 18 23:58:10 2000 *************** *** 5,11 **** # provided that this notice is preserved and due credit is given # to the original author and the contributors. # ! # $Id: Makefile,v 2.11.2.1 2000/04/26 12:14:58 darrenr Exp $ # BINDEST=/usr/local/bin SBINDEST=/sbin --- 5,11 ---- # provided that this notice is preserved and due credit is given # to the original author and the contributors. # ! # $Id: Makefile,v 2.11.2.2 2000/07/18 13:58:10 darrenr Exp $ # BINDEST=/usr/local/bin SBINDEST=/sbin *************** *** 126,131 **** --- 126,136 ---- make freebsd freebsd4: include + if [ x$INET6 = x ] ; then \ + echo "#undef INET6" > opt_inet6.h; \ + else \ + echo "#define INET6" > opt_inet6.h; \ + fi make setup "TARGOS=BSD" "CPUDIR=$(CPUDIR)" (cd BSD/$(CPUDIR); make build TOP=../.. $(MFLAGS) "ML=mlfk_ipl.c" "MLD=mlfk_ipl.c" "LKM=ipf.ko" "DLKM=-DKLD_MODULE"; cd ..) (cd BSD/$(CPUDIR); make -f Makefile.ipsend TOP=../.. $(MFLAGS1); cd ..) *************** *** 181,187 **** clean: clean-include ${RM} -f core *.o ipt fils ipf ipfstat ipftest ipmon if_ipl \ ! vnode_if.h $(LKM) *~ (cd SunOS4; make clean) (cd SunOS5; make clean) (cd BSD; make clean) --- 186,192 ---- clean: clean-include ${RM} -f core *.o ipt fils ipf ipfstat ipftest ipmon if_ipl \ ! vnode_if.h $(LKM) *~ opt_inet6.h (cd SunOS4; make clean) (cd SunOS5; make clean) (cd BSD; make clean) diff -cr ip_fil3.4.7/SunOS5/pkginfo ip_fil3.4.8/SunOS5/pkginfo *** ip_fil3.4.7/SunOS5/pkginfo Sat Jul 8 12:34:54 2000 --- ip_fil3.4.8/SunOS5/pkginfo Wed Jul 19 23:40:04 2000 *************** *** 5,11 **** PKG=ipf NAME=IP Filter ARCH=ARCH_updated_by_sed_when_package_is_built ! VERSION=3.4.7 CATEGORY=system DESC=This package contains tools for building a firewall VENDOR=Darren Reed --- 5,11 ---- PKG=ipf NAME=IP Filter ARCH=ARCH_updated_by_sed_when_package_is_built ! VERSION=3.4.8 CATEGORY=system DESC=This package contains tools for building a firewall VENDOR=Darren Reed diff -cr ip_fil3.4.7/fil.c ip_fil3.4.8/fil.c *** ip_fil3.4.7/fil.c Sat Jul 8 12:13:11 2000 --- ip_fil3.4.8/fil.c Wed Jul 19 23:13:40 2000 *************** *** 7,13 **** */ #if !defined(lint) static const char sccsid[] = "@(#)fil.c 1.36 6/5/96 (C) 1993-2000 Darren Reed"; ! static const char rcsid[] = "@(#)$Id: fil.c,v 2.35.2.15 2000/07/08 02:13:11 darrenr Exp $"; #endif #include --- 7,13 ---- */ #if !defined(lint) static const char sccsid[] = "@(#)fil.c 1.36 6/5/96 (C) 1993-2000 Darren Reed"; ! static const char rcsid[] = "@(#)$Id: fil.c,v 2.35.2.18 2000/07/19 13:13:40 darrenr Exp $"; #endif #include *************** *** 22,29 **** #if (defined(KERNEL) || defined(_KERNEL)) && defined(__FreeBSD_version) && \ (__FreeBSD_version >= 220000) # if (__FreeBSD_version >= 400000) ! # include "opt_inet6.h" ! # if (__FreeBSD_version >= 400019) # define CSUM_DELAY_DATA # endif # endif --- 22,31 ---- #if (defined(KERNEL) || defined(_KERNEL)) && defined(__FreeBSD_version) && \ (__FreeBSD_version >= 220000) # if (__FreeBSD_version >= 400000) ! # ifndef KLD_MODULE ! # include "opt_inet6.h" ! # endif ! # if (__FreeBSD_version == 400019) # define CSUM_DELAY_DATA # endif # endif *************** *** 1365,1371 **** * SUCH DAMAGE. * * @(#)uipc_mbuf.c 8.2 (Berkeley) 1/4/94 ! * $Id: fil.c,v 2.35.2.15 2000/07/08 02:13:11 darrenr Exp $ */ /* * Copy data from an mbuf chain starting "off" bytes from the beginning, --- 1367,1373 ---- * SUCH DAMAGE. * * @(#)uipc_mbuf.c 8.2 (Berkeley) 1/4/94 ! * $Id: fil.c,v 2.35.2.18 2000/07/19 13:13:40 darrenr Exp $ */ /* * Copy data from an mbuf chain starting "off" bytes from the beginning, diff -cr ip_fil3.4.7/ip_fil.c ip_fil3.4.8/ip_fil.c *** ip_fil3.4.7/ip_fil.c Sat Jul 8 12:17:38 2000 --- ip_fil3.4.8/ip_fil.c Tue Jul 18 23:57:55 2000 *************** *** 7,13 **** */ #if !defined(lint) static const char sccsid[] = "@(#)ip_fil.c 2.41 6/5/96 (C) 1993-2000 Darren Reed"; ! static const char rcsid[] = "@(#)$Id: ip_fil.c,v 2.42.2.13 2000/07/08 02:17:38 darrenr Exp $"; #endif #ifndef SOLARIS --- 7,13 ---- */ #if !defined(lint) static const char sccsid[] = "@(#)ip_fil.c 2.41 6/5/96 (C) 1993-2000 Darren Reed"; ! static const char rcsid[] = "@(#)$Id: ip_fil.c,v 2.42.2.14 2000/07/18 13:57:55 darrenr Exp $"; #endif #ifndef SOLARIS *************** *** 1342,1351 **** ATOMIC_INCL(frstats[1].fr_acct); } fin->fin_fr = NULL; ! if (!fr || !(fr->fr_flags & FR_RETMASK)) { (void) fr_checkstate(ip, fin); ! (void) ip_natout(ip, fin); ! } } else ip->ip_sum = 0; /* --- 1342,1350 ---- ATOMIC_INCL(frstats[1].fr_acct); } fin->fin_fr = NULL; ! if (!fr || !(fr->fr_flags & FR_RETMASK)) (void) fr_checkstate(ip, fin); ! (void) ip_natout(ip, fin); } else ip->ip_sum = 0; /* diff -cr ip_fil3.4.7/ip_ftp_pxy.c ip_fil3.4.8/ip_ftp_pxy.c *** ip_fil3.4.7/ip_ftp_pxy.c Sat Jul 8 12:42:11 2000 --- ip_fil3.4.8/ip_ftp_pxy.c Wed Jul 19 23:06:13 2000 *************** *** 2,18 **** * Simple FTP transparent proxy for in-kernel use. For use with the NAT * code. * ! * $Id: ip_ftp_pxy.c,v 2.7.2.9 2000/07/08 02:41:56 darrenr Exp $ */ #if SOLARIS && defined(_KERNEL) extern kmutex_t ipf_rw; #endif #define isdigit(x) ((x) >= '0' && (x) <= '9') ! #define isupper(x) ((unsigned)((x) - 'A') <= 'Z' - 'A') ! #define islower(x) ((unsigned)((x) - 'a') <= 'z' - 'a') #define isalpha(x) (isupper(x) || islower(x)) ! #define toupper(x) (isupper(x) ? (x) : (x) - 'a' + 'Z') #define IPF_FTP_PROXY --- 2,18 ---- * Simple FTP transparent proxy for in-kernel use. For use with the NAT * code. * ! * $Id: ip_ftp_pxy.c,v 2.7.2.12 2000/07/19 13:06:13 darrenr Exp $ */ #if SOLARIS && defined(_KERNEL) extern kmutex_t ipf_rw; #endif #define isdigit(x) ((x) >= '0' && (x) <= '9') ! #define isupper(x) (((unsigned)(x) >= 'A') && ((unsigned)(x) <= 'Z')) ! #define islower(x) (((unsigned)(x) >= 'a') && ((unsigned)(x) <= 'z')) #define isalpha(x) (isupper(x) || islower(x)) ! #define toupper(x) (isupper(x) ? (x) : (x) - 'a' + 'A') #define IPF_FTP_PROXY *************** *** 553,568 **** return 1; } else return 1; ! } else if (isupper(c)) { c = *s++; i--; ! if (isupper(c)) { c = *s++; i--; ! if (isupper(c)) { c = *s++; i--; ! if (isupper(c)) { c = *s++; i--; if ((c != ' ') && (c != '\r')) --- 553,568 ---- return 1; } else return 1; ! } else if (isalpha(c)) { c = *s++; i--; ! if (isalpha(c)) { c = *s++; i--; ! if (isalpha(c)) { c = *s++; i--; ! if (isalpha(c)) { c = *s++; i--; if ((c != ' ') && (c != '\r')) *************** *** 591,597 **** ftpinfo_t *ftp; int rv; { ! int mlen, len, off, inc, i; char *rptr, *wptr; ftpside_t *f, *t; tcphdr_t *tcp; --- 591,597 ---- ftpinfo_t *ftp; int rv; { ! int mlen, len, off, inc, i, sel; char *rptr, *wptr; ftpside_t *f, *t; tcphdr_t *tcp; *************** *** 622,634 **** rptr = f->ftps_rptr; wptr = f->ftps_wptr; ! i = nat->nat_aps->aps_seqoff[1 - rv]; /* * XXX - Ideally, this packet should get dropped because we now know * that it is out of order (and there is no real danger in doing so * apart from causing packets to go through here ordered). */ ! if (ntohl(tcp->th_seq) + i != f->ftps_seq + (wptr - rptr)) { return APR_ERR(-1); } --- 622,638 ---- rptr = f->ftps_rptr; wptr = f->ftps_wptr; ! sel = nat->nat_aps->aps_sel[1 - rv]; ! if (rv) ! i = nat->nat_aps->aps_ackoff[sel]; ! else ! i = nat->nat_aps->aps_seqoff[sel]; /* * XXX - Ideally, this packet should get dropped because we now know * that it is out of order (and there is no real danger in doing so * apart from causing packets to go through here ordered). */ ! if (ntohl(tcp->th_seq) + i != f->ftps_seq) { return APR_ERR(-1); } diff -cr ip_fil3.4.7/ip_log.c ip_fil3.4.8/ip_log.c *** ip_fil3.4.7/ip_log.c Tue Mar 14 09:10:21 2000 --- ip_fil3.4.8/ip_log.c Wed Jul 19 23:11:47 2000 *************** *** 5,11 **** * provided that this notice is preserved and due credit is given * to the original author and the contributors. * ! * $Id: ip_log.c,v 2.5 2000/03/13 22:10:21 darrenr Exp $ */ #include #if defined(KERNEL) && !defined(_KERNEL) --- 5,11 ---- * provided that this notice is preserved and due credit is given * to the original author and the contributors. * ! * $Id: ip_log.c,v 2.5.2.1 2000/07/19 13:11:47 darrenr Exp $ */ #include #if defined(KERNEL) && !defined(_KERNEL) *************** *** 20,26 **** # include "opt_ipfilter.h" # endif # else ! # include # endif #endif #ifdef IPFILTER_LOG --- 20,30 ---- # include "opt_ipfilter.h" # endif # else ! # ifdef KLD_MODULE ! # include ! # else ! # include ! # endif # endif #endif #ifdef IPFILTER_LOG diff -cr ip_fil3.4.7/ip_nat.c ip_fil3.4.8/ip_nat.c *** ip_fil3.4.7/ip_nat.c Sat Jul 8 12:19:15 2000 --- ip_fil3.4.8/ip_nat.c Tue Jul 18 23:57:40 2000 *************** *** 9,15 **** */ #if !defined(lint) static const char sccsid[] = "@(#)ip_nat.c 1.11 6/5/96 (C) 1995 Darren Reed"; ! static const char rcsid[] = "@(#)$Id: ip_nat.c,v 2.37.2.15 2000/07/08 02:19:15 darrenr Exp $"; #endif #if defined(__FreeBSD__) && defined(KERNEL) && !defined(_KERNEL) --- 9,15 ---- */ #if !defined(lint) static const char sccsid[] = "@(#)ip_nat.c 1.11 6/5/96 (C) 1995 Darren Reed"; ! static const char rcsid[] = "@(#)$Id: ip_nat.c,v 2.37.2.16 2000/07/18 13:57:40 darrenr Exp $"; #endif #if defined(__FreeBSD__) && defined(KERNEL) && !defined(_KERNEL) *************** *** 1565,1578 **** fix_outcksum(&icmp->icmp_cksum, sumd, 0); } else { fix_outcksum(&oip->ip_sum, sumd, 0); ! sumd += (sumd & 0xffff); while (sumd > 0xffff) sumd = (sumd & 0xffff) + (sumd >> 16); ! /* fix_incksum(&icmp->icmp_cksum, sumd, 0); */ } - if ((flags & IPN_TCPUDP) != 0) { tcphdr_t *tcp; --- 1565,1578 ---- fix_outcksum(&icmp->icmp_cksum, sumd, 0); } else { fix_outcksum(&oip->ip_sum, sumd, 0); ! #if !SOLARIS && !defined(__sgi) sumd += (sumd & 0xffff); while (sumd > 0xffff) sumd = (sumd & 0xffff) + (sumd >> 16); ! fix_incksum(&icmp->icmp_cksum, sumd, 0); ! #endif } if ((flags & IPN_TCPUDP) != 0) { tcphdr_t *tcp; *************** *** 1878,1884 **** np = nat->nat_ptr; if (natadd && fin->fin_fi.fi_fl & FI_FRAG) ipfr_nat_newfrag(ip, fin, 0, nat); - ip->ip_src = nat->nat_outip; MUTEX_ENTER(&nat->nat_lock); nat->nat_age = fr_defnatage; nat->nat_bytes += ip->ip_len; --- 1878,1883 ---- *************** *** 1889,1900 **** * Fix up checksums, not by recalculating them, but * simply computing adjustments. */ #if SOLARIS || defined(__sgi) ! if (nat->nat_dir == NAT_OUTBOUND) ! fix_outcksum(&ip->ip_sum, nat->nat_ipsumd, 0); ! else ! fix_incksum(&ip->ip_sum, nat->nat_ipsumd, 0); #endif if (!(ip->ip_off & IP_OFFMASK) && !(fin->fin_fi.fi_fl & FI_SHORT)) { --- 1888,1914 ---- * Fix up checksums, not by recalculating them, but * simply computing adjustments. */ + if (nflags == IPN_ICMPERR) { + u_32_t s1, s2, sumd; + + s1 = LONG_SUM(ntohl(ip->ip_src.s_addr)); + s2 = LONG_SUM(ntohl(nat->nat_outip.s_addr)); + CALC_SUMD(s1, s2, sumd); + + if (nat->nat_dir == NAT_OUTBOUND) + fix_incksum(&ip->ip_sum, sumd, 0); + else + fix_outcksum(&ip->ip_sum, sumd, 0); + } #if SOLARIS || defined(__sgi) ! else { ! if (nat->nat_dir == NAT_OUTBOUND) ! fix_outcksum(&ip->ip_sum, nat->nat_ipsumd, 0); ! else ! fix_incksum(&ip->ip_sum, nat->nat_ipsumd, 0); ! } #endif + ip->ip_src = nat->nat_outip; if (!(ip->ip_off & IP_OFFMASK) && !(fin->fin_fi.fi_fl & FI_SHORT)) { diff -cr ip_fil3.4.7/ip_nat.h ip_fil3.4.8/ip_nat.h *** ip_fil3.4.7/ip_nat.h Sat Jul 8 12:16:43 2000 --- ip_fil3.4.8/ip_nat.h Sun Jul 16 00:50:06 2000 *************** *** 6,12 **** * to the original author and the contributors. * * @(#)ip_nat.h 1.5 2/4/96 ! * $Id: ip_nat.h,v 2.17.2.5 2000/07/08 02:16:43 darrenr Exp $ */ #ifndef __IP_NAT_H__ --- 6,12 ---- * to the original author and the contributors. * * @(#)ip_nat.h 1.5 2/4/96 ! * $Id: ip_nat.h,v 2.17.2.6 2000/07/15 14:50:06 darrenr Exp $ */ #ifndef __IP_NAT_H__ *************** *** 239,244 **** --- 239,246 ---- #define NL_NEWMAP NAT_MAP #define NL_NEWRDR NAT_REDIRECT + #define NL_NEWBIMAP NAT_BIMAP + #define NL_NEWBLOCK NAT_MAPBLK #define NL_EXPIRE 0xffff #define NAT_HASH_FN(k,l,m) (((k) + ((k) >> 12) + l) % (m)) diff -cr ip_fil3.4.7/ip_rcmd_pxy.c ip_fil3.4.8/ip_rcmd_pxy.c *** ip_fil3.4.7/ip_rcmd_pxy.c Sat May 6 21:19:34 2000 --- ip_fil3.4.8/ip_rcmd_pxy.c Sat Jul 15 22:38:30 2000 *************** *** 1,5 **** /* ! * $Id: ip_rcmd_pxy.c,v 1.4.2.1 2000/05/06 11:19:34 darrenr Exp $ */ /* * Simple RCMD transparent proxy for in-kernel use. For use with the NAT --- 1,5 ---- /* ! * $Id: ip_rcmd_pxy.c,v 1.4.2.2 2000/07/15 12:38:30 darrenr Exp $ */ /* * Simple RCMD transparent proxy for in-kernel use. For use with the NAT *************** *** 93,100 **** #endif tcp = (tcphdr_t *)fin->fin_dp; off = (ip->ip_hl << 2) + (tcp->th_off << 2); - m = *(mb_t **)fin->fin_mp; #if SOLARIS m = fin->fin_qfm; --- 93,109 ---- #endif tcp = (tcphdr_t *)fin->fin_dp; + + if (tcp->th_flags & TH_SYN) { + *(u_32_t *)aps->aps_data = htonl(ntohl(tcp->th_seq) + 1); + return 0; + } + + if ((*(u_32_t *)aps->aps_data != 0) && + (tcp->th_seq != *(u_32_t *)aps->aps_data)) + return 0; + off = (ip->ip_hl << 2) + (tcp->th_off << 2); #if SOLARIS m = fin->fin_qfm; *************** *** 103,115 **** bzero(portbuf, sizeof(portbuf)); copyout_mblk(m, off, MIN(sizeof(portbuf), dlen), portbuf); #else dlen = mbufchainlen(m) - off; bzero(portbuf, sizeof(portbuf)); m_copydata(m, off, MIN(sizeof(portbuf), dlen), portbuf); #endif - if ((*(u_32_t *)aps->aps_data != 0) && - (tcp->th_seq != *(u_32_t *)aps->aps_data)) - return 0; portbuf[sizeof(portbuf) - 1] = '\0'; s = portbuf; --- 112,122 ---- bzero(portbuf, sizeof(portbuf)); copyout_mblk(m, off, MIN(sizeof(portbuf), dlen), portbuf); #else + m = *(mb_t **)fin->fin_mp; dlen = mbufchainlen(m) - off; bzero(portbuf, sizeof(portbuf)); m_copydata(m, off, MIN(sizeof(portbuf), dlen), portbuf); #endif portbuf[sizeof(portbuf) - 1] = '\0'; s = portbuf; diff -cr ip_fil3.4.7/ipl.h ip_fil3.4.8/ipl.h *** ip_fil3.4.7/ipl.h Sat Jul 8 12:34:54 2000 --- ip_fil3.4.8/ipl.h Wed Jul 19 23:40:04 2000 *************** *** 6,17 **** * to the original author and the contributors. * * @(#)ipl.h 1.21 6/5/96 ! * $Id: ipl.h,v 2.15.2.8 2000/07/08 02:34:54 darrenr Exp $ */ #ifndef __IPL_H__ #define __IPL_H__ ! #define IPL_VERSION "IP Filter: v3.4.7" #endif --- 6,17 ---- * to the original author and the contributors. * * @(#)ipl.h 1.21 6/5/96 ! * $Id: ipl.h,v 2.15.2.9 2000/07/19 13:40:04 darrenr Exp $ */ #ifndef __IPL_H__ #define __IPL_H__ ! #define IPL_VERSION "IP Filter: v3.4.8" #endif diff -cr ip_fil3.4.7/ipmon.c ip_fil3.4.8/ipmon.c *** ip_fil3.4.7/ipmon.c Sat Jul 8 12:15:17 2000 --- ip_fil3.4.8/ipmon.c Sun Jul 16 00:50:06 2000 *************** *** 7,13 **** */ #if !defined(lint) static const char sccsid[] = "@(#)ipmon.c 1.21 6/5/96 (C)1993-2000 Darren Reed"; ! static const char rcsid[] = "@(#)$Id: ipmon.c,v 2.12.2.1 2000/07/08 02:15:17 darrenr Exp $"; #endif #ifndef SOLARIS --- 7,13 ---- */ #if !defined(lint) static const char sccsid[] = "@(#)ipmon.c 1.21 6/5/96 (C)1993-2000 Darren Reed"; ! static const char rcsid[] = "@(#)$Id: ipmon.c,v 2.12.2.2 2000/07/15 14:50:06 darrenr Exp $"; #endif #ifndef SOLARIS *************** *** 401,406 **** --- 401,410 ---- strcpy(t, "NAT:RDR "); else if (nl->nl_type == NL_EXPIRE) strcpy(t, "NAT:EXPIRE "); + else if (nl->nl_type == NL_NEWBIMAP) + strcpy(t, "NAT:BIMAP "); + else if (nl->nl_type == NL_NEWBLOCK) + strcpy(t, "NAT:MAPBLOCK "); else sprintf(t, "Type: %d ", nl->nl_type); t += strlen(t); diff -cr ip_fil3.4.7/solaris.c ip_fil3.4.8/solaris.c *** ip_fil3.4.7/solaris.c Sun Jun 18 22:22:24 2000 --- ip_fil3.4.8/solaris.c Tue Jul 18 23:56:33 2000 *************** *** 6,12 **** * to the original author and the contributors. */ /* #pragma ident "@(#)solaris.c 1.12 6/5/96 (C) 1995 Darren Reed"*/ ! #pragma ident "@(#)$Id: solaris.c,v 2.15.2.5 2000/06/18 12:22:24 darrenr Exp $" #include #include --- 6,12 ---- * to the original author and the contributors. */ /* #pragma ident "@(#)solaris.c 1.12 6/5/96 (C) 1995 Darren Reed"*/ ! #pragma ident "@(#)$Id: solaris.c,v 2.15.2.6 2000/07/18 13:56:33 darrenr Exp $" #include #include *************** *** 683,689 **** s = m->b_rptr; } *mp = m2; ! MTYPE(m2) = M_DATA; freemsg(mt); mt = m2; --- 683,689 ---- s = m->b_rptr; } *mp = m2; ! MTYPE(m2) = MTYPE(mt); freemsg(mt); mt = m2; *************** *** 691,697 **** synced = 1; off = 0; goto tryagain; - } if (((sap == 0) && (ip->ip_v != IP_VERSION)) --- 691,696 ---- *************** *** 1732,1741 **** ATOMIC_INCL(frstats[1].fr_acct); } fin->fin_fr = NULL; ! if (!fr || !(fr->fr_flags & FR_RETMASK)) { (void) fr_checkstate(ip, fin); ! (void) ip_natout(ip, fin); ! } } #ifndef sparc if (fin->fin_v == 4) { --- 1731,1739 ---- ATOMIC_INCL(frstats[1].fr_acct); } fin->fin_fr = NULL; ! if (!fr || !(fr->fr_flags & FR_RETMASK)) (void) fr_checkstate(ip, fin); ! (void) ip_natout(ip, fin); } #ifndef sparc if (fin->fin_v == 4) {