面向内核开发者的Netlink注意事项¶
一般指导¶
属性枚举¶
较老的家族常定义值为0
且名为unspec
的“空”属性和命令。这虽然受支持(type: unused
),但在新家族中应避免使用。unspec
枚举值在实践中不被使用,因此只需将第一个属性的值设置为1
。
消息枚举¶
对请求和回复使用相同的命令ID。这使得它们更容易匹配,而且我们有足够的ID空间。
对通知使用独立的命令ID。这使得将通知与回复分开(并通过与回复不同的API呈现给用户应用程序)变得更容易。
回复请求¶
较老的家族不会回复所有命令,特别是NEW/ADD命令。用户只能通过ACK获取操作是否成功的信息。尝试返回有用的数据。一旦命令被添加,它是否回复完整消息或仅回复ACK都属于uAPI,不能更改。宁可选择回复。
特别是NEW和ADD命令应回复识别所创建对象的信息,例如已分配对象的ID(无需诉诸于使用NLM_F_ECHO
)。
NLM_F_ECHO¶
确保将请求信息传递给genl_notify(),以使NLM_F_ECHO
生效。这对于需要内核提供精确反馈(例如用于日志记录目的)的程序很有用。
支持dump一致性¶
如果在dump期间迭代对象可能会跳过对象或重复它们——请确保使用NLM_F_DUMP_INTR
报告dump不一致。这通常通过为结构维护一个生成ID并将其记录在struct netlink_callback的seq
成员中来实现。
Netlink规范¶
Netlink规范中仅与内核空间相关的部分的文档。
全局变量¶
kernel-policy¶
定义内核验证策略是global
(即对家族所有操作都相同),还是为每个操作单独定义(per-op
),或是为每个操作和操作类型(do vs dump)单独定义(split
)。新家族应使用per-op
(默认)以便能够缩小特定命令接受的属性范围。
检查¶
属性规范的checks
子部分的文档。
unterminated-ok¶
接受没有空终止符的字符串(仅适用于旧版家族)。从NLA_NUL_STRING
策略类型切换到NLA_STRING
。
max-len¶
定义二进制或字符串属性的最大长度(对应于struct nla_policy的len
成员)。对于字符串属性,终止空字符不计入max-len
。
该字段可以是字面整数值,也可以是已定义常量的名称。字符串类型可以将常量减一(即指定max-len: CONST - 1
)以保留终止字符的空间,因此实现应识别此类模式。
min-len¶
类似于max-len
,但定义最小长度。