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:
Vladislav Bolkhovitin
2009-02-16 18:46:00 +00:00
parent 3ab0a8972a
commit fe1a79f012
4 changed files with 32 additions and 22 deletions

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -19,7 +19,7 @@
struct iscsi_key;
struct iscsi_param {
int state;
int key_state;
unsigned int val;
};