summaryrefslogtreecommitdiffstats
path: root/source3
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2010-02-24 16:16:30 -0800
committerJeremy Allison <jra@samba.org>2010-02-24 16:16:30 -0800
commit26891651ec8dd68113ff0f49d996c3e70d55933e (patch)
tree6999b220923184b2b9b319c6148ffef9f9821437 /source3
parent76f4e6f16b624c6a680122b4bed7f5922bc1f236 (diff)
Change the credential handling so that we start with maxmux creds,
and then return to the client the number of credits per operation that they asked for. This is a more sensible algorithm than just blindly returning "20" on every reply, although we will probably still need more changes to this going forward. Jeremy.
Diffstat (limited to 'source3')
-rw-r--r--source3/smbd/smb2_server.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/source3/smbd/smb2_server.c b/source3/smbd/smb2_server.c
index 9e5be404ef..1d95d4be3f 100644
--- a/source3/smbd/smb2_server.c
+++ b/source3/smbd/smb2_server.c
@@ -234,7 +234,8 @@ static NTSTATUS smbd_smb2_request_create(struct smbd_server_connection *sconn,
return NT_STATUS_OK;
}
-static NTSTATUS smbd_smb2_request_validate(struct smbd_smb2_request *req)
+static NTSTATUS smbd_smb2_request_validate(struct smbd_smb2_request *req,
+ uint16_t *p_creds_requested)
{
int count;
int idx;
@@ -266,6 +267,8 @@ static NTSTATUS smbd_smb2_request_validate(struct smbd_smb2_request *req)
return NT_STATUS_INVALID_PARAMETER;
}
+ *p_creds_requested = SVAL(inhdr, SMB2_HDR_CREDIT);
+
flags = IVAL(inhdr, SMB2_HDR_FLAGS);
if (idx == 1) {
/*
@@ -314,7 +317,7 @@ static NTSTATUS smbd_smb2_request_validate(struct smbd_smb2_request *req)
return NT_STATUS_OK;
}
-static NTSTATUS smbd_smb2_request_setup_out(struct smbd_smb2_request *req)
+static NTSTATUS smbd_smb2_request_setup_out(struct smbd_smb2_request *req, uint16_t creds)
{
struct iovec *vector;
int count;
@@ -371,8 +374,7 @@ static NTSTATUS smbd_smb2_request_setup_out(struct smbd_smb2_request *req)
NT_STATUS_V(NT_STATUS_INTERNAL_ERROR));
SSVAL(outhdr, SMB2_HDR_OPCODE,
SVAL(inhdr, SMB2_HDR_OPCODE));
- /* Make up a number for now... JRA. FIXME ! FIXME !*/
- SSVAL(outhdr, SMB2_HDR_CREDIT, 20);
+ SSVAL(outhdr, SMB2_HDR_CREDIT, creds);
SIVAL(outhdr, SMB2_HDR_FLAGS,
IVAL(inhdr, SMB2_HDR_FLAGS) | SMB2_HDR_FLAG_REDIRECT);
SIVAL(outhdr, SMB2_HDR_NEXT_COMMAND, next_command_ofs);
@@ -1510,7 +1512,7 @@ void smbd_smb2_first_negprot(struct smbd_server_connection *sconn,
return;
}
- status = smbd_smb2_request_setup_out(req);
+ status = smbd_smb2_request_setup_out(req, (uint16_t)lp_maxmux());
if (!NT_STATUS_IS_OK(status)) {
smbd_server_connection_terminate(sconn, nt_errstr(status));
return;
@@ -1533,6 +1535,7 @@ void smbd_smb2_first_negprot(struct smbd_server_connection *sconn,
static void smbd_smb2_request_incoming(struct tevent_req *subreq)
{
+ uint16_t creds_requested = 0;
struct smbd_server_connection *sconn = tevent_req_callback_data(subreq,
struct smbd_server_connection);
NTSTATUS status;
@@ -1557,13 +1560,13 @@ static void smbd_smb2_request_incoming(struct tevent_req *subreq)
DEBUG(10,("smbd_smb2_request_incoming: idx[%d] of %d vectors\n",
req->current_idx, req->in.vector_count));
- status = smbd_smb2_request_validate(req);
+ status = smbd_smb2_request_validate(req, &creds_requested);
if (!NT_STATUS_IS_OK(status)) {
smbd_server_connection_terminate(sconn, nt_errstr(status));
return;
}
- status = smbd_smb2_request_setup_out(req);
+ status = smbd_smb2_request_setup_out(req, creds_requested);
if (!NT_STATUS_IS_OK(status)) {
smbd_server_connection_terminate(sconn, nt_errstr(status));
return;