Netlink 规范 C 代码生成¶
本文档描述了如何使用 Netlink 规范来渲染 C 代码(uAPI、策略等)。它还定义了较旧的族中允许的额外属性,通过 genetlink-c
协议级别来控制命名。
为简洁起见,本文档将各种对象的 name
属性称为对象类型。例如,$attr
是属性中 name
的值,$family
是族(全局 name
属性)的名称。
大写用于表示字面值,例如 $family-CMD
表示 $family
、一个连字符以及字面值 CMD
的连接。
#defines
和枚举值的名称始终转换为大写,并将连字符 (-
) 替换为下划线 (_
)。
如果构造的名称是 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
控制最大值的创建(默认情况下为属性枚举启用)。
属性¶
每个属性集(不包括分数集)都呈现为枚举。
属性枚举在 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
全局属性更改它。