2013-11-25 19 views
2

我是Linux開發新手。我正在研究一個示例Linux網絡驅動程序教程,並且遇到了net_generic(const struct net * net,int id)函數。可以解釋一下net_generic(const struct net * net,int id)的使用 我爲它的谷歌,但只發現頭文件。可以任何一個指向我的資源(網站或書),我可以參考。謝謝什麼是Linux中的net_generic函數include/net/net_namespace.h?

回答

4

當一個新的網絡命名空間被創建或銷燬時,網絡核心有一種通知方式。例如,作爲設備驅動程序開發人員或其他內核代碼開發人員,當您創建或銷燬新的網絡名稱空間時,您的模塊希望由網絡核心收到通知。爲此,您需要創建一個struct pernet_operations對象,並且必須使用register_pernet_subsys()函數向網絡子系統註冊。在您的驅動程序中,您可能需要將一些驅動程序私有數據存儲在作爲網絡名稱空間對象的struct net對象中,並且每當您收到有關命名空間事件的通知時都想訪問該私有數據。這就像在net_device對象中有一個驅動私有數據一樣。

所以你可以做的是,在pernet_operations結構中有'id'和'size'兩個字段。 id是指向一個整數的指針,size是一個整數。您需要在驅動程序中具有全局整數變量,並將該地址存儲在結構的「id」字段中,並告訴您所需的私有數據的大小。

例如這樣:

static struct pernet_operations bond_net_ops = { 
     .init = bond_net_init, 
     .exit = bond_net_exit, 
     .id = &bond_net_id, 
     .size = sizeof(struct bond_net), 
    };  

在此之後,當你調用register_pernet_subsys()函數與網絡子系統註冊,網絡subsytem分配所需的內存大小和結構網狀結構內部維護。並創建一個唯一的id並將其存儲在'id'指向的指針中,這意味着在上述情況下的bond_net_id中。這個ID就像是你的私人數據分配的錨點。

此後,只要你想訪問你的私人數據指針,你可以調用net_generic()函數,它返回分配內存的開始。例如在上面這種情況下,

 static void __net_exit bond_net_exit(struct net *net) 
     {  
      struct bond_net *bn = net_generic(net, bond_net_id); 
     } 

您可以參考驅動程序驅動程序/ net/bonding/bond_main.c。

+0

感謝您的回覆,您能不能指點我一本書我可以參考這些功能或一個網站的一些細節 – user2714949