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