iSCSI - E.4.2. 개시자 알고리즘

목록

E.4.2. Initiator Algorithms

E.4.2. 이니시에이터 알고리즘

Receive-a-In-PDU(Connection, CurrentPDU) { check-basic-validity(CurrentPDU); if (Header-Digest-Bad) discard, return; Retrieve TCB from CurrentPDU.InitiatorTaskTag. if (CurrentPDU.type == Async) { if (CurrentPDU.AsyncEvent == ConnectionDropped) { Retrieve the AffectedConnection for CurrentPDU.Parameter1. AffectedConnection.CurrentTimeout = CurrentPDU.Parameter3; AffectedConnection.State = CLEANUP_WAIT; Start-Timer(Connection-Cleanup-Handler, AffectedConnection, CurrentPDU.Parameter2); } else if (CurrentPDU.AsyncEvent == LogoutRequest)) { AffectedConnection = Connection; AffectedConnection.State = LOGOUT_REQUESTED; AffectedConnection.PerformConnectionCleanup = TRUE; AffectedConnection.CurrentTimeout = CurrentPDU.Parameter3; Start-Timer(Connection-Cleanup-Handler, AffectedConnection, 0); } else if (CurrentPDU.AsyncEvent == SessionDropped)) { for (each Connection) { Connection.State = CLEANUP_WAIT; Connection.CurrentTimeout = CurrentPDU.Parameter3; Start-Timer(Connection-Cleanup-Handler, Connection, CurrentPDU.Parameter2); } Session.state = FAILED; } } else if (CurrentPDU.type == LogoutResponse) { Retrieve the CleanupConnection for CurrentPDU.CID. if (CurrentPDU.Response = failure) { CleanupConnection.State = CLEANUP_WAIT; } else { CleanupConnection.State = FREE; } } else if (CurrentPDU.type == LoginResponse) { if (this is a response to an implicit Logout) { Retrieve the CleanupConnection. if (successful) { CleanupConnection.State = FREE; Connection.State = LOGGED_IN; } else { CleanupConnection.State = CLEANUP_WAIT; DestroyTransportConnection(Connection); } } } else { /* REST UNRELATED TO CONNECTION-RECOVERY, * NOT SHOWN */ } if (CleanupConnection.State == FREE) { for (each command that was active on CleanupConnection) { /* Establish new connection allegiance */ NewConnection = Pick-A-Logged-In-Connection(Session); Build-And-Send-Command(NewConnection, TCB); } } } Connection-Cleanup-Handler(Connection) { Retrieve Session from Connection. if (Connection can still exchange iSCSI PDUs) { NewConnection = Connection; } else { Start-Timer(Connection-Resource-Timeout-Handler, Connection, Connection.CurrentTimeout); if (there are other logged-in connections) { NewConnection = Pick-A-Logged-In- Connection(Session); } else { NewConnection = CreateTransportConnection(Session.OtherEndInfo); Initiate an implicit Logout on NewConnection for Connection.CID. return; } } Build-And-Send-Logout(NewConnection, Connection.CID, RecoveryRemove); } Transport_Exception_Handler(Connection) { Connection.PerformConnectionCleanup = TRUE; if (the event is an unexpected transport disconnect) { Connection.State = CLEANUP_WAIT; Connection.CurrentTimeout = DefaultTime2Retain; Start-Timer(Connection-Cleanup-Handler, Connection, DefaultTime2Wait); } else { Connection.State = FREE; } }