diff --git a/iscsi-scst/usr/iscsid.c b/iscsi-scst/usr/iscsid.c index dcb3a566d..6a6b4a88b 100644 --- a/iscsi-scst/usr/iscsid.c +++ b/iscsi-scst/usr/iscsid.c @@ -303,11 +303,13 @@ static void text_scan_login(struct connection *conn) text_key_add(conn, key, "NotUnderstood"); continue; } - if (idx == key_max_recv_data_length) + if (idx == key_max_recv_data_length) { + conn->session_param[idx].key_state = KEY_STATE_DONE; idx = key_max_xmit_data_length; + }; if (param_str_to_val(session_keys, idx, value, &val) < 0) { - if (conn->session_param[idx].state == KEY_STATE_START) { + if (conn->session_param[idx].key_state == KEY_STATE_START) { text_key_add_reject(conn, key); continue; } else { @@ -321,13 +323,16 @@ static void text_scan_login(struct connection *conn) param_check_val(session_keys, idx, &val); param_set_val(session_keys, conn->session_param, idx, &val); - switch (conn->session_param[idx].state) { + switch (conn->session_param[idx].key_state) { case KEY_STATE_START: - if (iscsi_is_key_declarative(idx)) + if (iscsi_is_key_declarative(idx)) { + conn->session_param[idx].key_state = KEY_STATE_DONE; break; + } memset(buf, 0, sizeof(buf)); param_val_to_str(session_keys, idx, val, buf); text_key_add(conn, key, buf); + conn->session_param[idx].key_state = KEY_STATE_DONE_ADDED; break; case KEY_STATE_REQUEST: if (val != conn->session_param[idx].val) { @@ -338,11 +343,12 @@ static void text_scan_login(struct connection *conn) val, conn->session_param[idx].val); goto out; } + conn->session_param[idx].key_state = KEY_STATE_DONE; break; + case KEY_STATE_DONE_ADDED: case KEY_STATE_DONE: break; } - conn->session_param[idx].state = KEY_STATE_DONE; } else text_key_add(conn, key, "NotUnderstood"); } @@ -358,12 +364,23 @@ static int text_check_param(struct connection *conn) int i, cnt; for (i = 0, cnt = 0; session_keys[i].name; i++) { - if (p[i].state == KEY_STATE_START && p[i].val != session_keys[i].rfc_def) { + if (p[i].val != session_keys[i].rfc_def) { + if (p[i].key_state == KEY_STATE_START) { + log_debug(1, "Key %s was not negotiated, use RFC " + "defined default %d", session_keys[i].name, + session_keys[i].rfc_def); + p[i].val = session_keys[i].rfc_def; + continue; + } else if (p[i].key_state == KEY_STATE_DONE_ADDED) { + log_debug(1, "Key %s was already added, val %d", + session_keys[i].name, p[i].val); + continue; + } switch (conn->state) { case STATE_LOGIN_FULL: case STATE_SECURITY_FULL: if (iscsi_is_key_declarative(i)) { - p[i].state = KEY_STATE_DONE; + p[i].key_state = KEY_STATE_DONE; continue; } break; @@ -374,10 +391,10 @@ static int text_check_param(struct connection *conn) param_val_to_str(session_keys, i, p[i].val, buf); text_key_add(conn, session_keys[i].name, buf); if (i == key_max_recv_data_length) { - p[i].state = KEY_STATE_DONE; + p[i].key_state = KEY_STATE_DONE; continue; } - p[i].state = KEY_STATE_REQUEST; + p[i].key_state = KEY_STATE_REQUEST; break; default: if (iscsi_is_key_declarative(i)) @@ -465,15 +482,7 @@ static void login_finish(struct connection *conn) switch (conn->session_type) { case SESSION_NORMAL: { - int i; - for (i = 0; session_keys[i].name; i++) { - if (conn->session_param[i].state == KEY_STATE_START) { - log_debug(1, "Key %s was not negotiated, use RFC defined " - "default %d", session_keys[i].name, - session_keys[i].rfc_def); - conn->session_param[i].val = session_keys[i].rfc_def; - } - } + if (!conn->session) session_create(conn); conn->sid = conn->session->sid; diff --git a/iscsi-scst/usr/iscsid.h b/iscsi-scst/usr/iscsid.h index 7f53da9ee..52d484f43 100644 --- a/iscsi-scst/usr/iscsid.h +++ b/iscsi-scst/usr/iscsid.h @@ -46,7 +46,8 @@ struct PDU { #define KEY_STATE_START 0 #define KEY_STATE_REQUEST 1 -#define KEY_STATE_DONE 2 +#define KEY_STATE_DONE_ADDED 2 +#define KEY_STATE_DONE 3 struct session { struct __qelem slist; diff --git a/iscsi-scst/usr/param.c b/iscsi-scst/usr/param.c index fd8323dc4..b677ccfac 100644 --- a/iscsi-scst/usr/param.c +++ b/iscsi-scst/usr/param.c @@ -197,8 +197,8 @@ static int marker_val_to_str(unsigned int val, char *str) static int marker_set_val(struct iscsi_param *param, int idx, unsigned int *val) { - if ((idx == key_ofmarkint && param[key_ofmarker].state == KEY_STATE_DONE) || - (idx == key_ifmarkint && param[key_ifmarker].state == KEY_STATE_DONE)) + if ((idx == key_ofmarkint && param[key_ofmarker].key_state == KEY_STATE_DONE) || + (idx == key_ifmarkint && param[key_ifmarker].key_state == KEY_STATE_DONE)) *val = 0; else *val = 1; diff --git a/iscsi-scst/usr/param.h b/iscsi-scst/usr/param.h index af027dfd9..2578f023a 100644 --- a/iscsi-scst/usr/param.h +++ b/iscsi-scst/usr/param.h @@ -19,7 +19,7 @@ struct iscsi_key; struct iscsi_param { - int state; + int key_state; unsigned int val; };