Home | History | Annotate | Download | only in inet
      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