mirror of
https://github.com/SCST-project/scst.git
synced 2026-05-14 09:11:27 +00:00
Fixes negotiation breakage, introduced by r667
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@674 d57e44dd-8a1f-0410-8b47-8ef2f437770f
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
struct iscsi_key;
|
||||
|
||||
struct iscsi_param {
|
||||
int state;
|
||||
int key_state;
|
||||
unsigned int val;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user