Logo

Linux 核心

6.16.0-rc4

快速搜尋

目錄

  • 開發流程
  • 提交補丁
  • 行為準則
  • 維護者手冊
  • 所有開發流程文件
  • 核心 API
  • 驅動程式 API
  • 子系統
  • 鎖定
  • 許可規則
  • 編寫文件
  • 開發工具
  • 測試指南
  • 駭客指南
  • 跟蹤
  • 故障注入
  • 即時補丁
  • Rust
  • 管理
  • 構建系統
  • 報告問題
  • 使用者空間工具
  • 使用者空間 API
    • 系統呼叫
    • 安全相關介面
    • 裝置和 I/O
    • 其他一切
      • Linux 特定的 ELF 特性
      • Netlink 手冊
      • 平臺配置檔案選擇(例如 /sys/firmware/acpi/platform_profile)
      • VDUSE - “使用者空間的 vDPA 裝置”
      • futex2
      • Perf 環形緩衝區
      • NT 同步原語驅動程式
  • 韌體
  • 韌體和裝置樹
  • CPU 架構
  • 未排序的文件
  • 翻譯

本頁

  • 顯示原始碼

對舊式 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,具體取決於應如何實現解析(解析為單個回覆與物件列表,即幾乎是一個轉儲)。

©核心開發社群。 | 技術支援 Sphinx 5.3.0 & Alabaster 0.7.16 | 頁面源