首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >netlink与通用netlink协议

netlink与通用netlink协议
EN

Stack Overflow用户
提问于 2014-08-21 17:28:35
回答 2查看 2.7K关注 0票数 0

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

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-20 20:45:23

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

这是在自定义应用程序中使用通用netlink协议的主要原因。

另一个不同之处是,在普通的netlink (如RTNL )中,应该在消息头的type字段中传递命令类型,而对于一般的netlink,则在那里传递协议id:

代码语言:javascript
复制
# nlmsg header
uint32 length;
uint16 type;  # command for rtnl and protocol id for genl
uint16 flags;
uint32 sequence_number;
uint32 pid;

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

代码语言:javascript
复制
# genlmsg data
uint8 cmd;
uint8 version;
uint16 reserved;

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

文档中可以找到更多的信息

票数 6
EN

Stack Overflow用户

发布于 2018-02-03 11:03:05

代码语言:javascript
复制
#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    

根本原因是:

代码语言:javascript
复制
nl_table = kcalloc(MAX_LINKS, sizeof(*nl_table), GFP_KERNEL);

genl netlink是netlink的包装器

这是我补充的一个新协议:https://github.com/leesagacious/Netlink

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25432400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档