login处理... main(int argc, char **argv) { ...... printf("anycom: iscsiadmin.c 2332"); rc = exec_node_op(op, do_login, do_logout, do_show, do_rescan, do_stats, info_level, rec, name, value); ...... } 切换到: static int exec_node_op(int op, int do_login, int do_logout, int do_show, int do_rescan, int do_stats, int info_level, struct node_rec *rec, char *name, char *value) { .... //其它所有注册工作都在这儿完成的。 if (login_portals(rec)) rc = -1; .... }
static int __login_portals(void *data, int *nr_found, struct list_head *rec_list, int (* login_fn)(void *, struct list_head *, struct node_rec *)){ struct node_rec *curr_rec, *tmp; struct list_head login_list; int ret = 0, err; *nr_found = 0; INIT_LIST_HEAD(&login_list); list_for_each_entry(curr_rec, rec_list, list) { err = login_fn(data, &login_list, curr_rec);这里的login_fn()就是login_portal if (err > 0 && !ret) ret = err; if (!err) (*nr_found)++; } printf("\nanycom: ---------------------------------------------------------iscsiadmin.c 682\n"); err = iscsid_login_reqs_wait(&login_list);//-========================后面是等回复了。 if (err && !ret) ret = err; printf("\nanycom: iscsiadmin.c 687 over\n");///到这里login就完成了,接着把rec们,都删掉。 list_for_each_entry_safe(curr_rec, tmp, rec_list, list) { list_del(&curr_rec->list); free(curr_rec); } return ret;}就是调用这个了.... static int login_portals(struct node_rec *pattern_rec) { .... INIT_LIST_HEAD(&rec_list); ret = for_each_rec(pattern_rec, &rec_list, link_recs); err = __login_portals(NULL, &nr_found, &rec_list, login_portal); .... }
也就是调用的这个 static int login_portal(void *data, struct list_head *list, struct node_rec *rec) { ... ===============================转到\usr\util.c了================================ rc = iscsid_req_by_rec_async(MGMT_IPC_SESSION_LOGIN, rec, &fd); ... } ===============================转到\usr\util.c================================ int iscsid_req_by_rec_async(iscsiadm_cmd_e cmd, node_rec_t *rec, int *fd) { iscsiadm_req_t req; //转递的参数转变成 iscsiadm_reg_t 类型了 //新开了一个iscsiadm_reg_t // memset(&req, 0, sizeof(iscsiadm_req_t)); req.command = cmd; memcpy(&req.u.session.rec, rec, sizeof(node_rec_t)); return iscsid_request(fd, &req); }
mgmt_ipc_err_e iscsid_request(int *fd, iscsiadm_req_t *req) { err = iscsid_connect(fd); .... ///用write与iscsid通信?socket通信 if ((err = write(*fd, req, sizeof(*req))) != sizeof(*req)) } static mgmt_ipc_err_e iscsid_connect(int *fd) { ... for (nsec = 1; nsec <= MAXSLEEP; nsec <<= 1) { printf("\nanycom:util.c 146\n"); if (connect(*fd, (struct sockaddr *) &addr, sizeof(addr)) == 0) /* Connection established */ return MGMT_IPC_OK; sleep(); . ... } } 问题是在哪里建了/dev/sdc? 在iscsid.c中int main(int argc, char *argv[])的内容: mgmt_ipc_listen(void) 480附近 开的socket。 开设备号在 这个东西,还是相当难看懂的, 注册了一个transport class,google上基本没它的资料,不知道是怎么用的。 DECLARE_TRANSPORT_CLASS()了一下。 TRANSPORT_CLASS_REGISTER()了一下。 从哪里来用它,目前还不清楚。
Open-iscs源码分析之---iscsiadm.c
最新推荐文章于 2021-03-03 15:49:21 发布