對舊式 Generic Netlink 族群的 Netlink 規範支援¶
本文件描述了描述構成 genetlink-legacy 協議級別的舊式 Generic Netlink 族群所需的許多附加怪癖和屬性。
規範¶
全域性變數¶
直接在規範檔案根級別列出的屬性。
版本¶
Generic Netlink 族群版本,預設為 1。
version 歷史上用於引入可能會破壞向後相容性的族群更改。由於通常不允許破壞相容性的更改,因此很少使用 version。
屬性型別巢狀¶
新的 Netlink 族群應使用 multi-attr 來定義陣列。舊族群(例如 genetlink 控制族群)嘗試重用屬性型別來攜帶資訊,從而定義陣列型別。
作為參考,multi-attr 陣列可能如下所示
[ARRAY-ATTR]
[INDEX (optionally)]
[MEMBER1]
[MEMBER2]
[SOME-OTHER-ATTR]
[ARRAY-ATTR]
[INDEX (optionally)]
[MEMBER1]
[MEMBER2]
其中 ARRAY-ATTR 是陣列條目型別。
索引陣列¶
indexed-array 將整個陣列包裝在一個額外的屬性中(因此將其大小限制為 64kB)。ENTRY 巢狀是特殊的,並且條目的索引作為它們的型別,而不是普通的屬性型別。
需要一個 sub-type 來描述 ENTRY 中的型別。nest sub-type 意味著在 ENTRY 中存在巢狀陣列,結構如下所示
[SOME-OTHER-ATTR]
[ARRAY-ATTR]
[ENTRY]
[MEMBER1]
[MEMBER2]
[ENTRY]
[MEMBER1]
[MEMBER2]
其他 sub-type(如 u32)意味著在 ENTRY 中只有一個成員,如 sub-type 中所述。結構如下所示
[SOME-OTHER-ATTR]
[ARRAY-ATTR]
[ENTRY u32]
[ENTRY u32]
型別值¶
type-value 是一種使用屬性型別來攜帶有關單個物件的資訊的構造(通常在逐個條目轉儲陣列時使用)。
type-value 可以具有多個巢狀級別,例如 genetlink 的策略轉儲建立以下結構
[POLICY-IDX]
[ATTR-IDX]
[POLICY-INFO-ATTR1]
[POLICY-INFO-ATTR2]
第一級巢狀的策略索引作為其屬性型別,它包含一個具有屬性索引作為其型別的巢狀。屬性索引巢狀內部是策略屬性。現代 Netlink 族群應該將其定義為扁平結構,巢狀在這裡沒有好處。
操作¶
列舉(訊息 ID)模型¶
統一¶
現代族群使用 unified 訊息 ID 模型,該模型對族群中的所有訊息使用單個列舉。請求和響應共享相同的訊息 ID。通知來自同一空間的不同 ID。例如,給定以下操作列表
-
name: a
value: 1
do: ...
-
name: b
do: ...
-
name: c
value: 4
notify: a
-
name: d
do: ...
操作 a 的請求和響應將具有 ID 1,b 的請求和響應將具有 ID 2(因為沒有顯式 value,它是上一個操作 + 1)。通知 c 將使用 ID 4,操作 d 將使用 ID 5,依此類推。
定向¶
directional 模型按訊息的方向分割 ID 分配。來自和傳送到核心的訊息不會相互混淆,因此這可以節省 ID 空間(以使程式設計更加繁瑣為代價)。
在這種情況下,應在操作的 request reply 部分中指定 value 屬性(如果操作同時具有 do 和 dump,則 ID 是共享的,應在 do 中設定 value)。對於通知,value 在 op 級別提供,但它僅分配一個 reply(即“來自核心”ID)。讓我們看一個例子
-
name: a
do:
request:
value: 2
attributes: ...
reply:
value: 1
attributes: ...
-
name: b
notify: a
-
name: c
notify: a
value: 7
-
name: d
do: ...
在這種情況下,a 在將訊息傳送到核心時將使用 2,並期望收到 ID 為 1 的訊息作為響應。通知 b 分配一個“來自核心”ID,即 2。c 分配“來自核心”ID 7。如果操作 d 未在規範中顯式設定 values,則將為請求分配 3(a 是具有請求部分的先前操作,值為 2),併為響應分配 8(c 是“來自核心”方向的先前操作)。
其他怪癖¶
結構體¶
舊式族群可以定義 C 結構體,既可以用作屬性的內容,也可以用作固定訊息頭。結構體在 definitions 中定義,並在操作或屬性中引用。
成員¶
name- 結構體成員的屬性名稱
type- 標量型別之一:u8、u16、u32、u64、s8、s16、s32、s64、string、binary或bitfield32。
byte-order-big-endian或little-endian
doc、enum、enum-as-flags、display-hint- 與 屬性定義 相同
請注意,YAML 中定義的結構體根據 C 約定隱式打包。例如,以下結構體為 4 位元組,而不是 6 位元組
struct {
u8 a;
u16 b;
u8 c;
}
任何填充都必須顯式新增,並且類似 C 的語言應從成員是否自然對齊來推斷是否需要顯式填充。
以下是上面來自 YAML 的結構體定義
definitions:
-
name: message-header
type: struct
members:
-
name: a
type: u8
-
name: b
type: u16
-
name: c
type: u8
固定頭¶
可以使用 fixed-header 將固定訊息頭新增到操作。fixed-header 的預設值可以在 operations 中設定,並且可以為每個操作設定或覆蓋它。
operations:
fixed-header: message-header
list:
-
name: get
fixed-header: custom-header
attribute-set: message-attrs
屬性¶
可以使用具有結構體定義名稱的 struct 屬性將 binary 屬性解釋為 C 結構體。struct 屬性暗示 sub-type: struct,因此不必指定子型別。
attribute-sets:
-
name: stats-attrs
attributes:
-
name: stats
type: binary
struct: vport-stats
C 陣列¶
舊式族群還使用 binary 屬性來封裝 C 陣列。sub-type 用於標識要提取的標量型別。
attributes:
-
name: ports
type: binary
sub-type: u32
多訊息 DO¶
新的 Netlink 族群絕不應使用設定了 NLM_F_MULTI 的多個回覆來響應 DO 操作。請改用過濾的轉儲。
在規範級別,我們可以為 do 定義一個 dumps 屬性,可能具有值 combine 和 multi-object,具體取決於應如何實現解析(解析為單個回覆與物件列表,即幾乎是一個轉儲)。