[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 的資料夾與對應程式,
其資料結構如下圖所示:
 

產生完新的 SM 之後, 我們就要修改 CMakeLists, 將新的 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 的撰寫,
以及相對應的測試函數撰寫, 這邊我們將會在後續繼續介紹.

留言

熱門文章

LTE筆記: RSRP, RSSI and RSRQ

[WiFi] WiFi 網路的識別: BSS, ESS, SSID, ESSID, BSSID

LTE筆記: 5G NR Measurement Events