Keep track of credits we're giving out. Set initial credits to 1 (MS-SMB2 spec required).
authorJeremy Allison <jra@samba.org>
Wed, 19 May 2010 00:11:54 +0000 (17:11 -0700)
committerJeremy Allison <jra@samba.org>
Wed, 19 May 2010 00:11:54 +0000 (17:11 -0700)
Jeremy.

source3/smbd/globals.h
source3/smbd/smb2_server.c

index ad175bc4209100a231392efe94b33af810ad1c6e..f6dd36ea7233cfd29fdc457d62f9bc791bbeb61c 100644 (file)
@@ -570,6 +570,7 @@ struct smbd_server_connection {
                        bool blocking_lock_unlock_state;
                } locks;
                struct smbd_smb2_request *requests;
+               uint64_t credits_granted;
        } smb2;
 };
 
index d8e6ba10a3ecc8480dd047994fd5db69abe617fd..75c818bcda52904412ec59b1affa76261b43ba04 100644 (file)
@@ -437,6 +437,10 @@ static NTSTATUS smbd_smb2_request_setup_out(struct smbd_smb2_request *req, uint1
                SSVAL(outhdr, SMB2_HDR_OPCODE,
                      SVAL(inhdr, SMB2_HDR_OPCODE));
                SSVAL(outhdr, SMB2_HDR_CREDIT,          creds);
+
+               /* Remember what we gave out. */
+               req->sconn->smb2.credits_granted += creds;
+
                SIVAL(outhdr, SMB2_HDR_FLAGS,
                      IVAL(inhdr, SMB2_HDR_FLAGS) | SMB2_HDR_FLAG_REDIRECT);
                SIVAL(outhdr, SMB2_HDR_NEXT_COMMAND,    next_command_ofs);
@@ -755,6 +759,9 @@ NTSTATUS smbd_smb2_request_pending_queue(struct smbd_smb2_request *req,
        SIVAL(hdr, SMB2_HDR_STATUS, NT_STATUS_V(STATUS_PENDING));
        SSVAL(hdr, SMB2_HDR_OPCODE, SVAL(reqhdr, SMB2_HDR_OPCODE));
        SSVAL(hdr, SMB2_HDR_CREDIT, 5);
+
+       req->sconn->smb2.credits_granted += 5;
+
        SIVAL(hdr, SMB2_HDR_FLAGS, flags | SMB2_HDR_FLAG_ASYNC);
        SIVAL(hdr, SMB2_HDR_NEXT_COMMAND, 0);
        SBVAL(hdr, SMB2_HDR_MESSAGE_ID, message_id);
@@ -1909,7 +1916,7 @@ void smbd_smb2_first_negprot(struct smbd_server_connection *sconn,
                return;
        }
 
-       status = smbd_smb2_request_setup_out(req, (uint16_t)lp_maxmux());
+       status = smbd_smb2_request_setup_out(req, 1);
        if (!NT_STATUS_IS_OK(status)) {
                smbd_server_connection_terminate(sconn, nt_errstr(status));
                return;