Print this page
9500 HP scanner needs smaller SMB2 rwsize

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/fs/smbsrv/smb2_negotiate.c
          +++ new/usr/src/uts/common/fs/smbsrv/smb2_negotiate.c
↓ open down ↓ 42 lines elided ↑ open up ↑
  43   43   * and memory consumption (for the buffers) on the server side.
  44   44   *
  45   45   * smb2_max_trans is the largest "transact" send or receive, which is
  46   46   * used for directory listings and info set/get operations.
  47   47   */
  48   48  uint32_t smb2_tcp_bufsize = (1<<22);    /* 4MB */
  49   49  uint32_t smb2_max_rwsize = (1<<20);     /* 1MB */
  50   50  uint32_t smb2_max_trans  = (1<<16);     /* 64KB */
  51   51  
  52   52  /*
       53 + * With clients (e.g. HP scanners) that don't advertise SMB2_CAP_LARGE_MTU
       54 + * (including all clients using dialect < SMB 2.1), use a "conservative" value
       55 + * for max r/w size because some older clients misbehave with larger values.
       56 + * 64KB is recommended in the [MS-SMB2] spec.  (3.3.5.3.1 SMB 2.1 or SMB 3.x
       57 + * Support) as the minimum so we'll use that.
       58 + */
       59 +uint32_t smb2_old_rwsize = (1<<16);     /* 64KB */
       60 +
       61 +/*
  53   62   * List of all SMB2 versions we implement.  Note that the
  54   63   * highest version we support may be limited by the
  55   64   * _cfg.skc_max_protocol setting.
  56   65   */
  57   66  static uint16_t smb2_versions[] = {
  58   67          0x202,  /* SMB 2.002 */
  59   68          0x210,  /* SMB 2.1 */
  60   69  };
  61   70  static uint16_t smb2_nversions =
  62   71      sizeof (smb2_versions) / sizeof (smb2_versions[0]);
↓ open down ↓ 179 lines elided ↑ open up ↑
 242  251   * Common parts of SMB2 Negotiate, used for both the
 243  252   * SMB1-to-SMB2 style, and straight SMB2 style.
 244  253   * Do negotiation decisions, encode, send the reply.
 245  254   */
 246  255  static int
 247  256  smb2_negotiate_common(smb_request_t *sr, uint16_t version)
 248  257  {
 249  258          timestruc_t boot_tv, now_tv;
 250  259          smb_session_t *s = sr->session;
 251  260          int rc;
      261 +        uint32_t max_rwsize;
 252  262          uint16_t secmode;
 253  263  
 254  264          sr->smb2_status = 0;
 255  265  
 256  266          /*
 257  267           * Negotiation itself.  First the Security Mode.
 258  268           * The caller stashed the client's secmode in s->secmode,
 259  269           * which we validate, and then replace with the server's
 260  270           * secmode, which is all we care about after this.
 261  271           */
↓ open down ↓ 28 lines elided ↑ open up ↑
 290  300           * SMB2 negotiate reply
 291  301           */
 292  302          sr->smb2_hdr_flags = SMB2_FLAGS_SERVER_TO_REDIR;
 293  303          (void) smb2_encode_header(sr, B_FALSE);
 294  304          if (sr->smb2_status != 0) {
 295  305                  smb2sr_put_error(sr, sr->smb2_status);
 296  306                  smb2_send_reply(sr);
 297  307                  return (-1); /* will drop */
 298  308          }
 299  309  
      310 +        /*
      311 +         * See notes above smb2_max_rwsize, smb2_old_rwsize
      312 +         */
      313 +        if (s->capabilities & SMB2_CAP_LARGE_MTU)
      314 +                max_rwsize = smb2_max_rwsize;
      315 +        else
      316 +                max_rwsize = smb2_old_rwsize;
      317 +
 300  318          rc = smb_mbc_encodef(
 301  319              &sr->reply,
 302  320              "wwww#cllllTTwwl#c",
 303  321              65, /* StructSize */        /* w */
 304  322              s->secmode,                 /* w */
 305  323              version,                    /* w */
 306  324              0, /* reserved */           /* w */
 307  325              UUID_LEN,                   /* # */
 308  326              &s->s_cfg.skc_machine_uuid, /* c */
 309  327              smb2srv_capabilities,       /* l */
 310  328              smb2_max_trans,             /* l */
 311      -            smb2_max_rwsize,            /* l */
 312      -            smb2_max_rwsize,            /* l */
      329 +            max_rwsize,                 /* l */
      330 +            max_rwsize,                 /* l */
 313  331              &now_tv,                    /* T */
 314  332              &boot_tv,                   /* T */
 315  333              128, /* SecBufOff */        /* w */
 316  334              sr->sr_cfg->skc_negtok_len, /* w */
 317  335              0,  /* reserved */          /* l */
 318  336              sr->sr_cfg->skc_negtok_len, /* # */
 319  337              sr->sr_cfg->skc_negtok);    /* c */
 320  338  
 321  339          smb2_send_reply(sr);
 322  340  
↓ open down ↓ 55 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX