Logo

Linux 内核

6.13.0-rc6

快速搜索

目录

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

本页

  • 显示源码

原始 Netlink 族对 Netlink 规范的支持¶

本文档描述了原始 Netlink 族(如 NETLINK_ROUTE)使用 netlink-raw 协议规范所需的其他属性。

规范¶

netlink-raw 模式使用指定原始 netlink 族使用的协议号和多播 ID 所需的属性扩展了 genetlink-legacy 模式。 有关详细信息,请参阅经典 Netlink。 原始 netlink 族还使用特定类型的子消息。

全局变量¶

protonum¶

protonum 属性用于指定在打开 netlink 套接字时要使用的协议号。

# SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)

name: rt-addr
protocol: netlink-raw
protonum: 0             # part of the NETLINK_ROUTE protocol

多播组属性¶

value¶

value 属性用于指定用于多播组注册的组 ID。

mcast-groups:
  list:
    -
      name: rtnlgrp-ipv4-ifaddr
      value: 5
    -
      name: rtnlgrp-ipv6-ifaddr
      value: 9
    -
      name: rtnlgrp-mctp-ifaddr
      value: 34

子消息¶

几个原始 netlink 族(如 rt_link 和 tc)使用属性嵌套作为携带模块特定信息的抽象。

概念上如下所示

[OUTER NEST OR MESSAGE LEVEL]
  [GENERIC ATTR 1]
  [GENERIC ATTR 2]
  [GENERIC ATTR 3]
  [GENERIC ATTR - wrapper]
    [MODULE SPECIFIC ATTR 1]
    [MODULE SPECIFIC ATTR 2]

外部级别的 GENERIC ATTR 在核心(或 rt_link 或核心 TC)中定义,而特定的驱动程序、TC 分类器、qdiscs 等可以将它们自己的信息包装在 GENERIC ATTR - wrapper 中。 尽管上面的示例显示了包装器内部的属性嵌套,但是模块通常可以完全自由地定义嵌套的格式。 实际上,包装器属性的有效负载与 netlink 消息具有非常相似的特征。 它可能包含固定的标头/结构、netlink 属性或两者都包含。 由于这些共享特征,我们将包装器属性的有效负载称为子消息。

子消息属性使用另一个属性的值作为选择器键来选择正确的子消息格式。 例如,如果已解码以下属性

{ "kind": "gre" }

并且我们遇到以下属性规范

-
  name: data
  type: sub-message
  sub-message: linkinfo-data-msg
  selector: kind

然后,我们查找一个名为 linkinfo-data-msg 的子消息定义,并使用 kind 属性的值(即 gre)作为键来选择子消息的正确格式

sub-messages:
  name: linkinfo-data-msg
  formats:
    -
      value: bridge
      attribute-set: linkinfo-bridge-attrs
    -
      value: gre
      attribute-set: linkinfo-gre-attrs
    -
      value: geneve
      attribute-set: linkinfo-geneve-attrs

这将使用名为 linkinfo-gre-attrs 的属性集作为属性空间来解码属性值作为子消息。

子消息可以具有可选的 fixed-header,后跟来自 attribute-set 的零个或多个属性。 例如,以下 tc-options-msg 子消息定义了使用 fixed-header、attribute-set 或两者混合的消息格式

sub-messages:
  -
    name: tc-options-msg
    formats:
      -
        value: bfifo
        fixed-header: tc-fifo-qopt
      -
        value: cake
        attribute-set: tc-cake-attrs
      -
        value: netem
        fixed-header: tc-netem-qopt
        attribute-set: tc-netem-attrs

请注意,选择器属性必须在任何依赖于它的子消息属性之前出现在 netlink 消息中。

如果在多个嵌套级别定义了诸如 kind 的属性,则将使用“最接近”选择器的值来解析子消息选择器。 例如,如果相同的属性名称在嵌套的 attribute-set 中与子消息选择器一起定义,并且也在顶层 attribute-set 中定义,则将使用“最接近”选择器的值来解析选择器。 如果该值未在消息中以与规范中定义的级别相同的级别出现,则这是一个错误。

嵌套结构定义¶

许多原始 netlink 族(如 tc)使用嵌套的结构定义。netlink-raw 模式可以使用 struct 属性在结构定义中嵌入结构。 例如,以下结构定义为 struct tc-tbf-qopt 的 rate 和 peakrate 成员都嵌入了 tc-ratespec 结构定义。

-
  name: tc-tbf-qopt
  type: struct
  members:
    -
      name: rate
      type: binary
      struct: tc-ratespec
    -
      name: peakrate
      type: binary
      struct: tc-ratespec
    -
      name: limit
      type: u32
    -
      name: buffer
      type: u32
    -
      name: mtu
      type: u32
©内核开发社区。| 由 Sphinx 5.3.0 和 Alabaster 0.7.16 驱动 | 页面源