500
kset_param(uint64_t transport_handle, uint64_t connh,
501
enum iscsi_param param, uint32_t value, int *retcode)
504
kset_param(uint64_t transport_handle, uint32_t sid, uint32_t cid,
505
enum iscsi_param param, void *value, int type)
504
struct iscsi_uevent ev;
507
struct iscsi_uevent *ev;
506
511
log_debug(7, "in %s", __FUNCTION__);
508
memset(&ev, 0, sizeof(struct iscsi_uevent));
510
ev.type = ISCSI_UEVENT_SET_PARAM;
511
ev.transport_handle = transport_handle;
512
ev.u.set_param.conn_handle = connh;
513
ev.u.set_param.param = param;
514
ev.u.set_param.value = value;
516
if ((rc = __kipc_call(&ev, sizeof(ev))) < 0) {
513
memset(setparam_buf, 0, NLM_SETPARAM_DEFAULT_MAX);
514
ev = (struct iscsi_uevent *)setparam_buf;
515
ev->type = ISCSI_UEVENT_SET_PARAM;
516
ev->transport_handle = transport_handle;
517
ev->u.set_param.sid = sid;
518
ev->u.set_param.cid = cid;
519
ev->u.set_param.param = param;
521
param_str = setparam_buf + sizeof(*ev);
524
sprintf(param_str, "%d", *((int *)value));
527
sprintf(param_str, "%s", (char *)value);
530
log_error("invalid type %d\n", type);
533
ev->u.set_param.len = len = strlen(param_str) + 1;
535
if ((rc = __kipc_call(ev, sizeof(*ev) + len)) < 0) {
520
*retcode = ev.r.retcode;
526
kstop_conn(uint64_t transport_handle, uint64_t connh, int flag)
543
kstop_conn(uint64_t transport_handle, uint32_t sid, uint32_t cid, int flag)
529
546
struct iscsi_uevent ev;
609
read_transport_file(char *filename, void *value, char *format)
612
char buffer[32], *line;
615
file = fopen(filename, "r");
617
line = fgets(buffer, sizeof(buffer), file);
619
sscanf(buffer, format, value);
621
log_error("Could not read %s.\n", filename);
626
log_error("Could not open %s.\n", filename);
633
trans_filter(const struct dirent *dir)
635
return strcmp(dir->d_name, ".") && strcmp(dir->d_name, "..");
641
struct dirent **namelist;
645
log_debug(7, "in %s", __FUNCTION__);
647
n = scandir(ISCSI_TRANSPORT_DIR, &namelist, trans_filter,
650
log_error("Could not scan %s.", ISCSI_TRANSPORT_DIR);
654
if (n > num_providers) {
655
iscsi_provider_t *provider_arr;
657
provider_arr = calloc(n,sizeof(iscsi_provider_t));
658
if (provider_arr == NULL) {
659
log_error("Failed to alloc %d poviders.", n);
662
if (num_providers > 0) {
665
provider = provider_arr;
669
for (i = 0; i < n; i++) {
670
strncpy(provider[i].name, namelist[i]->d_name,
671
ISCSI_TRANSPORT_NAME_MAXLEN);
674
sprintf(filename, ISCSI_TRANSPORT_DIR"/%s/handle",
676
err = read_transport_file(filename, &provider[i].handle,
681
sprintf(filename, ISCSI_TRANSPORT_DIR"/%s/caps",
683
err = read_transport_file(filename, &provider[i].caps,
689
for (i++; i < n; i++)
697
kget_stats(uint64_t transport_handle, uint64_t connh, char *statsbuf,
629
ktransport_ep_connect(iscsi_conn_t *conn, int non_blocking)
632
struct iscsi_uevent *ev;
633
struct sockaddr *dst_addr = (struct sockaddr *)&conn->saddr;
635
log_debug(7, "in %s", __FUNCTION__);
637
memset(setparam_buf, 0, NLM_SETPARAM_DEFAULT_MAX);
638
ev = (struct iscsi_uevent *)setparam_buf;
639
ev->type = ISCSI_UEVENT_TRANSPORT_EP_CONNECT;
640
ev->transport_handle = conn->session->transport_handle;
642
if (dst_addr->sa_family == PF_INET)
643
addrlen = sizeof(struct sockaddr_in);
644
else if (dst_addr->sa_family == PF_INET6)
645
addrlen = sizeof(struct sockaddr_in6);
647
log_error("%s unknown addr family %d\n",
648
__FUNCTION__, dst_addr->sa_family);
651
memcpy(setparam_buf + sizeof(*ev), dst_addr, addrlen);
652
ev->u.ep_connect.non_blocking = non_blocking;
654
if ((rc = __kipc_call(ev, sizeof(*ev) + addrlen)) < 0)
657
if (!ev->r.ep_connect_ret.handle)
660
conn->transport_ep_handle = ev->r.ep_connect_ret.handle;
662
log_debug(6, "%s got handle %llx",
663
__FUNCTION__, (unsigned long long)conn->transport_ep_handle);
668
ktransport_ep_poll(iscsi_conn_t *conn, int timeout_ms)
671
struct iscsi_uevent ev;
673
log_debug(7, "in %s", __FUNCTION__);
675
memset(&ev, 0, sizeof(struct iscsi_uevent));
677
ev.type = ISCSI_UEVENT_TRANSPORT_EP_POLL;
678
ev.transport_handle = conn->session->transport_handle;
679
ev.u.ep_poll.ep_handle = conn->transport_ep_handle;
680
ev.u.ep_poll.timeout_ms = timeout_ms;
682
if ((rc = __kipc_call(&ev, sizeof(ev))) < 0)
689
ktransport_ep_disconnect(iscsi_conn_t *conn)
692
struct iscsi_uevent ev;
694
log_debug(7, "in %s", __FUNCTION__);
696
if (conn->transport_ep_handle < 0)
699
memset(&ev, 0, sizeof(struct iscsi_uevent));
701
ev.type = ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT;
702
ev.transport_handle = conn->session->transport_handle;
703
ev.u.ep_disconnect.ep_handle = conn->transport_ep_handle;
705
if ((rc = __kipc_call(&ev, sizeof(ev))) < 0) {
706
log_error("conn %p session %p transport disconnect failed %d\n",
707
conn, conn->session, rc);
709
conn->transport_ep_handle = -1;
713
kget_stats(uint64_t transport_handle, uint32_t sid, uint32_t cid,
714
char *statsbuf, int statsbuf_max)
764
781
ev = (struct iscsi_uevent *)NLMSG_DATA(nlm_ev);
766
783
/* verify connection */
767
for (k = 0; k < num_providers; k++) {
768
item = provider[k].sessions.q_forw;
769
while (item != &provider[k].sessions) {
784
pitem = providers.q_forw;
785
while (pitem != &providers) {
786
p = (iscsi_provider_t *)pitem;
788
item = p->sessions.q_forw;
789
while (item != &p->sessions) {
771
791
session = (iscsi_session_t *)item;
772
792
for (i=0; i<ISCSI_CONN_MAX; i++) {
773
793
if (ev->type == ISCSI_KEVENT_RECV_PDU &&
774
ev->r.recv_req.conn_handle &&
775
session->conn[i].handle ==
776
ev->r.recv_req.conn_handle) {
794
session->id == ev->r.recv_req.sid &&
795
session->conn[i].id == ev->r.recv_req.cid) {
777
796
conn = &session->conn[i];
780
799
if (ev->type == ISCSI_KEVENT_CONN_ERROR &&
781
ev->r.connerror.conn_handle &&
782
session->conn[i].handle ==
783
ev->r.connerror.conn_handle) {
800
session->id == ev->r.connerror.sid &&
801
session->conn[i].id == ev->r.connerror.cid) {
784
802
conn = &session->conn[i];
788
806
item = item->q_forw;
808
pitem = pitem->q_forw;
791
812
if (conn == NULL) {
792
log_error("could not verify connection 0x%p ", conn);
813
log_error("could not verify connection %d:%d",
814
ev->r.recv_req.sid, ev->r.recv_req.cid);
844
866
nlm_recvbuf = calloc(1, NLM_BUF_DEFAULT_MAX);
845
867
if (!nlm_recvbuf) {
847
868
log_error("can not allocate nlm_recvbuf");
869
goto free_nlm_sendbuf;
851
872
pdu_sendbuf = calloc(1, PDU_SENDBUF_DEFAULT_MAX);
852
873
if (!pdu_sendbuf) {
855
874
log_error("can not allocate nlm_sendbuf");
875
goto free_nlm_recvbuf;
878
setparam_buf = calloc(1, NLM_SETPARAM_DEFAULT_MAX);
880
log_error("can not allocate setparam_buf");
881
goto free_pdu_sendbuf;
859
884
ctrl_fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_ISCSI);
861
886
log_error("can not create NETLINK_ISCSI socket");
887
goto free_setparam_buf;
865
890
memset(&src_addr, 0, sizeof(src_addr));
866
891
src_addr.nl_family = AF_NETLINK;
867
892
src_addr.nl_pid = getpid();
868
src_addr.nl_groups = 0; /* not in mcast groups */
893
src_addr.nl_groups = 1;
869
894
if (bind(ctrl_fd, (struct sockaddr *)&src_addr, sizeof(src_addr))) {
870
895
log_error("can not bind NETLINK_ISCSI socket");
874
899
memset(&dest_addr, 0, sizeof(dest_addr));