Beispiel #1
0
        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");
        }