예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
 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);
 }
예제 #4
0
        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);
        }