xref: /onnv-gate/usr/src/uts/common/inet/ipf/netinet/ipf_stack.h (revision 10587:e0d280fab007)
13448Sdh155122 /*
23448Sdh155122  * Copyright (C) 1993-2001, 2003 by Darren Reed.
33448Sdh155122  *
43448Sdh155122  * See the IPFILTER.LICENCE file for details on licencing.
53448Sdh155122  *
69876SDarren.Reed@Sun.COM  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
73448Sdh155122  * Use is subject to license terms.
83448Sdh155122  */
93448Sdh155122 
103448Sdh155122 #ifndef	__IPF_STACK_H__
113448Sdh155122 #define	__IPF_STACK_H__
123448Sdh155122 
133448Sdh155122 /* FIXME: appears needed for ip_proxy.h - tcpseq */
143448Sdh155122 #include <net/route.h>
153448Sdh155122 #include <netinet/in.h>
163448Sdh155122 #include <netinet/in_systm.h>
173448Sdh155122 #include <netinet/ip.h>
183448Sdh155122 #include <netinet/ip_var.h>
193448Sdh155122 #include <netinet/tcp.h>
203448Sdh155122 #include <netinet/udp.h>
213448Sdh155122 #include <netinet/ip_icmp.h>
223448Sdh155122 #include <netinet/tcpip.h>
233448Sdh155122 
243448Sdh155122 #include "ip_compat.h"
253448Sdh155122 #include "ip_fil.h"
263448Sdh155122 #include "ip_nat.h"
273448Sdh155122 #include "ip_frag.h"
283448Sdh155122 #include "ip_state.h"
293448Sdh155122 #include "ip_proxy.h"
303448Sdh155122 #include "ip_auth.h"
313448Sdh155122 #include "ip_lookup.h"
323448Sdh155122 #include "ip_pool.h"
333448Sdh155122 #include "ip_htable.h"
343448Sdh155122 #include <net/radix.h>
353448Sdh155122 #include <sys/neti.h>
363448Sdh155122 #include <sys/hook.h>
373448Sdh155122 
383448Sdh155122 /*
393448Sdh155122  * IPF stack instances
403448Sdh155122  */
413448Sdh155122 struct ipf_stack {
427513SDarren.Reed@Sun.COM 	struct ipf_stack	*ifs_next;
437513SDarren.Reed@Sun.COM 	struct ipf_stack	**ifs_pnext;
447513SDarren.Reed@Sun.COM 	netid_t			ifs_netid;
457513SDarren.Reed@Sun.COM 	zoneid_t		ifs_zone;
463448Sdh155122 
473448Sdh155122 	/* ipf module */
48*10587SAlexandr.Nedvedicky@Sun.COM 	fr_info_t		ifs_frcache[2][8];
493448Sdh155122 
503448Sdh155122 	filterstats_t		ifs_frstats[2];
513448Sdh155122 	frentry_t		*ifs_ipfilter[2][2];
523448Sdh155122 	frentry_t		*ifs_ipfilter6[2][2];
533448Sdh155122 	frentry_t		*ifs_ipacct6[2][2];
543448Sdh155122 	frentry_t		*ifs_ipacct[2][2];
553448Sdh155122 #if 0 /* not used */
563448Sdh155122 	frentry_t		*ifs_ipnatrules[2][2];
573448Sdh155122 #endif
583448Sdh155122 	frgroup_t		*ifs_ipfgroups[IPL_LOGSIZE][2];
593448Sdh155122 	int			ifs_fr_refcnt;
603448Sdh155122 	/*
613448Sdh155122 	 * For fr_running:
623448Sdh155122 	 * 0 == loading, 1 = running, -1 = disabled, -2 = unloading
633448Sdh155122 	 */
643448Sdh155122 	int			ifs_fr_running;
653448Sdh155122 	int			ifs_fr_flags;
663448Sdh155122 	int			ifs_fr_active;
673448Sdh155122 	int			ifs_fr_control_forwarding;
683448Sdh155122 	int			ifs_fr_update_ipid;
693448Sdh155122 #if 0
703448Sdh155122 	ushort_t		ifs_fr_ip_id;
713448Sdh155122 #endif
723448Sdh155122 	int			ifs_fr_chksrc;
733448Sdh155122 	int			ifs_fr_minttl;
743448Sdh155122 	int			ifs_fr_icmpminfragmtu;
753448Sdh155122 	int			ifs_fr_pass;
763448Sdh155122 	ulong_t			ifs_fr_frouteok[2];
773448Sdh155122 	ulong_t			ifs_fr_userifqs;
783448Sdh155122 	ulong_t			ifs_fr_badcoalesces[2];
793448Sdh155122 	uchar_t			ifs_ipf_iss_secret[32];
803448Sdh155122 	timeout_id_t		ifs_fr_timer_id;
813448Sdh155122 #if 0
823448Sdh155122 	timeout_id_t		ifs_synctimeoutid;
833448Sdh155122 #endif
843448Sdh155122 	int			ifs_ipf_locks_done;
853448Sdh155122 
863448Sdh155122 	ipftoken_t 		*ifs_ipftokenhead;
873448Sdh155122 	ipftoken_t 		**ifs_ipftokentail;
883448Sdh155122 
893448Sdh155122 	ipfmutex_t	ifs_ipl_mutex;
903448Sdh155122 	ipfmutex_t	ifs_ipf_authmx;
913448Sdh155122 	ipfmutex_t	ifs_ipf_rw;
923448Sdh155122 	ipfmutex_t	ifs_ipf_timeoutlock;
933448Sdh155122 	ipfrwlock_t	ifs_ipf_mutex;
943448Sdh155122 	ipfrwlock_t	ifs_ipf_global;
95*10587SAlexandr.Nedvedicky@Sun.COM 	ipfrwlock_t	ifs_ipf_frcache;
963448Sdh155122 	ipfrwlock_t	ifs_ip_poolrw;
973448Sdh155122 	ipfrwlock_t	ifs_ipf_frag;
983448Sdh155122 	ipfrwlock_t	ifs_ipf_state;
993448Sdh155122 	ipfrwlock_t	ifs_ipf_nat;
1003448Sdh155122 	ipfrwlock_t	ifs_ipf_natfrag;
1013448Sdh155122 	ipfmutex_t	ifs_ipf_nat_new;
1023448Sdh155122 	ipfmutex_t	ifs_ipf_natio;
1033448Sdh155122 	ipfrwlock_t	ifs_ipf_auth;
1043448Sdh155122 	ipfmutex_t	ifs_ipf_stinsert;
1053448Sdh155122 	ipfrwlock_t	ifs_ipf_ipidfrag;
1063448Sdh155122 	ipfrwlock_t	ifs_ipf_tokens;
1073448Sdh155122 	kcondvar_t	ifs_iplwait;
1083448Sdh155122 	kcondvar_t	ifs_ipfauthwait;
1093448Sdh155122 
1103448Sdh155122 	ipftuneable_t	*ifs_ipf_tuneables;
1113448Sdh155122 	ipftuneable_t	*ifs_ipf_tunelist;
1123448Sdh155122 
1133448Sdh155122 	/* ip_fil_solaris.c */
1147513SDarren.Reed@Sun.COM 	hook_t		*ifs_ipfhook4_in;
1157513SDarren.Reed@Sun.COM 	hook_t		*ifs_ipfhook4_out;
1167513SDarren.Reed@Sun.COM 	hook_t		*ifs_ipfhook4_loop_in;
1177513SDarren.Reed@Sun.COM 	hook_t		*ifs_ipfhook4_loop_out;
1187513SDarren.Reed@Sun.COM 	hook_t		*ifs_ipfhook4_nicevents;
1197513SDarren.Reed@Sun.COM 	hook_t		*ifs_ipfhook6_in;
1207513SDarren.Reed@Sun.COM 	hook_t		*ifs_ipfhook6_out;
1217513SDarren.Reed@Sun.COM 	hook_t		*ifs_ipfhook6_loop_in;
1227513SDarren.Reed@Sun.COM 	hook_t		*ifs_ipfhook6_loop_out;
1237513SDarren.Reed@Sun.COM 	hook_t		*ifs_ipfhook6_nicevents;
1243448Sdh155122 
1253448Sdh155122 	/* flags to indicate whether hooks are registered. */
1263448Sdh155122 	boolean_t	ifs_hook4_physical_in;
1273448Sdh155122 	boolean_t	ifs_hook4_physical_out;
1283448Sdh155122 	boolean_t	ifs_hook4_nic_events;
1293448Sdh155122 	boolean_t	ifs_hook4_loopback_in;
1303448Sdh155122 	boolean_t	ifs_hook4_loopback_out;
1313448Sdh155122 	boolean_t	ifs_hook6_physical_in;
1323448Sdh155122 	boolean_t	ifs_hook6_physical_out;
1333448Sdh155122 	boolean_t	ifs_hook6_nic_events;
1343448Sdh155122 	boolean_t	ifs_hook6_loopback_in;
1353448Sdh155122 	boolean_t	ifs_hook6_loopback_out;
1363448Sdh155122 
1373448Sdh155122 	int		ifs_ipf_loopback;
1387513SDarren.Reed@Sun.COM 	net_handle_t	ifs_ipf_ipv4;
1397513SDarren.Reed@Sun.COM 	net_handle_t	ifs_ipf_ipv6;
1403448Sdh155122 
1413448Sdh155122 	/* ip_auth.c */
1423448Sdh155122 	int			ifs_fr_authsize;
1433448Sdh155122 	int			ifs_fr_authused;
1443448Sdh155122 	int			ifs_fr_defaultauthage;
1453448Sdh155122 	int			ifs_fr_auth_lock;
1463448Sdh155122 	int			ifs_fr_auth_init;
1473448Sdh155122 	fr_authstat_t		ifs_fr_authstats;
1483448Sdh155122 	frauth_t		*ifs_fr_auth;
1493448Sdh155122 	mb_t			**ifs_fr_authpkts;
1503448Sdh155122 	int			ifs_fr_authstart;
1513448Sdh155122 	int			ifs_fr_authend;
1523448Sdh155122 	int			ifs_fr_authnext;
1533448Sdh155122 	frauthent_t		*ifs_fae_list;
1543448Sdh155122 	frentry_t		*ifs_ipauth;
1553448Sdh155122 	frentry_t		*ifs_fr_authlist;
1563448Sdh155122 
1573448Sdh155122 	/* ip_frag.c */
1583448Sdh155122 	ipfr_t			*ifs_ipfr_list;
1593448Sdh155122 	ipfr_t			**ifs_ipfr_tail;
1603448Sdh155122 	ipfr_t			**ifs_ipfr_heads;
1613448Sdh155122 
1623448Sdh155122 	ipfr_t			*ifs_ipfr_natlist;
1633448Sdh155122 	ipfr_t			**ifs_ipfr_nattail;
1643448Sdh155122 	ipfr_t			**ifs_ipfr_nattab;
1653448Sdh155122 
1663448Sdh155122 	ipfr_t  		*ifs_ipfr_ipidlist;
1673448Sdh155122 	ipfr_t  		**ifs_ipfr_ipidtail;
1683448Sdh155122 	ipfr_t			**ifs_ipfr_ipidtab;
1693448Sdh155122 
1703448Sdh155122 	ipfrstat_t		ifs_ipfr_stats;
1713448Sdh155122 	int			ifs_ipfr_inuse;
1723448Sdh155122 	int			ifs_ipfr_size;
1733448Sdh155122 
1743448Sdh155122 	int			ifs_fr_ipfrttl;
1753448Sdh155122 	int			ifs_fr_frag_lock;
1763448Sdh155122 	int			ifs_fr_frag_init;
1773448Sdh155122 	ulong_t			ifs_fr_ticks;
1783448Sdh155122 
1793448Sdh155122 	frentry_t		ifs_frblock;
1803448Sdh155122 
1813448Sdh155122 	/* ip_htable.c */
1823448Sdh155122 	iphtable_t		*ifs_ipf_htables[IPL_LOGSIZE];
1833448Sdh155122 	ulong_t			ifs_ipht_nomem[IPL_LOGSIZE];
1843448Sdh155122 	ulong_t			ifs_ipf_nhtables[IPL_LOGSIZE];
1853448Sdh155122 	ulong_t			ifs_ipf_nhtnodes[IPL_LOGSIZE];
1863448Sdh155122 
1873448Sdh155122 	/* ip_log.c */
1883448Sdh155122 	iplog_t			**ifs_iplh[IPL_LOGSIZE];
1893448Sdh155122 	iplog_t			*ifs_iplt[IPL_LOGSIZE];
1903448Sdh155122 	iplog_t			*ifs_ipll[IPL_LOGSIZE];
1913448Sdh155122 	int			ifs_iplused[IPL_LOGSIZE];
1923448Sdh155122 	fr_info_t		ifs_iplcrc[IPL_LOGSIZE];
1933448Sdh155122 	int			ifs_ipl_suppress;
1943448Sdh155122 	int			ifs_ipl_buffer_sz;
1953448Sdh155122 	int			ifs_ipl_logmax;
1963448Sdh155122 	int			ifs_ipl_logall;
1973448Sdh155122 	int			ifs_ipl_log_init;
1983448Sdh155122 	int			ifs_ipl_logsize;
1993448Sdh155122 
2003448Sdh155122 	/* ip_lookup.c */
2013448Sdh155122 	ip_pool_stat_t		ifs_ippoolstat;
2023448Sdh155122 	int			ifs_ip_lookup_inited;
2033448Sdh155122 
2043448Sdh155122 	/* ip_nat.c */
2053448Sdh155122 	/* nat_table[0] -> hashed list sorted by inside (ip, port) */
2063448Sdh155122 	/* nat_table[1] -> hashed list sorted by outside (ip, port) */
2073448Sdh155122 	nat_t			**ifs_nat_table[2];
2083448Sdh155122 	nat_t			*ifs_nat_instances;
2093448Sdh155122 	ipnat_t			*ifs_nat_list;
2103448Sdh155122 	uint_t			ifs_ipf_nattable_sz;
2113448Sdh155122 	uint_t			ifs_ipf_nattable_max;
2123448Sdh155122 	uint_t			ifs_ipf_natrules_sz;
2133448Sdh155122 	uint_t			ifs_ipf_rdrrules_sz;
2143448Sdh155122 	uint_t			ifs_ipf_hostmap_sz;
2153448Sdh155122 	uint_t			ifs_fr_nat_maxbucket;
2163448Sdh155122 	uint_t			ifs_fr_nat_maxbucket_reset;
2173448Sdh155122 	uint32_t		ifs_nat_masks;
2183448Sdh155122 	uint32_t		ifs_rdr_masks;
2197176Syx160601 	uint32_t		ifs_nat6_masks[4];
2207176Syx160601 	uint32_t		ifs_rdr6_masks[4];
2213448Sdh155122 	ipnat_t			**ifs_nat_rules;
2223448Sdh155122 	ipnat_t			**ifs_rdr_rules;
2233448Sdh155122 	hostmap_t		**ifs_maptable;
2243448Sdh155122 	hostmap_t		*ifs_ipf_hm_maplist;
2253448Sdh155122 
2263448Sdh155122 	ipftq_t			ifs_nat_tqb[IPF_TCP_NSTATES];
2273448Sdh155122 	ipftq_t			ifs_nat_udptq;
2283448Sdh155122 	ipftq_t			ifs_nat_icmptq;
2293448Sdh155122 	ipftq_t			ifs_nat_iptq;
2303448Sdh155122 	ipftq_t			*ifs_nat_utqe;
2313448Sdh155122 	int			ifs_nat_logging;
2323448Sdh155122 	ulong_t			ifs_fr_defnatage;
2333448Sdh155122 	ulong_t			ifs_fr_defnatipage;
2343448Sdh155122 	ulong_t			ifs_fr_defnaticmpage;
2353448Sdh155122 	natstat_t		ifs_nat_stats;
2363448Sdh155122 	int			ifs_fr_nat_lock;
2373448Sdh155122 	int			ifs_fr_nat_init;
2388170SJohn.Ojemann@Sun.COM 	uint_t			ifs_nat_flush_level_hi;
2398170SJohn.Ojemann@Sun.COM 	uint_t			ifs_nat_flush_level_lo;
2404817San207044 	ulong_t			ifs_nat_last_force_flush;
2414817San207044 	int			ifs_nat_doflush;
2423448Sdh155122 
2433448Sdh155122 	/* ip_pool.c */
2443448Sdh155122 	ip_pool_stat_t		ifs_ipoolstat;
2453448Sdh155122 	ip_pool_t		*ifs_ip_pool_list[IPL_LOGSIZE];
2463448Sdh155122 
2473448Sdh155122 	/* ip_proxy.c */
2483448Sdh155122 	ap_session_t		*ifs_ap_sess_list;
2493448Sdh155122 	aproxy_t		*ifs_ap_proxylist;
2503448Sdh155122 	aproxy_t		*ifs_ap_proxies; /* copy of lcl_ap_proxies */
2513448Sdh155122 
2523448Sdh155122 	/* ip_state.c */
2533448Sdh155122 	ipstate_t		**ifs_ips_table;
2543448Sdh155122 	ulong_t			*ifs_ips_seed;
2553448Sdh155122 	int			ifs_ips_num;
2563448Sdh155122 	ulong_t			ifs_ips_last_force_flush;
2578170SJohn.Ojemann@Sun.COM 	uint_t			ifs_state_flush_level_hi;
2588170SJohn.Ojemann@Sun.COM 	uint_t			ifs_state_flush_level_lo;
2593448Sdh155122 	ips_stat_t		ifs_ips_stats;
2603448Sdh155122 
2613448Sdh155122 	ulong_t			ifs_fr_tcpidletimeout;
2623448Sdh155122 	ulong_t			ifs_fr_tcpclosewait;
2633448Sdh155122 	ulong_t			ifs_fr_tcplastack;
2643448Sdh155122 	ulong_t			ifs_fr_tcptimeout;
2653448Sdh155122 	ulong_t			ifs_fr_tcpclosed;
2663448Sdh155122 	ulong_t			ifs_fr_tcphalfclosed;
2673448Sdh155122 	ulong_t			ifs_fr_udptimeout;
2683448Sdh155122 	ulong_t			ifs_fr_udpacktimeout;
2693448Sdh155122 	ulong_t			ifs_fr_icmptimeout;
2703448Sdh155122 	ulong_t			ifs_fr_icmpacktimeout;
2713448Sdh155122 	int			ifs_fr_statemax;
2723448Sdh155122 	int			ifs_fr_statesize;
2733448Sdh155122 	int			ifs_fr_state_doflush;
2743448Sdh155122 	int			ifs_fr_state_lock;
2753448Sdh155122 	int			ifs_fr_state_maxbucket;
2763448Sdh155122 	int			ifs_fr_state_maxbucket_reset;
2773448Sdh155122 	int			ifs_fr_state_init;
2789876SDarren.Reed@Sun.COM 	int			ifs_fr_enable_active;
2793448Sdh155122 	ipftq_t			ifs_ips_tqtqb[IPF_TCP_NSTATES];
2803448Sdh155122 	ipftq_t			ifs_ips_udptq;
2813448Sdh155122 	ipftq_t			ifs_ips_udpacktq;
2823448Sdh155122 	ipftq_t			ifs_ips_iptq;
2833448Sdh155122 	ipftq_t			ifs_ips_icmptq;
2843448Sdh155122 	ipftq_t			ifs_ips_icmpacktq;
2854431San207044 	ipftq_t			ifs_ips_deletetq;
2863448Sdh155122 	ipftq_t			*ifs_ips_utqe;
2873448Sdh155122 	int			ifs_ipstate_logging;
2883448Sdh155122 	ipstate_t		*ifs_ips_list;
2893448Sdh155122 	ulong_t			ifs_fr_iptimeout;
2903448Sdh155122 
2913448Sdh155122 	/* radix.c */
2923448Sdh155122 	int			ifs_max_keylen;
2933448Sdh155122 	struct radix_mask	*ifs_rn_mkfreelist;
2943448Sdh155122 	struct radix_node_head	*ifs_mask_rnhead;
2953448Sdh155122 	char			*ifs_addmask_key;
2963448Sdh155122 	char			*ifs_rn_zeros;
2973448Sdh155122 	char			*ifs_rn_ones;
2983448Sdh155122 #ifdef KERNEL
2993448Sdh155122 	/* kstats for inbound and outbound */
3003448Sdh155122 	kstat_t			*ifs_kstatp[2];
3013448Sdh155122 #endif
3023448Sdh155122 };
3033448Sdh155122 
3043448Sdh155122 #endif	/* __IPF_STACK_H__ */
305