1. 程式人生 > >Open-iscs原始碼分析之---iscsiadm.c

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()了一下。 從哪裡來用它,目前還不清楚。

相關推薦

Open-iscs原始碼分析---iscsiadm.c

login處理... main(int argc, char **argv) { ...... printf("anycom: iscsiadmin.c 2332"); rc = exec_node_op(op, do_login, do_logout,

redis原始碼分析intset.c

#include <stdio.h> #include <stdlib.h> #include <string.h> #include "intset.h" #include "zmalloc.h" #include "end

redis原始碼分析zipmap.c

/** * 建立空zipmap * @return */ /* Create a new empty zipmap. */ unsigned char *zipmapNew(void) { unsigned char *zm = zmalloc(2

YOLO原始碼分析data.c

darknet裡樣本的儲存是以如下形式進行排列的 flag | class_info | box_info flag為0或者1,表示有沒有物體 class_info表示類別資訊,其長度是num_class box_info表示標註資訊,其長度是5(x, y, w, h, o

Open vSwitch(OvS)原始碼分析工作流程(flow流表查詢)

前面分析了Open vSwitch幾部分原始碼,對於Open vSwitch也有了個大概的理解,今天要分析的程式碼將是整個Open vSwitch的重中之重。整個Open vSwitch的核心程式碼在datapath檔案中;而datapath檔案中的核心程式碼又在ovs_dp_process_re

Android Wi-Fi原始碼分析WifiService操作Wi-Fi(一):分析Wifi.c中的wifi_load_driver()函式

Wi-Fi原始碼分析之WifiService操作Wi-Fi(一) 分析Wifi.c中的wifi_load_driver()函式 int wifi_load_driver() { AL

ghostscript原始碼分析 scan_token()函式 (詞法分析器iscan.c)

scan_token()函式很重要,ghostscript寫得比較瑣碎難懂,裡面有些有英文解釋。 我只對我關注的部分加了些中文註釋。當然不是所有的都理解了。但是功能還是清楚了的,像某些函式介面。 如果讓我寫的話,我一定比他寫得更清晰。哈哈,當然他的scan_token基本的框架 設計還是

STL原始碼分析hash表(gnu-c++ 2.9)

1、基本概念 關於hash表的概念這裡就不再多說,hash表的變化一般都在雜湊函式和退避方法上。STL採用的是開鏈法,即每個hash桶裡面維持一個連結串列,hash函式計算出位置後,就將節點插入該位置的連結串列上,因此,底層實現為hash表的容器,迭代器的實現

HotSpot原始碼分析C++物件的記憶體佈局

HotSpot採用了OOP-Klass模型來描述Java類和物件。OOP(Ordinary Object Pointer)指的是普通物件指標,而Klass用來描述物件的具體型別。為了更好理解這個模型,首先要介紹一下C++的記憶體物件模型和虛擬函式。 1、C++類物件的記憶體佈局 我們使用Visual Stud

Spark原始碼分析Spark Shell(上)

https://www.cnblogs.com/xing901022/p/6412619.html 文中分析的spark版本為apache的spark-2.1.0-bin-hadoop2.7。 bin目錄結構: -rwxr-xr-x. 1 bigdata bigdata 1089 Dec

Netty 原始碼分析拆包器的奧祕

為什麼要粘包拆包 為什麼要粘包 首先你得了解一下TCP/IP協議,在使用者資料量非常小的情況下,極端情況下,一個位元組,該TCP資料包的有效載荷非常低,傳遞100位元組的資料,需要100次TCP傳送,100次ACK,在應用及時性要求不高的情況下,將這100個有效資料拼接成一個數據包,那會縮短到一個TCP資

Android原始碼分析為什麼在onCreate() 和 onResume() 獲取不到 View 的寬高

轉載自:https://www.jianshu.com/p/d7ab114ac1f7 先來看一段很熟悉的程式碼,可能在最開始接觸安卓的時候,大部分人都寫過的一段程式碼;即嘗試在 onCreate() 和 onResume() 方法中去獲取某個 View 的寬高資訊: 但是列印輸出後,我們會發

netty原始碼分析服務端啟動

ServerBootstrap與Bootstrap分別是netty中服務端與客戶端的引導類,主要負責服務端與客戶端初始化、配置及啟動引導等工作,接下來我們就通過netty原始碼中的示例對ServerBootstrap與Bootstrap的原始碼進行一個簡單的分析。首先我們知道這兩個類都繼承自AbstractB

SNMP原始碼分析(一)配置檔案部分

snmpd.conf想必不陌生。在程序啟動過程中會去讀取配置檔案中各個配置。其中幾個引數需要先知道是幹什麼的:   token:配置檔案的每行的開頭,例如 group MyROGroup v1 readSec 這行token的引數是group。  

【kubernetes/k8s原始碼分析】kubelet原始碼分析cdvisor原始碼分析

  資料流 UnsecuredDependencies -> run   1. cadvisor.New初始化 if kubeDeps.CAdvisorInterface == nil { imageFsInfoProvider := cadv

【kubernetes/k8s原始碼分析】kubelet原始碼分析容器網路初始化原始碼分析

一. 網路基礎   1.1 網路名稱空間的操作 建立網路名稱空間: ip netns add 名稱空間內執行命令: ip netns exec 進入名稱空間: ip netns exec bash   1.2 bridge-nf-c

【kubernetes/k8s原始碼分析】kubelet原始碼分析資源上報

0. 資料流   路徑: pkg/kubelet/kubelet.go   Run函式() ->   syncNodeStatus ()  ->   registerWithAPIServer() ->

【kubernetes/k8s原始碼分析】kubelet原始碼分析啟動容器

主要是呼叫runtime,這裡預設為docker 0. 資料流 NewMainKubelet(cmd/kubelet/app/server.go) -> NewKubeGenericRuntimeManager(pkg/kubelet/kuberuntime/kuberuntime

Android系統原始碼分析-ContentProvider

距離上一次寫部落格已經半年多了,這半年發生了很多事情,也有了很多感觸,最主要是改變了忙碌了工作,更加重視身體的健康,為此也把工作地點從深圳這個一線城市換到了珠海,工作相對沒有那麼累,身體感覺也好了很多。所以在工作完成之餘,也有了更多的時間來自我學習和提高,後續會用更多時間來寫更多實用的東西,幫助我們理解

Vue 原始碼分析proxy代理

Vue 原始碼分析之proxy代理 當我們在使用Vue進行資料設定時,通常初始化格式為: let data = { age: 12, name: 'yang' } // 例項化Vue物件 let vm = new Vue({ data })