summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/cam/ctl/ctl_frontend_iscsi.c13
-rw-r--r--sys/cam/ctl/ctl_frontend_iscsi.h1
-rw-r--r--sys/cam/ctl/ctl_ioctl.h3
-rw-r--r--sys/dev/iscsi/icl.h6
-rw-r--r--sys/dev/iscsi/icl_proxy.c5
5 files changed, 22 insertions, 6 deletions
diff --git a/sys/cam/ctl/ctl_frontend_iscsi.c b/sys/cam/ctl/ctl_frontend_iscsi.c
index 24f02e7..6caf789 100644
--- a/sys/cam/ctl/ctl_frontend_iscsi.c
+++ b/sys/cam/ctl/ctl_frontend_iscsi.c
@@ -1353,7 +1353,7 @@ cfiscsi_module_event_handler(module_t mod, int what, void *arg)
#ifdef ICL_KERNEL_PROXY
static void
-cfiscsi_accept(struct socket *so, int portal_id)
+cfiscsi_accept(struct socket *so, struct sockaddr *sa, int portal_id)
{
struct cfiscsi_session *cs;
@@ -1364,6 +1364,7 @@ cfiscsi_accept(struct socket *so, int portal_id)
}
icl_conn_handoff_sock(cs->cs_conn, so);
+ cs->cs_initiator_sa = sa;
cs->cs_portal_id = portal_id;
cs->cs_waiting_for_ctld = true;
cv_signal(&cfiscsi_softc.accept_cv);
@@ -1788,6 +1789,16 @@ cfiscsi_ioctl_accept(struct ctl_iscsi *ci)
ciap->connection_id = cs->cs_id;
ciap->portal_id = cs->cs_portal_id;
+ ciap->initiator_addrlen = cs->cs_initiator_sa->sa_len;
+ error = copyout(cs->cs_initiator_sa, ciap->initiator_addr,
+ cs->cs_initiator_sa->sa_len);
+ if (error != 0) {
+ snprintf(ci->error_str, sizeof(ci->error_str),
+ "copyout failed with error %d", error);
+ ci->status = CTL_ISCSI_ERROR;
+ return;
+ }
+
ci->status = CTL_ISCSI_OK;
}
diff --git a/sys/cam/ctl/ctl_frontend_iscsi.h b/sys/cam/ctl/ctl_frontend_iscsi.h
index 759c739..aca89f9 100644
--- a/sys/cam/ctl/ctl_frontend_iscsi.h
+++ b/sys/cam/ctl/ctl_frontend_iscsi.h
@@ -82,6 +82,7 @@ struct cfiscsi_session {
unsigned int cs_id;
int cs_ctl_initid;
#ifdef ICL_KERNEL_PROXY
+ struct sockaddr *cs_initiator_sa;
int cs_portal_id;
bool cs_login_phase;
bool cs_waiting_for_ctld;
diff --git a/sys/cam/ctl/ctl_ioctl.h b/sys/cam/ctl/ctl_ioctl.h
index c81a525..93dc492 100644
--- a/sys/cam/ctl/ctl_ioctl.h
+++ b/sys/cam/ctl/ctl_ioctl.h
@@ -706,8 +706,9 @@ struct ctl_iscsi_listen_params {
struct ctl_iscsi_accept_params {
int connection_id;
- struct sockaddr *initiator_addr;
int portal_id;
+ struct sockaddr *initiator_addr;
+ socklen_t initiator_addrlen;
int spare[4];
};
diff --git a/sys/dev/iscsi/icl.h b/sys/dev/iscsi/icl.h
index e30c3d1..5f03434 100644
--- a/sys/dev/iscsi/icl.h
+++ b/sys/dev/iscsi/icl.h
@@ -128,7 +128,8 @@ struct icl_listen_sock {
struct icl_listen {
TAILQ_HEAD(, icl_listen_sock) il_sockets;
struct sx il_lock;
- void (*il_accept)(struct socket *, int);
+ void (*il_accept)(struct socket *,
+ struct sockaddr *, int);
};
/*
@@ -140,7 +141,8 @@ int icl_conn_connect(struct icl_conn *ic, bool rdma,
/*
* Target part.
*/
-struct icl_listen *icl_listen_new(void (*accept_cb)(struct socket *, int));
+struct icl_listen *icl_listen_new(void (*accept_cb)(struct socket *,
+ struct sockaddr *, int));
void icl_listen_free(struct icl_listen *il);
int icl_listen_add(struct icl_listen *il, bool rdma,
int domain, int socktype, int protocol,
diff --git a/sys/dev/iscsi/icl_proxy.c b/sys/dev/iscsi/icl_proxy.c
index 18c9d20..4411730 100644
--- a/sys/dev/iscsi/icl_proxy.c
+++ b/sys/dev/iscsi/icl_proxy.c
@@ -182,7 +182,7 @@ icl_conn_connect(struct icl_conn *ic, bool rdma, int domain, int socktype,
}
struct icl_listen *
-icl_listen_new(void (*accept_cb)(struct socket *, int))
+icl_listen_new(void (*accept_cb)(struct socket *, struct sockaddr *, int))
{
struct icl_listen *il;
@@ -296,9 +296,10 @@ icl_accept_thread(void *arg)
if (sa != NULL)
free(sa, M_SONAME);
soclose(so);
+ continue;
}
- (ils->ils_listen->il_accept)(so, ils->ils_id);
+ (ils->ils_listen->il_accept)(so, sa, ils->ils_id);
}
}
OpenPOWER on IntegriCloud