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_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 114 typedef 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 */ 126 struct 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 }; 193 typedef struct tcp_stack tcp_stack_t; 194 195 #endif /* _KERNEL */ 196 #ifdef __cplusplus 197 } 198 #endif 199 200 #endif /* _INET_TCP_STACK_H */ 201