Jelajahi Sumber

Renamed SessionParameters to ISCSISession, moved Target from ConnectionState to ISCSISession

Tal Aloni 8 tahun lalu
induk
melakukan
0071852b1d

+ 14 - 14
ISCSI/ISCSI.Client/ClientHelper.cs

@@ -15,7 +15,7 @@ namespace ISCSI.Client
     public class ClientHelper
     {
         /// <param name="targetName">Set to null for discovery session</param>
-        internal static LoginRequestPDU GetFirstStageLoginRequest(string initiatorName, string targetName, SessionParameters session, ConnectionParameters connection)
+        internal static LoginRequestPDU GetFirstStageLoginRequest(string initiatorName, string targetName, ISCSISession session, ConnectionParameters connection)
         {
             LoginRequestPDU request = new LoginRequestPDU();
             request.InitiatorTaskTag = session.GetNextTaskTag();
@@ -49,7 +49,7 @@ namespace ISCSI.Client
             return request;
         }
 
-        internal static LoginRequestPDU GetSecondStageLoginRequest(LoginResponsePDU firstStageResponse, SessionParameters session, ConnectionParameters connection, bool isDiscovery)
+        internal static LoginRequestPDU GetSecondStageLoginRequest(LoginResponsePDU firstStageResponse, ISCSISession session, ConnectionParameters connection, bool isDiscovery)
         {
             LoginRequestPDU request = new LoginRequestPDU();
             request.ISID = firstStageResponse.ISID;
@@ -83,7 +83,7 @@ namespace ISCSI.Client
             return request;
         }
 
-        internal static LoginRequestPDU GetSingleStageLoginRequest(string initiatorName, string targetName, SessionParameters session, ConnectionParameters connection)
+        internal static LoginRequestPDU GetSingleStageLoginRequest(string initiatorName, string targetName, ISCSISession session, ConnectionParameters connection)
         {
             LoginRequestPDU request = new LoginRequestPDU();
             request.ISID = session.ISID;
@@ -126,7 +126,7 @@ namespace ISCSI.Client
             return request;
         }
 
-        internal static void UpdateOperationalParameters(KeyValuePairList<string, string> loginParameters, SessionParameters session, ConnectionParameters connection)
+        internal static void UpdateOperationalParameters(KeyValuePairList<string, string> loginParameters, ISCSISession session, ConnectionParameters connection)
         {
             string value = loginParameters.ValueOf("MaxRecvDataSegmentLength");
             if (value != null)
@@ -245,7 +245,7 @@ namespace ISCSI.Client
             }
         }
 
-        internal static LogoutRequestPDU GetLogoutRequest(SessionParameters session, ConnectionParameters connection)
+        internal static LogoutRequestPDU GetLogoutRequest(ISCSISession session, ConnectionParameters connection)
         {
             LogoutRequestPDU request = new LogoutRequestPDU();
             request.ReasonCode = LogoutReasonCode.CloseTheSession;
@@ -256,7 +256,7 @@ namespace ISCSI.Client
             return request;
         }
 
-        internal static TextRequestPDU GetSendTargetsRequest(SessionParameters session, ConnectionParameters connection)
+        internal static TextRequestPDU GetSendTargetsRequest(ISCSISession session, ConnectionParameters connection)
         {
             TextRequestPDU request = new TextRequestPDU();
             request.Text = "SendTargets=All";
@@ -267,7 +267,7 @@ namespace ISCSI.Client
             return request;
         }
 
-        internal static SCSICommandPDU GetReportLUNsCommand(SessionParameters session, ConnectionParameters connection, uint allocationLength)
+        internal static SCSICommandPDU GetReportLUNsCommand(ISCSISession session, ConnectionParameters connection, uint allocationLength)
         {
             SCSICommandDescriptorBlock reportLUNs = SCSICommandDescriptorBlock.Create(SCSIOpCodeName.ReportLUNs);
             reportLUNs.TransferLength = allocationLength;
@@ -282,7 +282,7 @@ namespace ISCSI.Client
             return scsiCommand;
         }
 
-        internal static SCSICommandPDU GetReadCapacity10Command(SessionParameters session, ConnectionParameters connection, ushort LUN)
+        internal static SCSICommandPDU GetReadCapacity10Command(ISCSISession session, ConnectionParameters connection, ushort LUN)
         {
             SCSICommandDescriptorBlock readCapacity10 = SCSICommandDescriptorBlock.Create(SCSIOpCodeName.ReadCapacity10);
             readCapacity10.TransferLength = ReadCapacity10Parameter.Length;
@@ -298,7 +298,7 @@ namespace ISCSI.Client
             return scsiCommand;
         }
 
-        internal static SCSICommandPDU GetReadCapacity16Command(SessionParameters session, ConnectionParameters connection, ushort LUN)
+        internal static SCSICommandPDU GetReadCapacity16Command(ISCSISession session, ConnectionParameters connection, ushort LUN)
         {
             SCSICommandDescriptorBlock serviceActionIn = SCSICommandDescriptorBlock.Create(SCSIOpCodeName.ServiceActionIn);
             serviceActionIn.ServiceAction = ServiceAction.ReadCapacity16;
@@ -315,7 +315,7 @@ namespace ISCSI.Client
             return scsiCommand;
         }
 
-        internal static SCSICommandPDU GetRead16Command(SessionParameters session, ConnectionParameters connection, ushort LUN, ulong sectorIndex, uint sectorCount, int bytesPerSector)
+        internal static SCSICommandPDU GetRead16Command(ISCSISession session, ConnectionParameters connection, ushort LUN, ulong sectorIndex, uint sectorCount, int bytesPerSector)
         {
             SCSICommandDescriptorBlock read16 = SCSICommandDescriptorBlock.Create(SCSIOpCodeName.Read16);
             read16.LogicalBlockAddress64 = sectorIndex;
@@ -332,7 +332,7 @@ namespace ISCSI.Client
             return scsiCommand;
         }
 
-        internal static SCSICommandPDU GetWrite16Command(SessionParameters session, ConnectionParameters connection, ushort LUN, ulong sectorIndex, byte[] data, int bytesPerSector)
+        internal static SCSICommandPDU GetWrite16Command(ISCSISession session, ConnectionParameters connection, ushort LUN, ulong sectorIndex, byte[] data, int bytesPerSector)
         {
             SCSICommandDescriptorBlock write16 = SCSICommandDescriptorBlock.Create(SCSIOpCodeName.Write16);
             write16.LogicalBlockAddress64 = sectorIndex;
@@ -354,7 +354,7 @@ namespace ISCSI.Client
             return scsiCommand;
         }
 
-        internal static List<SCSIDataOutPDU> GetWriteData(SessionParameters session, ConnectionParameters connection, ushort LUN, ulong sectorIndex, byte[] data, int bytesPerSector, ReadyToTransferPDU readyToTransfer)
+        internal static List<SCSIDataOutPDU> GetWriteData(ISCSISession session, ConnectionParameters connection, ushort LUN, ulong sectorIndex, byte[] data, int bytesPerSector, ReadyToTransferPDU readyToTransfer)
         {
             List<SCSIDataOutPDU> result = new List<SCSIDataOutPDU>();
             // if readyToTransfer.DesiredDataTransferLength <= connection.TargetMaxRecvDataSegmentLength we must send multiple Data-Out PDUs
@@ -378,7 +378,7 @@ namespace ISCSI.Client
             return result;
         }
 
-        internal static NOPOutPDU GetPingRequest(SessionParameters session, ConnectionParameters connection)
+        internal static NOPOutPDU GetPingRequest(ISCSISession session, ConnectionParameters connection)
         {
             // Microsoft iSCSI Target v3.1 expects that CmdSN won't be incremented after this request regardless of whether the ImmediateDelivery bit is set or not,
             // So we set the ImmediateDelivery bit to work around the issue.
@@ -392,7 +392,7 @@ namespace ISCSI.Client
             return request;
         }
 
-        internal static NOPOutPDU GetPingResponse(NOPInPDU request, SessionParameters session, ConnectionParameters connection)
+        internal static NOPOutPDU GetPingResponse(NOPInPDU request, ISCSISession session, ConnectionParameters connection)
         {
             NOPOutPDU response = new NOPOutPDU();
             // If the Initiator Task Tag contains 0xffffffff, the I bit MUST be set to 1 and the CmdSN is not advanced after this PDU is sent.

+ 1 - 1
ISCSI/ISCSI.Client/ISCSIClient.cs

@@ -19,7 +19,7 @@ namespace ISCSI.Client
 {
     public partial class ISCSIClient
     {
-        private SessionParameters m_session = new SessionParameters();
+        private ISCSISession m_session = new ISCSISession();
         private ConnectionParameters m_connection = new ConnectionParameters();
 
         private string m_initiatorName;

+ 1 - 1
ISCSI/ISCSI.Client/SessionParameters.cs

@@ -10,7 +10,7 @@ using System.Text;
 
 namespace ISCSI.Client
 {
-    public class SessionParameters
+    public class ISCSISession
     {
         public ulong ISID; // Initiator Session ID
         public ushort TSIH; // Target Session Identifying Handle

+ 6 - 6
ISCSI/ISCSI.Server/ConnectionManager.cs

@@ -24,7 +24,7 @@ namespace ISCSI.Server
 
         public bool RemoveConnection(ConnectionState connection)
         {
-            return RemoveConnection(connection.SessionParameters.ISID, connection.SessionParameters.TSIH, connection.ConnectionParameters.CID);
+            return RemoveConnection(connection.Session.ISID, connection.Session.TSIH, connection.ConnectionParameters.CID);
         }
 
         public bool RemoveConnection(ulong isid, ushort tsih, ushort cid)
@@ -43,7 +43,7 @@ namespace ISCSI.Server
 
         public ConnectionState FindConnection(ConnectionState connection)
         {
-            return FindConnection(connection.SessionParameters.ISID, connection.SessionParameters.TSIH, connection.ConnectionParameters.CID);
+            return FindConnection(connection.Session.ISID, connection.Session.TSIH, connection.ConnectionParameters.CID);
         }
 
         public ConnectionState FindConnection(ulong isid, ushort tsih, ushort cid)
@@ -66,8 +66,8 @@ namespace ISCSI.Server
             {
                 for (int index = 0; index < m_activeConnections.Count; index++)
                 {
-                    if (m_activeConnections[index].SessionParameters.ISID == isid &&
-                        m_activeConnections[index].SessionParameters.TSIH == tsih)
+                    if (m_activeConnections[index].Session.ISID == isid &&
+                        m_activeConnections[index].Session.TSIH == tsih)
                     {
                         result.Add(m_activeConnections[index]);
                     }
@@ -80,8 +80,8 @@ namespace ISCSI.Server
         {
             for (int index = 0; index < m_activeConnections.Count; index++)
             {
-                if (m_activeConnections[index].SessionParameters.ISID == isid &&
-                    m_activeConnections[index].SessionParameters.TSIH == tsih &&
+                if (m_activeConnections[index].Session.ISID == isid &&
+                    m_activeConnections[index].Session.TSIH == tsih &&
                     m_activeConnections[index].ConnectionParameters.CID == cid)
                 {
                     return index;

+ 11 - 4
ISCSI/ISCSI.Server/ConnectionState.cs

@@ -26,8 +26,7 @@ namespace ISCSI.Server
         public byte[] ReceiveBuffer = new byte[ReceiveBufferSize]; // immediate receive buffer
         public byte[] ConnectionBuffer = new byte[0]; // we append the receive buffer here until we have a complete PDU
 
-        public ISCSITarget Target; // Across all connections within a session, an initiator sees one and the same target.
-        public SessionParameters SessionParameters = new SessionParameters();
+        public ISCSISession Session = new ISCSISession();
         public ConnectionParameters ConnectionParameters = new ConnectionParameters();
 
         public CountdownLatch RunningSCSICommands = new CountdownLatch();
@@ -45,11 +44,19 @@ namespace ISCSI.Server
         {
             get
             {
-                return GetConnectionIdentifier(SessionParameters, ConnectionParameters);
+                return GetConnectionIdentifier(Session, ConnectionParameters);
             }
         }
 
-        public static string GetConnectionIdentifier(SessionParameters session, ConnectionParameters connection)
+        public ISCSITarget Target
+        {
+            get
+            {
+                return Session.Target;
+            }
+        }
+
+        public static string GetConnectionIdentifier(ISCSISession session, ConnectionParameters connection)
         {
             return String.Format("ISID={0},TSIH={1},CID={2}", session.ISID.ToString("x"), session.TSIH.ToString("x"), connection.CID.ToString("x"));
         }

+ 18 - 18
ISCSI/ISCSI.Server/ISCSIServer.cs

@@ -279,9 +279,9 @@ namespace ISCSI.Server
             // except for commands that are retransmitted due to digest error recovery and connection recovery.
             if (cmdSN.HasValue)
             {
-                if (state.SessionParameters.CommandNumberingStarted)
+                if (state.Session.CommandNumberingStarted)
                 {
-                    if (cmdSN != state.SessionParameters.ExpCmdSN)
+                    if (cmdSN != state.Session.ExpCmdSN)
                     {
                         Log(Severity.Error, "[{0}] CmdSN outside of expected range", state.ConnectionIdentifier);
                         // We ignore this PDU
@@ -291,20 +291,20 @@ namespace ISCSI.Server
                 }
                 else
                 {
-                    state.SessionParameters.ExpCmdSN = cmdSN.Value;
-                    state.SessionParameters.CommandNumberingStarted = true;
+                    state.Session.ExpCmdSN = cmdSN.Value;
+                    state.Session.CommandNumberingStarted = true;
                 }
 
                 if (pdu is LogoutRequestPDU || pdu is TextRequestPDU || pdu is SCSICommandPDU || pdu is RejectPDU)
                 {
                     if (!pdu.ImmediateDelivery)
                     {
-                        state.SessionParameters.ExpCmdSN++;
+                        state.Session.ExpCmdSN++;
                     }
                 }
             }
 
-            if (!state.SessionParameters.IsFullFeaturePhase)
+            if (!state.Session.IsFullFeaturePhase)
             {
                 if (pdu is LoginRequestPDU)
                 {
@@ -327,10 +327,10 @@ namespace ISCSI.Server
                             Log(Severity.Verbose, "[{0}] Implicit logout completed", state.ConnectionIdentifier);
                         }
                     }
-                    LoginResponsePDU response = ServerResponseHelper.GetLoginResponsePDU(request, m_targets, state.SessionParameters, state.ConnectionParameters, ref state.Target, GetNextTSIH);
-                    if (state.SessionParameters.IsFullFeaturePhase)
+                    LoginResponsePDU response = ServerResponseHelper.GetLoginResponsePDU(request, m_targets, state.Session, state.ConnectionParameters, GetNextTSIH);
+                    if (state.Session.IsFullFeaturePhase)
                     {
-                        state.SessionParameters.ISID = request.ISID;
+                        state.Session.ISID = request.ISID;
                         state.ConnectionParameters.CID = request.CID;
                         m_connectionManager.AddConnection(state);
                     }
@@ -341,7 +341,7 @@ namespace ISCSI.Server
                 {
                     // Before the Full Feature Phase is established, only Login Request and Login Response PDUs are allowed.
                     Log(Severity.Error, "[{0}] Improper command during login phase, OpCode: 0x{1}", state.ConnectionIdentifier, pdu.OpCode.ToString("x"));
-                    if (state.SessionParameters.TSIH == 0)
+                    if (state.Session.TSIH == 0)
                     {
                         // A target receiving any PDU except a Login request before the Login phase is started MUST
                         // immediately terminate the connection on which the PDU was received.
@@ -352,7 +352,7 @@ namespace ISCSI.Server
                         // Once the Login phase has started, if the target receives any PDU except a Login request,
                         // it MUST send a Login reject (with Status "invalid during login") and then disconnect.
                         LoginResponsePDU loginResponse = new LoginResponsePDU();
-                        loginResponse.TSIH = state.SessionParameters.TSIH;
+                        loginResponse.TSIH = state.Session.TSIH;
                         loginResponse.Status = LoginResponseStatusName.InvalidDuringLogon;
                         state.SendQueue.Enqueue(loginResponse);
                     }
@@ -370,7 +370,7 @@ namespace ISCSI.Server
                 {
                     Log(Severity.Verbose, "[{0}] Logour Request", state.ConnectionIdentifier);
                     LogoutRequestPDU request = (LogoutRequestPDU)pdu;
-                    if (state.SessionParameters.IsDiscovery && request.ReasonCode != LogoutReasonCode.CloseTheSession)
+                    if (state.Session.IsDiscovery && request.ReasonCode != LogoutReasonCode.CloseTheSession)
                     {
                         // RFC 3720: Discovery-session: The target MUST ONLY accept [..] logout request with the reason "close the session"
                         RejectPDU reject = new RejectPDU();
@@ -383,12 +383,12 @@ namespace ISCSI.Server
                         List<ConnectionState> connectionsToClose = new List<ConnectionState>();
                         if (request.ReasonCode == LogoutReasonCode.CloseTheSession)
                         {
-                            connectionsToClose = m_connectionManager.GetSessionConnections(state.SessionParameters.ISID, state.SessionParameters.TSIH);
+                            connectionsToClose = m_connectionManager.GetSessionConnections(state.Session.ISID, state.Session.TSIH);
                         }
                         else
                         {
                             // RFC 3720: A Logout for a CID may be performed on a different transport connection when the TCP connection for the CID has already been terminated.
-                            ConnectionState existingConnection = m_connectionManager.FindConnection(state.SessionParameters.ISID, state.SessionParameters.TSIH, request.CID);
+                            ConnectionState existingConnection = m_connectionManager.FindConnection(state.Session.ISID, state.Session.TSIH, request.CID);
                             if (existingConnection != null && existingConnection != state)
                             {
                                 connectionsToClose.Add(existingConnection);
@@ -411,7 +411,7 @@ namespace ISCSI.Server
                         // connection will be closed after a LogoutResponsePDU has been sent.
                     }
                 }
-                else if (state.SessionParameters.IsDiscovery)
+                else if (state.Session.IsDiscovery)
                 {
                     // The target MUST ONLY accept text requests with the SendTargets key and a logout
                     // request with the reason "close the session".  All other requests MUST be rejected.
@@ -443,7 +443,7 @@ namespace ISCSI.Server
                         Log(Severity.Debug, "[{0}] SCSIDataOutPDU: Target transfer tag: {1}, LUN: {2}, Buffer offset: {3}, Data segment length: {4}, DataSN: {5}, Final: {6}", state.ConnectionIdentifier, request.TargetTransferTag, (ushort)request.LUN, request.BufferOffset, request.DataSegmentLength, request.DataSN, request.Final);
                         try
                         {
-                            readyToTransferPDUs = TargetResponseHelper.GetReadyToTransferPDUs(request, state.Target, state.SessionParameters, state.ConnectionParameters, out commandsToExecute);
+                            readyToTransferPDUs = TargetResponseHelper.GetReadyToTransferPDUs(request, state.Target, state.Session, state.ConnectionParameters, out commandsToExecute);
                         }
                         catch (InvalidTargetTransferTagException ex)
                         {
@@ -459,7 +459,7 @@ namespace ISCSI.Server
                     {
                         SCSICommandPDU command = (SCSICommandPDU)pdu;
                         Log(Severity.Debug, "[{0}] SCSICommandPDU: CmdSN: {1}, LUN: {2}, Data segment length: {3}, Expected Data Transfer Length: {4}, Final: {5}", state.ConnectionIdentifier, command.CmdSN, (ushort)command.LUN, command.DataSegmentLength, command.ExpectedDataTransferLength, command.Final);
-                        readyToTransferPDUs = TargetResponseHelper.GetReadyToTransferPDUs(command, state.Target, state.SessionParameters, state.ConnectionParameters, out commandsToExecute);
+                        readyToTransferPDUs = TargetResponseHelper.GetReadyToTransferPDUs(command, state.Target, state.Session, state.ConnectionParameters, out commandsToExecute);
                     }
                     foreach (ReadyToTransferPDU readyToTransferPDU in readyToTransferPDUs)
                     {
@@ -513,7 +513,7 @@ namespace ISCSI.Server
                 }
                 Socket clientSocket = state.ClientSocket;
                 PDUHelper.SetStatSN(response, state.ConnectionParameters.StatSN);
-                PDUHelper.SetExpCmdSN(response, state.SessionParameters.ExpCmdSN, state.SessionParameters.ExpCmdSN + state.SessionParameters.CommandQueueSize);
+                PDUHelper.SetExpCmdSN(response, state.Session.ExpCmdSN, state.Session.ExpCmdSN + state.Session.CommandQueueSize);
                 if (response is SCSIResponsePDU ||
                     response is LoginResponsePDU ||
                     response is TextResponsePDU ||

+ 2 - 1
ISCSI/ISCSI.Server/SessionParameters.cs

@@ -10,7 +10,7 @@ using System.Text;
 
 namespace ISCSI.Server
 {
-    public class SessionParameters
+    public class ISCSISession
     {
         public int MaxConnections = DefaultParameters.Session.MaxConnections;
         public bool InitialR2T = DefaultParameters.Session.InitialR2T;
@@ -33,6 +33,7 @@ namespace ISCSI.Server
         public bool CommandNumberingStarted;
         public uint ExpCmdSN;
 
+        public ISCSITarget Target; // Across all connections within a session, an initiator sees one and the same target.
         public List<uint> CommandsInTransfer = new List<uint>();
         public List<SCSICommandPDU> DelayedCommands = new List<SCSICommandPDU>();
 

+ 29 - 29
ISCSI/ISCSI.Server/ServerResponseHelper.cs

@@ -29,7 +29,7 @@ namespace ISCSI.Server
             return response;
         }
 
-        internal static LoginResponsePDU GetLoginResponsePDU(LoginRequestPDU request, List<ISCSITarget> availableTargets, SessionParameters session, ConnectionParameters connection, ref ISCSITarget target, GetNextTSIH GetNextTSIH)
+        internal static LoginResponsePDU GetLoginResponsePDU(LoginRequestPDU request, List<ISCSITarget> availableTargets, ISCSISession session, ConnectionParameters connection, GetNextTSIH GetNextTSIH)
         {
             LoginResponsePDU response = new LoginResponsePDU();
             response.Transit = request.Transit;
@@ -73,7 +73,7 @@ namespace ISCSI.Server
             // RFC 3720:  The login process proceeds in two stages - the security negotiation
             // stage and the operational parameter negotiation stage.  Both stages are optional
             // but at least one of them has to be present.
-            bool firstLoginRequest = (!session.IsDiscovery && target == null);
+            bool firstLoginRequest = (!session.IsDiscovery && session.Target == null);
             if (firstLoginRequest)
             {
                 connection.InitiatorName = request.LoginParameters.ValueOf("InitiatorName");
@@ -98,8 +98,8 @@ namespace ISCSI.Server
                         int targetIndex = GetTargetIndex(availableTargets, targetName);
                         if (targetIndex >= 0)
                         {
-                            target = availableTargets[targetIndex];
-                            if (!target.AuthorizeInitiator(connection.InitiatorName, connection.InitiatorEndPoint))
+                            session.Target = availableTargets[targetIndex];
+                            if (!session.Target.AuthorizeInitiator(connection.InitiatorName, connection.InitiatorEndPoint))
                             {
                                 response.Status = LoginResponseStatusName.AuthorizationFailure;
                                 return response;
@@ -123,7 +123,7 @@ namespace ISCSI.Server
             if (request.CurrentStage == 0)
             {
                 response.LoginParameters.Add("AuthMethod", "None");
-                if (target != null)
+                if (session.Target != null)
                 {
                     // RFC 3720: During the Login Phase the iSCSI target MUST return the TargetPortalGroupTag key with the first Login Response PDU with which it is allowed to do so
                     response.LoginParameters.Add("TargetPortalGroupTag", "1");
@@ -179,7 +179,7 @@ namespace ISCSI.Server
             return -1;
         }
 
-        public static void UpdateOperationalParameters(KeyValuePairList<string, string> loginParameters, SessionParameters sessionParameters, ConnectionParameters connectionParameters)
+        public static void UpdateOperationalParameters(KeyValuePairList<string, string> loginParameters, ISCSISession session, ConnectionParameters connectionParameters)
         {
             string value = loginParameters.ValueOf("MaxRecvDataSegmentLength");
             if (value != null)
@@ -190,84 +190,84 @@ namespace ISCSI.Server
             value = loginParameters.ValueOf("MaxConnections");
             if (value != null)
             {
-                sessionParameters.MaxConnections = Math.Min(Convert.ToInt32(value), ISCSIServer.DesiredParameters.MaxConnections);
+                session.MaxConnections = Math.Min(Convert.ToInt32(value), ISCSIServer.DesiredParameters.MaxConnections);
             }
 
             value = loginParameters.ValueOf("InitialR2T");
             if (value != null)
             {
-                sessionParameters.InitialR2T = (value == "Yes") || ISCSIServer.DesiredParameters.InitialR2T;
+                session.InitialR2T = (value == "Yes") || ISCSIServer.DesiredParameters.InitialR2T;
             }
 
             value = loginParameters.ValueOf("ImmediateData");
             if (value != null)
             {
-                sessionParameters.ImmediateData = (value == "Yes") && ISCSIServer.DesiredParameters.ImmediateData;
+                session.ImmediateData = (value == "Yes") && ISCSIServer.DesiredParameters.ImmediateData;
             }
 
             value = loginParameters.ValueOf("MaxBurstLength");
             if (value != null)
             {
-                sessionParameters.MaxBurstLength = Math.Min(Convert.ToInt32(value), ISCSIServer.DesiredParameters.MaxBurstLength);
+                session.MaxBurstLength = Math.Min(Convert.ToInt32(value), ISCSIServer.DesiredParameters.MaxBurstLength);
             }
 
             value = loginParameters.ValueOf("FirstBurstLength");
             if (value != null)
             {
-                sessionParameters.FirstBurstLength = Math.Min(Convert.ToInt32(value), ISCSIServer.DesiredParameters.FirstBurstLength);
+                session.FirstBurstLength = Math.Min(Convert.ToInt32(value), ISCSIServer.DesiredParameters.FirstBurstLength);
             }
 
             value = loginParameters.ValueOf("DataPDUInOrder");
             if (value != null)
             {
-                sessionParameters.DataPDUInOrder = (value == "Yes") || ISCSIServer.DesiredParameters.DataPDUInOrder;
+                session.DataPDUInOrder = (value == "Yes") || ISCSIServer.DesiredParameters.DataPDUInOrder;
             }
 
             value = loginParameters.ValueOf("DataSequenceInOrder");
             if (value != null)
             {
-                sessionParameters.DataSequenceInOrder = (value == "Yes") || ISCSIServer.DesiredParameters.DataSequenceInOrder;
+                session.DataSequenceInOrder = (value == "Yes") || ISCSIServer.DesiredParameters.DataSequenceInOrder;
             }
 
             value = loginParameters.ValueOf("DefaultTime2Wait");
             if (value != null)
             {
-                sessionParameters.DefaultTime2Wait = Math.Max(Convert.ToInt32(value), ISCSIServer.DesiredParameters.DefaultTime2Wait);
+                session.DefaultTime2Wait = Math.Max(Convert.ToInt32(value), ISCSIServer.DesiredParameters.DefaultTime2Wait);
             }
 
             value = loginParameters.ValueOf("DefaultTime2Retain");
             if (value != null)
             {
-                sessionParameters.DefaultTime2Retain = Math.Min(Convert.ToInt32(value), ISCSIServer.DesiredParameters.DefaultTime2Retain);
+                session.DefaultTime2Retain = Math.Min(Convert.ToInt32(value), ISCSIServer.DesiredParameters.DefaultTime2Retain);
             }
 
             value = loginParameters.ValueOf("MaxOutstandingR2T");
             if (value != null)
             {
-                sessionParameters.MaxOutstandingR2T = Math.Min(Convert.ToInt32(value), ISCSIServer.DesiredParameters.MaxOutstandingR2T);
+                session.MaxOutstandingR2T = Math.Min(Convert.ToInt32(value), ISCSIServer.DesiredParameters.MaxOutstandingR2T);
             }
         }
 
-        public static KeyValuePairList<string, string> GetLoginOperationalParameters(SessionParameters sessionParameters, ConnectionParameters connectionParameters)
+        public static KeyValuePairList<string, string> GetLoginOperationalParameters(ISCSISession session, ConnectionParameters connectionParameters)
         {
             KeyValuePairList<string, string> loginParameters = new KeyValuePairList<string, string>();
             loginParameters.Add("HeaderDigest", "None");
             loginParameters.Add("DataDigest", "None");
             loginParameters.Add("MaxRecvDataSegmentLength", connectionParameters.TargetMaxRecvDataSegmentLength.ToString());
-            if (!sessionParameters.IsDiscovery)
+            if (!session.IsDiscovery)
             {
-                loginParameters.Add("MaxConnections", sessionParameters.MaxConnections.ToString());
-                loginParameters.Add("InitialR2T", sessionParameters.InitialR2T ? "Yes" : "No");    // Microsoft iSCSI Target support InitialR2T = No
-                loginParameters.Add("ImmediateData", sessionParameters.ImmediateData ? "Yes" : "No");
-                loginParameters.Add("MaxBurstLength", sessionParameters.MaxBurstLength.ToString());
-                loginParameters.Add("FirstBurstLength", sessionParameters.FirstBurstLength.ToString());
-                loginParameters.Add("MaxOutstandingR2T", sessionParameters.MaxOutstandingR2T.ToString());
-                loginParameters.Add("DataPDUInOrder", sessionParameters.DataPDUInOrder ? "Yes" : "No");
-                loginParameters.Add("DataSequenceInOrder", sessionParameters.DataSequenceInOrder ? "Yes" : "No");
-                loginParameters.Add("ErrorRecoveryLevel", sessionParameters.ErrorRecoveryLevel.ToString());
+                loginParameters.Add("MaxConnections", session.MaxConnections.ToString());
+                loginParameters.Add("InitialR2T", session.InitialR2T ? "Yes" : "No");    // Microsoft iSCSI Target support InitialR2T = No
+                loginParameters.Add("ImmediateData", session.ImmediateData ? "Yes" : "No");
+                loginParameters.Add("MaxBurstLength", session.MaxBurstLength.ToString());
+                loginParameters.Add("FirstBurstLength", session.FirstBurstLength.ToString());
+                loginParameters.Add("MaxOutstandingR2T", session.MaxOutstandingR2T.ToString());
+                loginParameters.Add("DataPDUInOrder", session.DataPDUInOrder ? "Yes" : "No");
+                loginParameters.Add("DataSequenceInOrder", session.DataSequenceInOrder ? "Yes" : "No");
+                loginParameters.Add("ErrorRecoveryLevel", session.ErrorRecoveryLevel.ToString());
             }
-            loginParameters.Add("DefaultTime2Wait", sessionParameters.DefaultTime2Wait.ToString());
-            loginParameters.Add("DefaultTime2Retain", sessionParameters.DefaultTime2Retain.ToString());
+            loginParameters.Add("DefaultTime2Wait", session.DefaultTime2Wait.ToString());
+            loginParameters.Add("DefaultTime2Retain", session.DefaultTime2Retain.ToString());
             
             return loginParameters;
         }

+ 2 - 2
ISCSI/ISCSI.Server/TargetResponseHelper.cs

@@ -17,7 +17,7 @@ namespace ISCSI.Server
 {
     public class TargetResponseHelper
     {
-        internal static List<ReadyToTransferPDU> GetReadyToTransferPDUs(SCSICommandPDU command, SCSITarget target, SessionParameters session, ConnectionParameters connection, out List<SCSICommandPDU> commandsToExecute)
+        internal static List<ReadyToTransferPDU> GetReadyToTransferPDUs(SCSICommandPDU command, SCSITarget target, ISCSISession session, ConnectionParameters connection, out List<SCSICommandPDU> commandsToExecute)
         {
             // We return either SCSIResponsePDU or List<SCSIDataInPDU>
             List<ReadyToTransferPDU> responseList = new List<ReadyToTransferPDU>();
@@ -58,7 +58,7 @@ namespace ISCSI.Server
             return responseList;
         }
 
-        internal static List<ReadyToTransferPDU> GetReadyToTransferPDUs(SCSIDataOutPDU request, SCSITarget target, SessionParameters session, ConnectionParameters connection, out List<SCSICommandPDU> commandsToExecute)
+        internal static List<ReadyToTransferPDU> GetReadyToTransferPDUs(SCSIDataOutPDU request, SCSITarget target, ISCSISession session, ConnectionParameters connection, out List<SCSICommandPDU> commandsToExecute)
         {
             List<ReadyToTransferPDU> responseList = new List<ReadyToTransferPDU>();
             commandsToExecute = new List<SCSICommandPDU>();

+ 2 - 2
ISCSI/ISCSI.csproj

@@ -40,8 +40,8 @@
     <Compile Include="ISCSI.Client\ISCSIClient.cs" />
     <Compile Include="ISCSI.Client\ISCSIClient.Parameters.cs" />
     <Compile Include="ISCSI.Client\ISCSIDisk.cs" />
+    <Compile Include="ISCSI.Client\ISCSISession.cs" />
     <Compile Include="ISCSI.Client\PDUHelper.cs" />
-    <Compile Include="ISCSI.Client\SessionParameters.cs" />
     <Compile Include="ISCSI.PDU\Enums\ISCSIOpCodeName.cs" />
     <Compile Include="ISCSI.PDU\Enums\ISCSIResponseName.cs" />
     <Compile Include="ISCSI.PDU\Enums\LoginResponseStatusClassName.cs" />
@@ -70,10 +70,10 @@
     <Compile Include="ISCSI.Server\Exceptions\InvalidTargetTransferTagException.cs" />
     <Compile Include="ISCSI.Server\ISCSIServer.cs" />
     <Compile Include="ISCSI.Server\ISCSIServer.Parameters.cs" />
+    <Compile Include="ISCSI.Server\ISCSISession.cs" />
     <Compile Include="ISCSI.Server\ISCSITarget.cs" />
     <Compile Include="ISCSI.Server\PDUHelper.cs" />
     <Compile Include="ISCSI.Server\ServerResponseHelper.cs" />
-    <Compile Include="ISCSI.Server\SessionParameters.cs" />
     <Compile Include="ISCSI.Server\TargetResponseHelper.cs" />
     <Compile Include="SCSI\Enums\AddressingMethod.cs" />
     <Compile Include="SCSI\Enums\ModePageCodeName.cs" />