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 (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. 24 */ 25 26 #ifndef _INET_SCTP_SCTP_STACK_H 27 #define _INET_SCTP_SCTP_STACK_H 28 29 #include <sys/netstack.h> 30 #include <sys/taskq.h> 31 32 #ifdef __cplusplus 33 extern "C" { 34 #endif 35 36 /* SCTP kstat */ 37 typedef struct sctp_kstat_s { 38 kstat_named_t sctp_add_faddr; 39 kstat_named_t sctp_add_timer; 40 kstat_named_t sctp_conn_create; 41 kstat_named_t sctp_find_next_tq; 42 kstat_named_t sctp_fr_add_hdr; 43 kstat_named_t sctp_fr_not_found; 44 kstat_named_t sctp_output_failed; 45 kstat_named_t sctp_rexmit_failed; 46 kstat_named_t sctp_send_init_failed; 47 kstat_named_t sctp_send_cookie_failed; 48 kstat_named_t sctp_send_cookie_ack_failed; 49 kstat_named_t sctp_send_err_failed; 50 kstat_named_t sctp_send_sack_failed; 51 kstat_named_t sctp_send_shutdown_failed; 52 kstat_named_t sctp_send_shutdown_ack_failed; 53 kstat_named_t sctp_send_shutdown_comp_failed; 54 kstat_named_t sctp_send_user_abort_failed; 55 kstat_named_t sctp_send_asconf_failed; 56 kstat_named_t sctp_send_asconf_ack_failed; 57 kstat_named_t sctp_send_ftsn_failed; 58 kstat_named_t sctp_send_hb_failed; 59 kstat_named_t sctp_return_hb_failed; 60 kstat_named_t sctp_ss_rexmit_failed; 61 kstat_named_t sctp_cl_connect; 62 kstat_named_t sctp_cl_assoc_change; 63 kstat_named_t sctp_cl_check_addrs; 64 kstat_named_t sctp_reclaim_cnt; 65 kstat_named_t sctp_listen_cnt_drop; 66 } sctp_kstat_t; 67 68 /* 69 * This struct contains only the counter part of sctp_kstat_t. It is used 70 * in sctp_stats_cpu_t instead of sctp_kstat_t to save memory space. 71 */ 72 typedef struct sctp_kstat_counter_s { 73 uint64_t sctp_add_faddr; 74 uint64_t sctp_add_timer; 75 uint64_t sctp_conn_create; 76 uint64_t sctp_find_next_tq; 77 uint64_t sctp_fr_add_hdr; 78 uint64_t sctp_fr_not_found; 79 uint64_t sctp_output_failed; 80 uint64_t sctp_rexmit_failed; 81 uint64_t sctp_send_init_failed; 82 uint64_t sctp_send_cookie_failed; 83 uint64_t sctp_send_cookie_ack_failed; 84 uint64_t sctp_send_err_failed; 85 uint64_t sctp_send_sack_failed; 86 uint64_t sctp_send_shutdown_failed; 87 uint64_t sctp_send_shutdown_ack_failed; 88 uint64_t sctp_send_shutdown_comp_failed; 89 uint64_t sctp_send_user_abort_failed; 90 uint64_t sctp_send_asconf_failed; 91 uint64_t sctp_send_asconf_ack_failed; 92 uint64_t sctp_send_ftsn_failed; 93 uint64_t sctp_send_hb_failed; 94 uint64_t sctp_return_hb_failed; 95 uint64_t sctp_ss_rexmit_failed; 96 uint64_t sctp_cl_connect; 97 uint64_t sctp_cl_assoc_change; 98 uint64_t sctp_cl_check_addrs; 99 uint64_t sctp_reclaim_cnt; 100 uint64_t sctp_listen_cnt_drop; 101 } sctp_kstat_counter_t; 102 103 /* Per CPU SCTP statistics counters. */ 104 typedef struct { 105 int64_t sctp_sc_assoc_cnt; 106 mib2_sctp_t sctp_sc_mib; 107 sctp_kstat_counter_t sctp_sc_stats; 108 } sctp_stats_cpu_t; 109 110 #define SCTP_KSTAT(sctps, x) \ 111 ((sctps)->sctps_sc[CPU->cpu_seqid]->sctp_sc_stats.x++) 112 113 #define SCTPS_BUMP_MIB(sctps, x) \ 114 BUMP_MIB(&(sctps)->sctps_sc[CPU->cpu_seqid]->sctp_sc_mib, x) 115 116 #define SCTPS_UPDATE_MIB(sctps, x, y) \ 117 UPDATE_MIB(&(sctps)->sctps_sc[CPU->cpu_seqid]->sctp_sc_mib, x, y) 118 119 /* 120 * SCTP stack instances 121 */ 122 struct sctp_stack { 123 netstack_t *sctps_netstack; /* Common netstack */ 124 125 /* Protected by sctps_g_lock */ 126 struct list sctps_g_list; /* SCTP instance data chain */ 127 kmutex_t sctps_g_lock; 128 129 #define SCTP_NUM_EPRIV_PORTS 64 130 int sctps_g_num_epriv_ports; 131 in_port_t sctps_g_epriv_ports[SCTP_NUM_EPRIV_PORTS]; 132 kmutex_t sctps_epriv_port_lock; 133 uint_t sctps_next_port_to_try; 134 135 /* SCTP bind hash list - all sctp_t with state >= BOUND. */ 136 struct sctp_tf_s *sctps_bind_fanout; 137 /* SCTP listen hash list - all sctp_t with state == LISTEN. */ 138 struct sctp_tf_s *sctps_listen_fanout; 139 struct sctp_tf_s *sctps_conn_fanout; 140 uint_t sctps_conn_hash_size; 141 142 /* holds sctp tunables */ 143 struct mod_prop_info_s *sctps_propinfo_tbl; 144 145 /* 146 * This lock protects the SCTP recvq_tq_list array and 147 * recvq_tq_list_cur_sz. 148 */ 149 kmutex_t sctps_rq_tq_lock; 150 int sctps_recvq_tq_list_max_sz; 151 taskq_t **sctps_recvq_tq_list; 152 153 /* Current number of recvq taskq. At least 1 for the default taskq. */ 154 uint32_t sctps_recvq_tq_list_cur_sz; 155 uint32_t sctps_recvq_tq_list_cur; 156 157 /* Global list of SCTP ILLs */ 158 struct sctp_ill_hash_s *sctps_g_ills; 159 uint32_t sctps_ills_count; 160 krwlock_t sctps_g_ills_lock; 161 162 /* Global list of SCTP IPIFs */ 163 struct sctp_ipif_hash_s *sctps_g_ipifs; 164 uint32_t sctps_g_ipifs_count; 165 krwlock_t sctps_g_ipifs_lock; 166 167 /* kstat exporting mib2_sctp_t and sctp_kstat_t data */ 168 kstat_t *sctps_mibkp; 169 kstat_t *sctps_kstat; 170 171 /* Variables for handling kmem reclaim call back. */ 172 kmutex_t sctps_reclaim_lock; 173 boolean_t sctps_reclaim; 174 timeout_id_t sctps_reclaim_tid; 175 uint32_t sctps_reclaim_period; 176 177 /* Listener association limit configuration. */ 178 kmutex_t sctps_listener_conf_lock; 179 list_t sctps_listener_conf; 180 181 /* 182 * Per CPU stats 183 * 184 * sctps_sc: array of pointer to per CPU stats. The i-th element in 185 * the array represents the stats of the CPU with cpu_seqid. 186 * sctps_sc_cnt: number of CPU stats in the sctps_sc array. 187 */ 188 sctp_stats_cpu_t **sctps_sc; 189 int sctps_sc_cnt; 190 }; 191 192 typedef struct sctp_stack sctp_stack_t; 193 194 #ifdef __cplusplus 195 } 196 #endif 197 198 #endif /* _INET_SCTP_SCTP_STACK_H */ 199