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:
parent
2ebde326cb
commit
8cab2ed4cd
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=264526
@ -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",
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
};
|
||||
|
||||
|
@ -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);
|
||||
|
||||
/*
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user