内核开发者的 Netlink 注意事项¶
一般指导¶
属性枚举¶
较旧的族通常会定义值为 0
且名为 unspec
的“null”属性和命令。这是支持的(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
生效。这对于需要内核精确反馈的程序(例如,用于日志记录目的)很有用。
支持转储一致性¶
如果在转储期间迭代对象可能会跳过对象或重复它们 - 确保使用 NLM_F_DUMP_INTR
报告转储不一致。这通常通过维护结构的生成 ID 并将其记录在 struct netlink_callback 的 seq
成员中来实现。
Netlink 规范¶
仅与内核空间相关的 Netlink 规范部分的文档。
全局变量¶
kernel-policy¶
定义内核验证策略是 global
,即对于族的所有操作都相同,还是为每个操作单独定义 - per-op
,或者为每个操作和操作类型(do 与 dump)分别定义 - split
。新族应使用 per-op
(默认),以便能够缩小特定命令接受的属性。
checks¶
属性规范的 checks
子部分的文档。
unterminated-ok¶
接受没有空终止的字符串(仅适用于旧版族)。从 NLA_NUL_STRING
切换到 NLA_STRING
策略类型。
max-len¶
定义二进制或字符串属性的最大长度(对应于 struct nla_policy 的 len
成员)。对于字符串属性,终止空字符不计入 max-len
。
该字段可以是字面整数值,也可以是已定义常量的名称。字符串类型可以将常量减一(即,指定 max-len: CONST - 1
)以保留终止字符的空间,因此实现应识别这种模式。
min-len¶
类似于 max-len
,但定义最小长度。