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 ATTRs 在核心(或 rt_link 或核心 TC)中定義,而特定驅動、TC 分類器、qdisc 等可以在 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