2009-04-30 80 views
4

我想使用netlink在應用程序和內核空間之間進行通信。我的Linux內核版本2.6.28是,和下面是我的錯誤代碼:如何在內核和用戶空間之間創建一個「netlink」?

nf_sock=netlink_kernel_create(NL_PROTO,0,nl_user_skb,THIS_MODULE); 

縮寫的錯誤信息是:

error: too few arguments to function 'netlink_kernel_create' 

在文件<linux/netlink.h>,功能netlink_kernel_create()被定義爲

extern struct sock *netlink_kernel_create(struct net *net,int unit,unsigned int groups,void (*input)(struct sk_buff *skb),struct mutex *cb_mutex,struct module *module) 

我不明白第一個參數net使用什麼。有人可以解釋我應該在這裏使用什麼嗎?

+0

你從哪裏得到函數定義?記住libc API的用戶空間可能不完全是內核syscall API的libc。 – stsquad 2009-04-30 10:32:58

回答

4

A struct net包含有關網絡名稱空間的信息,網絡名稱空間是一組可用於進程的網絡資源。請注意,可能有多個網絡名稱空間(即網絡堆棧的多個實例),但大多數驅動程序使用init_net名稱空間。

您的通話可能應該看起來像下面

nf_sock = netlink_kernel_create(&init_net, 
           NETLINK_USERSOCK, 
           0, 
           nl_rcv_func, 
           NULL, 
           THIS_MODULE); 

其中nl_rcv_func是一個函數以struct sk_buff *skb作爲唯一的參數和處理接收到的網絡鏈路的消息。

2

你好像一直在關注如this one這樣的指南,它(從2005年開始)可能已經超過了內核的發展。看起來從內核創建netlink的內部API已經改變。

請檢查本地內核樹中的文檔/文件夾中的某些(希望更新鮮)文檔,或者閱讀代碼本身。你也可以通過trawl的Linux Kernel郵件列表來歸檔任何可能發生的變化。

Here是2.6.29中的實際實現,如果你想讓它向後困惑(當然還沒有在你自己的樹中檢查過它)。

+1

@unwind:你最後一個鏈接被打破了,所以我改變了它。我對我的猜測非常有信心,但請檢查它以確保我鏈接到了正確的頁面。 – 2009-06-06 14:04:27

-3

對於內核/用戶通信,我會建議ioctl。 ioctl界面是標準的,內核之間更新的機會很小。

+2

ioctl的可能適用於簡單的更改,但界面是一個古老而脆弱的界面。對於任何中等複雜的內核開發者來說,Netlink是首選的API。 – stsquad 2009-04-30 10:31:21

1

是,結構網確實是淨命名空間,但它是不恰當的總是使用init_net,要註冊自己的pernet_operations,像這樣:

static struct pernet_operations fib_net_ops = { 
     .init = fib_net_init, 
     .exit = fib_net_exit, 
}; 

static int __net_init fib_net_init(struct net *net) 
{ 
     int error; 

#ifdef CONFIG_IP_ROUTE_CLASSID 
     net->ipv4.fib_num_tclassid_users = 0; 
#endif 
     error = ip_fib_net_init(net); 
     if (error < 0) 
       goto out; 
     error = nl_fib_lookup_init(net); 
     if (error < 0) 
       goto out_nlfl; 
     error = fib_proc_init(net); 
     if (error < 0) 
       goto out_proc; 
out: 
     return error; 

out_proc: 
     nl_fib_lookup_exit(net); 
out_nlfl: 
     ip_fib_net_exit(net); 
     goto out; 
} 

static int __net_init nl_fib_lookup_init(struct net *net) 
{ 
     struct sock *sk; 
     struct netlink_kernel_cfg cfg = { 
       .input = nl_fib_input, 
     }; 

     sk = netlink_kernel_create(net, NETLINK_FIB_LOOKUP, &cfg); 
     if (sk == NULL) 
       return -EAFNOSUPPORT; 
     net->ipv4.fibnl = sk; 
     return 0; 
} 

最後:

register_pernet_subsys(&fib_net_ops); 
相關問題