Exemple #1
0
 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);
        }