Netlink 规范 C 代码生成¶
本文档描述了 Netlink 规范如何用于生成 C 代码(包括 uAPI、策略等)。它还定义了在旧家族中由 genetlink-c
协议级别允许的额外属性,以控制命名。
为简洁起见,本文档通过对象类型来指代各种对象的 name
属性。例如,$attr
是属性中 name
的值,而 $family
是家族的名称(全局 name
属性)。
大写字母用于表示字面值,例如 $family-CMD
表示 $family
、一个破折号字符和字面值 CMD
的连接。
#define
和枚举值的名称总是转换为大写,并且将破折号 (-
) 替换为下划线 (_
)。
如果构造的名称是 C 关键字,则会附加一个额外的下划线(do
-> do_
)。
全局设置¶
c-family-name
控制家族名称的 #define
名称,默认为 $family-FAMILY-NAME
。
c-version-name
控制家族版本的 #define
名称,默认为 $family-FAMILY-VERSION
。
max-by-define
选择枚举的最大值是定义为 #define
还是在枚举内部定义。
定义¶
常量¶
每个常量都以 #define
的形式生成。常量的名称为 $family-$constant
,其值根据规范中的类型呈现为字符串或整数。
枚举和标志¶
枚举被命名为 $family-$enum
。完整名称可以直接设置,也可以通过指定 enum-name
属性来抑制。默认条目名称为 $family-$enum-$entry
。如果指定了 name-prefix
,它将替换条目名称中 $family-$enum
的部分。
布尔值 render-max
控制最大值的创建(对于属性枚举默认启用)。这些最大值被命名为 __$pfx-MAX
和 $pfx-MAX
。第一个值的名称可以通过 enum-cnt-name
属性覆盖。
属性¶
每个属性集(不包括分数集)都以枚举形式生成。
属性枚举在 netlink 头文件中传统上是无名的。如果需要命名,可以使用 enum-name
来指定名称。
如果集的名称与家族的名称相同,默认属性名称前缀为 $family-A
;如果名称不同,则为 $family-A-$set
。该前缀可以通过集的 name-prefix
属性覆盖。本节其余部分将该前缀称为 $pfx
。
属性被命名为 $pfx-$attribute
。
属性枚举以两个特殊值 __$pfx-MAX
和 $pfx-MAX
结尾,这些值用于确定属性表的大小。这两个名称可以直接通过 attr-cnt-name
和 attr-max-name
属性分别指定。
如果在全局级别将 max-by-define
设置为 true
,则 attr-max-name
将被指定为 #define
而非枚举值。
操作¶
操作被命名为 $family-CMD-$operation
。如果指定了 name-prefix
,它将替换名称中 $family-CMD
的部分。
与属性枚举类似,操作枚举以特殊的计数和最大值属性结尾。对于操作,这些属性可以使用 cmd-cnt-name
和 cmd-max-name
进行重命名。如果 max-by-define
为 true
,则最大值将是一个 define。
多播组¶
每个多播组都会在内核 uAPI 头文件中生成一个 define。该 define 的名称为 $family-MCGRP-$group
,可以通过 c-define-name
属性覆盖。
代码生成¶
uAPI 头文件假定来自默认头文件搜索路径中的 <linux/$family.h>
。可以通过 uapi-header
全局属性进行更改。