pub struct ScsiCommandResponse {Show 14 fields
pub opcode: RawBhsOpcode,
pub flags: RawScsiCmdRespFlags,
pub response: RawResponseCode,
pub status: RawScsiStatus,
pub total_ahs_length: u8,
pub data_segment_length: [u8; 3],
pub initiator_task_tag: InitiatorTaskTag,
pub snack_tag: U32<BigEndian>,
pub stat_sn: U32<BigEndian>,
pub exp_cmd_sn: U32<BigEndian>,
pub max_cmd_sn: U32<BigEndian>,
pub exp_data_sn: U32<BigEndian>,
pub bidirectional_read_residual_count: U32<BigEndian>,
pub residual_count: U32<BigEndian>,
/* private fields */
}Expand description
Basic Header Segment for iSCSI SCSI Command Response PDU
Represents the 48-byte header structure for SCSI Command Response PDU as defined in RFC 7143. Contains response status, sequence numbers, residual counts, and other information returned by the target after executing a SCSI command.
Fields§
§opcode: RawBhsOpcodePDU opcode (byte 0) - should be 0x21 for SCSI Response
flags: RawScsiCmdRespFlagsResponse flags (byte 1) - Final bit and residual overflow/underflow indicators
response: RawResponseCodeResponse code (byte 2) - indicates if command completed successfully
status: RawScsiStatusSCSI status (byte 3) - SCSI command execution status
total_ahs_length: u8Total Additional Header Segments length (byte 4)
data_segment_length: [u8; 3]Data Segment Length (bytes 5-7) - length of sense data or other response data
initiator_task_tag: InitiatorTaskTagInitiator Task Tag (bytes 16-19) - matches the original command ITT
snack_tag: U32<BigEndian>SNACK Tag (bytes 20-23) - used for data recovery
stat_sn: U32<BigEndian>Status Sequence Number (bytes 24-27) - sequence number for this response
exp_cmd_sn: U32<BigEndian>Expected Command Sequence Number (bytes 28-31) - next expected command
max_cmd_sn: U32<BigEndian>Maximum Command Sequence Number (bytes 32-35) - command window limit
exp_data_sn: U32<BigEndian>Expected Data Sequence Number (bytes 36-39) - for data recovery
bidirectional_read_residual_count: U32<BigEndian>Bidirectional Read Residual Count (bytes 40-43) - unused read data length
residual_count: U32<BigEndian>Residual Count (bytes 44-47) - difference between expected and actual data transfer
Implementations§
Source§impl ScsiCommandResponse
impl ScsiCommandResponse
Sourcepub fn to_bhs_bytes(&self, buf: &mut [u8]) -> Result<()>
pub fn to_bhs_bytes(&self, buf: &mut [u8]) -> Result<()>
Serializes the BHS into a byte buffer.
Sourcepub fn from_bhs_bytes(buf: &mut [u8]) -> Result<&mut Self>
pub fn from_bhs_bytes(buf: &mut [u8]) -> Result<&mut Self>
Deserializes the BHS from a byte buffer.
Sourcepub fn residual_valid(&self) -> bool
pub fn residual_valid(&self) -> bool
Checks if the residual count is valid.
Sourcepub fn residual_effective(&self) -> u32
pub fn residual_effective(&self) -> u32
Returns the effective residual count.
Sourcepub fn bidi_read_residual_valid(&self) -> bool
pub fn bidi_read_residual_valid(&self) -> bool
Checks if the bidirectional read residual count is valid.
Sourcepub fn bidi_read_residual_effective(&self) -> u32
pub fn bidi_read_residual_effective(&self) -> u32
Returns the effective bidirectional read residual count.
Trait Implementations§
Source§impl BasicHeaderSegment for ScsiCommandResponse
impl BasicHeaderSegment for ScsiCommandResponse
fn to_bhs_bytes(&self, buf: &mut [u8]) -> Result<()>
Source§fn get_opcode(&self) -> Result<BhsOpcode>
fn get_opcode(&self) -> Result<BhsOpcode>
Source§fn get_initiator_task_tag(&self) -> u32
fn get_initiator_task_tag(&self) -> u32
Source§fn get_ahs_length_bytes(&self) -> usize
fn get_ahs_length_bytes(&self) -> usize
Source§fn set_ahs_length_bytes(&mut self, len: u8)
fn set_ahs_length_bytes(&mut self, len: u8)
Source§fn get_data_length_bytes(&self) -> usize
fn get_data_length_bytes(&self) -> usize
Source§fn set_data_length_bytes(&mut self, len: u32)
fn set_data_length_bytes(&mut self, len: u32)
Source§fn total_length_bytes(&self) -> usize
fn total_length_bytes(&self) -> usize
fn get_header_diggest(&self, enable_header_digest: bool) -> usize
fn get_data_diggest(&self, enable_data_digest: bool) -> usize
Source§impl Debug for ScsiCommandResponse
impl Debug for ScsiCommandResponse
Source§impl<'a> From<&'a mut ScsiCommandResponse> for Pdu<'a>
impl<'a> From<&'a mut ScsiCommandResponse> for Pdu<'a>
Source§fn from(v: &'a mut ScsiCommandResponse) -> Pdu<'a>
fn from(v: &'a mut ScsiCommandResponse) -> Pdu<'a>
Source§impl FromBytes for ScsiCommandResponsewhere
RawBhsOpcode: FromBytes,
RawScsiCmdRespFlags: FromBytes,
RawResponseCode: FromBytes,
RawScsiStatus: FromBytes,
u8: FromBytes,
[u8; 3]: FromBytes,
[u8; 8]: FromBytes,
InitiatorTaskTag: FromBytes,
U32<BigEndian>: FromBytes,
impl FromBytes for ScsiCommandResponsewhere
RawBhsOpcode: FromBytes,
RawScsiCmdRespFlags: FromBytes,
RawResponseCode: FromBytes,
RawScsiStatus: FromBytes,
u8: FromBytes,
[u8; 3]: FromBytes,
[u8; 8]: FromBytes,
InitiatorTaskTag: FromBytes,
U32<BigEndian>: FromBytes,
Source§fn ref_from_bytes(
source: &[u8],
) -> Result<&Self, ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, Infallible>>where
Self: KnownLayout + Immutable,
fn ref_from_bytes(
source: &[u8],
) -> Result<&Self, ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, Infallible>>where
Self: KnownLayout + Immutable,
Source§fn ref_from_prefix(
source: &[u8],
) -> Result<(&Self, &[u8]), ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, Infallible>>where
Self: KnownLayout + Immutable,
fn ref_from_prefix(
source: &[u8],
) -> Result<(&Self, &[u8]), ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, Infallible>>where
Self: KnownLayout + Immutable,
Source§fn ref_from_suffix(
source: &[u8],
) -> Result<(&[u8], &Self), ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, Infallible>>where
Self: Immutable + KnownLayout,
fn ref_from_suffix(
source: &[u8],
) -> Result<(&[u8], &Self), ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, Infallible>>where
Self: Immutable + KnownLayout,
&Self. Read moreSource§fn mut_from_bytes(
source: &mut [u8],
) -> Result<&mut Self, ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, Infallible>>where
Self: IntoBytes + KnownLayout,
fn mut_from_bytes(
source: &mut [u8],
) -> Result<&mut Self, ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, Infallible>>where
Self: IntoBytes + KnownLayout,
Source§fn mut_from_prefix(
source: &mut [u8],
) -> Result<(&mut Self, &mut [u8]), ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, Infallible>>where
Self: IntoBytes + KnownLayout,
fn mut_from_prefix(
source: &mut [u8],
) -> Result<(&mut Self, &mut [u8]), ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, Infallible>>where
Self: IntoBytes + KnownLayout,
Source§fn mut_from_suffix(
source: &mut [u8],
) -> Result<(&mut [u8], &mut Self), ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, Infallible>>where
Self: IntoBytes + KnownLayout,
fn mut_from_suffix(
source: &mut [u8],
) -> Result<(&mut [u8], &mut Self), ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, Infallible>>where
Self: IntoBytes + KnownLayout,
Source§fn ref_from_bytes_with_elems(
source: &[u8],
count: usize,
) -> Result<&Self, ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, Infallible>>
fn ref_from_bytes_with_elems( source: &[u8], count: usize, ) -> Result<&Self, ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, Infallible>>
Source§fn ref_from_prefix_with_elems(
source: &[u8],
count: usize,
) -> Result<(&Self, &[u8]), ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, Infallible>>
fn ref_from_prefix_with_elems( source: &[u8], count: usize, ) -> Result<(&Self, &[u8]), ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, Infallible>>
Source§fn ref_from_suffix_with_elems(
source: &[u8],
count: usize,
) -> Result<(&[u8], &Self), ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, Infallible>>
fn ref_from_suffix_with_elems( source: &[u8], count: usize, ) -> Result<(&[u8], &Self), ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, Infallible>>
Source§fn mut_from_bytes_with_elems(
source: &mut [u8],
count: usize,
) -> Result<&mut Self, ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, Infallible>>
fn mut_from_bytes_with_elems( source: &mut [u8], count: usize, ) -> Result<&mut Self, ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, Infallible>>
Source§fn mut_from_prefix_with_elems(
source: &mut [u8],
count: usize,
) -> Result<(&mut Self, &mut [u8]), ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, Infallible>>
fn mut_from_prefix_with_elems( source: &mut [u8], count: usize, ) -> Result<(&mut Self, &mut [u8]), ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, Infallible>>
Source§fn mut_from_suffix_with_elems(
source: &mut [u8],
count: usize,
) -> Result<(&mut [u8], &mut Self), ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, Infallible>>
fn mut_from_suffix_with_elems( source: &mut [u8], count: usize, ) -> Result<(&mut [u8], &mut Self), ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, Infallible>>
Source§impl FromBytes for ScsiCommandResponse
impl FromBytes for ScsiCommandResponse
Source§impl FromZeros for ScsiCommandResponsewhere
RawBhsOpcode: FromZeros,
RawScsiCmdRespFlags: FromZeros,
RawResponseCode: FromZeros,
RawScsiStatus: FromZeros,
u8: FromZeros,
[u8; 3]: FromZeros,
[u8; 8]: FromZeros,
InitiatorTaskTag: FromZeros,
U32<BigEndian>: FromZeros,
impl FromZeros for ScsiCommandResponsewhere
RawBhsOpcode: FromZeros,
RawScsiCmdRespFlags: FromZeros,
RawResponseCode: FromZeros,
RawScsiStatus: FromZeros,
u8: FromZeros,
[u8; 3]: FromZeros,
[u8; 8]: FromZeros,
InitiatorTaskTag: FromZeros,
U32<BigEndian>: FromZeros,
impl Immutable for ScsiCommandResponsewhere
RawBhsOpcode: Immutable,
RawScsiCmdRespFlags: Immutable,
RawResponseCode: Immutable,
RawScsiStatus: Immutable,
u8: Immutable,
[u8; 3]: Immutable,
[u8; 8]: Immutable,
InitiatorTaskTag: Immutable,
U32<BigEndian>: Immutable,
Source§impl IntoBytes for ScsiCommandResponsewhere
RawBhsOpcode: IntoBytes,
RawScsiCmdRespFlags: IntoBytes,
RawResponseCode: IntoBytes,
RawScsiStatus: IntoBytes,
u8: IntoBytes,
[u8; 3]: IntoBytes,
[u8; 8]: IntoBytes,
InitiatorTaskTag: IntoBytes,
U32<BigEndian>: IntoBytes,
(): PaddingFree<Self, { _ }>,
impl IntoBytes for ScsiCommandResponsewhere
RawBhsOpcode: IntoBytes,
RawScsiCmdRespFlags: IntoBytes,
RawResponseCode: IntoBytes,
RawScsiStatus: IntoBytes,
u8: IntoBytes,
[u8; 3]: IntoBytes,
[u8; 8]: IntoBytes,
InitiatorTaskTag: IntoBytes,
U32<BigEndian>: IntoBytes,
(): PaddingFree<Self, { _ }>,
Source§fn as_mut_bytes(&mut self) -> &mut [u8] ⓘwhere
Self: FromBytes,
fn as_mut_bytes(&mut self) -> &mut [u8] ⓘwhere
Self: FromBytes,
Source§fn write_to(&self, dst: &mut [u8]) -> Result<(), SizeError<&Self, &mut [u8]>>where
Self: Immutable,
fn write_to(&self, dst: &mut [u8]) -> Result<(), SizeError<&Self, &mut [u8]>>where
Self: Immutable,
Source§impl KnownLayout for ScsiCommandResponse
impl KnownLayout for ScsiCommandResponse
Source§type PointerMetadata = <U32<BigEndian> as KnownLayout>::PointerMetadata
type PointerMetadata = <U32<BigEndian> as KnownLayout>::PointerMetadata
Self. Read moreSource§fn size_for_metadata(meta: Self::PointerMetadata) -> Option<usize>
fn size_for_metadata(meta: Self::PointerMetadata) -> Option<usize>
Self with the given pointer
metadata. Read moreSource§impl PartialEq for ScsiCommandResponse
impl PartialEq for ScsiCommandResponse
Source§fn eq(&self, other: &ScsiCommandResponse) -> bool
fn eq(&self, other: &ScsiCommandResponse) -> bool
self and other values to be equal, and is used by ==.Source§impl SendingData for ScsiCommandResponse
impl SendingData for ScsiCommandResponse
Source§fn get_final_bit(&self) -> bool
fn get_final_bit(&self) -> bool
Source§fn set_final_bit(&mut self)
fn set_final_bit(&mut self)
Source§fn get_continue_bit(&self) -> bool
fn get_continue_bit(&self) -> bool
Source§fn set_continue_bit(&mut self)
fn set_continue_bit(&mut self)
impl StructuralPartialEq for ScsiCommandResponse
Source§impl TryFromBytes for ScsiCommandResponsewhere
RawBhsOpcode: TryFromBytes,
RawScsiCmdRespFlags: TryFromBytes,
RawResponseCode: TryFromBytes,
RawScsiStatus: TryFromBytes,
u8: TryFromBytes,
[u8; 3]: TryFromBytes,
[u8; 8]: TryFromBytes,
InitiatorTaskTag: TryFromBytes,
U32<BigEndian>: TryFromBytes,
impl TryFromBytes for ScsiCommandResponsewhere
RawBhsOpcode: TryFromBytes,
RawScsiCmdRespFlags: TryFromBytes,
RawResponseCode: TryFromBytes,
RawScsiStatus: TryFromBytes,
u8: TryFromBytes,
[u8; 3]: TryFromBytes,
[u8; 8]: TryFromBytes,
InitiatorTaskTag: TryFromBytes,
U32<BigEndian>: TryFromBytes,
Source§fn try_ref_from_bytes(
source: &[u8],
) -> Result<&Self, ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>where
Self: KnownLayout + Immutable,
fn try_ref_from_bytes(
source: &[u8],
) -> Result<&Self, ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>where
Self: KnownLayout + Immutable,
Source§fn try_ref_from_prefix(
source: &[u8],
) -> Result<(&Self, &[u8]), ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>where
Self: KnownLayout + Immutable,
fn try_ref_from_prefix(
source: &[u8],
) -> Result<(&Self, &[u8]), ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>where
Self: KnownLayout + Immutable,
Source§fn try_ref_from_suffix(
source: &[u8],
) -> Result<(&[u8], &Self), ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>where
Self: KnownLayout + Immutable,
fn try_ref_from_suffix(
source: &[u8],
) -> Result<(&[u8], &Self), ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>where
Self: KnownLayout + Immutable,
Source§fn try_mut_from_bytes(
bytes: &mut [u8],
) -> Result<&mut Self, ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, ValidityError<&mut [u8], Self>>>where
Self: KnownLayout + IntoBytes,
fn try_mut_from_bytes(
bytes: &mut [u8],
) -> Result<&mut Self, ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, ValidityError<&mut [u8], Self>>>where
Self: KnownLayout + IntoBytes,
Source§fn try_mut_from_prefix(
source: &mut [u8],
) -> Result<(&mut Self, &mut [u8]), ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, ValidityError<&mut [u8], Self>>>where
Self: KnownLayout + IntoBytes,
fn try_mut_from_prefix(
source: &mut [u8],
) -> Result<(&mut Self, &mut [u8]), ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, ValidityError<&mut [u8], Self>>>where
Self: KnownLayout + IntoBytes,
Source§fn try_mut_from_suffix(
source: &mut [u8],
) -> Result<(&mut [u8], &mut Self), ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, ValidityError<&mut [u8], Self>>>where
Self: KnownLayout + IntoBytes,
fn try_mut_from_suffix(
source: &mut [u8],
) -> Result<(&mut [u8], &mut Self), ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, ValidityError<&mut [u8], Self>>>where
Self: KnownLayout + IntoBytes,
Source§fn try_ref_from_bytes_with_elems(
source: &[u8],
count: usize,
) -> Result<&Self, ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>
fn try_ref_from_bytes_with_elems( source: &[u8], count: usize, ) -> Result<&Self, ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>
Source§fn try_ref_from_prefix_with_elems(
source: &[u8],
count: usize,
) -> Result<(&Self, &[u8]), ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>
fn try_ref_from_prefix_with_elems( source: &[u8], count: usize, ) -> Result<(&Self, &[u8]), ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>
source as a &Self with
a DST length equal to count. Read moreSource§fn try_ref_from_suffix_with_elems(
source: &[u8],
count: usize,
) -> Result<(&[u8], &Self), ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>
fn try_ref_from_suffix_with_elems( source: &[u8], count: usize, ) -> Result<(&[u8], &Self), ConvertError<AlignmentError<&[u8], Self>, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>
source as a &Self with
a DST length equal to count. Read moreSource§fn try_mut_from_bytes_with_elems(
source: &mut [u8],
count: usize,
) -> Result<&mut Self, ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, ValidityError<&mut [u8], Self>>>
fn try_mut_from_bytes_with_elems( source: &mut [u8], count: usize, ) -> Result<&mut Self, ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, ValidityError<&mut [u8], Self>>>
Source§fn try_mut_from_prefix_with_elems(
source: &mut [u8],
count: usize,
) -> Result<(&mut Self, &mut [u8]), ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, ValidityError<&mut [u8], Self>>>
fn try_mut_from_prefix_with_elems( source: &mut [u8], count: usize, ) -> Result<(&mut Self, &mut [u8]), ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, ValidityError<&mut [u8], Self>>>
source as a &mut Self
with a DST length equal to count. Read moreSource§fn try_mut_from_suffix_with_elems(
source: &mut [u8],
count: usize,
) -> Result<(&mut [u8], &mut Self), ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, ValidityError<&mut [u8], Self>>>
fn try_mut_from_suffix_with_elems( source: &mut [u8], count: usize, ) -> Result<(&mut [u8], &mut Self), ConvertError<AlignmentError<&mut [u8], Self>, SizeError<&mut [u8], Self>, ValidityError<&mut [u8], Self>>>
source as a &mut Self
with a DST length equal to count. Read more