2.2.9 TRANS_COMMAND_SACK
The TRANS_COMMAND_SACK packet is used to acknowledge outstanding packets. Packet ACK is typically bundled in all user data packets using the bSeq and bNRcv fields found in the TRANS_USERDATA_HEADER. However, the TRANS_COMMAND_SACK packet is used in the following scenarios:
A dedicated ACK is requested (that is, when the PACKET_COMMAND_POLL bit in the bCommand header field is set).
No user data remains for further bundled acknowledgments.
The Delayed Acknowledgment Timer (section 3.1.2.6) elapses.
|
|
|
|
|
|
|
|
|
|
1 |
|
|
|
|
|
|
|
|
|
2 |
|
|
|
|
|
|
|
|
|
3 |
|
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
bCommand |
bExtOpCode |
bFlags |
bRetry |
||||||||||||||||||||||||||||
|
bNSeq |
bNRcv |
wPadding |
|||||||||||||||||||||||||||||
|
tTimestamp |
|||||||||||||||||||||||||||||||
|
dwSACKMask1 (optional) |
|||||||||||||||||||||||||||||||
|
dwSACKMask2 (optional) |
|||||||||||||||||||||||||||||||
|
dwSendMask1 (optional) |
|||||||||||||||||||||||||||||||
|
dwSendMask2 (optional) |
|||||||||||||||||||||||||||||||
bCommand (1 byte): An 8-bit integer that provides the command code for the message. This field MUST be set to one of the following values.
-
Value
Meaning
0x80
Indicates that this message utilizes a command frame (CFRAME).
0x88
Indicates that this message utilizes a CFRAME (0x80) and POLL (0x08) values, which specify that the sender requests immediate acknowledgment (ACK) from the receiver upon receipt of the message.
-
The CFRAME value MUST be set. The POLL value SHOULD NOT be set and SHOULD be ignored. If any other values are specified, the packet MUST be ignored.
bExtOpCode (1 byte): An 8-bit integer that provides the extended operation code for the message. This field MUST be set to 0x06 to denote that this message selectively acknowledges (SACK) outstanding packets.
bFlags (1 byte): An 8-bit integer that provides the status flags for the message. This field MUST be set to one or more of the following values.
-
Value
Meaning
SACK_FLAGS_RESPONSE
0x01
The bRetry field is valid.
SACK_FLAGS_SACK_MASK1
0x02
The low 32 bits of the SACK mask are present in dwSACKMask1.
SACK_FLAGS_SACK_MASK2
0x04
The high 32 bits of the SACK mask are present in dwSACKMask2.
SACK_FLAGS_SEND_MASK1
0x08
The low 32 bits of the send mask are present in dwSendMask1.
SACK_FLAGS_SEND_MASK2
0x10
The high 32 bits of the send mask are present in dwSendMask2.
-
If any of the mask bits are set, and there is no corresponding Mask DWORD present in the message, then this message SHOULD be ignored.
bRetry (1 byte): A Boolean that indicates if the last received packet was a retry. This value MUST be ignored if SACK_FLAGS_RESPONSE is not set. Otherwise, the value SHOULD be 0 if the last received data frame (DFRAME) for the connection was not marked as a retry; otherwise, it SHOULD be nonzero. Recipients MUST NOT require any particular bit (or bits) to be set in the nonzero case, only that at least one bit is set.
bNSeq (1 byte): SACK packets do not have sequence numbers of their own. This 8-bit integer represents the sequence number of the next DFRAME to send.
bNRcv (1 byte): An 8-bit integer that provides the expected sequence number of the next packet received. If the SACK_FLAGS_SACK_MASK1 flag is set, the bNRcv field is supplemented with an additional DWORD bitmask field that selectively acknowledges frames with sequence numbers higher than bNRcv.
wPadding (2 bytes): A 16-bit integer field MUST be set to 0 when sending and ignored on receipt.
tTimestamp (4 bytes): A 32-bit integer that provides the sender's computer system tick count. The value of the tTimestamp field SHOULD be ignored, but MAY be used to estimate the differences in local tick counts between a sender and receiver.
dwSACKMask1 (4 bytes): A 32-bit integer that provides the optional low 32 bits of the SACK mask in little-endian byte order. The existence of this field in the packet is dependent on the bFlags field having SACK_FLAGS_SACK_MASK1 set.
dwSACKMask2 (4 bytes): A 32-bit integer that provides the optional high 32 bits of the SACK mask in little-endian byte order. The existence of this field in the packet is dependent on the bFlags field having SACK_FLAGS_SACK_MASK2 set.
dwSendMask1 (4 bytes): A 32-bit integer that provides the optional low 32 bits of the send mask in little-endian byte order. The existence of this field in the packet is dependent on the bFlags field having SACK_FLAGS_SEND_MASK1 set.
dwSendMask2 (4 bytes): A 32-bit integer that provides the optional high 32 bits of the send mask in little-endian byte order. The existence of this field in the packet is dependent on the bFlags field having SACK_FLAGS_SEND_MASK2 set.