[ORAN] FlexRIC Sevice Model (1): Indication Definition
在 FlexRIC 的架構中,
其 Service Model (SM) 包裝成 library 供 xApp 和 E2 Agent 使用,
因此, 在使用 SM 進行資料交換前, 必須先定義 SM,
並將定義好的 SM 封裝, 使得 xApp 和 E2 Agent 皆可使用.
詳細的說明, 可以參考官網建立 SM 的教學文件:
為了要建立 SM, 首先我們要建立相對應的檔案系統,
方法為執行: cd flexric/src/sm && python3 gen_sm.py
執行後輸入 SM 名稱 (default 為 new), 產生 new_sm 的資料夾與對應程式,
其資料結構如下圖所示:
一共有兩層 CMakeLists.txt 需要修改:
- ~/flexric/src/sm/CMakeLists.txt
## 在此文件中, 加入新的 SM 路徑:
add_subdirectory(kpm_sm_v2.02)
....
add_subdirectory(new_sm) #在文件尾端加入產生的資料夾名稱
- ~/flexric/CMakeLists.txt
#######
## Service Models
#######
# KPM service Model encoding definitions
set(SM_ENCODING_KPM "ASN" CACHE STRING "The KPM SM encoding to use")
set_property(CACHE SM_ENCODING_KPM PROPERTY STRINGS "PLAIN" "ASN" "FLATBUFFERS")
message(STATUS "Selected KPM SM_ENCODING: ${SM_ENCODING_KPM}")
...
# new Service Model
set(SM_ENCODING_NEW "PLAIN" CACHE STRING "The new SM encoding to use")
set_property(CACHE SM_ENCODING_NEW PROPERTY STRINGS "PLAIN" "ASN" "FLATBUFFERS")
message(STATUS "Selected new SM_ENCODING: ${SM_ENCODING_NEW}")
...
###
# Install the Service models
###
...
install(TARGETS new_sm DESTINATION ${CMAKE_INSTALL_LIBDIR}/flexric)
透過上述的設定, 我們定義好了 SM 編譯的路徑,
接著, 我們就回到 ~/flexric/src/sm/new_sm 進行 SM 的細部設計,
首先, 我們需要先註冊一組新的 SM ID, 此 ID 為一組數字,
141 ~ 147 已用於 FlexRIC 預先定義的 SM, 因此, 我們從 148 開始使用:
- ~/flexric/src/sm/new_sm/new_sm_id.h
const uint16_t SM_NEW_ID = 148;
接著, 也是最重要的是定義 information element (IE),
也就是 SM 中交換的資料與格式, 位於 ~/flexric/src/sm/new_sm/ie
此處一共有 4 個檔案, e2sm_new_v00.asn 和 e2sm_new_v00.fbs
對應於 ASN.1 以及 fb (flatBuffer) 的格式, new_data_ie.c 和 new_data_ie.h 則是 plain,
我們先專注在 new_data_ie.c 和 new_data_ie.h 比較簡單的範例.
在此範例中, 我們先看 new_data_ie.h 的 Indication Message 定義部分,
這邊我們跟隨官網的範例, 定義一個回傳的物件 (new_ng_u_tunnel_stats_t),
以及此物件中對應的四個參數: data1, data2, data3, data4.
此四個參數都必須給予數值型態定義, 如下所述:
同時, 我們也可以看到, 在 new_data_ie.h 的對應區間中,
有三個相對應的函式標題 (free, copy, compare), 必須在 new_data_ie.c 中定義:
// Supporting function
- void free_new_ind_msg(new_ind_msg_t* src);
- new_ind_msg_t cp_new_ind_msg(new_ind_msg_t const* src);
- bool eq_new_ind_msg(new_ind_msg_t* m0, new_ind_msg_t* m1);
可以參考原本範例程式中的邏輯, 並根據定義的欄位作相對應修改,
這邊就把修改的程式結果, 以截圖的方式顯示:
以上的修改, 大致上就完成了 SM Model 中 Indication 欄位的定義,
不過, 一個 Service Model 的完整建立, 還包含了 decode/encode 的撰寫,
以及相對應的測試函數撰寫, 這邊我們將會在後續繼續介紹.
留言
張貼留言