|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: CDB/PDU inconsistencies and residual countsDean,
I have seen some
good answers to this already, but let me try to explain it from another point of
view. That of the layered SCSI subsystem in the host OS.
In a
layered SCSI subsystem as found in most modern operating systems, the HBA driver is normally given a request generated by
a Target driver (such as a SCSI Disk class
driver). The request includes a CDB, transfer direction
bits, and a buffer address and length (often in the form of a
scatter/gather list). After scheduling and processing the request, the HBA
driver is responsible to return status to tell the Target driver what
happened with respect to the buffer of data it requested to be
transferred by the device.
The purpose
of the overflow-underflow indication is to tell the originator of the request
whether the device attempted to transfer more, less, or exactly the same number
of bytes as was specified in the buffer length of the original request to the
HBA driver. The residual count reports the variance
from the buffer length.
In the case of
the iSCSI HBA driver, the length of the buffer passed to the HBA is used as the
"expected transfer length". The iSCSI protocol enables the transfer
of this number of bytes between the initiator and the iSCSI
target over the wire. If the SCSI layer in the target requests or attempts to transfer more or less
than this original expected number of bytes (the length of the
buffer in the original request), an underflow or overflow should be
returned over the wire to the iSCSI HBA so that it can be reported to the
SCSI Target driver.
For the case of overflow iSCSI can
never transport more than expected transfer length. For the case of underflow, iSCSI may or may not transport bytes within
expected transfer length unused by the SCSI
layer.
There are
cases in which the Target driver will not know how in
advance how much data the Target
will attempt to return for a given
CDB. In these cases,
most Target drivers will use an oversized buffer, the buffer
is not filled, an underrun is reported, and the residual is the difference
between the buffer size and the bytes transfered by the SCSI device. Conversely the Target driver may intentionally or
unintentionally use an undersized buffer relative to the target
devices interpretation of the command contained in the
CDB.
It should be the target driver writer's job to interpret and
handle the underrun and overrun status. These may be expected or unexpected results.
The lengths must be reported as a byte count of variance from the buffer length. When buffer length is sent as
"expected transfer length" the iSCSI target can do the residual length
calculation properly.
Thanks,
Nick
Home Last updated: Tue Aug 05 12:46:10 2003 12771 messages in chronological order |