[SCSI] iscsi: add target discvery event to transport class
Patch from david.somayajulu@qlogic.com: Add target discovery event. We may have a setup where the iscsi traffic is on a different netowrk than the other network traffic. In this case we will want to do discovery though the iscsi card. This patch adds a event to the transport class that can be used by hw iscsi cards that support this. Signed-off-by: Mike Christie <michaelc@cs.wisc.edu> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
This commit is contained in:
parent
332959cb52
commit
01cb225dad
3 changed files with 57 additions and 0 deletions
|
@ -977,6 +977,21 @@ iscsi_if_transport_ep(struct iscsi_transport *transport,
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
iscsi_tgt_dscvr(struct iscsi_transport *transport,
|
||||||
|
struct iscsi_uevent *ev)
|
||||||
|
{
|
||||||
|
struct sockaddr *dst_addr;
|
||||||
|
|
||||||
|
if (!transport->tgt_dscvr)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
dst_addr = (struct sockaddr *)((char*)ev + sizeof(*ev));
|
||||||
|
return transport->tgt_dscvr(ev->u.tgt_dscvr.type,
|
||||||
|
ev->u.tgt_dscvr.host_no,
|
||||||
|
ev->u.tgt_dscvr.enable, dst_addr);
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
|
iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
|
||||||
{
|
{
|
||||||
|
@ -1065,6 +1080,9 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
|
||||||
case ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT:
|
case ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT:
|
||||||
err = iscsi_if_transport_ep(transport, ev, nlh->nlmsg_type);
|
err = iscsi_if_transport_ep(transport, ev, nlh->nlmsg_type);
|
||||||
break;
|
break;
|
||||||
|
case ISCSI_UEVENT_TGT_DSCVR:
|
||||||
|
err = iscsi_tgt_dscvr(transport, ev);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
err = -EINVAL;
|
err = -EINVAL;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -47,12 +47,20 @@ enum iscsi_uevent_e {
|
||||||
ISCSI_UEVENT_TRANSPORT_EP_POLL = UEVENT_BASE + 13,
|
ISCSI_UEVENT_TRANSPORT_EP_POLL = UEVENT_BASE + 13,
|
||||||
ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT = UEVENT_BASE + 14,
|
ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT = UEVENT_BASE + 14,
|
||||||
|
|
||||||
|
ISCSI_UEVENT_TGT_DSCVR = UEVENT_BASE + 15,
|
||||||
|
|
||||||
/* up events */
|
/* up events */
|
||||||
ISCSI_KEVENT_RECV_PDU = KEVENT_BASE + 1,
|
ISCSI_KEVENT_RECV_PDU = KEVENT_BASE + 1,
|
||||||
ISCSI_KEVENT_CONN_ERROR = KEVENT_BASE + 2,
|
ISCSI_KEVENT_CONN_ERROR = KEVENT_BASE + 2,
|
||||||
ISCSI_KEVENT_IF_ERROR = KEVENT_BASE + 3,
|
ISCSI_KEVENT_IF_ERROR = KEVENT_BASE + 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum iscsi_tgt_dscvr {
|
||||||
|
ISCSI_TGT_DSCVR_SEND_TARGETS = 1,
|
||||||
|
ISCSI_TGT_DSCVR_ISNS = 2,
|
||||||
|
ISCSI_TGT_DSCVR_SLP = 3,
|
||||||
|
};
|
||||||
|
|
||||||
struct iscsi_uevent {
|
struct iscsi_uevent {
|
||||||
uint32_t type; /* k/u events type */
|
uint32_t type; /* k/u events type */
|
||||||
uint32_t iferror; /* carries interface or resource errors */
|
uint32_t iferror; /* carries interface or resource errors */
|
||||||
|
@ -116,6 +124,17 @@ struct iscsi_uevent {
|
||||||
struct msg_transport_disconnect {
|
struct msg_transport_disconnect {
|
||||||
uint64_t ep_handle;
|
uint64_t ep_handle;
|
||||||
} ep_disconnect;
|
} ep_disconnect;
|
||||||
|
struct msg_tgt_dscvr {
|
||||||
|
enum iscsi_tgt_dscvr type;
|
||||||
|
uint32_t host_no;
|
||||||
|
/*
|
||||||
|
* enable = 1 to establish a new connection
|
||||||
|
* with the server. enable = 0 to disconnect
|
||||||
|
* from the server. Used primarily to switch
|
||||||
|
* from one iSNS server to another.
|
||||||
|
*/
|
||||||
|
uint32_t enable;
|
||||||
|
} tgt_dscvr;
|
||||||
} u;
|
} u;
|
||||||
union {
|
union {
|
||||||
/* messages k -> u */
|
/* messages k -> u */
|
||||||
|
@ -141,6 +160,24 @@ struct iscsi_uevent {
|
||||||
struct msg_transport_connect_ret {
|
struct msg_transport_connect_ret {
|
||||||
uint64_t handle;
|
uint64_t handle;
|
||||||
} ep_connect_ret;
|
} ep_connect_ret;
|
||||||
|
struct msg_tgt_dscvr_ret {
|
||||||
|
/*
|
||||||
|
* session/connection pair used to reference
|
||||||
|
* the connection to server
|
||||||
|
*/
|
||||||
|
uint32_t sid;
|
||||||
|
uint32_t cid;
|
||||||
|
union {
|
||||||
|
struct isns {
|
||||||
|
/* port # for conn to iSNS server */
|
||||||
|
uint16_t isns_port;
|
||||||
|
/* listening port to receive SCNs */
|
||||||
|
uint16_t scn_port;
|
||||||
|
/* listening port to receive ESIs */
|
||||||
|
uint16_t esi_port;
|
||||||
|
} isns_attrib;
|
||||||
|
} u;
|
||||||
|
} tgt_dscvr_ret;
|
||||||
} r;
|
} r;
|
||||||
} __attribute__ ((aligned (sizeof(uint64_t))));
|
} __attribute__ ((aligned (sizeof(uint64_t))));
|
||||||
|
|
||||||
|
|
|
@ -127,6 +127,8 @@ struct iscsi_transport {
|
||||||
uint64_t *ep_handle);
|
uint64_t *ep_handle);
|
||||||
int (*ep_poll) (uint64_t ep_handle, int timeout_ms);
|
int (*ep_poll) (uint64_t ep_handle, int timeout_ms);
|
||||||
void (*ep_disconnect) (uint64_t ep_handle);
|
void (*ep_disconnect) (uint64_t ep_handle);
|
||||||
|
int (*tgt_dscvr) (enum iscsi_tgt_dscvr type, uint32_t host_no,
|
||||||
|
uint32_t enable, struct sockaddr *dst_addr);
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Reference in a new issue