netlink, PF_NETLINK -
核心與使用者之間的通訊
#include <asm/types.h>
#include <sys/socket.h>
#include <linux/netlink.h>
netlink_socket = socket(PF_NETLINK, socket_type, netlink_family);
Netlink
用於在核心模組與在使用者地址空間中的程序之間傳遞訊息的。它包
含了用於使用者程序的基於標準套接字的介面和用於核心模組的一個內部核心
API。有關這個內部核心介面的資料沒有包含在此手冊頁中。同樣還有
一個過時的透過 netlink
字元裝置的介面也沒有包含在此,它只是提供
向下相容特性。
Netlink
是一個面向資料包的服務。
SOCK_RAW 和
SOCK_DGRAM 都是
socket_type
的有效值。然而 netlink
協議對資料包 datagram
和原套接字(raw sockets)
並不作區分。
netlink_family 選擇核心模組或
netlink
組進行通訊。現有可指定的
netlink 的種類有:
- NETLINK_ROUTE
- 接收路由更新資訊,可以用來修改
IPv4 的路由表。(參見
rtnetlink(7))。
- NETLINK_FIREWALL
- 接收 IPv4
防火牆編碼傳送的資料包。
- NETLINK_ARPD
- 用以維護使用者地址空間裡的
arp 表
- NETLINK_ROUTE6
- 接收和傳送 IPv6
路由表更新訊息。
- NETLINK_IP6_FW
- 接收未透過 IPv6
防火牆檢查的資料包(尚未實現)
-
NETLINK_TAPBASE...NETLINK_TAPBASE+15
- 是 ethertap
裝置例項。Ethertap
是從使用者程式空間對乙太網驅動程式進行
模擬的“偽”網路通道裝置。
- NETLINK_SKIP
- Enskip
的保留選項。
- NETLINK_USERSOCK
- 為今後使用者程式空間協議用保留選項。
Netlink
資料資訊由具有一個或多個
nlmsghdr
資料報頭及其有效資料的位元組流組成。對於分成多個數據包的
Netlink 資訊,
資料報頭中的
NLM_F_MULTI
標誌位將被設定,除了最後一個包的報頭具有標誌
NLMSG_DONE外。
位元組流應只能用標準的
NLMSG_* 宏來訪問,參閱
netlink(3).
Netlink
不是可靠的協議。它只是儘可能地將資訊傳輸到目的地,但在記憶體耗
盡或發生其他錯誤時,它會丟失資訊。為保證資訊可靠傳輸,可以設定標誌
NLM_F_ACK
來要求接收方確認。資料接收確認是一個
NLMSG_ERROR
資料包,包中的出錯欄位設定為
0。應用程式必須自己建立收到資訊確認訊息。
在資訊傳送過程中,核心一直(嘗試)對每個出錯的資料包傳送
NLMSG_ERROR
訊息。使用者程序也應當遵循這一個慣例。
每一個 netlink
資料類都有一個32位廣播分組,當
對套接字呼叫
bind(2)
時,
sockaddr_nl 中的
nl_groups
欄位設定成所要偵聽的廣播組的位掩碼。其預設值為
0,表示不接收任何廣播。
一個套接字可以對任意一個多址廣播組廣播訊息,只要在呼叫
sendmsg(2) 或呼叫
connect(2)
時,將位掩碼
nl_groups
設定成要傳送訊息的廣播組的值就可以了。
只有具有有效 uid 為 0
的使用者或具有
CAP_NET_ADMIN
許可權的使用者才可能傳送或偵聽針對
netlink
多址廣播組的訊息。
任何一個對多址廣播組訊息的響應需發回程序標識
pid 和廣播組地址。
struct nlmsghdr
{
__u32 nlmsg_len; /* 包括報頭在內的訊息長度*/
__u16 nlmsg_type; /* 訊息正文 */
__u16 nlmsg_flags; /* 附加標誌*/
__u32 nlmsg_seq; /* 序列號*/
__u32 nlmsg_pid; /* 傳送程序號 PID */
};
struct nlmsgerr
{
int error; /* 負數表示的出錯號 errno 或為 0 要求確認 acks*/
struct nlmsghdr msg; /* 造成出錯的訊息報頭*/
};
在每個
nlmsghdr
後跟隨著有效資料。
nlmsg_type
可以成為標準訊息的型別:
NLMSG_NOOP
可以忽略的訊息,
NLMSG_ERROR
發出錯誤發生的訊息,有關資料中包含一個
nlmsgerr 結構,
NLMSG_DONE
一個多資料包訊息結束的資訊。
一個 netlink
類通常指定更多的訊息型別,請參閱有關手冊頁,如
NETLINK_ROUTE. 中的
rtnetlink(7)
nlmsg_flags 的標準標誌位 |
|
NLM_F_REQUEST |
設定全部請求訊息 |
NLM_F_MULTI |
此訊息是多資料包訊息之一,透過標誌
NLMSG_DONE 結束。 . |
NLM_F_ACK |
資料成功接收返回確認訊息 |
NLM_F_ECHO |
要求響應請求資訊 |
為 GET
請求設立的附加標誌位 |
|
NLM_F_ROOT |
返回物件表而不是單個數據項 |
NLM_F_MATCH |
尚未實現 |
NLM_F_ATOMIC |
返回物件表的原子快照(atomic
snapshot) |
NLM_F_DUMP |
尚未列入文件 |
對新建 NEW
請求設立的附加標誌位 |
|
NLM_F_REPLACE |
替換現有的物件 |
NLM_F_EXCL |
如物件已存在,不作替換 |
NLM_F_CREATE |
建立物件,如果物件不存在 |
NLM_F_APPEND |
物件表新增物件項 |
注 NLM_F_ATOMIC 要求使用者有
CAP_NET_ADMIN 或超級使用者權。
sockaddr_nl
描述了在使用者空間或在核心空間裡一個
netlink
客戶物件的資料結構。
一個 sockaddr_nl
物件可以是單址廣播或對一個
netlink 多址組 (nl_groups 不為 0).
struct sockaddr_nl
{
sa_family_t nl_family; /* AF_NETLINK */
unsigned short nl_pad; /* 零 */
pid_t nl_pid; /* 程序標識號pid */
__u32 nl_groups; /* 多址廣播組掩碼*/
};
nl_pid 是使用者空間中 netlink
的程序標識號
pid,如果是在核心時此值為
0。
nl_groups 是一個代表 neltlink
組號的位掩碼。
本手冊頁並不完整。
透過
libnetlink 呼叫 netlink
功能通常比透過低層核心介面要來得好些。
netlink 套接字介面是 Linux 2.2
新特性
Linux 2.0
支援更多的基於netlink介面的原始裝置(作為向下相容特性,
這些裝置目前仍可使用。舊介面特性沒有在此敘述。
cmsg(3),
rtnetlink(7),
netlink(3).
ftp://ftp.inr.ac.ru/ip-routing/iproute2* 有關 libnetlink
部分
LetBright <[email protected]>
2000/11/09
http://cmpp.linuxforum.net
本頁面中文版由中文 man
手冊頁計劃提供。
中文 man 手冊頁計劃:
https://github.com/man-pages-zh/manpages-zh