面向核心開發者的Netlink注意事項¶
一般指導¶
屬性列舉¶
較老的家族常定義值為0且名為unspec的“空”屬性和命令。這雖然受支援(type: unused),但在新家族中應避免使用。unspec列舉值在實踐中不被使用,因此只需將第一個屬性的值設定為1。
訊息列舉¶
對請求和回覆使用相同的命令ID。這使得它們更容易匹配,而且我們有足夠的ID空間。
對通知使用獨立的命令ID。這使得將通知與回覆分開(並透過與回覆不同的API呈現給使用者應用程式)變得更容易。
回覆請求¶
較老的家族不會回覆所有命令,特別是NEW/ADD命令。使用者只能透過ACK獲取操作是否成功的資訊。嘗試返回有用的資料。一旦命令被新增,它是否回覆完整訊息或僅回覆ACK都屬於uAPI,不能更改。寧可選擇回覆。
特別是NEW和ADD命令應回覆識別所建立物件的資訊,例如已分配物件的ID(無需訴諸於使用NLM_F_ECHO)。
NLM_F_ECHO¶
確保將請求資訊傳遞給genl_notify(),以使NLM_F_ECHO生效。這對於需要核心提供精確反饋(例如用於日誌記錄目的)的程式很有用。
支援dump一致性¶
如果在dump期間迭代物件可能會跳過物件或重複它們——請確保使用NLM_F_DUMP_INTR報告dump不一致。這通常透過為結構維護一個生成ID並將其記錄在struct netlink_callback的seq成員中來實現。
Netlink規範¶
Netlink規範中僅與核心空間相關的部分的文件。
全域性變數¶
kernel-policy¶
定義核心驗證策略是global(即對家族所有操作都相同),還是為每個操作單獨定義(per-op),或是為每個操作和操作型別(do vs dump)單獨定義(split)。新家族應使用per-op(預設)以便能夠縮小特定命令接受的屬性範圍。
檢查¶
屬性規範的checks子部分的文件。
unterminated-ok¶
接受沒有空終止符的字串(僅適用於舊版家族)。從NLA_NUL_STRING策略型別切換到NLA_STRING。
max-len¶
定義二進位制或字串屬性的最大長度(對應於struct nla_policy的len成員)。對於字串屬性,終止空字元不計入max-len。
該欄位可以是字面整數值,也可以是已定義常量的名稱。字串型別可以將常量減一(即指定max-len: CONST - 1)以保留終止字元的空間,因此實現應識別此類模式。
min-len¶
類似於max-len,但定義最小長度。