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