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

@@ -61,6 +61,13 @@ struct iscsi_in_pdu {
long long data_pos;
unsigned char *data;
/*
* Some data structures wrt Data Digest (if negociated)
*/
unsigned char data_digest_buf[ISCSI_DIGEST_SIZE];
int received_data_digest_bytes;
uint32_t calculated_data_digest;
};
void iscsi_free_iscsi_in_pdu(struct iscsi_context *iscsi, struct iscsi_in_pdu *in);
@@ -105,6 +112,8 @@ struct iscsi_context {
uint32_t statsn;
enum iscsi_header_digest want_header_digest;
enum iscsi_header_digest header_digest;
enum iscsi_data_digest want_data_digest;
enum iscsi_data_digest data_digest;
int fd;
int is_connected;
@@ -272,6 +281,8 @@ struct iscsi_pdu {
struct iscsi_scsi_cbdata scsi_cbdata;
time_t scsi_timeout;
uint32_t expxferlen;
uint32_t calculated_data_digest;
};
struct iscsi_pdu *iscsi_allocate_pdu(struct iscsi_context *iscsi,
@@ -350,6 +361,9 @@ void* iscsi_szmalloc(struct iscsi_context *iscsi, size_t size);
void iscsi_sfree(struct iscsi_context *iscsi, void* ptr);
uint32_t crc32c(uint8_t *buf, int len);
void crc32c_init(uint32_t *crc_ptr);
uint32_t crc32c_chain(uint32_t crc, uint8_t *buf, int len);
uint32_t crc32c_chain_done(uint32_t crc);
struct scsi_task *iscsi_scsi_get_task_from_pdu(struct iscsi_pdu *pdu);

View File

@@ -335,6 +335,29 @@ enum iscsi_header_digest {
EXTERN int iscsi_set_header_digest(struct iscsi_context *iscsi,
enum iscsi_header_digest header_digest);
/*
* Types of data digest we support. Default is NONE
*/
enum iscsi_data_digest {
ISCSI_DATA_DIGEST_NONE = 0,
ISCSI_DATA_DIGEST_NONE_CRC32C = 1,
ISCSI_DATA_DIGEST_CRC32C_NONE = 2,
ISCSI_DATA_DIGEST_CRC32C = 3,
ISCSI_DATA_DIGEST_LAST = ISCSI_DATA_DIGEST_CRC32C
};
/*
* Set the desired data digest for a scsi context.
* Data digest can only be set/changed before the context
* is logged in to the target.
*
* Returns:
* 0: success
* <0: error
*/
EXTERN int iscsi_set_data_digest(struct iscsi_context *iscsi,
enum iscsi_data_digest data_digest);
/*
* Specify the username and password to use for chap authentication
*/