tcp_stack.h revision 11042:2d6e217af1b4
1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22/*
23 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24 * Use is subject to license terms.
25 */
26
27#ifndef	_INET_TCP_STACK_H
28#define	_INET_TCP_STACK_H
29
30#include <sys/netstack.h>
31#include <inet/ip.h>
32#include <inet/ipdrop.h>
33#include <sys/sunddi.h>
34#include <sys/sunldi.h>
35
36#ifdef	__cplusplus
37extern "C" {
38#endif
39
40/* Kstats */
41typedef struct tcp_stat {
42	kstat_named_t	tcp_time_wait;
43	kstat_named_t	tcp_time_wait_syn;
44	kstat_named_t	tcp_time_wait_syn_success;
45	kstat_named_t	tcp_detach_non_time_wait;
46	kstat_named_t	tcp_detach_time_wait;
47	kstat_named_t	tcp_time_wait_reap;
48	kstat_named_t	tcp_clean_death_nondetached;
49	kstat_named_t	tcp_reinit_calls;
50	kstat_named_t	tcp_eager_err1;
51	kstat_named_t	tcp_eager_err2;
52	kstat_named_t	tcp_eager_blowoff_calls;
53	kstat_named_t	tcp_eager_blowoff_q;
54	kstat_named_t	tcp_eager_blowoff_q0;
55	kstat_named_t	tcp_not_hard_bound;
56	kstat_named_t	tcp_no_listener;
57	kstat_named_t	tcp_found_eager;
58	kstat_named_t	tcp_wrong_queue;
59	kstat_named_t	tcp_found_eager_binding1;
60	kstat_named_t	tcp_found_eager_bound1;
61	kstat_named_t	tcp_eager_has_listener1;
62	kstat_named_t	tcp_open_alloc;
63	kstat_named_t	tcp_open_detached_alloc;
64	kstat_named_t	tcp_rput_time_wait;
65	kstat_named_t	tcp_listendrop;
66	kstat_named_t	tcp_listendropq0;
67	kstat_named_t	tcp_wrong_rq;
68	kstat_named_t	tcp_rsrv_calls;
69	kstat_named_t	tcp_eagerfree2;
70	kstat_named_t	tcp_eagerfree3;
71	kstat_named_t	tcp_eagerfree4;
72	kstat_named_t	tcp_eagerfree5;
73	kstat_named_t	tcp_timewait_syn_fail;
74	kstat_named_t	tcp_listen_badflags;
75	kstat_named_t	tcp_timeout_calls;
76	kstat_named_t	tcp_timeout_cached_alloc;
77	kstat_named_t	tcp_timeout_cancel_reqs;
78	kstat_named_t	tcp_timeout_canceled;
79	kstat_named_t	tcp_timermp_freed;
80	kstat_named_t	tcp_push_timer_cnt;
81	kstat_named_t	tcp_ack_timer_cnt;
82	kstat_named_t   tcp_wsrv_called;
83	kstat_named_t   tcp_flwctl_on;
84	kstat_named_t	tcp_timer_fire_early;
85	kstat_named_t	tcp_timer_fire_miss;
86	kstat_named_t	tcp_rput_v6_error;
87	kstat_named_t	tcp_zcopy_on;
88	kstat_named_t	tcp_zcopy_off;
89	kstat_named_t	tcp_zcopy_backoff;
90	kstat_named_t	tcp_fusion_flowctl;
91	kstat_named_t	tcp_fusion_backenabled;
92	kstat_named_t	tcp_fusion_urg;
93	kstat_named_t	tcp_fusion_putnext;
94	kstat_named_t	tcp_fusion_unfusable;
95	kstat_named_t	tcp_fusion_aborted;
96	kstat_named_t	tcp_fusion_unqualified;
97	kstat_named_t	tcp_fusion_rrw_busy;
98	kstat_named_t	tcp_fusion_rrw_msgcnt;
99	kstat_named_t	tcp_fusion_rrw_plugged;
100	kstat_named_t	tcp_in_ack_unsent_drop;
101	kstat_named_t	tcp_sock_fallback;
102	kstat_named_t	tcp_lso_enabled;
103	kstat_named_t	tcp_lso_disabled;
104	kstat_named_t	tcp_lso_times;
105	kstat_named_t	tcp_lso_pkt_out;
106} tcp_stat_t;
107
108#define	TCP_STAT(tcps, x)	((tcps)->tcps_statistics.x.value.ui64++)
109#define	TCP_STAT_UPDATE(tcps, x, n)	\
110	((tcps)->tcps_statistics.x.value.ui64 += (n))
111#define	TCP_STAT_SET(tcps, x, n)	\
112	((tcps)->tcps_statistics.x.value.ui64 = (n))
113
114typedef struct tcp_g_stat {
115	kstat_named_t	tcp_timermp_alloced;
116	kstat_named_t	tcp_timermp_allocfail;
117	kstat_named_t	tcp_timermp_allocdblfail;
118	kstat_named_t	tcp_freelist_cleanup;
119} tcp_g_stat_t;
120
121#ifdef _KERNEL
122
123/*
124 * TCP stack instances
125 */
126struct tcp_stack {
127	netstack_t	*tcps_netstack;	/* Common netstack */
128
129	mib2_tcp_t	tcps_mib;
130
131	/*
132	 * Extra privileged ports. In host byte order.
133	 * Protected by tcp_epriv_port_lock.
134	 */
135#define	TCP_NUM_EPRIV_PORTS	64
136	int		tcps_g_num_epriv_ports;
137	uint16_t	tcps_g_epriv_ports[TCP_NUM_EPRIV_PORTS];
138	kmutex_t	tcps_epriv_port_lock;
139
140	/*
141	 * The smallest anonymous port in the priviledged port range which TCP
142	 * looks for free port.  Use in the option TCP_ANONPRIVBIND.
143	 */
144	in_port_t	tcps_min_anonpriv_port;
145
146	/* Only modified during _init and _fini thus no locking is needed. */
147	caddr_t		tcps_g_nd;
148	struct tcpparam_s *tcps_params;	/* ndd parameters */
149	struct tcpparam_s *tcps_wroff_xtra_param;
150
151	/* Hint not protected by any lock */
152	uint_t		tcps_next_port_to_try;
153
154	/* TCP bind hash list - all tcp_t with state >= BOUND. */
155	struct tf_s	*tcps_bind_fanout;
156
157	/* TCP queue hash list - all tcp_t in case they will be an acceptor. */
158	struct tf_s	*tcps_acceptor_fanout;
159
160	/*
161	 * MIB-2 stuff for SNMP
162	 * Note: tcpInErrs {tcp 15} is accumulated in ip.c
163	 */
164	kstat_t		*tcps_mibkp;	/* kstat exporting tcp_mib data */
165	kstat_t		*tcps_kstat;
166	tcp_stat_t	tcps_statistics;
167
168	uint32_t	tcps_iss_incr_extra;
169				/* Incremented for each connection */
170	kmutex_t	tcps_iss_key_lock;
171	MD5_CTX		tcps_iss_key;
172
173	/* Packet dropper for TCP IPsec policy drops. */
174	ipdropper_t	tcps_dropper;
175
176	/*
177	 * These two variables control the rate for TCP to generate RSTs in
178	 * response to segments not belonging to any connections.  We limit
179	 * TCP to sent out tcp_rst_sent_rate (ndd param) number of RSTs in
180	 * each 1 second interval.  This is to protect TCP against DoS attack.
181	 */
182	clock_t		tcps_last_rst_intrvl;
183	uint32_t	tcps_rst_cnt;
184	/* The number of RST not sent because of the rate limit. */
185	uint32_t	tcps_rst_unsent;
186	ldi_ident_t	tcps_ldi_ident;
187
188	/* Used to synchronize access when reclaiming memory */
189	mblk_t		*tcps_ixa_cleanup_mp;
190	kmutex_t	tcps_ixa_cleanup_lock;
191	kcondvar_t	tcps_ixa_cleanup_cv;
192};
193typedef struct tcp_stack tcp_stack_t;
194
195#endif /* _KERNEL */
196#ifdef	__cplusplus
197}
198#endif
199
200#endif	/* _INET_TCP_STACK_H */
201