diff options
Diffstat (limited to 'usr/netlink.c')
-rw-r--r-- | usr/netlink.c | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/usr/netlink.c b/usr/netlink.c index 8fc61e1..801ee6f 100644 --- a/usr/netlink.c +++ b/usr/netlink.c @@ -988,6 +988,28 @@ kset_net_config(uint64_t transport_handle, uint32_t host_no, return 0; } +static int krecv_conn_state(struct iscsi_conn *conn, int *state) +{ + int rc; + + rc = ipc->ctldev_handle(); + if (rc == -ENXIO) { + /* event for some other conn */ + rc = -EAGAIN; + goto exit; + } else if (rc < 0) + /* fatal handling error or conn error */ + goto exit; + + *state = *(enum iscsi_conn_state *)conn->recv_context->data; + + ipc_ev_clbk->put_ev_context(conn->recv_context); + conn->recv_context = NULL; + +exit: + return rc; +} + static void drop_data(struct nlmsghdr *nlh) { int ev_size; @@ -1005,7 +1027,7 @@ static int ctldev_handle(void) char nlm_ev[NLMSG_SPACE(sizeof(struct iscsi_uevent))]; struct nlmsghdr *nlh; struct iscsi_ev_context *ev_context; - uint32_t sid = 0, cid = 0; + uint32_t sid = 0, cid = 0, state = 0; log_debug(7, "in %s", __FUNCTION__); @@ -1042,6 +1064,11 @@ static int ctldev_handle(void) sid = ev->r.connerror.sid; cid = ev->r.connerror.cid; break; + case ISCSI_KEVENT_CONN_LOGIN_STATE: + sid = ev->r.conn_login.sid; + cid = ev->r.conn_login.cid; + state = ev->r.conn_login.state; + break; case ISCSI_KEVENT_UNBIND_SESSION: sid = ev->r.unbind_session.sid; /* session wide event so cid is 0 */ @@ -1113,6 +1140,12 @@ static int ctldev_handle(void) rc = ipc_ev_clbk->sched_ev_context(ev_context, conn, 0, EV_CONN_ERROR); break; + case ISCSI_KEVENT_CONN_LOGIN_STATE: + memcpy(ev_context->data, &ev->r.conn_login.state, + sizeof(ev->r.conn_login.state)); + rc = ipc_ev_clbk->sched_ev_context(ev_context, conn, 0, + EV_CONN_LOGIN); + break; case ISCSI_KEVENT_UNBIND_SESSION: rc = ipc_ev_clbk->sched_ev_context(ev_context, conn, 0, EV_CONN_STOP); @@ -1233,6 +1266,7 @@ struct iscsi_ipc nl_ipc = { .recv_pdu_begin = krecv_pdu_begin, .recv_pdu_end = krecv_pdu_end, .set_net_config = kset_net_config, + .recv_conn_state = krecv_conn_state, }; struct iscsi_ipc *ipc = &nl_ipc; |