xref: /illumos-gate/usr/src/uts/common/inet/tcp_stack.h (revision 968633ad8faee931821fd6b656eb0d96d4b186c0)
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 2008 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 
34 #ifdef	__cplusplus
35 extern "C" {
36 #endif
37 
38 /* Kstats */
39 typedef struct tcp_stat {
40 	kstat_named_t	tcp_time_wait;
41 	kstat_named_t	tcp_time_wait_syn;
42 	kstat_named_t	tcp_time_wait_syn_success;
43 	kstat_named_t	tcp_time_wait_syn_fail;
44 	kstat_named_t	tcp_reinput_syn;
45 	kstat_named_t	tcp_ip_output;
46 	kstat_named_t	tcp_detach_non_time_wait;
47 	kstat_named_t	tcp_detach_time_wait;
48 	kstat_named_t	tcp_time_wait_reap;
49 	kstat_named_t	tcp_clean_death_nondetached;
50 	kstat_named_t	tcp_reinit_calls;
51 	kstat_named_t	tcp_eager_err1;
52 	kstat_named_t	tcp_eager_err2;
53 	kstat_named_t	tcp_eager_blowoff_calls;
54 	kstat_named_t	tcp_eager_blowoff_q;
55 	kstat_named_t	tcp_eager_blowoff_q0;
56 	kstat_named_t	tcp_not_hard_bound;
57 	kstat_named_t	tcp_no_listener;
58 	kstat_named_t	tcp_found_eager;
59 	kstat_named_t	tcp_wrong_queue;
60 	kstat_named_t	tcp_found_eager_binding1;
61 	kstat_named_t	tcp_found_eager_bound1;
62 	kstat_named_t	tcp_eager_has_listener1;
63 	kstat_named_t	tcp_open_alloc;
64 	kstat_named_t	tcp_open_detached_alloc;
65 	kstat_named_t	tcp_rput_time_wait;
66 	kstat_named_t	tcp_listendrop;
67 	kstat_named_t	tcp_listendropq0;
68 	kstat_named_t	tcp_wrong_rq;
69 	kstat_named_t	tcp_rsrv_calls;
70 	kstat_named_t	tcp_eagerfree2;
71 	kstat_named_t	tcp_eagerfree3;
72 	kstat_named_t	tcp_eagerfree4;
73 	kstat_named_t	tcp_eagerfree5;
74 	kstat_named_t	tcp_timewait_syn_fail;
75 	kstat_named_t	tcp_listen_badflags;
76 	kstat_named_t	tcp_timeout_calls;
77 	kstat_named_t	tcp_timeout_cached_alloc;
78 	kstat_named_t	tcp_timeout_cancel_reqs;
79 	kstat_named_t	tcp_timeout_canceled;
80 	kstat_named_t	tcp_timermp_freed;
81 	kstat_named_t	tcp_push_timer_cnt;
82 	kstat_named_t	tcp_ack_timer_cnt;
83 	kstat_named_t	tcp_ire_null1;
84 	kstat_named_t	tcp_ire_null;
85 	kstat_named_t	tcp_ip_send;
86 	kstat_named_t	tcp_ip_ire_send;
87 	kstat_named_t   tcp_wsrv_called;
88 	kstat_named_t   tcp_flwctl_on;
89 	kstat_named_t	tcp_timer_fire_early;
90 	kstat_named_t	tcp_timer_fire_miss;
91 	kstat_named_t	tcp_rput_v6_error;
92 	kstat_named_t	tcp_out_sw_cksum;
93 	kstat_named_t	tcp_out_sw_cksum_bytes;
94 	kstat_named_t	tcp_zcopy_on;
95 	kstat_named_t	tcp_zcopy_off;
96 	kstat_named_t	tcp_zcopy_backoff;
97 	kstat_named_t	tcp_zcopy_disable;
98 	kstat_named_t	tcp_mdt_pkt_out;
99 	kstat_named_t	tcp_mdt_pkt_out_v4;
100 	kstat_named_t	tcp_mdt_pkt_out_v6;
101 	kstat_named_t	tcp_mdt_discarded;
102 	kstat_named_t	tcp_mdt_conn_halted1;
103 	kstat_named_t	tcp_mdt_conn_halted2;
104 	kstat_named_t	tcp_mdt_conn_halted3;
105 	kstat_named_t	tcp_mdt_conn_resumed1;
106 	kstat_named_t	tcp_mdt_conn_resumed2;
107 	kstat_named_t	tcp_mdt_legacy_small;
108 	kstat_named_t	tcp_mdt_legacy_all;
109 	kstat_named_t	tcp_mdt_legacy_ret;
110 	kstat_named_t	tcp_mdt_allocfail;
111 	kstat_named_t	tcp_mdt_addpdescfail;
112 	kstat_named_t	tcp_mdt_allocd;
113 	kstat_named_t	tcp_mdt_linked;
114 	kstat_named_t	tcp_fusion_flowctl;
115 	kstat_named_t	tcp_fusion_backenabled;
116 	kstat_named_t	tcp_fusion_urg;
117 	kstat_named_t	tcp_fusion_putnext;
118 	kstat_named_t	tcp_fusion_unfusable;
119 	kstat_named_t	tcp_fusion_aborted;
120 	kstat_named_t	tcp_fusion_unqualified;
121 	kstat_named_t	tcp_fusion_rrw_busy;
122 	kstat_named_t	tcp_fusion_rrw_msgcnt;
123 	kstat_named_t	tcp_fusion_rrw_plugged;
124 	kstat_named_t	tcp_in_ack_unsent_drop;
125 	kstat_named_t	tcp_sock_fallback;
126 	kstat_named_t	tcp_lso_enabled;
127 	kstat_named_t	tcp_lso_disabled;
128 	kstat_named_t	tcp_lso_times;
129 	kstat_named_t	tcp_lso_pkt_out;
130 } tcp_stat_t;
131 
132 #define	TCP_STAT(tcps, x)	((tcps)->tcps_statistics.x.value.ui64++)
133 #define	TCP_STAT_UPDATE(tcps, x, n)	\
134 	((tcps)->tcps_statistics.x.value.ui64 += (n))
135 #define	TCP_STAT_SET(tcps, x, n)	\
136 	((tcps)->tcps_statistics.x.value.ui64 = (n))
137 
138 typedef struct tcp_g_stat {
139 	kstat_named_t	tcp_timermp_alloced;
140 	kstat_named_t	tcp_timermp_allocfail;
141 	kstat_named_t	tcp_timermp_allocdblfail;
142 	kstat_named_t	tcp_freelist_cleanup;
143 } tcp_g_stat_t;
144 
145 #ifdef _KERNEL
146 
147 /*
148  * TCP stack instances
149  */
150 struct tcp_stack {
151 	netstack_t	*tcps_netstack;	/* Common netstack */
152 
153 	mib2_tcp_t	tcps_mib;
154 
155 	/* Protected by tcps_g_q_lock */
156 	queue_t		*tcps_g_q;	/* Default queue */
157 	uint_t		tcps_refcnt;	/* Total number of tcp_t's */
158 	kmutex_t	tcps_g_q_lock;
159 	kcondvar_t	tcps_g_q_cv;
160 	kthread_t	*tcps_g_q_creator;
161 	struct __ldi_handle *tcps_g_q_lh;
162 	cred_t		*tcps_g_q_cr;    /* For _inactive close call */
163 
164 	/* Protected by tcp_hsp_lock */
165 	struct tcp_hsp	**tcps_hsp_hash;	/* Hash table for HSPs */
166 	krwlock_t	 tcps_hsp_lock;
167 
168 	/*
169 	 * Extra privileged ports. In host byte order.
170 	 * Protected by tcp_epriv_port_lock.
171 	 */
172 #define	TCP_NUM_EPRIV_PORTS	64
173 	int		tcps_g_num_epriv_ports;
174 	uint16_t	tcps_g_epriv_ports[TCP_NUM_EPRIV_PORTS];
175 	kmutex_t	tcps_epriv_port_lock;
176 
177 	/*
178 	 * The smallest anonymous port in the priviledged port range which TCP
179 	 * looks for free port.  Use in the option TCP_ANONPRIVBIND.
180 	 */
181 	in_port_t	tcps_min_anonpriv_port;
182 
183 	/* Only modified during _init and _fini thus no locking is needed. */
184 	caddr_t		tcps_g_nd;
185 	struct tcpparam_s *tcps_params;	/* ndd parameters */
186 	struct tcpparam_s *tcps_wroff_xtra_param;
187 	struct tcpparam_s *tcps_mdt_head_param;
188 	struct tcpparam_s *tcps_mdt_tail_param;
189 	struct tcpparam_s *tcps_mdt_max_pbufs_param;
190 
191 	/* Hint not protected by any lock */
192 	uint_t		tcps_next_port_to_try;
193 
194 	/* TCP bind hash list - all tcp_t with state >= BOUND. */
195 	struct tf_s	*tcps_bind_fanout;
196 
197 	/* TCP queue hash list - all tcp_t in case they will be an acceptor. */
198 	struct tf_s	*tcps_acceptor_fanout;
199 
200 	/*
201 	 * MIB-2 stuff for SNMP
202 	 * Note: tcpInErrs {tcp 15} is accumulated in ip.c
203 	 */
204 	kstat_t		*tcps_mibkp;	/* kstat exporting tcp_mib data */
205 	kstat_t		*tcps_kstat;
206 	tcp_stat_t	tcps_statistics;
207 
208 	uint32_t	tcps_iss_incr_extra;
209 				/* Incremented for each connection */
210 	kmutex_t	tcps_iss_key_lock;
211 	MD5_CTX		tcps_iss_key;
212 
213 	/* Packet dropper for TCP IPsec policy drops. */
214 	ipdropper_t	tcps_dropper;
215 
216 	/*
217 	 * This controls the rate some ndd info report functions can be used
218 	 * by non-priviledged users.  It stores the last time such info is
219 	 * requested.  When those report functions are called again, this
220 	 * is checked with the current time and compare with the ndd param
221 	 * tcp_ndd_get_info_interval.
222 	 */
223 	clock_t		tcps_last_ndd_get_info_time;
224 
225 	/*
226 	 * These two variables control the rate for TCP to generate RSTs in
227 	 * response to segments not belonging to any connections.  We limit
228 	 * TCP to sent out tcp_rst_sent_rate (ndd param) number of RSTs in
229 	 * each 1 second interval.  This is to protect TCP against DoS attack.
230 	 */
231 	clock_t		tcps_last_rst_intrvl;
232 	uint32_t	tcps_rst_cnt;
233 	/* The number of RST not sent because of the rate limit. */
234 	uint32_t	tcps_rst_unsent;
235 };
236 typedef struct tcp_stack tcp_stack_t;
237 
238 #endif /* _KERNEL */
239 #ifdef	__cplusplus
240 }
241 #endif
242 
243 #endif	/* _INET_TCP_STACK_H */
244