Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+18 −0
Original line number Original line Diff line number Diff line
@@ -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;
+37 −0
Original line number Original line Diff line number Diff line
@@ -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))));


+2 −0
Original line number Original line Diff line number Diff line
@@ -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);
};
};


/*
/*