Commit 3af142fe authored by Adheer Chandravanshi's avatar Adheer Chandravanshi Committed by James Bottomley

[SCSI] scsi_transport_iscsi: Add support to set CHAP entries

For offload iSCSI like qla4xxx, CHAP entries are stored in adapter's
flash.
This patch adds support to add/update CHAP entries in adapter's flash
using iscsi tools, like Open-iSCSI.
Signed-off-by: default avatarAdheer Chandravanshi <adheer.chandravanshi@qlogic.com>
Signed-off-by: default avatarVikas Chaudhary <vikas.chaudhary@qlogic.com>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent b1d0b63f
...@@ -2744,6 +2744,28 @@ iscsi_get_chap(struct iscsi_transport *transport, struct nlmsghdr *nlh) ...@@ -2744,6 +2744,28 @@ iscsi_get_chap(struct iscsi_transport *transport, struct nlmsghdr *nlh)
return err; return err;
} }
static int iscsi_set_chap(struct iscsi_transport *transport,
struct iscsi_uevent *ev, uint32_t len)
{
char *data = (char *)ev + sizeof(*ev);
struct Scsi_Host *shost;
int err = 0;
if (!transport->set_chap)
return -ENOSYS;
shost = scsi_host_lookup(ev->u.set_path.host_no);
if (!shost) {
pr_err("%s could not find host no %u\n",
__func__, ev->u.set_path.host_no);
return -ENODEV;
}
err = transport->set_chap(shost, data, len);
scsi_host_put(shost);
return err;
}
static int iscsi_delete_chap(struct iscsi_transport *transport, static int iscsi_delete_chap(struct iscsi_transport *transport,
struct iscsi_uevent *ev) struct iscsi_uevent *ev)
{ {
...@@ -3234,6 +3256,10 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group) ...@@ -3234,6 +3256,10 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group)
case ISCSI_UEVENT_LOGOUT_FLASHNODE_SID: case ISCSI_UEVENT_LOGOUT_FLASHNODE_SID:
err = iscsi_logout_flashnode_sid(transport, ev); err = iscsi_logout_flashnode_sid(transport, ev);
break; break;
case ISCSI_UEVENT_SET_CHAP:
err = iscsi_set_chap(transport, ev,
nlmsg_attrlen(nlh, sizeof(*ev)));
break;
default: default:
err = -ENOSYS; err = -ENOSYS;
break; break;
......
...@@ -69,6 +69,7 @@ enum iscsi_uevent_e { ...@@ -69,6 +69,7 @@ enum iscsi_uevent_e {
ISCSI_UEVENT_LOGIN_FLASHNODE = UEVENT_BASE + 28, ISCSI_UEVENT_LOGIN_FLASHNODE = UEVENT_BASE + 28,
ISCSI_UEVENT_LOGOUT_FLASHNODE = UEVENT_BASE + 29, ISCSI_UEVENT_LOGOUT_FLASHNODE = UEVENT_BASE + 29,
ISCSI_UEVENT_LOGOUT_FLASHNODE_SID = UEVENT_BASE + 30, ISCSI_UEVENT_LOGOUT_FLASHNODE_SID = UEVENT_BASE + 30,
ISCSI_UEVENT_SET_CHAP = UEVENT_BASE + 31,
/* up events */ /* up events */
ISCSI_KEVENT_RECV_PDU = KEVENT_BASE + 1, ISCSI_KEVENT_RECV_PDU = KEVENT_BASE + 1,
...@@ -309,8 +310,16 @@ enum iscsi_param_type { ...@@ -309,8 +310,16 @@ enum iscsi_param_type {
ISCSI_HOST_PARAM, /* iscsi_host_param */ ISCSI_HOST_PARAM, /* iscsi_host_param */
ISCSI_NET_PARAM, /* iscsi_net_param */ ISCSI_NET_PARAM, /* iscsi_net_param */
ISCSI_FLASHNODE_PARAM, /* iscsi_flashnode_param */ ISCSI_FLASHNODE_PARAM, /* iscsi_flashnode_param */
ISCSI_CHAP_PARAM, /* iscsi_chap_param */
}; };
/* structure for minimalist usecase */
struct iscsi_param_info {
uint32_t len; /* Actual length of the param value */
uint16_t param; /* iscsi param */
uint8_t value[0]; /* length sized value follows */
} __packed;
struct iscsi_iface_param_info { struct iscsi_iface_param_info {
uint32_t iface_num; /* iface number, 0 - n */ uint32_t iface_num; /* iface number, 0 - n */
uint32_t len; /* Actual length of the param */ uint32_t len; /* Actual length of the param */
...@@ -739,6 +748,14 @@ enum chap_type_e { ...@@ -739,6 +748,14 @@ enum chap_type_e {
CHAP_TYPE_IN, CHAP_TYPE_IN,
}; };
enum iscsi_chap_param {
ISCSI_CHAP_PARAM_INDEX,
ISCSI_CHAP_PARAM_CHAP_TYPE,
ISCSI_CHAP_PARAM_USERNAME,
ISCSI_CHAP_PARAM_PASSWORD,
ISCSI_CHAP_PARAM_PASSWORD_LEN
};
#define ISCSI_CHAP_AUTH_NAME_MAX_LEN 256 #define ISCSI_CHAP_AUTH_NAME_MAX_LEN 256
#define ISCSI_CHAP_AUTH_SECRET_MAX_LEN 256 #define ISCSI_CHAP_AUTH_SECRET_MAX_LEN 256
struct iscsi_chap_rec { struct iscsi_chap_rec {
......
...@@ -152,6 +152,7 @@ struct iscsi_transport { ...@@ -152,6 +152,7 @@ struct iscsi_transport {
int (*get_chap) (struct Scsi_Host *shost, uint16_t chap_tbl_idx, int (*get_chap) (struct Scsi_Host *shost, uint16_t chap_tbl_idx,
uint32_t *num_entries, char *buf); uint32_t *num_entries, char *buf);
int (*delete_chap) (struct Scsi_Host *shost, uint16_t chap_tbl_idx); int (*delete_chap) (struct Scsi_Host *shost, uint16_t chap_tbl_idx);
int (*set_chap) (struct Scsi_Host *shost, void *data, int len);
int (*get_flashnode_param) (struct iscsi_bus_flash_session *fnode_sess, int (*get_flashnode_param) (struct iscsi_bus_flash_session *fnode_sess,
int param, char *buf); int param, char *buf);
int (*set_flashnode_param) (struct iscsi_bus_flash_session *fnode_sess, int (*set_flashnode_param) (struct iscsi_bus_flash_session *fnode_sess,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment