d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx/*
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx * Use is subject to license terms.
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx */
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#pragma ident "%Z%%M% %I% %E% SMI"
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#if defined(KERNEL) || defined(_KERNEL)
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# undef KERNEL
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# undef _KERNEL
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# define KERNEL 1
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# define _KERNEL 1
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#endif
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#include <sys/errno.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#include <sys/types.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#include <sys/param.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#include <sys/time.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#if defined(__NetBSD__)
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# if (NetBSD >= 199905) && !defined(IPFILTER_LKM) && defined(_KERNEL)
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# include "opt_ipfilter_log.h"
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# endif
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#endif
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#if defined(_KERNEL) && defined(__FreeBSD_version) && \
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx (__FreeBSD_version >= 220000)
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# if (__FreeBSD_version >= 400000)
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# if !defined(IPFILTER_LKM)
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# include "opt_inet6.h"
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# endif
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# if (__FreeBSD_version == 400019)
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# define CSUM_DELAY_DATA
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# endif
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# endif
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# include <sys/filio.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#else
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# include <sys/ioctl.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#endif
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#if !defined(_AIX51)
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# include <sys/fcntl.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#endif
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#if defined(_KERNEL)
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# include <sys/systm.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# include <sys/file.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#else
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# include <stdio.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# include <string.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# include <stdlib.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# include <stddef.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# include <sys/file.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# define _KERNEL
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# ifdef __OpenBSD__
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yxstruct file;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# endif
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# include <sys/uio.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# undef _KERNEL
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#endif
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#if !defined(__SVR4) && !defined(__svr4__) && !defined(__hpux) && \
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx !defined(linux)
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# include <sys/mbuf.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#else
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# if !defined(linux)
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# include <sys/byteorder.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# endif
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# if (SOLARIS2 < 5) && defined(sun)
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# include <sys/dditypes.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# endif
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#endif
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#ifdef __hpux
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# define _NET_ROUTE_INCLUDED
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#endif
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#if !defined(linux)
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# include <sys/protosw.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#endif
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#include <sys/socket.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#include <net/if.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#ifdef sun
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# include <net/af.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#endif
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#if !defined(_KERNEL) && defined(__FreeBSD__)
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# include "radix_ipf.h"
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#endif
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#include <net/route.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#include <netinet/in.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#include <netinet/in_systm.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#include <netinet/ip.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#if !defined(linux)
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# include <netinet/ip_var.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#endif
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#if defined(__sgi) && defined(IFF_DRVRLOCK) /* IRIX 6 */
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# include <sys/hashing.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# include <netinet/in_var.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#endif
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#include <netinet/tcp.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#if (!defined(__sgi) && !defined(AIX)) || defined(_KERNEL)
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# include <netinet/udp.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# include <netinet/ip_icmp.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#endif
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#ifdef __hpux
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# undef _NET_ROUTE_INCLUDED
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#endif
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#include "netinet/ip_compat.h"
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#ifdef USE_INET6
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# include <netinet/icmp6.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# if !SOLARIS && defined(_KERNEL) && !defined(__osf__) && !defined(__hpux)
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# include <netinet6/in6_var.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# endif
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#endif
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#include <netinet/tcpip.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#include "netinet/ip_fil.h"
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#include "netinet/ip_nat.h"
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#include "netinet/ip_frag.h"
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#include "netinet/ip_state.h"
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#include "netinet/ip_proxy.h"
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#include "netinet/ip_auth.h"
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#include "netinet/ipf_stack.h"
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#ifdef IPFILTER_SCAN
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# include "netinet/ip_scan.h"
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#endif
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#ifdef IPFILTER_SYNC
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# include "netinet/ip_sync.h"
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#endif
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#include "netinet/ip_pool.h"
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#include "netinet/ip_htable.h"
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#ifdef IPFILTER_COMPILED
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# include "netinet/ip_rules.h"
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#endif
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#if defined(IPFILTER_BPF) && defined(_KERNEL)
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# include <net/bpf.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#endif
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#if defined(__FreeBSD_version) && (__FreeBSD_version >= 300000)
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# include <sys/malloc.h>
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# if defined(_KERNEL) && !defined(IPFILTER_LKM)
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# include "opt_ipfilter.h"
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# endif
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#endif
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#include "netinet/ipl.h"
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx/* END OF INCLUDES */
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#ifdef IPFILTER_COMPAT
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx# define IPFILTER_VERSION_4010900 4010900
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yxstruct nat_4010900 {
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx ipfmutex_t nat_lock;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx struct nat *nat_next;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx struct nat **nat_pnext;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx struct nat *nat_hnext[2];
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx struct nat **nat_phnext[2];
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx struct hostmap *nat_hm;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx void *nat_data;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx struct nat **nat_me;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx struct ipstate *nat_state;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx struct ap_session *nat_aps; /* proxy session */
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx frentry_t *nat_fr; /* filter rule ptr if appropriate */
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx struct ipnat *nat_ptr; /* pointer back to the rule */
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx void *nat_ifps[2];
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx void *nat_sync;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx ipftqent_t nat_tqe;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx u_32_t nat_flags;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx u_32_t nat_sumd[2]; /* ip checksum delta for data segment */
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx u_32_t nat_ipsumd; /* ip checksum delta for ip header */
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx u_32_t nat_mssclamp; /* if != zero clamp MSS to this */
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx i6addr_t nat_inip6;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx i6addr_t nat_outip6;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx i6addr_t nat_oip6; /* other ip */
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx U_QUAD_T nat_pkts[2];
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx U_QUAD_T nat_bytes[2];
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx union {
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx udpinfo_t nat_unu;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx tcpinfo_t nat_unt;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx icmpinfo_t nat_uni;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx greinfo_t nat_ugre;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx } nat_un;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx u_short nat_oport; /* other port */
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx u_short nat_use;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx u_char nat_p; /* protocol for NAT */
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx int nat_dir;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx int nat_ref; /* reference count */
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx int nat_hv[2];
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx char nat_ifnames[2][LIFNAMSIZ];
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx int nat_rev; /* 0 = forward, 1 = reverse */
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx int nat_redir;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx};
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yxstruct nat_save_4010900 {
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx void *ipn_next;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx struct nat_4010900 ipn_nat;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx struct ipnat ipn_ipnat;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx struct frentry ipn_fr;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx int ipn_dsize;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx char ipn_data[4];
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx};
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yxstruct natlookup_4010900 {
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx struct in_addr nlc_inip;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx struct in_addr nlc_outip;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx struct in_addr nlc_realip;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx int nlc_flags;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx u_short nlc_inport;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx u_short nlc_outport;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx u_short nlc_realport;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx};
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx/* ------------------------------------------------------------------------ */
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx/* Function: fr_incomptrans */
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx/* Returns: int - 0 = success, else failure */
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx/* Parameters: obj(I) - pointer to ioctl data */
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx/* ptr(I) - pointer to store real data in */
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx/* */
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx/* Translate the copied in ipfobj_t to new for backward compatibility at */
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx/* the ABI for user land. */
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx/* ------------------------------------------------------------------------ */
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yxint fr_incomptrans(obj, ptr)
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yxipfobj_t *obj;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yxvoid *ptr;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx{
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx int error;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx natlookup_t *nlp;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx nat_save_t *nsp;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx struct nat_save_4010900 nsc;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx struct natlookup_4010900 nlc;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx switch (obj->ipfo_type)
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx {
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx case IPFOBJ_NATLOOKUP :
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx if ((obj->ipfo_rev != IPFILTER_VERSION_4010900) ||
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx (obj->ipfo_size != sizeof (nlc)))
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx return EINVAL;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx error = COPYIN((caddr_t)obj->ipfo_ptr, (caddr_t)&nlc,
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx obj->ipfo_size);
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx if (!error) {
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx nlp = (natlookup_t *)ptr;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx bzero((char *)nlp, sizeof (*nlp));
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx nlp->nl_inip = nlc.nlc_inip;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx nlp->nl_outip = nlc.nlc_outip;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx nlp->nl_inport = nlc.nlc_inport;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx nlp->nl_outport = nlc.nlc_outport;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx nlp->nl_flags = nlc.nlc_flags;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx nlp->nl_v = 4;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx }
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx break;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx case IPFOBJ_NATSAVE :
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx if ((obj->ipfo_rev != IPFILTER_VERSION_4010900) ||
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx (obj->ipfo_size != sizeof (nsc)))
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx return EINVAL;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx error = COPYIN((caddr_t)obj->ipfo_ptr, (caddr_t)&nsc,
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx obj->ipfo_size);
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx if (!error) {
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx nsp = (nat_save_t *)ptr;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx bzero((char *)nsp, sizeof (*nsp));
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx nsp->ipn_next = nsc.ipn_next;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx nsp->ipn_dsize = nsc.ipn_dsize;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx nsp->ipn_nat.nat_inip = nsc.ipn_nat.nat_inip;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx nsp->ipn_nat.nat_outip = nsc.ipn_nat.nat_outip;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx nsp->ipn_nat.nat_oip = nsc.ipn_nat.nat_oip;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx nsp->ipn_nat.nat_inport = nsc.ipn_nat.nat_inport;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx nsp->ipn_nat.nat_outport = nsc.ipn_nat.nat_outport;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx nsp->ipn_nat.nat_oport = nsc.ipn_nat.nat_oport;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx nsp->ipn_nat.nat_flags = nsc.ipn_nat.nat_flags;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx nsp->ipn_nat.nat_v = 4;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx }
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx break;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx default :
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx return EINVAL;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx }
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx return error;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx}
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx/* ------------------------------------------------------------------------ */
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx/* Function: fr_outcomptrans */
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx/* Returns: int - 0 = success, else failure */
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx/* Parameters: obj(I) - pointer to ioctl data */
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx/* ptr(I) - pointer to store real data in */
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx/* */
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx/* Translate the copied out ipfobj_t to new definition for backward */
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx/* compatibility at the ABI for user land. */
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx/* ------------------------------------------------------------------------ */
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yxint fr_outcomptrans(obj, ptr)
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yxipfobj_t *obj;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yxvoid *ptr;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx{
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx int error;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx natlookup_t *nlp;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx struct natlookup_4010900 nlc;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx switch (obj->ipfo_type)
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx {
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx case IPFOBJ_NATLOOKUP :
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx if ((obj->ipfo_rev != IPFILTER_VERSION_4010900) ||
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx (obj->ipfo_size != sizeof (nlc)))
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx return EINVAL;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx bzero((char *)&nlc, sizeof (nlc));
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx nlp = (natlookup_t *)ptr;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx nlc.nlc_inip = nlp->nl_inip;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx nlc.nlc_outip = nlp->nl_outip;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx nlc.nlc_realip = nlp->nl_realip;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx nlc.nlc_inport = nlp->nl_inport;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx nlc.nlc_outport = nlp->nl_outport;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx nlc.nlc_realport = nlp->nl_realport;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx nlc.nlc_flags = nlp->nl_flags;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx error = COPYOUT((caddr_t)&nlc, (caddr_t)obj->ipfo_ptr,
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx obj->ipfo_size);
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx break;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx default :
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx return EINVAL;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx }
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx return error;
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx}
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx
d6c23f6fbecbcca8ddd2b74c6e10f37095f9fd46yx#endif /* IPFILTER_COMPAT */