Logo

Linux 内核

6.16.0-rc4

快速搜索

目录

  • 开发流程
  • 提交补丁
  • 行为准则
  • 维护者手册
  • 所有开发流程文档
  • 核心 API
  • 驱动程序 API
  • 子系统
  • 锁
  • 许可规则
  • 编写文档
  • 开发工具
  • 测试指南
  • Hacking 指南
  • 跟踪
  • 故障注入
  • 热补丁
  • Rust
  • 管理
  • 构建系统
  • 报告问题
  • 用户空间工具
  • 用户空间 API
    • 系统调用
    • 安全相关接口
    • 设备与 I/O
    • 其他
      • Linux 特有的 ELF 怪癖
      • Netlink 手册
      • 平台配置文件选择 (例如 /sys/firmware/acpi/platform_profile)
      • VDUSE - “用户空间 vDPA 设备”
      • futex2
      • Perf 环形缓冲区
      • NT 同步原语驱动程序
  • 固件
  • 固件和设备树
  • CPU 架构
  • 未分类文档
  • 翻译

本页

  • 显示源

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 全局属性进行更改。

© 内核开发社区。| 由 Sphinx 5.3.0 和 Alabaster 0.7.16 提供支持 | 页面源