|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: Comments on status responsesI still don't see what difference does it make if you have to check the status or the sense bytes. But perhaps we can differentiate end-point iSCSI issues from transport iSCSI issues ? We will have to give it some more thought. Julo "Merhar, Milan" <mmerhar@pirus.com> on 14/09/2000 17:12:59 Please respond to "Merhar, Milan" <mmerhar@pirus.com> To: Julian Satran/Haifa/IBM@IBMIL, ips@ece.cmu.edu cc: Subject: RE: Comments on status responses Julo, I agree with you that status returned from a SCSI target device needs to be transported exactly, so that existing drivers, etc. (which are unaware of the intervening iSCSI transport) work as expected. But, I think the question here concerns status reported by the iSCSI layer itself. Basically, my opinion is that if we expect the other end's error handler to be something like if ( errno ) then abort; it makes little or no difference what we return; 'OK' = 0 and 'ERR' = 1 works as well as an elaborate list of nonzero error codes. But, if there's a chance the other end could implement a more robust and/or less disruptive error recovery procedure, it makes sense to pass some "hints" along, through a broader set of exception codes. As an example, I suggest one might want to create a client-side recovery procedure that handles a storage device response timeout differently, depending on whether it was caused by a target too busy to process the command in a timely fashion, versus a timeout caused by excessive network congestion or repeated TCP error retrys. - milan -----Original Message----- From: julian_satran@il.ibm.com [mailto:julian_satran@il.ibm.com] Sent: Wednesday, September 13, 2000 1:57 PM To: ips@ece.cmu.edu Subject: RE: Comments on the Draft On 1 - depends on where thing go with asymmetric vs. symmetric. 2 - Explicit error codes - isn't that the sense function? 3 - For the flag - probably yes- but I am not sure. Status implies it so you need it only if status is bad - which can be before the end. Julo "Hall, Howard" <howard@pirus.com> on 13/09/2000 20:50:10 Please respond to "Hall, Howard" <howard@pirus.com> To: Julian Satran/Haifa/IBM@IBMIL cc: Subject: RE: Comments on the Draft Julo, Thank you very much for your thoughtful response. What do you think of some of the other issues (reference the original email): - whether CmdRN, MaxCmdRN, etc. should be used for in-order delivery of commands across multiple TCP connections in a session (Comments for Section 2.2.2). - more explicit error codes - the proposed flag described at the end of the email -Howard -----Original Message----- From: julian_satran@il.ibm.com [mailto:julian_satran@il.ibm.com] Sent: Wednesday, September 13, 2000 4:52 AM To: Hall, Howard Subject: Re: Comments on the Draft 1. General - Loss of synchronization - we hope to be able one day to get to a better solution but I would suggest to recommend the implementer to drop the connections as it won't be able to parse a reset too, reinstate them and then try a reset to distinguish it clearly from other events. If it happens in a target - drop - and wait for a reconnect then send an AE to indicate the event and wait for reset. As for inconsistencies - I've added your proposal to the todo list - thank you. 2. The view is a qualifier for the name - it allows a target to a second level of refinement about what he things it should show the initiator. The first part of the name itself is the first level - but for those that are conservative in the use of names they are left with the view. 3. We structured it to follow closely FCP - for bridging reasons. As far as I can recall Response comes first followed by sense. We will state it explicitly in the document thanks. 4.timeouts - yes you are right and I stated it already in an older note about bridging. We where thinking about three timers: - command delivery - data delivery - status delivery Those should be set at the session initiation and be known to the initiator and target but they don't have to be necessarily sent over the wire (as they imply mostly local actions in the endpoints). 5. immediate data length negotiation - will fix the negotiation parameters - thanks. We think also about limiting it by default to 64k(?) 6. iSCSI check - the reason I choose to make it SCSI check too is to get a "hook" into ACA behavior. I think that is mandatory - without it all hell breaks loose! Both initiator and target could be built the with ACA on check condition. We can remove the iSCSI status field and add a set of basic sense bytes detailing the error. Let us keep talking on this item. 7. The security parts are being rewritten just as we talk and we hope that we will all see them soon 8. Target reset will be changed to have two types - soft and hard reset. 9. closing connection. Yes you are right it needs more text. And we already agreed to add a logout (on a different connection to force connection close) and remove the RID from login Thanks for your careful reading and hope to see you on row 1 or 2 at the next IETF meeting, Julo "Hall, Howard" <howard@pirus.com> on 13/09/2000 02:12:38 Please respond to "Hall, Howard" <howard@pirus.com> To: ips@ece.cmu.edu cc: (bcc: Julian Satran/Haifa/IBM) Subject: Comments on the Draft Here are some detailed questions, issues, and proposals we have come up with after reviewing the draft closely. -Howard Howard Hall Pirus Networks www.pirus.com ----------------------- Section: General We need to explicitly describe in the draft how to handle loss of iSCSI parsing synchronization on a TCP stream. Resynchronization can be accomplished by shutting down the TCP connection. If it's the command stream that gets reset, iSCSI needs to "remember" an error code for this session (for how long?), so that it can let its client know what happened when the command session gets reestablished. Similarly, suggestions should be made on how to respond when the other side sends messages that don't make sense, i.e.: a target sends bogus RTT messages, or repeated "opcode not understood" We propose that the draft, in general, should state that initiators and targets should 'play safe' - especially avoiding bogus reads and writes. Initiators can use the 'escalating big hammer' approach, terminating the task, terminating the connection/session, resetting the device. Finally, what should a target do if it detects inconsistencies in the data buffers for a write command e.g.. offsets over end of total transfer size, offset overlaps, data portion greater than total transfer length, transfer tags which don't correspond with any in progress etc. What should an initiator do when it decides that at target is behaving illegally? For example, what if a 512 byte write is sent and then we receive an RTT for offset 2048? We propose that the draft specifies to abort the write command and send a response with the ISCSI status set to 1 ( iscsi check ). Better yet - since we have 8 bits of iSCSI status, why not have more values than just "good" and "iscsi check" (e.g. not_logged_on, data_in_timeout, buffer_address_inconsistency). After seeing a couple consecutively it should shut down the connection or better yet send the proposed "Out of Sync" command described below. Section: General There's no framing of the headers and data on the buffers from TCP. If anything goes wrong with the parsing, its difficult if not impossible to recover. It only takes one length field to be 'off'. If this happens the target will probably generate lots of "Opcode not understood" messages. We suggest one of two methods: 1) after seeing consecutive "Opcode not understood" messages it should shut down the connection if this doesn't solve the problem then reset the target, or 2) When the target finds that it is out of sync with the initiator ( on receipt of an "Opcode not understood"), it will send a new iSCSI "Out of Sync" command to the initiator. The initiator will assume at the reception of the "Out of Sync" command that all unacknowledged outstanding requests have been dropped. The initiator then sends the next command with the OOB (out of band) bit set, and with the OOB offset pointing to the beginning of the iSCSI header. The target, after sending the "Out of Sync" command, should ignore every thing on that connection and wait for the OOB data to re-sync again. This exchange could also work if sent from the initiator to the target. Section 2.2.2: Ordering and iSCSI numbering "The initiator and target are assumed to have three registers that define the allocation mechanism - CmdRN, ExpCmdRN, MaxCmdRN.... The target and initiator registers are supposed to uphold causal ordering." This indicates that these registers guarantee ordered delivery of commands among multiple TCP connections in a session. However, the spec continues in the following paragraphs with the following statement which seems to negate this: "iSCSI targets are not required to use the numbering scheme for ordered delivery even when they support multiple connections." We believe that the draft should clarify the issue by either: 1) stating that in-order delivery MUST be guaranteed, or 2) limiting the use of the above three registers only to indicate the command queue depth of the target, and remove any mention of their role for in-order delivery. Section 2.2.6: What is the view used for? Is it's intent so different customers get different LUNs views (like FC zoning)? Section: 3.1.1 The draft suggests that the payload to the SCSI response (opcode 0x41) could contain response data and sense data together. However, the description is ambiguous in terms of explaining how to interpret any such data that follows the header - for instance if it contains both, which one comes first, could there be a gap between them, are there alignment issues etc. Should a target's response or sense data be included in a SCSI data response buffer? In any case, its seems more natural that an adapter would provide these separately ( response data for inquiry, sense for check condition etc ). So, in the interests of simplicity we suggest limiting the scsi response messages to contain EITHER response data, OR sense data, but not both. We know which because either the res_len or the sense_len will have a non zero value. Section: 3.10 There should a be a timeout interval for getting in all the data buffers associated with a write and a read. Incomplete data may hang around indefinitely if the TCP session stays open. We propose that the target needs to have a timeout for WRITE, and the initiator needs to have a timeout for READ. The spec should specify the length of the timeout and what the recovery action is. One suggestion is a timeout in the order of seconds, with the recovery action of closing the TCP connection, starting a new connection, and re-issuing the command. The time out parameter could be passed in the Login Parameters field. Section: 2.2.4 It states in section 2.2.4 that "an initiator may request, at login, to send immediate data of any size and a target may indicate the size of immediate data blocks it is ready to accept in its response." But the draft is ambiguous as to how this size negotiation gets done. Is it a text command format? If so what is the syntax? We propose: "ImmediateData: MaxSize" where MaxSize is the maximum size of immediate data the target is willing to accept in bytes. Section: 3.3 The SCSI Response message defines a field 'iSCSI Status'. The value 1 means 'iSCSI Check'. In some error cases the command is being rejected without being sent to the scsi layer, because the iscsi target layer found a problem. Section 3.3.4 of the draft states: "if the iscsi field is not 0 the command status will indicate CHECK CONDITION". But the Command Status field is supposed to be the SCSI status (section 3.3.3). If the command never went to the SCSI layer, then a specific value should not put in that field. We propose in these cases to change iscsi_status to the condition (more values than just "good" and "iscsi check" i.e. not_logged_on, data_in_timeout, buffer_address_inconsistency), and command status to 0. This informs the initiator the iscsi target layer had a problem with this command and never passed it on to the SCSI layer, allowing an unambiguous separation of SCSI-related error conditions from iSCSI ones. Section: 3.11.3 This section states that if the key is not recognized, it should be ignored. How should malformed Text commands be handled? It can be handled by: 1) ignore the command, 2) Send a response with no keys, 3) Close down the session, 4) error response (however this may provide information to an attacker) Section: 3.13.4 the login "parameters passed for a clear-text password authentication are: Initiator:<domain-name>[/modifier] Target:<domain-name>[/modifier] Authenticator:open-sesame Access-Id:value" Access-Id is ambiguous? How does it differ from the Initiator? It is not described in Appendix B. Sections: 3.14.2, 3.11.3, and 3.12.3 A Text Command is sent because the Login Response indicated "additional authentication required." The login can now complete, and the target should send a Login Response indicating "accept login." Does the target have to send a Text Response in addition to the Login Response? The text response description makes it sound like all text keys must be sent back to the initiator, if they are accepted. This would only be the case for certain keys (such as UseRTT), correct? Section: 3.17 The map command is very ambiguous and needs further definition. Does the iSCSI initiator or target issue this command? Sections 3.6-3.8 When an iSCSI target receives a Task Management command specifying "Target Reset", the iSCSI target may send an Asynchronous Event to any initiators connected to the target device. What is the intended session shutdown sequence? Does each initiator wait for the target to close the TCP connection? Does each initiator immediately close its TCP connection? Are the initiators expected to wait for a certain amount of time prior to re-opening their TCP connections? This area needs more work. General Proposal: We propose that a flag be added to the SCSI Data PDU to indicate that a PDU is the last one for the "current data transfer". This is most useful when the current data transfer is the data being sent in response to an RTT: The target knows not to expect any more data for that RTT when it sees the bit set. This simplifies the termination of the data transfer, particularly if overlapping data requests are sent or the initiator fails to send all of the requested data. The bit might also be useful for data transfers to the initiator in response to a SCSI command, where the data transfer can be terminated and checked without having to watch for a SCSI Response packet. Finally, it may belong in the SCSI Command PDU (for immediate data) and perhaps the SCSI Response PDU (if non-sense data can show up there) for consistency of implementation.
Home Last updated: Tue Sep 04 01:07:16 2001 6315 messages in chronological order |