Print this page
3942 inject sanity into ipadm tcp buffer size properties
3943 _snd_lowat_fraction tcp tunable has no effect
Reviewed by: Adam Leventhal <ahl@delphix.com>
Reviewed by: Peng Dai <peng.dai@delphix.com>

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/inet/sctp/sctp_tunables.c
          +++ new/usr/src/uts/common/inet/sctp/sctp_tunables.c
↓ open down ↓ 13 lines elided ↑ open up ↑
  14   14   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15   15   * If applicable, add the following below this CDDL HEADER, with the
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  
  22   22  /*
  23   23   * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
       24 + * Copyright (c) 2013 by Delphix. All rights reserved.
  24   25   */
  25   26  
  26   27  #include <inet/ip.h>
  27   28  #include <inet/ip6.h>
  28   29  #include <inet/sctp/sctp_stack.h>
  29   30  #include <inet/sctp/sctp_impl.h>
  30   31  #include <sys/sunddi.h>
  31   32  
  32   33  /* Max size IP datagram is 64k - 1 */
  33   34  #define SCTP_MSS_MAX_IPV4 (IP_MAXPACKET - (sizeof (ipha_t) + \
↓ open down ↓ 1 lines elided ↑ open up ↑
  35   36  #define SCTP_MSS_MAX_IPV6 (IP_MAXPACKET - (sizeof (ip6_t) + \
  36   37                                          sizeof (sctp_hdr_t)))
  37   38  /* Max of the above */
  38   39  #define SCTP_MSS_MAX    SCTP_MSS_MAX_IPV4
  39   40  
  40   41  /*
  41   42   * returns the current list of listener limit configuration.
  42   43   */
  43   44  /* ARGSUSED */
  44   45  static int
  45      -sctp_listener_conf_get(void *cbarg, mod_prop_info_t *pinfo, const char *ifname,
  46      -    void *val, uint_t psize, uint_t flags)
       46 +sctp_listener_conf_get(netstack_t *stack, mod_prop_info_t *pinfo,
       47 +    const char *ifname, void *val, uint_t psize, uint_t flags)
  47   48  {
  48      -        sctp_stack_t    *sctps = (sctp_stack_t *)cbarg;
       49 +        sctp_stack_t    *sctps = stack->netstack_sctp;
  49   50          sctp_listener_t *sl;
  50   51          char            *pval = val;
  51   52          size_t          nbytes = 0, tbytes = 0;
  52   53          uint_t          size;
  53   54          int             err = 0;
  54   55  
  55   56          bzero(pval, psize);
  56   57          size = psize;
  57   58  
  58   59          if (flags & (MOD_PROP_DEFAULT|MOD_PROP_PERM|MOD_PROP_POSSIBLE))
↓ open down ↓ 20 lines elided ↑ open up ↑
  79   80  
  80   81          mutex_exit(&sctps->sctps_listener_conf_lock);
  81   82          return (err);
  82   83  }
  83   84  
  84   85  /*
  85   86   * add a new listener limit configuration.
  86   87   */
  87   88  /* ARGSUSED */
  88   89  static int
  89      -sctp_listener_conf_add(void *cbarg, cred_t *cr, mod_prop_info_t *pinfo,
       90 +sctp_listener_conf_add(netstack_t *stack, cred_t *cr, mod_prop_info_t *pinfo,
  90   91      const char *ifname, const void* pval, uint_t flags)
  91   92  {
  92   93          sctp_listener_t *new_sl;
  93   94          sctp_listener_t *sl;
  94   95          long            lport;
  95   96          long            ratio;
  96   97          char            *colon;
  97      -        sctp_stack_t    *sctps = (sctp_stack_t *)cbarg;
       98 +        sctp_stack_t    *sctps = stack->netstack_sctp;
  98   99  
  99  100          if (flags & MOD_PROP_DEFAULT)
 100  101                  return (ENOTSUP);
 101  102  
 102  103          if (ddi_strtol(pval, &colon, 10, &lport) != 0 || lport <= 0 ||
 103  104              lport > USHRT_MAX || *colon != ':') {
 104  105                  return (EINVAL);
 105  106          }
 106  107          if (ddi_strtol(colon + 1, NULL, 10, &ratio) != 0 || ratio <= 0)
 107  108                  return (EINVAL);
↓ open down ↓ 20 lines elided ↑ open up ↑
 128  129          list_insert_tail(&sctps->sctps_listener_conf, new_sl);
 129  130          mutex_exit(&sctps->sctps_listener_conf_lock);
 130  131          return (0);
 131  132  }
 132  133  
 133  134  /*
 134  135   * remove a listener limit configuration.
 135  136   */
 136  137  /* ARGSUSED */
 137  138  static int
 138      -sctp_listener_conf_del(void *cbarg, cred_t *cr, mod_prop_info_t *pinfo,
      139 +sctp_listener_conf_del(netstack_t *stack, cred_t *cr, mod_prop_info_t *pinfo,
 139  140      const char *ifname, const void* pval, uint_t flags)
 140  141  {
 141  142          sctp_listener_t *sl;
 142  143          long            lport;
 143      -        sctp_stack_t    *sctps = (sctp_stack_t *)cbarg;
      144 +        sctp_stack_t    *sctps = stack->netstack_sctp;
 144  145  
 145  146          if (flags & MOD_PROP_DEFAULT)
 146  147                  return (ENOTSUP);
 147  148  
 148  149          if (ddi_strtol(pval, NULL, 10, &lport) != 0 || lport <= 0 ||
 149  150              lport > USHRT_MAX) {
 150  151                  return (EINVAL);
 151  152          }
 152  153          mutex_enter(&sctps->sctps_listener_conf_lock);
 153  154          for (sl = list_head(&sctps->sctps_listener_conf); sl != NULL;
↓ open down ↓ 2 lines elided ↑ open up ↑
 156  157                          list_remove(&sctps->sctps_listener_conf, sl);
 157  158                          mutex_exit(&sctps->sctps_listener_conf_lock);
 158  159                          kmem_free(sl, sizeof (sctp_listener_t));
 159  160                          return (0);
 160  161                  }
 161  162          }
 162  163          mutex_exit(&sctps->sctps_listener_conf_lock);
 163  164          return (ESRCH);
 164  165  }
 165  166  
      167 +static int
      168 +sctp_set_buf_prop(netstack_t *stack, cred_t *cr, mod_prop_info_t *pinfo,
      169 +    const char *ifname, const void *pval, uint_t flags)
      170 +{
      171 +        return (mod_set_buf_prop(stack->netstack_sctp->sctps_propinfo_tbl,
      172 +            stack, cr, pinfo, ifname, pval, flags));
      173 +}
      174 +
      175 +static int
      176 +sctp_get_buf_prop(netstack_t *stack, mod_prop_info_t *pinfo, const char *ifname,
      177 +    void *val, uint_t psize, uint_t flags)
      178 +{
      179 +        return (mod_get_buf_prop(stack->netstack_sctp->sctps_propinfo_tbl,
      180 +            stack, pinfo, ifname, val, psize, flags));
      181 +}
      182 +
 166  183  /*
 167  184   * All of these are alterable, within the min/max values given, at run time.
 168  185   *
 169  186   * Note: All those tunables which do not start with "_" are Committed and
 170  187   * therefore are public. See PSARC 2010/080.
 171  188   */
 172  189  mod_prop_info_t sctp_propinfo_tbl[] = {
 173  190          { "_max_init_retr", MOD_PROTO_SCTP,
 174  191              mod_set_uint32, mod_get_uint32,
 175  192              {0, 128, 8}, {8} },
↓ open down ↓ 1 lines elided ↑ open up ↑
 177  194          { "_pa_max_retr", MOD_PROTO_SCTP,
 178  195              mod_set_uint32, mod_get_uint32,
 179  196              {1, 128, 10}, {10} },
 180  197  
 181  198          { "_pp_max_retr", MOD_PROTO_SCTP,
 182  199              mod_set_uint32, mod_get_uint32,
 183  200              {1, 128, 5}, {5} },
 184  201  
 185  202          { "_cwnd_max", MOD_PROTO_SCTP,
 186  203              mod_set_uint32, mod_get_uint32,
 187      -            {128, (1<<30), 1024*1024}, {1024*1024} },
      204 +            {128, ULP_MAX_BUF, 1024*1024}, {1024*1024} },
 188  205  
 189  206          { "smallest_nonpriv_port", MOD_PROTO_SCTP,
 190  207              mod_set_uint32, mod_get_uint32,
 191  208              {1024, (32*1024), 1024}, {1024} },
 192  209  
 193  210          { "_ipv4_ttl", MOD_PROTO_SCTP,
 194  211              mod_set_uint32, mod_get_uint32,
 195  212              {1, 255, 64}, {64} },
 196  213  
 197  214          { "_heartbeat_interval", MOD_PROTO_SCTP,
↓ open down ↓ 30 lines elided ↑ open up ↑
 228  245              {1024, UINT32_MAX, SCTP_RECV_HIWATER}, { SCTP_RECV_HIWATER} },
 229  246  
 230  247          { "smallest_anon_port", MOD_PROTO_SCTP,
 231  248              mod_set_uint32, mod_get_uint32,
 232  249              {1024, ULP_MAX_PORT, 32*1024}, {32*1024} },
 233  250  
 234  251          { "largest_anon_port", MOD_PROTO_SCTP,
 235  252              mod_set_uint32, mod_get_uint32,
 236  253              {1024, ULP_MAX_PORT, ULP_MAX_PORT}, {ULP_MAX_PORT} },
 237  254  
 238      -        { "send_maxbuf", MOD_PROTO_SCTP,
 239      -            mod_set_uint32, mod_get_uint32,
 240      -            {SCTP_XMIT_LOWATER,  (1<<30),  SCTP_XMIT_HIWATER},
      255 +        { "send_buf", MOD_PROTO_SCTP,
      256 +            sctp_set_buf_prop, sctp_get_buf_prop,
      257 +            {SCTP_XMIT_LOWATER,  ULP_MAX_BUF,  SCTP_XMIT_HIWATER},
 241  258              {SCTP_XMIT_HIWATER} },
 242  259  
 243  260          { "_xmit_lowat", MOD_PROTO_SCTP,
 244  261              mod_set_uint32, mod_get_uint32,
 245      -            {SCTP_XMIT_LOWATER,  (1<<30),  SCTP_XMIT_LOWATER},
      262 +            {SCTP_XMIT_LOWATER,  ULP_MAX_BUF,  SCTP_XMIT_LOWATER},
 246  263              {SCTP_XMIT_LOWATER} },
 247  264  
 248      -        { "recv_maxbuf", MOD_PROTO_SCTP,
 249      -            mod_set_uint32, mod_get_uint32,
 250      -            {SCTP_RECV_LOWATER,  (1<<30),  SCTP_RECV_HIWATER},
      265 +        { "recv_buf", MOD_PROTO_SCTP,
      266 +            sctp_set_buf_prop, sctp_get_buf_prop,
      267 +            {SCTP_RECV_LOWATER,  ULP_MAX_BUF,  SCTP_RECV_HIWATER},
 251  268              {SCTP_RECV_HIWATER} },
 252  269  
 253      -        { "_max_buf", MOD_PROTO_SCTP,
      270 +        { "max_buf", MOD_PROTO_SCTP,
 254  271              mod_set_uint32, mod_get_uint32,
 255      -            {8192, (1<<30), 1024*1024}, {1024*1024} },
      272 +            {8192, ULP_MAX_BUF, 1024*1024}, {1024*1024} },
 256  273  
 257  274          /* tunable - 20 */
 258  275          { "_rtt_updates", MOD_PROTO_SCTP,
 259  276              mod_set_uint32, mod_get_uint32,
 260  277              {0, 65536, 20}, {20} },
 261  278  
 262  279          { "_ipv6_hoplimit", MOD_PROTO_SCTP,
 263  280              mod_set_uint32, mod_get_uint32,
 264  281              {0, IPV6_MAX_HOPS, IPV6_DEFAULT_HOPS}, {IPV6_DEFAULT_HOPS} },
 265  282  
↓ open down ↓ 88 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX