iscsi: compute Data Digest for out_data segments
This commit is contained in:
@@ -20,6 +20,7 @@
|
||||
#include <stdint.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#if defined(_WIN32)
|
||||
#include <basetsd.h>
|
||||
@@ -316,6 +317,7 @@ struct iscsi_pdu {
|
||||
uint32_t expxferlen;
|
||||
|
||||
uint32_t calculated_data_digest;
|
||||
bool outdata_digest_computed;
|
||||
};
|
||||
|
||||
struct iscsi_pdu *iscsi_allocate_pdu(struct iscsi_context *iscsi,
|
||||
|
||||
24
lib/socket.c
24
lib/socket.c
@@ -839,13 +839,12 @@ static int iscsi_pdu_update_headerdigest(struct iscsi_context *iscsi, struct isc
|
||||
static int
|
||||
iscsi_write_to_socket(struct iscsi_context *iscsi)
|
||||
{
|
||||
ssize_t count;
|
||||
ssize_t count, data_segment_len;
|
||||
size_t total;
|
||||
struct iscsi_pdu *pdu;
|
||||
static char padding_buf[3];
|
||||
int socket_flags = 0;
|
||||
bool do_data_digest = (iscsi->data_digest != ISCSI_DATA_DIGEST_NONE);
|
||||
|
||||
bool do_data_digest = (iscsi->data_digest != ISCSI_DATA_DIGEST_NONE), execute_data_digest;
|
||||
#ifdef MSG_NOSIGNAL
|
||||
socket_flags |= MSG_NOSIGNAL;
|
||||
#elif SO_NOSIGPIPE
|
||||
@@ -935,6 +934,23 @@ iscsi_write_to_socket(struct iscsi_context *iscsi)
|
||||
return 0;
|
||||
}
|
||||
|
||||
data_segment_len = iscsi_get_pdu_data_size(pdu->outdata.data);
|
||||
if (do_data_digest &&
|
||||
data_segment_len &&
|
||||
!pdu->payload_len)
|
||||
execute_data_digest = true;
|
||||
else
|
||||
execute_data_digest = false;
|
||||
|
||||
if (execute_data_digest && !pdu->outdata_digest_computed)
|
||||
{
|
||||
uint8_t ahslen = pdu->outdata.data[4];
|
||||
uint8_t head_len = iscsi->header_digest != ISCSI_HEADER_DIGEST_NONE ? 52 : 48;
|
||||
uint32_t offset = head_len + ahslen * 4;
|
||||
pdu->calculated_data_digest = crc32c_chain(pdu->calculated_data_digest, pdu->outdata.data + offset, pdu->outdata.size - offset);
|
||||
pdu->outdata_digest_computed = true;
|
||||
}
|
||||
|
||||
/* Write any iovectors that might have been passed to us */
|
||||
while (pdu->payload_written < pdu->payload_len) {
|
||||
struct scsi_iovector* iovector_out;
|
||||
@@ -991,7 +1007,7 @@ iscsi_write_to_socket(struct iscsi_context *iscsi)
|
||||
* 1. DataDigest has been negociated, and
|
||||
* 2. We have actually written some data
|
||||
*/
|
||||
if (do_data_digest && pdu->payload_written) {
|
||||
if (execute_data_digest || (do_data_digest && pdu->payload_written)) {
|
||||
uint32_t data_digest = crc32c_chain_done(pdu->calculated_data_digest);
|
||||
char data_digest_buf[ISCSI_DIGEST_SIZE];
|
||||
|
||||
|
||||
Reference in New Issue
Block a user