netlink和通用netlink协议

时间:2014-08-21 17:28:35

标签: linux-kernel netlink

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

感谢。

2 个答案:

答案 0 :(得分:5)

Netlink协议编号ID是预定义的,这些编号不应该被重用或覆盖。同时,通用netlink允许通过字符串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消息也可以使用消息数据部分。

您可以在docs

中找到一些其他信息

答案 1 :(得分:-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    

The fundamental reason is:

nl_table = kcalloc(MAX_LINKS, sizeof(*nl_table), GFP_KERNEL);

genl netlink is a wrapper for netlink

This is a new agreement I added: https://github.com/leesagacious/Netlink