1
0
mirror of https://github.com/samba-team/samba.git synced 2025-08-12 01:49:28 +03:00

libcli/smb: add max_credits arg to smbXcli_negprot_send()

This allows source4/torture code to set the option for tests by
preparing a struct smbcli_options with max_credits set to some value and
pass that to a torture_smb2_connection_ext().

This will be used in subsequent smbtorture test for SMB2 creditting.

Behaviour of existing upper layers is unchanged, they simply pass the
wanted max credits value to smbXcli_negprot_send() instead of
retrofitting it with a call to smb2cli_conn_set_max_credits().

Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
This commit is contained in:
Ralph Boehme
2017-02-27 16:14:39 +01:00
committed by Jeremy Allison
parent ac71bb3eb4
commit 8cbdc6a6df
8 changed files with 21 additions and 20 deletions

View File

@ -4092,7 +4092,8 @@ struct tevent_req *smbXcli_negprot_send(TALLOC_CTX *mem_ctx,
struct smbXcli_conn *conn,
uint32_t timeout_msec,
enum protocol_types min_protocol,
enum protocol_types max_protocol)
enum protocol_types max_protocol,
uint16_t max_credits)
{
struct tevent_req *req, *subreq;
struct smbXcli_negprot_state *state;
@ -4125,6 +4126,10 @@ struct tevent_req *smbXcli_negprot_send(TALLOC_CTX *mem_ctx,
conn->max_protocol = max_protocol;
conn->protocol = PROTOCOL_NONE;
if (max_protocol >= PROTOCOL_SMB2_02) {
conn->smb2.max_credits = max_credits;
}
if ((min_protocol < PROTOCOL_SMB2_02) &&
(max_protocol < PROTOCOL_SMB2_02)) {
/*
@ -4147,16 +4152,6 @@ struct tevent_req *smbXcli_negprot_send(TALLOC_CTX *mem_ctx,
*/
conn->dispatch_incoming = smb2cli_conn_dispatch_incoming;
/*
* As we're starting with an SMB2 negprot, emulate Windows
* and ask for 31 credits in the initial SMB2 negprot.
* If we don't and leave requested credits at
* zero, MacOSX servers return zero credits on
* the negprot reply and we fail to connect.
*/
smb2cli_conn_set_max_credits(conn,
WINDOWS_CLIENT_PURE_SMB2_NEGPROT_INITIAL_CREDIT_ASK);
subreq = smbXcli_negprot_smb2_subreq(state);
if (tevent_req_nomem(subreq, req)) {
return tevent_req_post(req, ev);
@ -5137,7 +5132,8 @@ NTSTATUS smbXcli_negprot(struct smbXcli_conn *conn,
goto fail;
}
req = smbXcli_negprot_send(frame, ev, conn, timeout_msec,
min_protocol, max_protocol);
min_protocol, max_protocol,
WINDOWS_CLIENT_PURE_SMB2_NEGPROT_INITIAL_CREDIT_ASK);
if (req == NULL) {
goto fail;
}

View File

@ -436,7 +436,8 @@ struct tevent_req *smbXcli_negprot_send(TALLOC_CTX *mem_ctx,
struct smbXcli_conn *conn,
uint32_t timeout_msec,
enum protocol_types min_protocol,
enum protocol_types max_protocol);
enum protocol_types max_protocol,
uint16_t max_credits);
NTSTATUS smbXcli_negprot_recv(struct tevent_req *req);
NTSTATUS smbXcli_negprot(struct smbXcli_conn *conn,
uint32_t timeout_msec,

View File

@ -39,6 +39,7 @@
#include "../libcli/smb/smbXcli_base.h"
#include "../libcli/smb/smb_seal.h"
#include "lib/param/param.h"
#include "../libcli/smb/smb2_negotiate_context.h"
#define STAR_SMBSERVER "*SMBSERVER"
@ -2754,7 +2755,8 @@ static void cli_start_connection_connected(struct tevent_req *subreq)
subreq = smbXcli_negprot_send(state, state->ev, state->cli->conn,
state->cli->timeout,
state->min_protocol,
state->max_protocol);
state->max_protocol,
WINDOWS_CLIENT_PURE_SMB2_NEGPROT_INITIAL_CREDIT_ASK);
if (tevent_req_nomem(subreq, req)) {
return;
}

View File

@ -2990,7 +2990,7 @@ static bool run_negprot_nowait(int dummy)
struct tevent_req *req;
req = smbXcli_negprot_send(ev, ev, cli->conn, cli->timeout,
PROTOCOL_CORE, PROTOCOL_NT1);
PROTOCOL_CORE, PROTOCOL_NT1, 0);
if (req == NULL) {
TALLOC_FREE(ev);
return false;

View File

@ -103,6 +103,7 @@ struct smbcli_options {
enum smb_signing_setting signing;
uint32_t smb2_capabilities;
struct GUID client_guid;
uint64_t max_credits;
};
/* this is the context for the client transport layer */

View File

@ -60,7 +60,8 @@ struct tevent_req *smb_raw_negotiate_send(TALLOC_CTX *mem_ctx,
transport->conn,
timeout_msec,
minprotocol,
maxprotocol);
maxprotocol,
transport->options.max_credits);
if (tevent_req_nomem(subreq, req)) {
return tevent_req_post(req, ev);
}

View File

@ -155,7 +155,8 @@ static void smb2_connect_socket_done(struct composite_context *creq)
subreq = smbXcli_negprot_send(state, state->ev,
state->transport->conn, timeout_msec,
min_protocol,
state->transport->options.max_protocol);
state->transport->options.max_protocol,
state->transport->options.max_credits);
if (tevent_req_nomem(subreq, req)) {
return;
}
@ -181,9 +182,6 @@ static void smb2_connect_negprot_done(struct tevent_req *subreq)
return;
}
/* This is a hack... */
smb2cli_conn_set_max_credits(transport->conn, 30);
state->session = smb2_session_init(transport, state->gensec_settings, state);
if (tevent_req_nomem(state->session, req)) {
return;

View File

@ -30,6 +30,7 @@
#include "lib/param/param.h"
#include "libcli/raw/libcliraw.h"
#include "librpc/ndr/libndr.h"
#include "libcli/smb/smb2_negotiate_context.h"
void lpcfg_smbcli_options(struct loadparm_context *lp_ctx,
struct smbcli_options *options)
@ -47,6 +48,7 @@ void lpcfg_smbcli_options(struct loadparm_context *lp_ctx,
options->use_level2_oplocks = true;
options->smb2_capabilities = SMB2_CAP_ALL;
options->client_guid = GUID_random();
options->max_credits = WINDOWS_CLIENT_PURE_SMB2_NEGPROT_INITIAL_CREDIT_ASK;
}
void lpcfg_smbcli_session_options(struct loadparm_context *lp_ctx,