|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: iSCSI: plugfest4 issuesJulian: Five issues came up today, Wednesday, 31-July-2002, at the iSCSI plugfest. 1. We have hit a situation where a lot of people are not interoperating, and this has to do with the use of "Irrelevant" as a key response value. In section 4.2 the standard says only: "If a specific key is not relevant for the current negotiation, the responder may answer with the constant "Irrelevant" for all types of negotiation. ...". The problem is that nowhere in the standard is it further defined when a key is relevant and when it is not. It is left up to each individual implementation, and as a result, different implementers are coming to different conclusions in the same circumstances. Thus, they do not interoperate. A few implementations are simply saying that all keys are always relevant, and never accept "Irrelevant" as an answer in any situation. That is the extreme, but their argument is that it requires extra logic to decide when a key is relevant and when it is not, and hence it is simpler not to do this. More common are implementations that have simply not thought of all the possible situations in which a key has become irrelevant. We have a choice on how to proceed. The simplest alternative would be to eliminate "Irrelevant" as a response, since it is never necessary to use this in a response, yet it always requires extra logic on the receiving side to deal with it. An alternative if we decide to keep "Irrelevant" as a response is to have the standard specify as part of the definition of each key in Section 11 and Appendix A those situations in which that key may be considered irrelevant. This could be listed as an attribute "Irrelevant when:" immediately following the current "Scope:" attribute. This attribute is in addition to the integrity rules which already exist. The following is a list of all the keys that I am aware of that can accept a response of Irrelevant, and the situations in which this can legitimately occur (numbers indicate the section where the key is defined): 11.2 MaxConnections -- Irrelevant when: SessionType=Discovery 11.10 InitialR2T -- Irrelevant when: SessionType=Discovery 11.11 BidiInitialR2T -- Irrelevant when: SessionType=Discovery 11.12 ImmediateData -- Irrelevant when: SessionType=Discovery 11.10 MaxBurstLength -- Irrelevant when: SessionType=Discovery 11.10 FirstBurstLength -- Irrelevant when: SessionType=Discovery -- also irrelevant when ( InitialR2T=Yes and ImmediateData=No ) 11.18 MaxOutstandingR2T -- Irrelevant when: SessionType=Discovery 11.19 DataPDUInOrder -- Irrelevant when: SessionType=Discovery 11.20 DataSequenceInOrder -- Irrelevant when: SessionType=Discovery A.3.2 OFMarkInt -- Irrelevant when: OFMarker=No IFMarkInt -- Irrelevant when: IFMarker=No 2. Section 2.2.2.1 states: "Commands meant for immediate delivery are marked with an immediate delivery flag; they also carry CmdSN. CmdSN does not advance for commands marked for immediate delivery." and 2 paragraphs later in the same section: "If immediate delivery is used with task management commands, these commands may reach the target before the tasks on which they are sup- posed to act. For this reason the task management command MUST carry the current CmdSN as a marker of their position in the stream of com- mands." Given the first statement quoted above, why is this last sentence needed? It is causing some confusion because it makes it sound as if the task management command is somehow an exception because it MUST carry the current CmdSN (implying that maybe other immediate commands do not have to carry the current CmdSN). To eliminate the confusion, but to keep the same intention, a suggested rewording would be: To the first paragraph quoted above, change the phrase "they also carry CmdSN" to: "they MUST also carry the current CmdSN". In the second paragraph quoted above, either change the second sentence (the one starting "For this reason...") to: "However, their CmdSN is a marker of their position in the stream of commands." (which is the wording that was used previously in draft 12), or just eliminate the second sentence entirely, since this topic is discussed later in section 2.5.1.3 and again in section 9.5.1. 3. Section 9.13.3 states: "For a new session, the target MUST generate a non-zero TSIH and return it in the Login Final-Response (see Section 4.3 Login Phase). In all other cases, this field should be set to the TSIH provided by the initiator in the Login Request." The phrase "in all other cases" is ambiguous. Some companies are interpreting it to mean "sessions other than a new session", while others are interpreting it to mean "Login Responses other than the Login Final-Response in a new session". So what is the intent? On a new session, clearly the target MUST return the non-zero TSIH in the Login Final-Response, but can it also return a non-zero TSIH in the first, second, ... Login Partial Responses that precede the Login Final-Response? If the intent for new sessions is to have the TSIH set to 0 in Login Partial-Responses and only change to a non-zero TSIH in the Login Final-Response, then a suggested rewording to make this clear would be: "Except for the Login Final-Response in a new session, this field should be set to the TSIH provided by the initiator in the Login Request. For a new session, the target MUST generate a non-zero TSIH and return it ONLY in the Login Final-Response (see Section 4.3 Login Phase)." If the intent is to allow, but not require, the target to return the non-zero TSIH in the first, second, ... Login Partial Responses in a new session, then a suggested rewording to make this clear would be: "During Login Phases that do not establish a new session, this field should be set to the TSIH provided by the initiator in the Login Request. For a new session, the target MUST generate a non-zero TSIH and MAY return it in a Login Partial-Response but MUST return it in the Login final-Response (see Section 4.3 Login Phase)." This last interpretation still leaves open the question of whether the target is allowed to toggle back and forth between 0 and the newly-generated TSIH within sequences of Login Partial-Responses. 4. There has been some misunderstanding with the phrase "not advanced". For example, in section 9.8.2 StatSN it says: "The StatSN field will contain the next StatSN. The StatSN for this connection is not advanced." In spite of the presence of the word "next", some implementations are interpreting this to mean that this PDU will always contain the same value for StatSN as was sent in the previous response. Perhaps it would help if the words "after this PDU is sent" were added to the last sentence quoted above so that it would read: "The StatSN for this connection is not advanced after this PDU is sent." Other examples where this wording could be added to help clarify when the advancing is performed (or not performed) are: section 2.2.2.1: "Commands meant for immediate delivery are marked with an immediate delivery flag; they also carry the next CmdSN. CmdSN does not advance after commands marked for immediate delivery are sent." section 2.2.2.1: "- CmdSN - the current command Sequence Number, advanced by 1 after each command shipped except for commands marked for immediate delivery." section 2.2.2.3: "For input (read) data PDUs, DataSN starts with 0 for the first data PDU of an input command and advances by 1 after each data PDU is sent. For output data PDUs, DataSN starts with 0 for the first data PDU of a sequence (the initial unsolicited sequence or any data PDU sequence issued to satisfy an R2T) and advances by 1 after each data PDU is sent. R2Ts are also sequenced per command. For example, the first R2T has an R2TSN of 0 and the R2TSN advances by 1 after each R2T is sent." section 9.11.5: "The target StatSN register is advanced after each Text Response is sent." section 9.18.1: "However, the I bit must be set to 1 and the CmdSN is not advanced after this PDU is sent." section 9.19.2: "However, when the Initiator Task Tag is set to 0xffffffff, StatSN for the connection is not advanced after this PDU is sent." 5. There has been major disagreement about correct digest values. A number of implementations differ only due to a Big-Endian/ Little-Endian problem that we hope to be able to resolve over the next few days. Differences between other implementations show no discernible pattern. Of course, all implementations claim to compute the proper answers to the test cases given in the standard. The difficulty is that these test cases are not sample pdus and therefore never actually occur during operation. A recommendation would be to include in the standard a simple sample PDU (one that could actually be sent during a session) and give its correctly computed CRC value. For example, a NOP-OUT PDU with I=1, DataSegmentLength=0, Lun=0, InitiatorTaskTag and Target Transfer Tag both = 0xffffffff, CmdSN = 1234, and ExpStatSN=567 could be legal, and most implementations could probably arrange fairly simply for such a PDU to actually be sent by an initiator. By publishing the correct CRC value for such a pdu, all questions about who is right and who is wrong are immediately solved, and new implementations can be developed more accurately. Thank you for your consideration. Bob Russell InterOperability Lab University of New Hampshire rdr@iol.unh.edu 603-862-3774
Home Last updated: Wed Jul 31 23:18:53 2002 11505 messages in chronological order |