public void SmbdNegotiate_UncompletedMessage() { const ushort CREDIT_REQUESTED = 10; const uint MAX_SEND_SIZE = 1024; const uint MAX_RECEIVE_SIZE = 1024; const uint MAX_FRAGMENT_SIZE = 131072; #region Create a negotiate message, Sends only 19 bytes of negotiate message to peer 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); // Create negotiate message SmbdNegotiateRequest smbdRequest = new SmbdNegotiateRequest(); smbdRequest.MinVersion = SmbdVersion.V1; smbdRequest.MaxVersion = SmbdVersion.V1; smbdRequest.Reserved = 0; smbdRequest.CreditsRequested = CREDIT_REQUESTED; smbdRequest.PreferredSendSize = MAX_SEND_SIZE; smbdRequest.MaxReceiveSize = MAX_RECEIVE_SIZE; smbdRequest.MaxFragmentedSize = MAX_FRAGMENT_SIZE; byte[] requestBytes = TypeMarshal.ToBytes <SmbdNegotiateRequest>(smbdRequest); byte[] uncompletedRequest = new byte[requestBytes.Length - 1]; Array.Copy(requestBytes, uncompletedRequest, uncompletedRequest.Length); BaseTestSite.Log.Add(LogEntryKind.TestStep, "Send SMBD negotiate message with only 19 bytes."); status = smbdAdapter.SendDataOverRdma(uncompletedRequest); BaseTestSite.Assert.AreEqual <NtStatus>(status, NtStatus.STATUS_SUCCESS, "Status of Send SMBD negotiate {0}", status); // wait for connection to be terminated BaseTestSite.Log.Add(LogEntryKind.TestStep, "Verify server connection will be terminated."); smbdAdapter.WaitRdmaDisconnect(); BaseTestSite.Assert.IsFalse(smbdAdapter.ClientConnection.Endpoint.IsConnected, "Connection should be terminated."); #endregion BaseTestSite.Log.Add(LogEntryKind.TestStep, "Basic negotiate, sending the whole 20 bytes of SMBD negotiate message to peer, verify server returns STATUS_SUCCESS."); SmbdNegotiateResponse response; BasicNegotiate( CREDIT_REQUESTED, MAX_SEND_SIZE, MAX_RECEIVE_SIZE, MAX_FRAGMENT_SIZE, out response); }
public void SmbdCreditMgmt_ConsumeAllCreditServer_Timeout() { // define data for test case const ushort RECEIVE_CREDIT_MAX = 10; const ushort SEND_CREDIT_TARGET = 10; Initialize_ReceiveSmbdDataTransferTestCase( RECEIVE_CREDIT_MAX, SEND_CREDIT_TARGET, smbdAdapter.TestConfig.ModerateFileSizeInByte); BaseTestSite.Log.Add(LogEntryKind.TestStep, "Receive 10 messages to comsume all credits."); #region Receive 10 messages to comsume all credits SmbdDataTransferMessage transferPackage; int offset = 0; NtStatus status; while (smbdAdapter.ClientConnection.ReceiveCredits > 0) { status = (NtStatus)smbdAdapter.SmbdReceivDataTransferMessage( smbdAdapter.TestConfig.Smb2ConnectionTimeout, out transferPackage ); if (transferPackage.DataLength == 0) { if (offset > 0) { // 0 length SMBDirect Data Transfer message in the segments BaseTestSite.Assert.Fail("Empty SMBDirect Data Transfer Message in the Fragmented messages"); } else { continue; } } #region Assert BaseTestSite.Assert.AreEqual <uint>( (uint)(smbdAdapter.TestConfig.ModerateFileSizeInByte - offset), transferPackage.DataLength + transferPackage.RemainingDataLength, "Received SMBDirect Data Transfer Message: DataLength {0}, RemainingDataLength {1}", transferPackage.DataLength, transferPackage.RemainingDataLength); BaseTestSite.Assert.AreEqual <uint>( 0, transferPackage.DataOffset % 8, "Received SMBDirect Data Transfer Message: DataOffset {0}, which should be 8-byte aligned", transferPackage.DataOffset); #endregion offset += (int)transferPackage.DataLength; if (transferPackage.RemainingDataLength == 0) { break; } } #endregion BaseTestSite.Log.Add(LogEntryKind.TestStep, string.Format("Wait for a KEEP_ALIVE_INTERVAL time in {0} seconds.", SmbdConnection.KEEP_ALIVE_INTERVAL)); Thread.Sleep(TimeSpan.FromSeconds(SmbdConnection.KEEP_ALIVE_INTERVAL)); BaseTestSite.Log.Add(LogEntryKind.TestStep, "Check no more message receive."); BaseTestSite.Assert.AreEqual <int>( 0, smbdAdapter.ReceiveEntryInQueue, "No message should be sent from server"); BaseTestSite.Log.Add(LogEntryKind.TestStep, "Check server connection will be terminated."); smbdAdapter.WaitRdmaDisconnect(); BaseTestSite.Assert.IsFalse(smbdAdapter.ClientConnection.Endpoint.IsConnected, "Connection should be terminated"); }