我已经读过通用的netlink如何- to,我发现netlink唯一的主要缺点是协议族的数量限制在MAX_LINKS (32),因此他们创建了通用的netlink协议。这是唯一的原因吗?这是否意味着,它建议使用genl而不是netlink,例如用户和内核空间之间的通信?与传统的网络链接相比,genl是否被认为是一种更可扩展和更易于管理的链接?
谢谢。
发布于 2015-02-20 20:45:23
Netlink协议编号ID是预先定义的,并且这些号码不应该被重用或重写。同时,通用的netlink允许通过字符串ID进行动态协议解析。
这是在自定义应用程序中使用通用netlink协议的主要原因。
另一个不同之处是,在普通的netlink (如RTNL )中,应该在消息头的type字段中传递命令类型,而对于一般的netlink,则在那里传递协议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消息也可以使用消息数据部分。
在文档中可以找到更多的信息
发布于 2018-02-03 11:03:05
#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
https://stackoverflow.com/questions/25432400
复制相似问题