Netlink 規範 C 程式碼生成¶
本文件描述了 Netlink 規範如何用於生成 C 程式碼(包括 uAPI、策略等)。它還定義了在舊家族中由 genetlink-c 協議級別允許的額外屬性,以控制命名。
為簡潔起見,本文件透過物件型別來指代各種物件的 name 屬性。例如,$attr 是屬性中 name 的值,而 $family 是家族的名稱(全域性 name 屬性)。
大寫字母用於表示字面值,例如 $family-CMD 表示 $family、一個破折號字元和字面值 CMD 的連線。
#define 和列舉值的名稱總是轉換為大寫,並且將破折號 (-) 替換為下劃線 (_)。
如果構造的名稱是 C 關鍵字,則會附加一個額外的下劃線(do -> do_)。
全域性設定¶
c-family-name 控制家族名稱的 #define 名稱,預設為 $family-FAMILY-NAME。
c-version-name 控制家族版本的 #define 名稱,預設為 $family-FAMILY-VERSION。
max-by-define 選擇列舉的最大值是定義為 #define 還是在列舉內部定義。
定義¶
常量¶
每個常量都以 #define 的形式生成。常量的名稱為 $family-$constant,其值根據規範中的型別呈現為字串或整數。
列舉和標誌¶
列舉被命名為 $family-$enum。完整名稱可以直接設定,也可以透過指定 enum-name 屬性來抑制。預設條目名稱為 $family-$enum-$entry。如果指定了 name-prefix,它將替換條目名稱中 $family-$enum 的部分。
布林值 render-max 控制最大值的建立(對於屬性列舉預設啟用)。這些最大值被命名為 __$pfx-MAX 和 $pfx-MAX。第一個值的名稱可以透過 enum-cnt-name 屬性覆蓋。
屬性¶
每個屬性集(不包括分數集)都以列舉形式生成。
屬性列舉在 netlink 標頭檔案中傳統上是無名的。如果需要命名,可以使用 enum-name 來指定名稱。
如果集的名稱與家族的名稱相同,預設屬性名稱字首為 $family-A;如果名稱不同,則為 $family-A-$set。該字首可以透過集的 name-prefix 屬性覆蓋。本節其餘部分將該字首稱為 $pfx。
屬性被命名為 $pfx-$attribute。
屬性列舉以兩個特殊值 __$pfx-MAX 和 $pfx-MAX 結尾,這些值用於確定屬性表的大小。這兩個名稱可以直接透過 attr-cnt-name 和 attr-max-name 屬性分別指定。
如果在全域性級別將 max-by-define 設定為 true,則 attr-max-name 將被指定為 #define 而非列舉值。
操作¶
操作被命名為 $family-CMD-$operation。如果指定了 name-prefix,它將替換名稱中 $family-CMD 的部分。
與屬性列舉類似,操作列舉以特殊的計數和最大值屬性結尾。對於操作,這些屬性可以使用 cmd-cnt-name 和 cmd-max-name 進行重新命名。如果 max-by-define 為 true,則最大值將是一個 define。
多播組¶
每個多播組都會在核心 uAPI 標頭檔案中生成一個 define。該 define 的名稱為 $family-MCGRP-$group,可以透過 c-define-name 屬性覆蓋。
程式碼生成¶
uAPI 標頭檔案假定來自預設標頭檔案搜尋路徑中的 <linux/$family.h>。可以透過 uapi-header 全域性屬性進行更改。