diff --git a/include/iscsi-private.h b/include/iscsi-private.h index 9783d4b..85fbc5d 100644 --- a/include/iscsi-private.h +++ b/include/iscsi-private.h @@ -45,6 +45,11 @@ enum iscsi_initial_r2t { ISCSI_INITIAL_R2T_YES = 1 }; +enum iscsi_immediate_data { + ISCSI_IMMEDIATE_DATA_NO = 0, + ISCSI_IMMEDIATE_DATA_YES = 1 +}; + struct iscsi_context { const char *initiator_name; const char *target_name; @@ -93,6 +98,8 @@ struct iscsi_context { uint32_t max_recv_data_segment_length; enum iscsi_initial_r2t want_initial_r2t; enum iscsi_initial_r2t use_initial_r2t; + enum iscsi_initial_r2t want_immediate_data; + enum iscsi_initial_r2t use_immediate_data; }; #define ISCSI_PDU_IMMEDIATE 0x40 diff --git a/lib/init.c b/lib/init.c index 74255a8..4e8d681 100644 --- a/lib/init.c +++ b/lib/init.c @@ -65,6 +65,8 @@ iscsi_create_context(const char *initiator_name) iscsi->max_recv_data_segment_length = 262144; iscsi->want_initial_r2t = ISCSI_INITIAL_R2T_NO; iscsi->use_initial_r2t = ISCSI_INITIAL_R2T_NO; + iscsi->want_immediate_data = ISCSI_IMMEDIATE_DATA_YES; + iscsi->use_immediate_data = ISCSI_IMMEDIATE_DATA_YES; return iscsi; } diff --git a/lib/login.c b/lib/login.c index 8346c7f..db50af0 100644 --- a/lib/login.c +++ b/lib/login.c @@ -218,12 +218,15 @@ iscsi_login_add_immediatedata(struct iscsi_context *iscsi, struct iscsi_pdu *pdu return 0; } - str = (char *)"ImmediateData=Yes"; + asprintf(&str, "ImmediateData=%s", iscsi->want_immediate_data == ISCSI_IMMEDIATE_DATA_NO ? + "No" : "Yes"); if (iscsi_pdu_add_data(iscsi, pdu, (unsigned char *)str, strlen(str)+1) != 0) { iscsi_set_error(iscsi, "Out-of-memory: pdu add data failed."); + free(str); return -1; } + free(str); return 0; } @@ -942,6 +945,14 @@ iscsi_process_login_reply(struct iscsi_context *iscsi, struct iscsi_pdu *pdu, } } + if (!strncmp((char *)ptr, "ImmediateData=", 14)) { + if (!strcmp((char *)ptr + 14, "No")) { + iscsi->use_immediate_data = ISCSI_IMMEDIATE_DATA_NO; + } else { + iscsi->use_immediate_data = ISCSI_IMMEDIATE_DATA_YES; + } + } + if (!strncmp((char *)ptr, "MaxBurstLength=", 15)) { iscsi->max_burst_length = strtol((char *)ptr + 15, NULL, 10); }