原始 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