From 1f1e5111d4da07faaa7f361e95b807150a8f3348 Mon Sep 17 00:00:00 2001 From: Ronnie Sahlberg Date: Sun, 2 Jan 2011 12:59:41 +1100 Subject: [PATCH] Negotiate ImmediateData during login and store the result in iscsi-> We will use this later to decide when we should send unsolicited imemdiate data to the target. Currently we always send unsolicited immediate data but targets configured to not allow immediate data may refuce this and turn an error. --- include/iscsi-private.h | 7 +++++++ lib/init.c | 2 ++ lib/login.c | 13 ++++++++++++- 3 files changed, 21 insertions(+), 1 deletion(-) 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); }