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) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  24  */
  25 
  26 #ifndef _INET_TCP_STACK_H
  27 #define _INET_TCP_STACK_H
  28 
  29 #include <sys/netstack.h>
  30 #include <inet/ip.h>
  31 #include <inet/ipdrop.h>
  32 #include <inet/tcp_stats.h>
  33 #include <sys/sunddi.h>
  34 #include <sys/sunldi.h>
  35 
  36 #ifdef  __cplusplus
  37 extern "C" {
  38 #endif
  39 
  40 #ifdef _KERNEL
  41 
  42 /*
  43  * TCP stack instances
  44  */
  45 struct tcp_stack {
  46         netstack_t      *tcps_netstack; /* Common netstack */
  47 
  48         /*
  49          * Extra privileged ports. In host byte order.
  50          * Protected by tcp_epriv_port_lock.
  51          */
  52 #define TCP_NUM_EPRIV_PORTS     64
  53         int             tcps_g_num_epriv_ports;
  54         in_port_t       tcps_g_epriv_ports[TCP_NUM_EPRIV_PORTS];
  55         kmutex_t        tcps_epriv_port_lock;
  56 
  57         /*
  58          * The smallest anonymous port in the priviledged port range which TCP
  59          * looks for free port.  Use in the option TCP_ANONPRIVBIND.
  60          */
  61         in_port_t       tcps_min_anonpriv_port;
  62 
  63         /* holds the tcp tunables */
  64         struct mod_prop_info_s *tcps_propinfo_tbl;
  65 
  66         /* Hint not protected by any lock */
  67         uint_t          tcps_next_port_to_try;
  68 
  69         /* TCP bind hash list - all tcp_t with state >= BOUND. */
  70         struct tf_s     *tcps_bind_fanout;
  71 
  72         /* TCP queue hash list - all tcp_t in case they will be an acceptor. */
  73         struct tf_s     *tcps_acceptor_fanout;
  74 
  75         /*
  76          * MIB-2 stuff for SNMP
  77          * Note: tcpInErrs {tcp 15} is accumulated in ip.c
  78          */
  79         kstat_t         *tcps_mibkp;    /* kstat exporting mib2_tcp_t data */
  80         kstat_t         *tcps_kstat;    /* kstat exporting tcp_stat_t data */
  81 
  82         uint32_t        tcps_iss_incr_extra;
  83                                 /* Incremented for each connection */
  84         kmutex_t        tcps_iss_key_lock;
  85         MD5_CTX         tcps_iss_key;
  86 
  87         /* Packet dropper for TCP IPsec policy drops. */
  88         ipdropper_t     tcps_dropper;
  89 
  90         /*
  91          * These two variables control the rate for TCP to generate RSTs in
  92          * response to segments not belonging to any connections.  We limit
  93          * TCP to sent out tcp_rst_sent_rate (ndd param) number of RSTs in
  94          * each 1 second interval.  This is to protect TCP against DoS attack.
  95          */
  96         int64_t         tcps_last_rst_intrvl;
  97         uint32_t        tcps_rst_cnt;
  98 
  99         ldi_ident_t     tcps_ldi_ident;
 100 
 101         /* Used to synchronize access when reclaiming memory */
 102         mblk_t          *tcps_ixa_cleanup_mp;
 103         kmutex_t        tcps_ixa_cleanup_lock;
 104         kcondvar_t      tcps_ixa_cleanup_ready_cv;
 105         kcondvar_t      tcps_ixa_cleanup_done_cv;
 106 
 107         /* Variables for handling kmem reclaim call back. */
 108         kmutex_t        tcps_reclaim_lock;
 109         boolean_t       tcps_reclaim;
 110         timeout_id_t    tcps_reclaim_tid;
 111         uint32_t        tcps_reclaim_period;
 112 
 113         /* Listener connection limit configuration. */
 114         kmutex_t        tcps_listener_conf_lock;
 115         list_t          tcps_listener_conf;
 116 
 117         /*
 118          * Per CPU stats
 119          *
 120          * tcps_sc: array of pointer to per CPU stats.  The i-th element in the
 121          *    array represents the stats of the CPU with cpu_seqid.
 122          * tcps_sc_cnt: number of CPU stats in the tcps_sc array.
 123          */
 124         tcp_stats_cpu_t **tcps_sc;
 125         int             tcps_sc_cnt;
 126 };
 127 
 128 typedef struct tcp_stack tcp_stack_t;
 129 
 130 #endif /* _KERNEL */
 131 #ifdef  __cplusplus
 132 }
 133 #endif
 134 
 135 #endif  /* _INET_TCP_STACK_H */