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