Commit 01cb225d authored by Mike Christie's avatar Mike Christie Committed by James Bottomley

[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: default avatarMike Christie <michaelc@cs.wisc.edu>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent 332959cb
...@@ -977,6 +977,21 @@ iscsi_if_transport_ep(struct iscsi_transport *transport, ...@@ -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) ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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);
}; };
/* /*
......
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