0

我已经阅读了通用 netlink How-To,我发现 netlink 的唯一主要缺点是协议族的数量限制为 MAX_LINKS (32),因此他们创建了通用 netlink 协议。这是唯一的原因吗?这是否意味着它建议使用 genl 而不是 netlink,例如作为用户和内核空间之间的通信?与传统的网络链接相比,genl 是否被认为更具可扩展性和可管理性?

谢谢。

4

2 回答 2

6

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 消息也可以使用消息数据部分。

您可以在文档中找到一些其他信息

于 2015-02-20T20:45:23.157 回答
-2
#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

于 2018-02-03T11:03:05.663 回答