Add support for Data Digest
This commit is contained in:
22
lib/pdu.c
22
lib/pdu.c
@@ -225,6 +225,9 @@ iscsi_allocate_pdu(struct iscsi_context *iscsi, enum iscsi_opcode opcode,
|
||||
/* flags */
|
||||
pdu->flags = flags;
|
||||
|
||||
/* DataDigest - may or may not be calculated. Initialize anyway. */
|
||||
crc32c_init(&pdu->calculated_data_digest);
|
||||
|
||||
return pdu;
|
||||
}
|
||||
|
||||
@@ -537,6 +540,25 @@ iscsi_process_pdu(struct iscsi_context *iscsi, struct iscsi_in_pdu *in)
|
||||
}
|
||||
}
|
||||
|
||||
/* verify data checksum ... */
|
||||
if (iscsi->data_digest != ISCSI_DATA_DIGEST_NONE) {
|
||||
int dsl = scsi_get_uint32(&in->hdr[4]) & 0x00ffffff;
|
||||
/* ... but only if some data is present. */
|
||||
if (dsl) {
|
||||
uint32_t crc_rcvd = 0;
|
||||
uint32_t crc = crc32c_chain_done(in->calculated_data_digest);
|
||||
|
||||
crc_rcvd |= in->data_digest_buf[0];
|
||||
crc_rcvd |= in->data_digest_buf[1] << 8;
|
||||
crc_rcvd |= in->data_digest_buf[2] << 16;
|
||||
crc_rcvd |= in->data_digest_buf[3] << 24;
|
||||
if (crc != crc_rcvd) {
|
||||
iscsi_set_error(iscsi, "data checksum verification failed: calculated 0x%" PRIx32 " received 0x%" PRIx32, crc, crc_rcvd);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ahslen != 0) {
|
||||
iscsi_set_error(iscsi, "cant handle expanded headers yet");
|
||||
return -1;
|
||||
|
||||
Reference in New Issue
Block a user