private LoginResponsePDU GetLoginResponsePDU(LoginRequestPDU request, ConnectionParameters connection) { // RFC 3720: The numbering fields (StatSN, ExpCmdSN, MaxCmdSN) are only valid if status-Class is 0. // RFC 3720: Command numbering starts with the first login request on the first connection of a session if (request.Continue) { connection.AddTextToSequence(request.InitiatorTaskTag, request.LoginParametersText); return(GetPartialLoginResponsePDU(request, connection)); } else { string text = connection.AddTextToSequence(request.InitiatorTaskTag, request.LoginParametersText); connection.RemoveTextSequence(request.InitiatorTaskTag); KeyValuePairList <string, string> loginParameters = KeyValuePairUtils.GetKeyValuePairList(text); if (connection.Session == null) { LoginResponseStatusName status = SetUpSession(request, loginParameters, connection); if (status != LoginResponseStatusName.Success) { LoginResponsePDU response = GetLoginResponseTemplate(request); response.Transit = request.Transit; response.Status = status; return(response); } } return(GetFinalLoginResponsePDU(request, loginParameters, connection)); } }
public LoginResponsePDU(byte[] buffer, int offset) : base(buffer, offset) { Transit = Final; // the Transit bit replaces the Final bit Continue = (OpCodeSpecificHeader[0] & 0x40) != 0; CurrentStage = (byte)((OpCodeSpecificHeader[0] & 0x0C) >> 2); NextStage = (byte)(OpCodeSpecificHeader[0] & 0x03); VersionMax = OpCodeSpecificHeader[1]; VersionActive = OpCodeSpecificHeader[2]; ISID = (ulong)BigEndianConverter.ToUInt32(LUNOrOpCodeSpecific, 0) << 16 | BigEndianConverter.ToUInt16(LUNOrOpCodeSpecific, 4); TSIH = BigEndianConverter.ToUInt16(LUNOrOpCodeSpecific, 6); StatSN = BigEndianConverter.ToUInt32(OpCodeSpecific, 4); ExpCmdSN = BigEndianConverter.ToUInt32(OpCodeSpecific, 8); MaxCmdSN = BigEndianConverter.ToUInt32(OpCodeSpecific, 12); Status = (LoginResponseStatusName)BigEndianConverter.ToUInt16(OpCodeSpecific, 16); string parametersString = Encoding.ASCII.GetString(Data); LoginParameters = KeyValuePairUtils.GetKeyValuePairList(parametersString); }