SYNOPSIS 總攬
#include <asm/types.h>
#include <sys/socket.h>
#include <linux/netlink.h>
netlink_socket = socket(PF_NETLINK, socket_type, netlink_family);
DESCRIPTION 描述
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:T{ | |
此消息是多數據包消息之一,通過標志 | |
結束。 | |
T} | |
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 組號的位掩碼。