|
@@ -1652,9 +1652,12 @@ static int qla4xxx_session_get_param(struct iscsi_cls_session *cls_sess,
|
|
|
struct iscsi_session *sess = cls_sess->dd_data;
|
|
|
struct ddb_entry *ddb_entry = sess->dd_data;
|
|
|
struct scsi_qla_host *ha = ddb_entry->ha;
|
|
|
+ struct iscsi_cls_conn *cls_conn = ddb_entry->conn;
|
|
|
+ struct ql4_chap_table chap_tbl;
|
|
|
int rval, len;
|
|
|
uint16_t idx;
|
|
|
|
|
|
+ memset(&chap_tbl, 0, sizeof(chap_tbl));
|
|
|
switch (param) {
|
|
|
case ISCSI_PARAM_CHAP_IN_IDX:
|
|
|
rval = qla4xxx_get_chap_index(ha, sess->username_in,
|
|
@@ -1666,14 +1669,46 @@ static int qla4xxx_session_get_param(struct iscsi_cls_session *cls_sess,
|
|
|
len = sprintf(buf, "%hu\n", idx);
|
|
|
break;
|
|
|
case ISCSI_PARAM_CHAP_OUT_IDX:
|
|
|
- rval = qla4xxx_get_chap_index(ha, sess->username,
|
|
|
- sess->password, LOCAL_CHAP,
|
|
|
- &idx);
|
|
|
+ if (ddb_entry->ddb_type == FLASH_DDB) {
|
|
|
+ if (ddb_entry->chap_tbl_idx != INVALID_ENTRY) {
|
|
|
+ idx = ddb_entry->chap_tbl_idx;
|
|
|
+ rval = QLA_SUCCESS;
|
|
|
+ } else {
|
|
|
+ rval = QLA_ERROR;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ rval = qla4xxx_get_chap_index(ha, sess->username,
|
|
|
+ sess->password,
|
|
|
+ LOCAL_CHAP, &idx);
|
|
|
+ }
|
|
|
if (rval)
|
|
|
len = sprintf(buf, "\n");
|
|
|
else
|
|
|
len = sprintf(buf, "%hu\n", idx);
|
|
|
break;
|
|
|
+ case ISCSI_PARAM_USERNAME:
|
|
|
+ case ISCSI_PARAM_PASSWORD:
|
|
|
+ /* First, populate session username and password for FLASH DDB,
|
|
|
+ * if not already done. This happens when session login fails
|
|
|
+ * for a FLASH DDB.
|
|
|
+ */
|
|
|
+ if (ddb_entry->ddb_type == FLASH_DDB &&
|
|
|
+ ddb_entry->chap_tbl_idx != INVALID_ENTRY &&
|
|
|
+ !sess->username && !sess->password) {
|
|
|
+ idx = ddb_entry->chap_tbl_idx;
|
|
|
+ rval = qla4xxx_get_uni_chap_at_index(ha, chap_tbl.name,
|
|
|
+ chap_tbl.secret,
|
|
|
+ idx);
|
|
|
+ if (!rval) {
|
|
|
+ iscsi_set_param(cls_conn, ISCSI_PARAM_USERNAME,
|
|
|
+ (char *)chap_tbl.name,
|
|
|
+ strlen((char *)chap_tbl.name));
|
|
|
+ iscsi_set_param(cls_conn, ISCSI_PARAM_PASSWORD,
|
|
|
+ (char *)chap_tbl.secret,
|
|
|
+ chap_tbl.secret_len);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /* allow fall-through */
|
|
|
default:
|
|
|
return iscsi_session_get_param(cls_sess, param, buf);
|
|
|
}
|