Properly identify target portal when running in proxy mode. While here,

remove CTL_ISCSI_CLOSE, it wasn't used or implemented anyway.

Sponsored by:	The FreeBSD Foundation
This commit is contained in:
Edward Tomasz Napierala 2014-04-16 10:29:34 +00:00
parent 2ebde326cb
commit 8cab2ed4cd
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=264526
8 changed files with 74 additions and 63 deletions

View File

@ -1350,7 +1350,7 @@ cfiscsi_module_event_handler(module_t mod, int what, void *arg)
#ifdef ICL_KERNEL_PROXY
static void
cfiscsi_accept(struct socket *so)
cfiscsi_accept(struct socket *so, int portal_id)
{
struct cfiscsi_session *cs;
@ -1361,6 +1361,7 @@ cfiscsi_accept(struct socket *so)
}
icl_conn_handoff_sock(cs->cs_conn, so);
cs->cs_portal_id = portal_id;
cs->cs_waiting_for_ctld = true;
cv_signal(&cfiscsi_softc.accept_cv);
}
@ -1739,7 +1740,7 @@ cfiscsi_ioctl_listen(struct ctl_iscsi *ci)
}
error = icl_listen_add(cfiscsi_softc.listener, cilp->iser, cilp->domain,
cilp->socktype, cilp->protocol, sa);
cilp->socktype, cilp->protocol, sa, cilp->portal_id);
if (error != 0) {
free(sa, M_SONAME);
CFISCSI_DEBUG("icl_listen_add, error %d", error);
@ -1783,6 +1784,7 @@ cfiscsi_ioctl_accept(struct ctl_iscsi *ci)
cs->cs_login_phase = true;
ciap->connection_id = cs->cs_id;
ciap->portal_id = cs->cs_portal_id;
ci->status = CTL_ISCSI_OK;
}
@ -1916,13 +1918,6 @@ cfiscsi_ioctl_receive(struct ctl_iscsi *ci)
ci->status = CTL_ISCSI_OK;
}
static void
cfiscsi_ioctl_close(struct ctl_iscsi *ci)
{
/*
* XXX
*/
}
#endif /* !ICL_KERNEL_PROXY */
static int
@ -1961,15 +1956,11 @@ cfiscsi_ioctl(struct cdev *dev,
case CTL_ISCSI_RECEIVE:
cfiscsi_ioctl_receive(ci);
break;
case CTL_ISCSI_CLOSE:
cfiscsi_ioctl_close(ci);
break;
#else
case CTL_ISCSI_LISTEN:
case CTL_ISCSI_ACCEPT:
case CTL_ISCSI_SEND:
case CTL_ISCSI_RECEIVE:
case CTL_ISCSI_CLOSE:
ci->status = CTL_ISCSI_ERROR;
snprintf(ci->error_str, sizeof(ci->error_str),
"%s: CTL compiled without ICL_KERNEL_PROXY",

View File

@ -82,6 +82,7 @@ struct cfiscsi_session {
unsigned int cs_id;
int cs_ctl_initid;
#ifdef ICL_KERNEL_PROXY
int cs_portal_id;
bool cs_login_phase;
bool cs_waiting_for_ctld;
struct cv cs_login_cv;

View File

@ -626,7 +626,6 @@ typedef enum {
CTL_ISCSI_ACCEPT,
CTL_ISCSI_SEND,
CTL_ISCSI_RECEIVE,
CTL_ISCSI_CLOSE,
#endif
} ctl_iscsi_type;
@ -701,11 +700,14 @@ struct ctl_iscsi_listen_params {
int protocol;
struct sockaddr *addr;
socklen_t addrlen;
int portal_id;
int spare[4];
};
struct ctl_iscsi_accept_params {
int connection_id;
struct sockaddr *initiator_addr;
int portal_id;
int spare[4];
};
@ -729,10 +731,6 @@ struct ctl_iscsi_receive_params {
int spare3[4];
};
struct ctl_iscsi_close_params {
int connection_id;
int spare[4];
};
#endif /* ICL_KERNEL_PROXY */
union ctl_iscsi_data {
@ -745,7 +743,6 @@ union ctl_iscsi_data {
struct ctl_iscsi_accept_params accept;
struct ctl_iscsi_send_params send;
struct ctl_iscsi_receive_params receive;
struct ctl_iscsi_close_params close;
#endif
};

View File

@ -118,16 +118,17 @@ struct icl_listen;
struct icl_listen_sock {
TAILQ_ENTRY(icl_listen_sock) ils_next;
struct icl_listen *ils_listen;
struct socket *ils_socket;
bool ils_running;
bool ils_disconnecting;
struct icl_listen *ils_listen;
struct socket *ils_socket;
bool ils_running;
bool ils_disconnecting;
int ils_id;
};
struct icl_listen {
TAILQ_HEAD(, icl_listen_sock) il_sockets;
struct sx il_lock;
void (*il_accept)(struct socket *);
void (*il_accept)(struct socket *, int);
};
/*
@ -139,10 +140,11 @@ int icl_conn_connect(struct icl_conn *ic, bool rdma,
/*
* Target part.
*/
struct icl_listen *icl_listen_new(void (*accept_cb)(struct socket *));
struct icl_listen *icl_listen_new(void (*accept_cb)(struct socket *, 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, struct sockaddr *sa);
int icl_listen_add(struct icl_listen *il, bool rdma,
int domain, int socktype, int protocol,
struct sockaddr *sa, int portal_id);
int icl_listen_remove(struct icl_listen *il, struct sockaddr *sa);
/*

View File

@ -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 *))
icl_listen_new(void (*accept_cb)(struct socket *, int))
{
struct icl_listen *il;
@ -298,13 +298,13 @@ icl_accept_thread(void *arg)
soclose(so);
}
(ils->ils_listen->il_accept)(so);
(ils->ils_listen->il_accept)(so, ils->ils_id);
}
}
static int
icl_listen_add_tcp(struct icl_listen *il, int domain, int socktype, int protocol,
struct sockaddr *sa)
icl_listen_add_tcp(struct icl_listen *il, int domain, int socktype,
int protocol, struct sockaddr *sa, int portal_id)
{
struct icl_listen_sock *ils;
struct socket *so;
@ -348,6 +348,7 @@ icl_listen_add_tcp(struct icl_listen *il, int domain, int socktype, int protocol
ils = malloc(sizeof(*ils), M_ICL_PROXY, M_ZERO | M_WAITOK);
ils->ils_listen = il;
ils->ils_socket = so;
ils->ils_id = portal_id;
error = kthread_add(icl_accept_thread, ils, NULL, NULL, 0, 0, "iclacc");
if (error != 0) {
@ -366,8 +367,8 @@ icl_listen_add_tcp(struct icl_listen *il, int domain, int socktype, int protocol
}
int
icl_listen_add(struct icl_listen *il, bool rdma, int domain, int socktype, int protocol,
struct sockaddr *sa)
icl_listen_add(struct icl_listen *il, bool rdma, int domain, int socktype,
int protocol, struct sockaddr *sa, int portal_id)
{
if (rdma) {
@ -375,12 +376,14 @@ icl_listen_add(struct icl_listen *il, bool rdma, int domain, int socktype, int p
ICL_DEBUG("RDMA not supported");
return (EOPNOTSUPP);
#else
return (icl_listen_add_rdma(il, domain, socktype, protocol, sa));
return (icl_listen_add_rdma(il, domain, socktype, protocol,
sa, portal_id));
#endif
}
return (icl_listen_add_tcp(il, domain, socktype, protocol, sa));
return (icl_listen_add_tcp(il, domain, socktype, protocol, sa,
portal_id));
}
int

View File

@ -1408,9 +1408,13 @@ conf_apply(struct conf *oldconf, struct conf *newconf)
#ifdef ICL_KERNEL_PROXY
if (proxy_mode) {
log_debugx("listening on %s, portal-group \"%s\" using ICL proxy",
newp->p_listen, newpg->pg_name);
kernel_listen(newp->p_ai, newp->p_iser);
newpg->pg_conf->conf_portal_id++;
newp->p_id = newpg->pg_conf->conf_portal_id;
log_debugx("listening on %s, portal-group "
"\"%s\", portal id %d, using ICL proxy",
newp->p_listen, newpg->pg_name, newp->p_id);
kernel_listen(newp->p_ai, newp->p_iser,
newp->p_id);
continue;
}
#endif
@ -1671,6 +1675,7 @@ main_loop(struct conf *conf, bool dont_fork)
struct portal *portal;
#ifdef ICL_KERNEL_PROXY
int connection_id;
int portal_id;
#endif
fd_set fdset;
int error, nfds, client_fd;
@ -1683,16 +1688,22 @@ main_loop(struct conf *conf, bool dont_fork)
#ifdef ICL_KERNEL_PROXY
if (proxy_mode) {
connection_id = kernel_accept();
if (connection_id == 0)
continue;
kernel_accept(&connection_id, &portal_id);
/*
* XXX: This is obviously temporary.
*/
pg = TAILQ_FIRST(&conf->conf_portal_groups);
portal = TAILQ_FIRST(&pg->pg_portals);
log_debugx("incoming connection, id %d, portal id %d",
connection_id, portal_id);
TAILQ_FOREACH(pg, &conf->conf_portal_groups, pg_next) {
TAILQ_FOREACH(portal, &pg->pg_portals, p_next) {
if (portal->p_id == portal_id) {
goto found;
}
}
}
log_errx(1, "kernel returned invalid portal_id %d",
portal_id);
found:
handle_connection(portal, connection_id, dont_fork);
} else {
#endif

View File

@ -88,6 +88,9 @@ struct portal {
bool p_iser;
char *p_listen;
struct addrinfo *p_ai;
#ifdef ICL_KERNEL_PROXY
int p_id;
#endif
TAILQ_HEAD(, target) p_targets;
int p_socket;
@ -146,6 +149,9 @@ struct conf {
int conf_maxproc;
uint16_t conf_last_portal_group_tag;
#ifdef ICL_KERNEL_PROXY
int conf_portal_id;
#endif
struct pidfh *conf_pidfh;
bool conf_default_pg_defined;
@ -265,8 +271,9 @@ void kernel_capsicate(void);
/*
* ICL_KERNEL_PROXY
*/
void kernel_listen(struct addrinfo *ai, bool iser);
int kernel_accept(void);
void kernel_listen(struct addrinfo *ai, bool iser,
int portal_id);
void kernel_accept(int *connection_id, int *portal_id);
void kernel_send(struct pdu *pdu);
void kernel_receive(struct pdu *pdu);

View File

@ -622,13 +622,15 @@ kernel_handoff(struct connection *conn)
req.data.handoff.max_burst_length = conn->conn_max_burst_length;
req.data.handoff.immediate_data = conn->conn_immediate_data;
if (ioctl(ctl_fd, CTL_ISCSI, &req) == -1)
if (ioctl(ctl_fd, CTL_ISCSI, &req) == -1) {
log_err(1, "error issuing CTL_ISCSI ioctl; "
"dropping connection");
}
if (req.status != CTL_ISCSI_OK)
if (req.status != CTL_ISCSI_OK) {
log_errx(1, "error returned from CTL iSCSI handoff request: "
"%s; dropping connection", req.error_str);
}
}
int
@ -673,7 +675,7 @@ kernel_port_off(void)
#ifdef ICL_KERNEL_PROXY
void
kernel_listen(struct addrinfo *ai, bool iser)
kernel_listen(struct addrinfo *ai, bool iser, int portal_id)
{
struct ctl_iscsi req;
@ -686,11 +688,10 @@ kernel_listen(struct addrinfo *ai, bool iser)
req.data.listen.protocol = ai->ai_protocol;
req.data.listen.addr = ai->ai_addr;
req.data.listen.addrlen = ai->ai_addrlen;
req.data.listen.portal_id = portal_id;
if (ioctl(ctl_fd, CTL_ISCSI, &req) == -1) {
if (ioctl(ctl_fd, CTL_ISCSI, &req) == -1)
log_err(1, "error issuing CTL_ISCSI ioctl");
return;
}
if (req.status != CTL_ISCSI_OK) {
log_errx(1, "error returned from CTL iSCSI listen: %s",
@ -698,8 +699,8 @@ kernel_listen(struct addrinfo *ai, bool iser)
}
}
int
kernel_accept(void)
void
kernel_accept(int *connection_id, int *portal_id)
{
struct ctl_iscsi req;
@ -707,18 +708,16 @@ kernel_accept(void)
req.type = CTL_ISCSI_ACCEPT;
if (ioctl(ctl_fd, CTL_ISCSI, &req) == -1) {
log_warn("error issuing CTL_ISCSI ioctl");
return (0);
}
if (ioctl(ctl_fd, CTL_ISCSI, &req) == -1)
log_err(1, "error issuing CTL_ISCSI ioctl");
if (req.status != CTL_ISCSI_OK) {
log_warnx("error returned from CTL iSCSI accept: %s",
log_errx(1, "error returned from CTL iSCSI accept: %s",
req.error_str);
return (0);
}
return (req.data.accept.connection_id);
*connection_id = req.data.accept.connection_id;
*portal_id = req.data.accept.portal_id;
}
void