public NtStatus SmbdNegotiate( SmbdVersion minVersion, SmbdVersion maxVersion, ushort reserved, ushort creditsRequested, ushort receiveCreditMax, uint preferredSendSize, uint maxReceiveSize, uint maxFragmentedSize, out SmbdNegotiateResponse smbdNegotiateResponse ) { NtStatus status = smbdClient.Negotiate( minVersion, maxVersion, creditsRequested, receiveCreditMax, preferredSendSize, maxReceiveSize, maxFragmentedSize, out smbdNegotiateResponse, reserved ); // record Server's ADM ServerConnection.MaxSendSize = smbdNegotiateResponse.PreferredSendSize; ServerConnection.MaxReceiveSize = smbdNegotiateResponse.MaxReceiveSize; ServerConnection.MaxFragmentedSize = smbdNegotiateResponse.MaxFragmentedSize; ServerConnection.MaxReadWriteSize = smbdNegotiateResponse.MaxReadWriteSize; return(status); }
public void BasicNegotiate( ushort creditsRequested, uint preferredSendSize, uint maxReceiveSize, uint maxFragmentedSize, out SmbdNegotiateResponse response) { BaseTestSite.Log.Add(LogEntryKind.TestStep, "Connect to server over RDMA"); NtStatus status = smbdAdapter.ConnectToServerOverRDMA(); BaseTestSite.Assert.AreEqual <NtStatus>(NtStatus.STATUS_SUCCESS, status, "Status of SMBD connection is {0}", status); BaseTestSite.Log.Add(LogEntryKind.TestStep, "SMBD Negotiate"); status = smbdAdapter.SmbdNegotiate( creditsRequested, (ushort)smbdAdapter.TestConfig.ReceiveCreditMax, preferredSendSize, maxReceiveSize, maxFragmentedSize, out response, SmbdVersion.V1, SmbdVersion.V1 ); BaseTestSite.Assert.AreEqual <NtStatus>(NtStatus.STATUS_SUCCESS, status, "Status of SMBD negotiate is {0}", status); BaseTestSite.Log.Add(LogEntryKind.TestStep, "Verify SMBD negotiate response"); NegotiateBasicChecker( response, creditsRequested, maxReceiveSize, preferredSendSize, maxFragmentedSize); }
public void NegotiateBasicChecker( SmbdNegotiateResponse response, ushort creditsRequested, uint maxReceiveSize, uint preferredSendSize, uint maxFragmentedSize) { // verify the response BaseTestSite.Assert.AreEqual <SmbdVersion>( SmbdVersion.V1, response.MinVersion, "MinVersion in negotiate response is {0}", response.MinVersion); BaseTestSite.Assert.AreEqual <SmbdVersion>( SmbdVersion.V1, response.MaxVersion, "MaxVersion in negotiate response is {0}", response.MaxVersion); BaseTestSite.Assert.AreEqual <SmbdVersion>( SmbdVersion.V1, response.NegotiatedVersion, "NegotiatedVersion in negotiate response is {0}", response.NegotiatedVersion); BaseTestSite.Assert.AreEqual <ushort>( 0, response.Reserved, "Reserved in negotiate response is {0}", response.Reserved); BaseTestSite.Assert.IsTrue( response.CreditsGranted > 0 && response.CreditsGranted <= creditsRequested, "CreditsGranted in negotiate response is {0}", response.CreditsGranted); BaseTestSite.Assert.IsTrue( response.CreditsRequested > 0, "CreditsRequested in negotiate response is {0}", response.CreditsRequested); BaseTestSite.Assert.AreEqual <uint>( 0, response.Status, "Status in negotiate response is {0}", response.Status); BaseTestSite.Assert.IsTrue( response.MaxReadWriteSize >= SmbdConnection.FLOOR_MAX_READ_WRITE_SIZE, "MaxReadWriteSize in negotiate response is {0}", response.MaxReadWriteSize); if (preferredSendSize >= SmbdConnection.FLOOR_MAX_RECEIVE_SIZE) { // sever MUST set Connection.MaxReceiveSize to the smaller(Connection.MaxReceiveSize, PreferredSendSize) // If the result is smaller than 128, then Connection.MaxReceiveSize MUST be set to 128. BaseTestSite.Assert.IsTrue( response.MaxReceiveSize >= SmbdConnection.FLOOR_MAX_RECEIVE_SIZE && response.MaxReceiveSize <= preferredSendSize, "MaxReceiveSize in negotiate response is {0}", response.MaxReceiveSize); } // server MUST set Connection.MaxSendSize to the smaller(Connection.MaxSendSize, MaxReceiveSize). BaseTestSite.Assert.IsTrue( response.PreferredSendSize >= SmbdConnection.FLOOR_MAX_RECEIVE_SIZE && response.PreferredSendSize <= maxReceiveSize, "PreferredSendSize in negotiate response is {0}", response.PreferredSendSize); BaseTestSite.Assert.IsTrue( response.MaxFragmentedSize >= SmbdConnection.FLOOR_MAX_FRAGMENTED_SIZE, "MaxFragmentedSize in negotiate response is {0}", response.MaxFragmentedSize); }
public void SmbdNegotiate_Redundancy() { const ushort CREDIT_REQUESTED = 10; const uint MAX_SEND_SIZE = 1024; const uint MAX_RECEIVE_SIZE = 1024; const uint MAX_FRAGMENT_SIZE = 131072; const int NEGOTIATE_SIZE = 512; // it is the size of receive size after server accept the connection BaseTestSite.Log.Add(LogEntryKind.TestStep, "Connect to server over RDMA."); NtStatus status = smbdAdapter.ConnectToServerOverRDMA(); BaseTestSite.Assert.AreEqual <NtStatus>(status, NtStatus.STATUS_SUCCESS, "Status of SMBD connection is {0}.", status); BaseTestSite.Log.Add(LogEntryKind.TestStep, "Create SMBD Negotiate request."); SmbdNegotiateRequest request = new SmbdNegotiateRequest(); request.MinVersion = SmbdVersion.V1; request.MaxVersion = SmbdVersion.V1; request.Reserved = 0; request.CreditsRequested = CREDIT_REQUESTED; request.PreferredSendSize = MAX_SEND_SIZE; request.MaxReceiveSize = MAX_RECEIVE_SIZE; request.MaxFragmentedSize = MAX_FRAGMENT_SIZE; BaseTestSite.Log.Add(LogEntryKind.TestStep, "Add 492 redundancy bytes."); byte[] requestBytes = TypeMarshal.ToBytes <SmbdNegotiateRequest>(request); byte[] allbytes = new byte[NEGOTIATE_SIZE]; Array.Copy(requestBytes, allbytes, requestBytes.Length); // post receive status = smbdAdapter.ClientConnection.Endpoint.PostReceive(NEGOTIATE_SIZE); BaseTestSite.Assert.AreEqual <NtStatus>(status, NtStatus.STATUS_SUCCESS, "Status of Post Receive is {0}.", status); BaseTestSite.Log.Add(LogEntryKind.TestStep, "Send SMBD negotiate request."); status = smbdAdapter.SendDataOverRdma(allbytes); BaseTestSite.Assert.AreEqual <NtStatus>(status, NtStatus.STATUS_SUCCESS, "Status of Send SMBD negotiate is {0}.", status); BaseTestSite.Log.Add(LogEntryKind.TestStep, "Receive and verify NEGOTIATE response."); byte[] responseData; smbdAdapter.ReceiveDataOverRdma( TimeSpan.FromSeconds(SmbdConnection.ACTIVE_NEGOTIATION_TIMEOUT), out responseData); SmbdNegotiateResponse response = TypeMarshal.ToStruct <SmbdNegotiateResponse>(responseData); smbdAdapter.DisconnectRdma(); NegotiateBasicChecker( response, CREDIT_REQUESTED, MAX_RECEIVE_SIZE, MAX_SEND_SIZE, MAX_FRAGMENT_SIZE); }