我已经阅读了通用 netlink How-To,我发现 netlink 的唯一主要缺点是协议族的数量限制为 MAX_LINKS (32),因此他们创建了通用 netlink 协议。这是唯一的原因吗?这是否意味着它建议使用 genl 而不是 netlink,例如作为用户和内核空间之间的通信?与传统的网络链接相比,genl 是否被认为更具可扩展性和可管理性?
谢谢。
我已经阅读了通用 netlink How-To,我发现 netlink 的唯一主要缺点是协议族的数量限制为 MAX_LINKS (32),因此他们创建了通用 netlink 协议。这是唯一的原因吗?这是否意味着它建议使用 genl 而不是 netlink,例如作为用户和内核空间之间的通信?与传统的网络链接相比,genl 是否被认为更具可扩展性和可管理性?
谢谢。
Netlink 协议编号 ID 是预定义的,这些编号不应被重用或覆盖。同时,通用网络链接允许通过字符串 ID 进行动态协议解析。
这就是将通用 netlink 协议用于自定义应用程序的主要原因。
另一个区别是,在像 RTNL 这样的普通网络链接中,应该type
在消息头的字段中传递命令类型,而在通用网络链接的情况下,协议 id 是在那里传递的:
# nlmsg header
uint32 length;
uint16 type; # command for rtnl and protocol id for genl
uint16 flags;
uint32 sequence_number;
uint32 pid;
通用 netlink 命令 id 在消息数据中传递:
# genlmsg data
uint8 cmd;
uint8 version;
uint16 reserved;
因此,genl 的所有数据都应该在 NLA 链中传递,而不同类型的 RTNL 消息也可以使用消息数据部分。
您可以在文档中找到一些其他信息
#define NETLINK_ROUTE 0 /* Routing/device hook */
#define NETLINK_UNUSED 1 /* Unused number */
#define NETLINK_USERSOCK 2 /* Reserved for user mode socket protocols */
#define NETLINK_FIREWALL 3 /* Unused number, formerly ip_queue */
#define NETLINK_SOCK_DIAG 4 /* socket monitoring */
#define NETLINK_NFLOG 5 /* netfilter/iptables ULOG */
#define NETLINK_XFRM 6 /* ipsec */
#define NETLINK_SELINUX 7 /* SELinux event notifications */
#define NETLINK_ISCSI 8 /* Open-iSCSI */
#define NETLINK_AUDIT 9 /* auditing */
#define NETLINK_FIB_LOOKUP 10
#define NETLINK_CONNECTOR 11
#define NETLINK_NETFILTER 12 /* netfilter subsystem */
#define NETLINK_IP6_FW 13
#define NETLINK_DNRTMSG 14 /* DECnet routing messages */
#define NETLINK_KOBJECT_UEVENT 15 /* Kernel messages to userspace */
#define NETLINK_GENERIC 16
#define NETLINK_SCSITRANSPORT 18 /* SCSI Transports */
#define NETLINK_ECRYPTFS 19
#define NETLINK_RDMA 20
#define NETLINK_CRYPTO 21 /* Crypto layer */
#define NETLINK_INET_DIAG NETLINK_SOCK_DIAG
#define MAX_LINKS 32
根本原因是:
nl_table = kcalloc(MAX_LINKS, sizeof(*nl_table), GFP_KERNEL);
genl netlink 是 netlink 的包装器
这是我添加的新协议: https://github.com/leesagacious/Netlink