Print this page
9500 HP scanner needs smaller SMB2 rwsize

*** 48,57 **** --- 48,66 ---- uint32_t smb2_tcp_bufsize = (1<<22); /* 4MB */ uint32_t smb2_max_rwsize = (1<<20); /* 1MB */ uint32_t smb2_max_trans = (1<<16); /* 64KB */ /* + * With clients (e.g. HP scanners) that don't advertise SMB2_CAP_LARGE_MTU + * (including all clients using dialect < SMB 2.1), use a "conservative" value + * for max r/w size because some older clients misbehave with larger values. + * 64KB is recommended in the [MS-SMB2] spec. (3.3.5.3.1 SMB 2.1 or SMB 3.x + * Support) as the minimum so we'll use that. + */ + uint32_t smb2_old_rwsize = (1<<16); /* 64KB */ + + /* * List of all SMB2 versions we implement. Note that the * highest version we support may be limited by the * _cfg.skc_max_protocol setting. */ static uint16_t smb2_versions[] = {
*** 247,256 **** --- 256,266 ---- smb2_negotiate_common(smb_request_t *sr, uint16_t version) { timestruc_t boot_tv, now_tv; smb_session_t *s = sr->session; int rc; + uint32_t max_rwsize; uint16_t secmode; sr->smb2_status = 0; /*
*** 295,304 **** --- 305,322 ---- smb2sr_put_error(sr, sr->smb2_status); smb2_send_reply(sr); return (-1); /* will drop */ } + /* + * See notes above smb2_max_rwsize, smb2_old_rwsize + */ + if (s->capabilities & SMB2_CAP_LARGE_MTU) + max_rwsize = smb2_max_rwsize; + else + max_rwsize = smb2_old_rwsize; + rc = smb_mbc_encodef( &sr->reply, "wwww#cllllTTwwl#c", 65, /* StructSize */ /* w */ s->secmode, /* w */
*** 306,317 **** 0, /* reserved */ /* w */ UUID_LEN, /* # */ &s->s_cfg.skc_machine_uuid, /* c */ smb2srv_capabilities, /* l */ smb2_max_trans, /* l */ ! smb2_max_rwsize, /* l */ ! smb2_max_rwsize, /* l */ &now_tv, /* T */ &boot_tv, /* T */ 128, /* SecBufOff */ /* w */ sr->sr_cfg->skc_negtok_len, /* w */ 0, /* reserved */ /* l */ --- 324,335 ---- 0, /* reserved */ /* w */ UUID_LEN, /* # */ &s->s_cfg.skc_machine_uuid, /* c */ smb2srv_capabilities, /* l */ smb2_max_trans, /* l */ ! max_rwsize, /* l */ ! max_rwsize, /* l */ &now_tv, /* T */ &boot_tv, /* T */ 128, /* SecBufOff */ /* w */ sr->sr_cfg->skc_negtok_len, /* w */ 0, /* reserved */ /* l */