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); }
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); }
/// <summary> /// SMBDirect Negotiate /// </summary> /// <param name="minVersion">The minimum SMBDirect Protocol version supported by the sender</param> /// <param name="maxVersion">The maximum SMBDirect Protocol version supported by the sender</param> /// <param name="creditsRequested">The number of Send Credits requested of the receiver</param> /// <param name="receiveCreditMax">Maximum of receive credits</param> /// <param name="preferredSendSize">The maximum number of bytes that the sender requests to transmit in a single message</param> /// <param name="maxReceiveSize">The maximum number of bytes that the sender can receive in a single message</param> /// <param name="maxFragmentedSize">The maximum number of upper-layer bytes that the sender can receive as the result of a sequence of fragmented Send operations</param> /// <param name="smbdNegotiateResponse">SMBDirect Negotiate response</param> /// <param name="reserved">The sender SHOULD set this field to 0 and the receiver MUST ignore it on receipt</param> /// <returns></returns> public NtStatus Negotiate( SmbdVersion minVersion, SmbdVersion maxVersion, ushort creditsRequested, ushort receiveCreditMax, uint preferredSendSize, uint maxReceiveSize, uint maxFragmentedSize, out SmbdNegotiateResponse smbdNegotiateResponse, ushort reserved = 0 ) { #region set SMBD connection Connection.ReceiveCreditMax = receiveCreditMax; Connection.SendCreditTarget = creditsRequested; Connection.MaxSendSize = preferredSendSize; Connection.MaxFragmentedSize = maxFragmentedSize; Connection.MaxReceiveSize = maxReceiveSize; #endregion smbdNegotiateResponse = new SmbdNegotiateResponse(); // send negotiate message SmbdNegotiateRequest smbdRequest = new SmbdNegotiateRequest(); smbdRequest.MinVersion = minVersion; smbdRequest.MaxVersion = maxVersion; smbdRequest.Reserved = reserved; smbdRequest.CreditsRequested = creditsRequested; smbdRequest.PreferredSendSize = preferredSendSize; smbdRequest.MaxReceiveSize = maxReceiveSize; smbdRequest.MaxFragmentedSize = maxFragmentedSize; byte[] requestBytes = TypeMarshal.ToBytes <SmbdNegotiateRequest>(smbdRequest); // post receive NtStatus ret = Connection.Endpoint.PostReceive((uint)SmbdNegotiateResponse.SIZE); if (ret != NtStatus.STATUS_SUCCESS) { LogEvent(string.Format("Connection.Endpoint.PostReceive with error {0}", ret)); return(ret); } // send message ret = (NtStatus)Connection.Endpoint.SendData(requestBytes); if (ret != NtStatus.STATUS_SUCCESS) { LogEvent(string.Format("Connection.Endpoint.SendData with error {0}", ret)); return(ret); } byte[] responseBytes; try { ret = Connection.Endpoint.ReceiveData( TimeSpan.FromSeconds(SmbdConnection.ACTIVE_NEGOTIATION_TIMEOUT), out responseBytes); if (ret != NtStatus.STATUS_SUCCESS) { LogEvent(string.Format("Connection.Endpoint.ReceiveData with error {0}", ret)); return(ret); } } catch (TimeoutException e) { LogEvent(string.Format("Do not get the SMBD negotiate response within {0} seconds", SmbdConnection.ACTIVE_NEGOTIATION_TIMEOUT)); throw new TimeoutException(e.Message); } smbdNegotiateResponse = TypeMarshal.ToStruct <SmbdNegotiateResponse>(responseBytes); if ((NtStatus)smbdNegotiateResponse.Status != NtStatus.STATUS_SUCCESS) { LogEvent(string.Format("SMBDirect Negotiate response with status {0}", (NtStatus)smbdNegotiateResponse.Status)); return((NtStatus)smbdNegotiateResponse.Status); } #region set connection parameters Connection.Protocol = SmbdVersion.V1; Connection.ReceiveCreditTarget = smbdNegotiateResponse.CreditsRequested; Connection.MaxReceiveSize = Smaller(Connection.MaxReceiveSize, smbdNegotiateResponse.PreferredSendSize); Connection.MaxSendSize = Smaller(Connection.MaxSendSize, smbdNegotiateResponse.MaxReceiveSize); Connection.MaxReadWriteSize = Smaller(smbdNegotiateResponse.MaxReadWriteSize, SmbdConnection.FLOOR_MAX_READ_WRITE_SIZE); Connection.SendCredits = smbdNegotiateResponse.CreditsGranted; #endregion Connection.Role = SmbdRole.ESTABLISHED; try { Connection.FragmentReassemblyBuffer = new byte[Connection.MaxFragmentedSize]; } catch (OverflowException) { Connection.MaxFragmentedSize = smbdNegotiateResponse.MaxFragmentedSize; Connection.FragmentReassemblyBuffer = new byte[Connection.MaxFragmentedSize]; } return((NtStatus)smbdNegotiateResponse.Status); }
/// <summary> /// SMBDirect Negotiate /// </summary> /// <param name="minVersion">The minimum SMBDirect Protocol version supported by the sender</param> /// <param name="maxVersion">The maximum SMBDirect Protocol version supported by the sender</param> /// <param name="creditsRequested">The number of Send Credits requested of the receiver</param> /// <param name="receiveCreditMax">Maximum of receive credits</param> /// <param name="preferredSendSize">The maximum number of bytes that the sender requests to transmit in a single message</param> /// <param name="maxReceiveSize">The maximum number of bytes that the sender can receive in a single message</param> /// <param name="maxFragmentedSize">The maximum number of upper-layer bytes that the sender can receive as the result of a sequence of fragmented Send operations</param> /// <param name="smbdNegotiateResponse">SMBDirect Negotiate response</param> /// <param name="reserved">The sender SHOULD set this field to 0 and the receiver MUST ignore it on receipt</param> /// <returns></returns> public NtStatus Negotiate( SmbdVersion minVersion, SmbdVersion maxVersion, ushort creditsRequested, ushort receiveCreditMax, uint preferredSendSize, uint maxReceiveSize, uint maxFragmentedSize, out SmbdNegotiateResponse smbdNegotiateResponse, ushort reserved = 0 ) { #region set SMBD connection Connection.ReceiveCreditMax = receiveCreditMax; Connection.SendCreditTarget = creditsRequested; Connection.MaxSendSize = preferredSendSize; Connection.MaxFragmentedSize = maxFragmentedSize; Connection.MaxReceiveSize = maxReceiveSize; #endregion smbdNegotiateResponse = new SmbdNegotiateResponse(); // send negotiate message SmbdNegotiateRequest smbdRequest = new SmbdNegotiateRequest(); smbdRequest.MinVersion = minVersion; smbdRequest.MaxVersion = maxVersion; smbdRequest.Reserved = reserved; smbdRequest.CreditsRequested = creditsRequested; smbdRequest.PreferredSendSize = preferredSendSize; smbdRequest.MaxReceiveSize = maxReceiveSize; smbdRequest.MaxFragmentedSize = maxFragmentedSize; byte[] requestBytes = TypeMarshal.ToBytes<SmbdNegotiateRequest>(smbdRequest); // post receive NtStatus ret = Connection.Endpoint.PostReceive((uint)SmbdNegotiateResponse.SIZE); if (ret != NtStatus.STATUS_SUCCESS) { LogEvent(string.Format("Connection.Endpoint.PostReceive with error {0}", ret)); return ret; } // send message ret = (NtStatus)Connection.Endpoint.SendData(requestBytes); if (ret != NtStatus.STATUS_SUCCESS) { LogEvent(string.Format("Connection.Endpoint.SendData with error {0}", ret)); return ret; } byte[] responseBytes; try { ret = Connection.Endpoint.ReceiveData( TimeSpan.FromSeconds(SmbdConnection.ACTIVE_NEGOTIATION_TIMEOUT), out responseBytes); if (ret != NtStatus.STATUS_SUCCESS) { LogEvent(string.Format("Connection.Endpoint.ReceiveData with error {0}", ret)); return ret; } } catch (TimeoutException e) { LogEvent(string.Format("Do not get the SMBD negotiate response within {0} seconds", SmbdConnection.ACTIVE_NEGOTIATION_TIMEOUT)); throw new TimeoutException(e.Message); } smbdNegotiateResponse = TypeMarshal.ToStruct<SmbdNegotiateResponse>(responseBytes); if ((NtStatus)smbdNegotiateResponse.Status != NtStatus.STATUS_SUCCESS) { LogEvent(string.Format("SMBDirect Negotiate response with status {0}", (NtStatus)smbdNegotiateResponse.Status)); return (NtStatus)smbdNegotiateResponse.Status; } #region set connection parameters Connection.Protocol = SmbdVersion.V1; Connection.ReceiveCreditTarget = smbdNegotiateResponse.CreditsRequested; Connection.MaxReceiveSize = Smaller(Connection.MaxReceiveSize, smbdNegotiateResponse.PreferredSendSize); Connection.MaxSendSize = Smaller(Connection.MaxSendSize, smbdNegotiateResponse.MaxReceiveSize); Connection.MaxReadWriteSize = Smaller(smbdNegotiateResponse.MaxReadWriteSize, SmbdConnection.FLOOR_MAX_READ_WRITE_SIZE); Connection.SendCredits = smbdNegotiateResponse.CreditsGranted; #endregion Connection.Role = SmbdRole.ESTABLISHED; try { Connection.FragmentReassemblyBuffer = new byte[Connection.MaxFragmentedSize]; } catch (OverflowException) { Connection.MaxFragmentedSize = smbdNegotiateResponse.MaxFragmentedSize; Connection.FragmentReassemblyBuffer = new byte[Connection.MaxFragmentedSize]; } return (NtStatus)smbdNegotiateResponse.Status; }
public NtStatus SmbdNegotiate( ushort sendCreditTarget, ushort receiveCreditMax, out SmbdNegotiateResponse response) { return client.SmbdNegotiate( SmbdVersion.V1, SmbdVersion.V1, 0, sendCreditTarget, receiveCreditMax, (uint)testConfig.MaxSendSize, (uint)testConfig.MaxReceiveSize, (uint)testConfig.MaxFragmentedSize, out response ); }
public NtStatus SmbdNegotiate( uint preferredSendSize, uint maxReceiveSize, uint maxFragmentSize, out SmbdNegotiateResponse response ) { return client.SmbdNegotiate( SmbdVersion.V1, SmbdVersion.V1, 0, (ushort)testConfig.SendCreditTarget, (ushort)testConfig.ReceiveCreditMax, preferredSendSize, maxReceiveSize, maxFragmentSize, out response ); }
public NtStatus SmbdNegotiate( ushort creditsRequested, ushort receiveCreditsMax, uint preferredSendSize, uint maxReceiveSize, uint maxFragmentSize, out SmbdNegotiateResponse response, SmbdVersion minVersion = SmbdVersion.V1, SmbdVersion maxVersion = SmbdVersion.V1 ) { return client.SmbdNegotiate( minVersion, maxVersion, 0, creditsRequested, receiveCreditsMax, preferredSendSize, maxReceiveSize, maxFragmentSize, out response ); }