public uint Smb2WriteOverRdmaChannel( UInt64 offset, byte[] writeChannelInfo, uint length, out WRITE_Response responsePayload, Channel_Values channel = Channel_Values.CHANNEL_RDMA_V1 ) { ushort creditCharge = CalculateCreditCharge(length); RequestCreditsFromSmb2Server(creditCharge); uint status = this.Smb2WriteOverRdmaChannel( creditCharge, 64, offset, writeChannelInfo, length, out responsePayload, channel ); CalculateSmb2AvailableCredits(creditCharge, packetHeader.CreditRequestResponse); return(status); }
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); }
private uint Smb2WriteOverRdmaChannel( ushort creditCharge, ushort creditRequest, UInt64 offset, byte[] writeChannelInfo, uint length, out WRITE_Response responsePayload, Channel_Values channel = Channel_Values.CHANNEL_RDMA_V1 ) { WriteRequest( creditCharge, creditRequest, Packet_Header_Flags_Values.FLAGS_SIGNED, messageId, sessionId, TreeId, offset, FileId, channel, WRITE_Request_Flags_Values.None, writeChannelInfo, new byte[length] ); return(WriteResponse(messageId, out this.packetHeader, out responsePayload)); }
public void SMBDRead(uint treeId, FILEID fileId, Channel_Values channel, out byte[] buffer, uint offset, uint length, RDMAEndian endian) { NtStatus status; SmbdBufferDescriptorV1 descriptor; status = smbdClient.RegisterBuffer( (uint)length, SmbdBufferReadWrite.RDMA_WRITE_PERMISSION_FOR_READ_FILE, endianMap[endian], out descriptor ); if (status != NtStatus.STATUS_SUCCESS) { throw new InvalidOperationException("SMBD register buffer failed!"); } byte[] channelInfo = TypeMarshal.ToBytes(descriptor); Packet_Header packetHeader; READ_Response response; status = (NtStatus)Read( 0, RequestAndConsumeCredit(), signingRequired ? Packet_Header_Flags_Values.FLAGS_SIGNED : Packet_Header_Flags_Values.NONE, GetMessageId(), sessionId, treeId, length, offset, fileId, length, channel, 0, channelInfo, out buffer, out packetHeader, out response ); UpdateCredit(packetHeader); if (status != NtStatus.STATUS_SUCCESS) { throw new InvalidOperationException("Read through SMBD failed!"); } buffer = new byte[length]; status = smbdClient.ReadRegisteredBuffer(buffer, descriptor); if (status != NtStatus.STATUS_SUCCESS) { throw new InvalidOperationException("SMBD write buffer failed!"); } }
private bool CheckSMBDReadWrite(DialectRevision[] dialects, Channel_Values channel) { try { using (var client = new SMBDClient(DetectionInfo.ConnectionTimeout)) { var config = DetectionInfo.SMBDClientCapability; RdmaAdapterInfo rdmaAdapterInfo; client.ConnectOverRDMA(DetectionInfo.DriverRdmaNICIPAddress, DetectionInfo.SUTRdmaNICIPAddress, DetectionInfo.SMBDPort, config.MaxReceiveSize, out rdmaAdapterInfo); client.SMBDNegotiate( config.CreditsRequested, config.ReceiveCreditMax, config.PreferredSendSize, config.MaxReceiveSize, config.MaxFragmentedSize ); client.Smb2Negotiate(dialects); client.Smb2SessionSetup(DetectionInfo.Authentication, DetectionInfo.DomainName, DetectionInfo.SUTName, DetectionInfo.UserName, DetectionInfo.Password); string path = Smb2Utility.GetUncPath(DetectionInfo.SUTName, DetectionInfo.ShareFolder); uint treeId; client.Smb2TreeConnect(path, out treeId); FILEID fileId; client.CreateRandomFile(treeId, out fileId); uint length = client.CalculateSMBDMaxReadWriteSize(); var buffer = Smb2Utility.CreateRandomByteArray((int)length); client.SMBDWrite(treeId, fileId, channel, buffer, 0, DetectionInfo.Endian); var readBuffer = new byte[length]; client.SMBDRead(treeId, fileId, channel, out readBuffer, 0, length, DetectionInfo.Endian); if (!Enumerable.SequenceEqual(buffer, readBuffer)) { throw new InvalidOperationException("The data is inconsistent for write and read!"); } return(true); } } catch (Exception ex) { DetectorUtil.WriteLog(String.Format("CheckSMBDReadWrite threw exception: {0}", ex)); return(false); } }
protected NtStatus Smb2WriteOverRdma(string fileName, byte[] content, Channel_Values channel, SmbdBufferDescriptorV1 descp) { smbdAdapter.SmbdWriteRegisteredBuffer(content, descp); byte[] channelInfo = TypeMarshal.ToBytes <SmbdBufferDescriptorV1>(descp); WRITE_Response writeResponse; return((NtStatus)smbdAdapter.Smb2WriteOverRdmaChannel( 0, channelInfo, (uint)content.Length, out writeResponse, channel)); }
private uint Smb2WriteOverRdmaChannel( ushort creditCharge, ushort creditRequest, UInt64 offset, byte[] writeChannelInfo, uint length, out WRITE_Response responsePayload, Channel_Values channel = Channel_Values.CHANNEL_RDMA_V1 ) { var request = new Smb2WriteRequestPacket(); request.Header.CreditCharge = creditCharge; request.Header.Command = Smb2Command.WRITE; request.Header.CreditRequestResponse = creditRequest; request.Header.Flags = Packet_Header_Flags_Values.FLAGS_SIGNED; request.Header.MessageId = messageId; request.Header.TreeId = TreeId; request.Header.SessionId = sessionId; request.PayLoad.Length = 0; request.PayLoad.Offset = offset; request.PayLoad.FileId = FileId; request.PayLoad.Channel = channel; request.PayLoad.RemainingBytes = length; // not described in TD. Get from capture package request.PayLoad.WriteChannelInfoOffset = request.BufferOffset; request.PayLoad.WriteChannelInfoLength = (ushort)writeChannelInfo.Length; request.PayLoad.DataOffset = 0; request.PayLoad.Flags = WRITE_Request_Flags_Values.None; request.Buffer = writeChannelInfo; SendPacket(request); return(WriteResponse(messageId, out this.packetHeader, out responsePayload)); }
protected NtStatus Smb2WriteOverRdma(string fileName, byte[] content, Channel_Values channel, SmbdBufferDescriptorV1 descp) { smbdAdapter.SmbdWriteRegisteredBuffer(content, descp); byte[] channelInfo = TypeMarshal.ToBytes<SmbdBufferDescriptorV1>(descp); WRITE_Response writeResponse; return (NtStatus)smbdAdapter.Smb2WriteOverRdmaChannel( 0, channelInfo, (uint)content.Length, out writeResponse, channel); }
public void SMBDWrite(uint treeId, FILEID fileId, Channel_Values channel, byte[] buffer, uint offset, RDMAEndian endian) { NtStatus status; SmbdBufferDescriptorV1 descriptor; status = smbdClient.RegisterBuffer( (uint)buffer.Length, SmbdBufferReadWrite.RDMA_READ_PERMISSION_FOR_WRITE_FILE, endianMap[endian], out descriptor ); if (status != NtStatus.STATUS_SUCCESS) { throw new InvalidOperationException("SMBD register buffer failed!"); } status = smbdClient.WriteRegisteredBuffer(buffer, descriptor); if (status != NtStatus.STATUS_SUCCESS) { throw new InvalidOperationException("SMBD write buffer failed!"); } byte[] channelInfo = TypeMarshal.ToBytes(descriptor); Packet_Header packetHeader; WRITE_Response response; // Pack WRITE request manually since the DataOffset and RemainingBytes need to be fixed. var request = new Smb2WriteRequestPacket(); request.Header.CreditCharge = 0; request.Header.CreditRequestResponse = RequestAndConsumeCredit(); request.Header.Flags = signingRequired ? Packet_Header_Flags_Values.FLAGS_SIGNED : Packet_Header_Flags_Values.NONE; request.Header.MessageId = GetMessageId(); request.Header.SessionId = sessionId; request.Header.TreeId = treeId; request.Header.Command = Smb2Command.WRITE; request.PayLoad.Offset = 0; request.PayLoad.FileId = fileId; request.PayLoad.Channel = channel; request.PayLoad.Flags = WRITE_Request_Flags_Values.None; request.PayLoad.Length = 0; request.PayLoad.RemainingBytes = (uint)buffer.Length; request.PayLoad.DataOffset = 0; request.PayLoad.WriteChannelInfoLength = (ushort)channelInfo.Length; request.PayLoad.WriteChannelInfoOffset = request.BufferOffset; request.Buffer = channelInfo; SendPacket(request); status = (NtStatus)WriteResponse(messageId, out packetHeader, out response); UpdateCredit(packetHeader); if (status != NtStatus.STATUS_SUCCESS) { throw new InvalidOperationException("Write through SMBD failed!"); } }
public uint Smb2WriteOverRdmaChannel( UInt64 offset, byte[] channelInfo, uint length, out WRITE_Response writeResponse, Channel_Values channel = Channel_Values.CHANNEL_RDMA_V1) { return client.Smb2WriteOverRdmaChannel( offset, channelInfo, length, out writeResponse, channel); }
public uint Smb2ReadOverRdmaChannel( UInt64 offset, uint byteCount, byte[] channelBuffer, out READ_Response readResponse, out byte[] readData, Channel_Values channel = Channel_Values.CHANNEL_RDMA_V1) { return client.Smb2ReadOverRdmaChannel( offset, byteCount, channelBuffer, out readResponse, out readData, channel); }