Пример #1
0
        public uint Smb2Read(
            UInt64 offset,
            uint byteCount,
            out byte[] readData,
            out READ_Response readResponse
            )
        {
            ushort creditCharge = (ushort)(1 + ((byteCount - 1) / 65535));

            RequestCreditsFromSmb2Server(creditCharge);

            uint status = this.Read(
                (ushort)creditCharge,
                64,
                Packet_Header_Flags_Values.FLAGS_SIGNED,
                this.messageId,
                this.sessionId,
                this.TreeId,
                byteCount,
                0,
                this.FileId,
                0,
                Channel_Values.CHANNEL_NONE,
                0,
                new byte[0],
                out readData,
                out packetHeader,
                out readResponse
                );

            CalculateSmb2AvailableCredits(creditCharge, packetHeader.CreditRequestResponse);
            return(status);
        }
Пример #2
0
        public uint Smb2ReadOverRdmaChannel(
            UInt64 offset,
            uint byteCount,
            byte[] channelBuffer,
            out READ_Response readResponse,
            out byte[] readData,
            Channel_Values channel = Channel_Values.CHANNEL_RDMA_V1
            )
        {
            ushort creditCharge = CalculateCreditCharge(byteCount);

            RequestCreditsFromSmb2Server(creditCharge);

            uint status = this.Read(
                (ushort)creditCharge,
                64,
                Packet_Header_Flags_Values.FLAGS_SIGNED,
                this.messageId,
                this.sessionId,
                this.TreeId,
                byteCount,
                offset,
                this.FileId,
                0,
                channel,
                0,
                channelBuffer,
                out readData,
                out packetHeader,
                out readResponse
                );

            CalculateSmb2AvailableCredits(creditCharge, packetHeader.CreditRequestResponse);
            return(status);
        }
Пример #3
0
        /// <summary>
        /// Receive and validate SMB2 Read Response
        /// </summary>
        /// <param name="readResponseSize">Size of SMB2 read response</param>
        public void ValidateReadResponse(int credits, int readResponseSize)
        {
            // receive read response, maybe in several SMBDirect data transfer messages
            SmbdDataTransferMessage transferPackage = new SmbdDataTransferMessage();

            byte[] readResponsePacket = new byte[readResponseSize];
            int    offset             = 0;

            NtStatus status;

            while (offset < readResponseSize)
            {
                while (smbdAdapter.ClientConnection.ReceiveCredits > 0)
                {
                    status = (NtStatus)smbdAdapter.SmbdReceivDataTransferMessage(
                        smbdAdapter.TestConfig.Smb2ConnectionTimeout,
                        out transferPackage
                        );
                    BaseTestSite.Log.Add(
                        LogEntryKind.Debug,
                        "Received a SMBDirect Data Transfer message, current Connection.ReceiveCredits is {0}", smbdAdapter.ClientConnection.ReceiveCredits);

                    #region Assert
                    BaseTestSite.Assert.AreEqual <NtStatus>(
                        NtStatus.STATUS_SUCCESS,
                        status,
                        "Received SMBDirect Data Transfer Message with status {0}", status);
                    BaseTestSite.Assert.AreEqual <uint>(
                        (uint)(readResponseSize - 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

                    Array.Copy(transferPackage.Buffer, 0, readResponsePacket, offset, transferPackage.DataLength);
                    offset += (int)transferPackage.DataLength;

                    if (transferPackage.RemainingDataLength == 0)
                    {
                        break;
                    }
                }

                BaseTestSite.Assert.IsTrue(transferPackage.CreditsGranted > 0,
                                           "SMBDirect Data Tranfer message with last credit should with CreditsGranted greater than 0");
                #region send empty message to grant credit
                status = NtStatus.STATUS_SUCCESS;
                do
                {
                    status = smbdAdapter.SmbdPostReceive();
                }while (status == NtStatus.STATUS_SUCCESS &&
                        smbdAdapter.ClientConnection.ReceiveCredits < credits);

                // check receive queue before sending
                BaseTestSite.Assert.AreEqual <int>(
                    0,
                    smbdAdapter.ReceiveEntryInQueue,
                    "No message should be sent from server");

                smbdAdapter.SmbdSendDataTransferMessage(
                    smbdAdapter.ClientConnection.SendCreditTarget,
                    (ushort)smbdAdapter.ClientConnection.ReceiveCredits,
                    SmbdDataTransfer_Flags.NONE,
                    0,
                    0,
                    0,
                    new byte[0]);

                BaseTestSite.Log.Add(
                    LogEntryKind.Debug,
                    "Grant {0} credits to peer, current Connection.ReceiveCredits is {0}", smbdAdapter.ClientConnection.ReceiveCredits);

                #endregion
            }

            #region Decode SMB2 READ response and validate
            object        endpoint = new object();
            int           consumedLength;
            int           expectedLength;
            StackPacket[] stackPackets = smbdAdapter.Decoder.Smb2DecodePacketCallback(
                endpoint,
                readResponsePacket,
                out consumedLength,
                out expectedLength);
            Smb2ReadResponsePacket package = (Smb2ReadResponsePacket)stackPackets[0];

            READ_Response readResponse = package.PayLoad;
            BaseTestSite.Assert.AreEqual <NtStatus>(
                NtStatus.STATUS_SUCCESS,
                (NtStatus)package.Header.Status,
                "Status of SMB2 Read File is {0}", (NtStatus)package.Header.Status);
            #endregion
        }