Open Network Linux Platform (ONLP) 是 ONL 所提供的一套基於 C 語言的 API。

這一套 API 讓開發著能夠在不修改交換機管理程式的情況下將程式部屬到多個不同的設備中。

下圖是 ONLP 的簡易架構圖:

Screen Shot 2019-09-27 at 3.55.38 PM.png

ONLP 主要分成三個區塊:ONLP API, ONLP, ONLPI API

ONLP API

這部份定義了許多常用的 API,例如查詢整個 Chassis 中有哪些元件可以使用、或是查詢 SFP 的 Serial Number 等等。每一個元件都有一個 OID,一個 OID 包含兩個部分,一個是這一個元件的類型(SFP, Fan, Thermal, …),另一個是他本身的 ID。另外在 ONLP API 中也定義了一個名為 onlp_oid_hdr_s 的一套資料結構,主要的原因是因為在 ONLP 中所定義的元件是可以包含子元件的,例如風扇中包含了溫度計。

ONLP

ONLP 這部份是 ONLP API 的實作,裡面大多數的情況是將 ONLP API 的參數傳遞到底下 ONLPI API 上。但在 ONLP 實作中還包含了其他東西像是錯誤處理,資料型態轉換,以及 API Lock 等等的。

ONLP 中所使用的 Lock 是用系統的 share memory 或是用 semaphore 去實作,這樣不同的 process 在使用相同的 API 時(例如同時設定風扇轉速)就不會有衝突。

ONLPI API

ONLPI API 跟 ONLP API 的設計其實很相似,只是他在不同的設備平台上會有不同的實作,不同廠商若需支援 ONLP,僅需要實作 ONLPI API 這一部分即可。

在編譯好 ONLP 函式庫以及工具之後,會產生兩個 Share library 供應用程式使用,一個是 ONLP 本身 (libonlp.so),另一個則是針對特定設備的函式庫 (libonlp-platform.so),這一個函式庫在開機時會自動被放置在正確的路徑上面。

開機時自動載入正確的 ONL 函式庫

上一篇有提到說 ONL 在開機時,會自動載入與該設備相關的檔案並執行特定的腳本,這部份要從 ONIE 開始講起,在 ONIE 裝好之後,會在 ONIE 中包含該設備的資訊,這部份可以透過 oonie-sysinfo 這一個指令去獲得像是 CPU 架構,或是本身設備的 model 等。

在 ONL Installer 中會透過 ONIE 的指令找出平台名稱,然後將將平台資訊寫在 ONL 開機專用的 config 中,開機時會依據 config 中所寫的名稱找出正確的 Python script 執行。

Python 腳本會先初始化各項硬體及系統配置,例如初始化 i2c device, i2c mux, spi 或是設備商提供的 Kernel module 等。另外也會透過 symbolic link 把 libonlp-[platform name].so link 到 /lib/[system arch] 中。

 

Share Your Thought