Home | History | Annotate | Download | only in netinet
      1   3448  dh155122 /*
      2   3448  dh155122  * Copyright (C) 1993-2001, 2003 by Darren Reed.
      3   3448  dh155122  *
      4   3448  dh155122  * See the IPFILTER.LICENCE file for details on licencing.
      5   3448  dh155122  *
      6   9876    Darren  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
      7   3448  dh155122  * Use is subject to license terms.
      8   3448  dh155122  */
      9   3448  dh155122 
     10   3448  dh155122 #ifndef	__IPF_STACK_H__
     11   3448  dh155122 #define	__IPF_STACK_H__
     12   3448  dh155122 
     13   3448  dh155122 /* FIXME: appears needed for ip_proxy.h - tcpseq */
     14   3448  dh155122 #include <net/route.h>
     15   3448  dh155122 #include <netinet/in.h>
     16   3448  dh155122 #include <netinet/in_systm.h>
     17   3448  dh155122 #include <netinet/ip.h>
     18   3448  dh155122 #include <netinet/ip_var.h>
     19   3448  dh155122 #include <netinet/tcp.h>
     20   3448  dh155122 #include <netinet/udp.h>
     21   3448  dh155122 #include <netinet/ip_icmp.h>
     22   3448  dh155122 #include <netinet/tcpip.h>
     23   3448  dh155122 
     24   3448  dh155122 #include "ip_compat.h"
     25   3448  dh155122 #include "ip_fil.h"
     26   3448  dh155122 #include "ip_nat.h"
     27   3448  dh155122 #include "ip_frag.h"
     28   3448  dh155122 #include "ip_state.h"
     29   3448  dh155122 #include "ip_proxy.h"
     30   3448  dh155122 #include "ip_auth.h"
     31   3448  dh155122 #include "ip_lookup.h"
     32   3448  dh155122 #include "ip_pool.h"
     33   3448  dh155122 #include "ip_htable.h"
     34   3448  dh155122 #include <net/radix.h>
     35   3448  dh155122 #include <sys/neti.h>
     36   3448  dh155122 #include <sys/hook.h>
     37   3448  dh155122 
     38   3448  dh155122 /*
     39   3448  dh155122  * IPF stack instances
     40   3448  dh155122  */
     41   3448  dh155122 struct ipf_stack {
     42   7513    Darren 	struct ipf_stack	*ifs_next;
     43   7513    Darren 	struct ipf_stack	**ifs_pnext;
     44   7513    Darren 	netid_t			ifs_netid;
     45   7513    Darren 	zoneid_t		ifs_zone;
     46   3448  dh155122 
     47   3448  dh155122 	/* ipf module */
     48  10587  Alexandr 	fr_info_t		ifs_frcache[2][8];
     49   3448  dh155122 
     50   3448  dh155122 	filterstats_t		ifs_frstats[2];
     51   3448  dh155122 	frentry_t		*ifs_ipfilter[2][2];
     52   3448  dh155122 	frentry_t		*ifs_ipfilter6[2][2];
     53   3448  dh155122 	frentry_t		*ifs_ipacct6[2][2];
     54   3448  dh155122 	frentry_t		*ifs_ipacct[2][2];
     55   3448  dh155122 #if 0 /* not used */
     56   3448  dh155122 	frentry_t		*ifs_ipnatrules[2][2];
     57   3448  dh155122 #endif
     58   3448  dh155122 	frgroup_t		*ifs_ipfgroups[IPL_LOGSIZE][2];
     59   3448  dh155122 	int			ifs_fr_refcnt;
     60   3448  dh155122 	/*
     61   3448  dh155122 	 * For fr_running:
     62   3448  dh155122 	 * 0 == loading, 1 = running, -1 = disabled, -2 = unloading
     63   3448  dh155122 	 */
     64   3448  dh155122 	int			ifs_fr_running;
     65   3448  dh155122 	int			ifs_fr_flags;
     66   3448  dh155122 	int			ifs_fr_active;
     67   3448  dh155122 	int			ifs_fr_control_forwarding;
     68   3448  dh155122 	int			ifs_fr_update_ipid;
     69   3448  dh155122 #if 0
     70   3448  dh155122 	ushort_t		ifs_fr_ip_id;
     71   3448  dh155122 #endif
     72   3448  dh155122 	int			ifs_fr_chksrc;
     73   3448  dh155122 	int			ifs_fr_minttl;
     74   3448  dh155122 	int			ifs_fr_icmpminfragmtu;
     75   3448  dh155122 	int			ifs_fr_pass;
     76   3448  dh155122 	ulong_t			ifs_fr_frouteok[2];
     77   3448  dh155122 	ulong_t			ifs_fr_userifqs;
     78   3448  dh155122 	ulong_t			ifs_fr_badcoalesces[2];
     79   3448  dh155122 	uchar_t			ifs_ipf_iss_secret[32];
     80   3448  dh155122 	timeout_id_t		ifs_fr_timer_id;
     81   3448  dh155122 #if 0
     82   3448  dh155122 	timeout_id_t		ifs_synctimeoutid;
     83   3448  dh155122 #endif
     84   3448  dh155122 	int			ifs_ipf_locks_done;
     85   3448  dh155122 
     86   3448  dh155122 	ipftoken_t 		*ifs_ipftokenhead;
     87   3448  dh155122 	ipftoken_t 		**ifs_ipftokentail;
     88   3448  dh155122 
     89   3448  dh155122 	ipfmutex_t	ifs_ipl_mutex;
     90   3448  dh155122 	ipfmutex_t	ifs_ipf_authmx;
     91   3448  dh155122 	ipfmutex_t	ifs_ipf_rw;
     92   3448  dh155122 	ipfmutex_t	ifs_ipf_timeoutlock;
     93   3448  dh155122 	ipfrwlock_t	ifs_ipf_mutex;
     94   3448  dh155122 	ipfrwlock_t	ifs_ipf_global;
     95  10587  Alexandr 	ipfrwlock_t	ifs_ipf_frcache;
     96   3448  dh155122 	ipfrwlock_t	ifs_ip_poolrw;
     97   3448  dh155122 	ipfrwlock_t	ifs_ipf_frag;
     98   3448  dh155122 	ipfrwlock_t	ifs_ipf_state;
     99   3448  dh155122 	ipfrwlock_t	ifs_ipf_nat;
    100   3448  dh155122 	ipfrwlock_t	ifs_ipf_natfrag;
    101   3448  dh155122 	ipfmutex_t	ifs_ipf_nat_new;
    102   3448  dh155122 	ipfmutex_t	ifs_ipf_natio;
    103   3448  dh155122 	ipfrwlock_t	ifs_ipf_auth;
    104   3448  dh155122 	ipfmutex_t	ifs_ipf_stinsert;
    105   3448  dh155122 	ipfrwlock_t	ifs_ipf_ipidfrag;
    106   3448  dh155122 	ipfrwlock_t	ifs_ipf_tokens;
    107   3448  dh155122 	kcondvar_t	ifs_iplwait;
    108   3448  dh155122 	kcondvar_t	ifs_ipfauthwait;
    109   3448  dh155122 
    110   3448  dh155122 	ipftuneable_t	*ifs_ipf_tuneables;
    111   3448  dh155122 	ipftuneable_t	*ifs_ipf_tunelist;
    112   3448  dh155122 
    113   3448  dh155122 	/* ip_fil_solaris.c */
    114   7513    Darren 	hook_t		*ifs_ipfhook4_in;
    115   7513    Darren 	hook_t		*ifs_ipfhook4_out;
    116   7513    Darren 	hook_t		*ifs_ipfhook4_loop_in;
    117   7513    Darren 	hook_t		*ifs_ipfhook4_loop_out;
    118   7513    Darren 	hook_t		*ifs_ipfhook4_nicevents;
    119   7513    Darren 	hook_t		*ifs_ipfhook6_in;
    120   7513    Darren 	hook_t		*ifs_ipfhook6_out;
    121   7513    Darren 	hook_t		*ifs_ipfhook6_loop_in;
    122   7513    Darren 	hook_t		*ifs_ipfhook6_loop_out;
    123   7513    Darren 	hook_t		*ifs_ipfhook6_nicevents;
    124   3448  dh155122 
    125   3448  dh155122 	/* flags to indicate whether hooks are registered. */
    126   3448  dh155122 	boolean_t	ifs_hook4_physical_in;
    127   3448  dh155122 	boolean_t	ifs_hook4_physical_out;
    128   3448  dh155122 	boolean_t	ifs_hook4_nic_events;
    129   3448  dh155122 	boolean_t	ifs_hook4_loopback_in;
    130   3448  dh155122 	boolean_t	ifs_hook4_loopback_out;
    131   3448  dh155122 	boolean_t	ifs_hook6_physical_in;
    132   3448  dh155122 	boolean_t	ifs_hook6_physical_out;
    133   3448  dh155122 	boolean_t	ifs_hook6_nic_events;
    134   3448  dh155122 	boolean_t	ifs_hook6_loopback_in;
    135   3448  dh155122 	boolean_t	ifs_hook6_loopback_out;
    136   3448  dh155122 
    137   3448  dh155122 	int		ifs_ipf_loopback;
    138   7513    Darren 	net_handle_t	ifs_ipf_ipv4;
    139   7513    Darren 	net_handle_t	ifs_ipf_ipv6;
    140   3448  dh155122 
    141   3448  dh155122 	/* ip_auth.c */
    142   3448  dh155122 	int			ifs_fr_authsize;
    143   3448  dh155122 	int			ifs_fr_authused;
    144   3448  dh155122 	int			ifs_fr_defaultauthage;
    145   3448  dh155122 	int			ifs_fr_auth_lock;
    146   3448  dh155122 	int			ifs_fr_auth_init;
    147   3448  dh155122 	fr_authstat_t		ifs_fr_authstats;
    148   3448  dh155122 	frauth_t		*ifs_fr_auth;
    149   3448  dh155122 	mb_t			**ifs_fr_authpkts;
    150   3448  dh155122 	int			ifs_fr_authstart;
    151   3448  dh155122 	int			ifs_fr_authend;
    152   3448  dh155122 	int			ifs_fr_authnext;
    153   3448  dh155122 	frauthent_t		*ifs_fae_list;
    154   3448  dh155122 	frentry_t		*ifs_ipauth;
    155   3448  dh155122 	frentry_t		*ifs_fr_authlist;
    156   3448  dh155122 
    157   3448  dh155122 	/* ip_frag.c */
    158   3448  dh155122 	ipfr_t			*ifs_ipfr_list;
    159   3448  dh155122 	ipfr_t			**ifs_ipfr_tail;
    160   3448  dh155122 	ipfr_t			**ifs_ipfr_heads;
    161   3448  dh155122 
    162   3448  dh155122 	ipfr_t			*ifs_ipfr_natlist;
    163   3448  dh155122 	ipfr_t			**ifs_ipfr_nattail;
    164   3448  dh155122 	ipfr_t			**ifs_ipfr_nattab;
    165   3448  dh155122 
    166   3448  dh155122 	ipfr_t  		*ifs_ipfr_ipidlist;
    167   3448  dh155122 	ipfr_t  		**ifs_ipfr_ipidtail;
    168   3448  dh155122 	ipfr_t			**ifs_ipfr_ipidtab;
    169   3448  dh155122 
    170   3448  dh155122 	ipfrstat_t		ifs_ipfr_stats;
    171   3448  dh155122 	int			ifs_ipfr_inuse;
    172   3448  dh155122 	int			ifs_ipfr_size;
    173   3448  dh155122 
    174   3448  dh155122 	int			ifs_fr_ipfrttl;
    175   3448  dh155122 	int			ifs_fr_frag_lock;
    176   3448  dh155122 	int			ifs_fr_frag_init;
    177   3448  dh155122 	ulong_t			ifs_fr_ticks;
    178   3448  dh155122 
    179   3448  dh155122 	frentry_t		ifs_frblock;
    180   3448  dh155122 
    181   3448  dh155122 	/* ip_htable.c */
    182   3448  dh155122 	iphtable_t		*ifs_ipf_htables[IPL_LOGSIZE];
    183   3448  dh155122 	ulong_t			ifs_ipht_nomem[IPL_LOGSIZE];
    184   3448  dh155122 	ulong_t			ifs_ipf_nhtables[IPL_LOGSIZE];
    185   3448  dh155122 	ulong_t			ifs_ipf_nhtnodes[IPL_LOGSIZE];
    186   3448  dh155122 
    187   3448  dh155122 	/* ip_log.c */
    188   3448  dh155122 	iplog_t			**ifs_iplh[IPL_LOGSIZE];
    189   3448  dh155122 	iplog_t			*ifs_iplt[IPL_LOGSIZE];
    190   3448  dh155122 	iplog_t			*ifs_ipll[IPL_LOGSIZE];
    191   3448  dh155122 	int			ifs_iplused[IPL_LOGSIZE];
    192   3448  dh155122 	fr_info_t		ifs_iplcrc[IPL_LOGSIZE];
    193   3448  dh155122 	int			ifs_ipl_suppress;
    194   3448  dh155122 	int			ifs_ipl_buffer_sz;
    195   3448  dh155122 	int			ifs_ipl_logmax;
    196   3448  dh155122 	int			ifs_ipl_logall;
    197   3448  dh155122 	int			ifs_ipl_log_init;
    198   3448  dh155122 	int			ifs_ipl_logsize;
    199   3448  dh155122 
    200   3448  dh155122 	/* ip_lookup.c */
    201   3448  dh155122 	ip_pool_stat_t		ifs_ippoolstat;
    202   3448  dh155122 	int			ifs_ip_lookup_inited;
    203   3448  dh155122 
    204   3448  dh155122 	/* ip_nat.c */
    205   3448  dh155122 	/* nat_table[0] -> hashed list sorted by inside (ip, port) */
    206   3448  dh155122 	/* nat_table[1] -> hashed list sorted by outside (ip, port) */
    207   3448  dh155122 	nat_t			**ifs_nat_table[2];
    208   3448  dh155122 	nat_t			*ifs_nat_instances;
    209   3448  dh155122 	ipnat_t			*ifs_nat_list;
    210   3448  dh155122 	uint_t			ifs_ipf_nattable_sz;
    211   3448  dh155122 	uint_t			ifs_ipf_nattable_max;
    212   3448  dh155122 	uint_t			ifs_ipf_natrules_sz;
    213   3448  dh155122 	uint_t			ifs_ipf_rdrrules_sz;
    214   3448  dh155122 	uint_t			ifs_ipf_hostmap_sz;
    215   3448  dh155122 	uint_t			ifs_fr_nat_maxbucket;
    216   3448  dh155122 	uint_t			ifs_fr_nat_maxbucket_reset;
    217   3448  dh155122 	uint32_t		ifs_nat_masks;
    218   3448  dh155122 	uint32_t		ifs_rdr_masks;
    219   7176  yx160601 	uint32_t		ifs_nat6_masks[4];
    220   7176  yx160601 	uint32_t		ifs_rdr6_masks[4];
    221   3448  dh155122 	ipnat_t			**ifs_nat_rules;
    222   3448  dh155122 	ipnat_t			**ifs_rdr_rules;
    223   3448  dh155122 	hostmap_t		**ifs_maptable;
    224   3448  dh155122 	hostmap_t		*ifs_ipf_hm_maplist;
    225   3448  dh155122 
    226   3448  dh155122 	ipftq_t			ifs_nat_tqb[IPF_TCP_NSTATES];
    227   3448  dh155122 	ipftq_t			ifs_nat_udptq;
    228   3448  dh155122 	ipftq_t			ifs_nat_icmptq;
    229   3448  dh155122 	ipftq_t			ifs_nat_iptq;
    230   3448  dh155122 	ipftq_t			*ifs_nat_utqe;
    231   3448  dh155122 	int			ifs_nat_logging;
    232   3448  dh155122 	ulong_t			ifs_fr_defnatage;
    233   3448  dh155122 	ulong_t			ifs_fr_defnatipage;
    234   3448  dh155122 	ulong_t			ifs_fr_defnaticmpage;
    235   3448  dh155122 	natstat_t		ifs_nat_stats;
    236   3448  dh155122 	int			ifs_fr_nat_lock;
    237   3448  dh155122 	int			ifs_fr_nat_init;
    238   8170      John 	uint_t			ifs_nat_flush_level_hi;
    239   8170      John 	uint_t			ifs_nat_flush_level_lo;
    240   4817  an207044 	ulong_t			ifs_nat_last_force_flush;
    241   4817  an207044 	int			ifs_nat_doflush;
    242   3448  dh155122 
    243   3448  dh155122 	/* ip_pool.c */
    244   3448  dh155122 	ip_pool_stat_t		ifs_ipoolstat;
    245   3448  dh155122 	ip_pool_t		*ifs_ip_pool_list[IPL_LOGSIZE];
    246   3448  dh155122 
    247   3448  dh155122 	/* ip_proxy.c */
    248   3448  dh155122 	ap_session_t		*ifs_ap_sess_list;
    249   3448  dh155122 	aproxy_t		*ifs_ap_proxylist;
    250   3448  dh155122 	aproxy_t		*ifs_ap_proxies; /* copy of lcl_ap_proxies */
    251   3448  dh155122 
    252   3448  dh155122 	/* ip_state.c */
    253   3448  dh155122 	ipstate_t		**ifs_ips_table;
    254   3448  dh155122 	ulong_t			*ifs_ips_seed;
    255   3448  dh155122 	int			ifs_ips_num;
    256   3448  dh155122 	ulong_t			ifs_ips_last_force_flush;
    257   8170      John 	uint_t			ifs_state_flush_level_hi;
    258   8170      John 	uint_t			ifs_state_flush_level_lo;
    259   3448  dh155122 	ips_stat_t		ifs_ips_stats;
    260   3448  dh155122 
    261   3448  dh155122 	ulong_t			ifs_fr_tcpidletimeout;
    262   3448  dh155122 	ulong_t			ifs_fr_tcpclosewait;
    263   3448  dh155122 	ulong_t			ifs_fr_tcplastack;
    264   3448  dh155122 	ulong_t			ifs_fr_tcptimeout;
    265   3448  dh155122 	ulong_t			ifs_fr_tcpclosed;
    266   3448  dh155122 	ulong_t			ifs_fr_tcphalfclosed;
    267   3448  dh155122 	ulong_t			ifs_fr_udptimeout;
    268   3448  dh155122 	ulong_t			ifs_fr_udpacktimeout;
    269   3448  dh155122 	ulong_t			ifs_fr_icmptimeout;
    270   3448  dh155122 	ulong_t			ifs_fr_icmpacktimeout;
    271   3448  dh155122 	int			ifs_fr_statemax;
    272   3448  dh155122 	int			ifs_fr_statesize;
    273   3448  dh155122 	int			ifs_fr_state_doflush;
    274   3448  dh155122 	int			ifs_fr_state_lock;
    275   3448  dh155122 	int			ifs_fr_state_maxbucket;
    276   3448  dh155122 	int			ifs_fr_state_maxbucket_reset;
    277   3448  dh155122 	int			ifs_fr_state_init;
    278   9876    Darren 	int			ifs_fr_enable_active;
    279   3448  dh155122 	ipftq_t			ifs_ips_tqtqb[IPF_TCP_NSTATES];
    280   3448  dh155122 	ipftq_t			ifs_ips_udptq;
    281   3448  dh155122 	ipftq_t			ifs_ips_udpacktq;
    282   3448  dh155122 	ipftq_t			ifs_ips_iptq;
    283   3448  dh155122 	ipftq_t			ifs_ips_icmptq;
    284   3448  dh155122 	ipftq_t			ifs_ips_icmpacktq;
    285   4431  an207044 	ipftq_t			ifs_ips_deletetq;
    286   3448  dh155122 	ipftq_t			*ifs_ips_utqe;
    287   3448  dh155122 	int			ifs_ipstate_logging;
    288   3448  dh155122 	ipstate_t		*ifs_ips_list;
    289   3448  dh155122 	ulong_t			ifs_fr_iptimeout;
    290   3448  dh155122 
    291   3448  dh155122 	/* radix.c */
    292   3448  dh155122 	int			ifs_max_keylen;
    293   3448  dh155122 	struct radix_mask	*ifs_rn_mkfreelist;
    294   3448  dh155122 	struct radix_node_head	*ifs_mask_rnhead;
    295   3448  dh155122 	char			*ifs_addmask_key;
    296   3448  dh155122 	char			*ifs_rn_zeros;
    297   3448  dh155122 	char			*ifs_rn_ones;
    298   3448  dh155122 #ifdef KERNEL
    299   3448  dh155122 	/* kstats for inbound and outbound */
    300   3448  dh155122 	kstat_t			*ifs_kstatp[2];
    301   3448  dh155122 #endif
    302   3448  dh155122 };
    303   3448  dh155122 
    304   3448  dh155122 #endif	/* __IPF_STACK_H__ */
    305