Add support for Data Digest

This commit is contained in:
Brian Meagher
2024-05-04 18:54:21 -07:00
parent ec5d33da63
commit 882bcad53a
11 changed files with 254 additions and 17 deletions

View File

@@ -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;