PDU avoid incrementing itt to 0xffffffff
This patch avoid incrementing itt to 0xffffffff which is a reserved value for immediate pdus. Avoid incrementing it to 0xfffffff to avoid unexpected behaviour. Signed-off-by: Peter Lieven <pl@kamp.de>
This commit is contained in:
@@ -328,6 +328,9 @@ iscsi_add_to_outqueue(struct iscsi_context *iscsi, struct iscsi_pdu *pdu);
|
|||||||
int
|
int
|
||||||
iscsi_serial32_compare(u_int32_t s1, u_int32_t s2);
|
iscsi_serial32_compare(u_int32_t s1, u_int32_t s2);
|
||||||
|
|
||||||
|
u_int32_t
|
||||||
|
iscsi_itt_post_increment(struct iscsi_context *iscsi);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -279,7 +279,7 @@ try_again:
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
pdu->itt = iscsi->itt++;
|
pdu->itt = iscsi_itt_post_increment(iscsi);
|
||||||
iscsi_pdu_set_itt(pdu, pdu->itt);
|
iscsi_pdu_set_itt(pdu, pdu->itt);
|
||||||
|
|
||||||
pdu->cmdsn = iscsi->cmdsn++;
|
pdu->cmdsn = iscsi->cmdsn++;
|
||||||
@@ -309,7 +309,7 @@ try_again:
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
pdu->itt = iscsi->itt++;
|
pdu->itt = iscsi_itt_post_increment(iscsi);
|
||||||
iscsi_pdu_set_itt(pdu, pdu->itt);
|
iscsi_pdu_set_itt(pdu, pdu->itt);
|
||||||
|
|
||||||
pdu->cmdsn = iscsi->cmdsn++;
|
pdu->cmdsn = iscsi->cmdsn++;
|
||||||
|
|||||||
@@ -1067,7 +1067,7 @@ iscsi_process_login_reply(struct iscsi_context *iscsi, struct iscsi_pdu *pdu,
|
|||||||
if ((in->hdr[1] & ISCSI_PDU_LOGIN_TRANSIT)
|
if ((in->hdr[1] & ISCSI_PDU_LOGIN_TRANSIT)
|
||||||
&& (in->hdr[1] & ISCSI_PDU_LOGIN_NSG_FF) == ISCSI_PDU_LOGIN_NSG_FF) {
|
&& (in->hdr[1] & ISCSI_PDU_LOGIN_NSG_FF) == ISCSI_PDU_LOGIN_NSG_FF) {
|
||||||
iscsi->is_loggedin = 1;
|
iscsi->is_loggedin = 1;
|
||||||
iscsi->itt++;
|
iscsi_itt_post_increment(iscsi);
|
||||||
iscsi->header_digest = iscsi->want_header_digest;
|
iscsi->header_digest = iscsi->want_header_digest;
|
||||||
ISCSI_LOG(iscsi, 2, "login successful");
|
ISCSI_LOG(iscsi, 2, "login successful");
|
||||||
pdu->callback(iscsi, SCSI_STATUS_GOOD, NULL, pdu->private_data);
|
pdu->callback(iscsi, SCSI_STATUS_GOOD, NULL, pdu->private_data);
|
||||||
|
|||||||
16
lib/pdu.c
16
lib/pdu.c
@@ -48,6 +48,18 @@ iscsi_serial32_compare(u_int32_t s1, u_int32_t s2) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u_int32_t
|
||||||
|
iscsi_itt_post_increment(struct iscsi_context *iscsi) {
|
||||||
|
u_int32_t old_itt = iscsi->itt;
|
||||||
|
iscsi->itt++;
|
||||||
|
/* 0xffffffff is a reserved value */
|
||||||
|
if (iscsi->itt == 0xffffffff) {
|
||||||
|
iscsi->itt = 0;
|
||||||
|
}
|
||||||
|
return old_itt;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
struct iscsi_pdu *
|
struct iscsi_pdu *
|
||||||
iscsi_allocate_pdu_with_itt_flags_size(struct iscsi_context *iscsi, enum iscsi_opcode opcode,
|
iscsi_allocate_pdu_with_itt_flags_size(struct iscsi_context *iscsi, enum iscsi_opcode opcode,
|
||||||
enum iscsi_opcode response_opcode, uint32_t itt, uint32_t flags, size_t payload_size)
|
enum iscsi_opcode response_opcode, uint32_t itt, uint32_t flags, size_t payload_size)
|
||||||
@@ -107,14 +119,14 @@ struct iscsi_pdu *
|
|||||||
iscsi_allocate_pdu(struct iscsi_context *iscsi, enum iscsi_opcode opcode,
|
iscsi_allocate_pdu(struct iscsi_context *iscsi, enum iscsi_opcode opcode,
|
||||||
enum iscsi_opcode response_opcode)
|
enum iscsi_opcode response_opcode)
|
||||||
{
|
{
|
||||||
return iscsi_allocate_pdu_with_itt_flags(iscsi, opcode, response_opcode, iscsi->itt++, 0);
|
return iscsi_allocate_pdu_with_itt_flags(iscsi, opcode, response_opcode, iscsi_itt_post_increment(iscsi), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct iscsi_pdu *
|
struct iscsi_pdu *
|
||||||
iscsi_allocate_pdu_size(struct iscsi_context *iscsi, enum iscsi_opcode opcode,
|
iscsi_allocate_pdu_size(struct iscsi_context *iscsi, enum iscsi_opcode opcode,
|
||||||
enum iscsi_opcode response_opcode, size_t payload_size)
|
enum iscsi_opcode response_opcode, size_t payload_size)
|
||||||
{
|
{
|
||||||
return iscsi_allocate_pdu_with_itt_flags_size(iscsi, opcode, response_opcode, iscsi->itt++, 0, payload_size);
|
return iscsi_allocate_pdu_with_itt_flags_size(iscsi, opcode, response_opcode, iscsi_itt_post_increment(iscsi), 0, payload_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user