netlink和通用netlink协议

Mar*_*ark 0 linux-kernel netlink

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

谢谢.

svi*_*ota 5

Netlink协议号ID是预定义的,这些号码不应该被重用或覆盖.同时,通用netlink允许通过字符串ID进行动态协议解析.

这是将通用netlink协议用于自定义应用程序的主要原因.

另一个区别是,在像RTNL这样的普通netlink中,应该type在消息头的字段中传递命令类型,而在通用netlink的情况下,协议ID在那里传递:

# nlmsg header
uint32 length;
uint16 type;  # command for rtnl and protocol id for genl
uint16 flags;
uint32 sequence_number;
uint32 pid;
Run Code Online (Sandbox Code Playgroud)

通用netlink命令id在消息数据中传递:

# genlmsg data
uint8 cmd;
uint8 version;
uint16 reserved;
Run Code Online (Sandbox Code Playgroud)

因此,genl的所有数据都应该在NLA链中传递,而不同类型的RTNL消息也可以使用消息数据部分.

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