Open-iscs源码分析之---iscsiadm.c

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(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_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_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()了一下。
从哪里来用它,目前还不清楚。

















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值