🎉

5G SystemにおけるgNodeB疑似呼を自作してみる

に公開

1. はじめに

この記事は、5G Coreを相手にgNodeBの疑似呼を自作実装している途中経過をまとめたものである。
どこまで出来たか何を割り切っているかどう言った仕様にすると使い勝手が良くなるかなどを以下にまとめた。

2. 背景・目的

5G Core の実装や仕様検証をしていると、次のような場面に遭遇した。

  • UEやgNodebを用意するほどではない
  • 実機では中々再現出来ない準正常動作の検証をしたい(信号クロスやタイムアウトなど)
  • NGAP/NAS信号に任意のパラメータを設定したい
  • UEを複数台の構成で容易に接続検証出来る環境を準備したい

そこで今回は、「gNodeB疑似呼をソフトウェアで作る」ことにした。

3. 実装方針

今回の疑似呼では、以下のように割り切っている

  • 実機 gNodeB ❌
  • RRC ❌
  • 無線 ❌

gNodeb疑似呼単体で動作しNGAP信号にそのままNASを内包する事でUEのエミュレートは行わない。

言語

  • Go言語
    • 並行処理が書きやすい
    • 仕事で暫くGo言語を使用しておりスキルマッチ
    • 比較的自由に使える豊富なライブラリ

基本戦略

  • SCTP接続を張る
  • NGAP/NAS信号は直接記述
  • コマンド入力による柔軟な設定・動作
  • シナリオ制御による信号のシーケンス制御
  • マッピングパラメータなどはまとめてyamlで定義

4. ここまで出来た事

1. SCTP接続

  • AMFのNGAPポート38412)へSCTP接続
  • Associationの確立
  • ハートビート確認

2. NG Setup Procedure

  • NG Setup Request送信
  • NG Setup Response受信

3. コマンド入力受付

  • startlinkコマンドでSCTPリンク確立
  • send 信号名 で信号送信

4. 各種読み込み

  • configはyaml定義として読み込む
  • 信号データはsignal.txtとして読み込む
  • 信号制御はscenario.txtとして読み込む

5. 信号のイメージ

シャープ文字以降はコメントアウトに対応済みです。
※信号バイナリデータはUERANSIMをベースに一旦仮でパラメータは作成しています。

signal.txt
NGSetupRequest {
  001500     # NG Setup Request
  44         # Length
  000004     # Params
  001b00     # GlobalRANNodeID
  09         # Length
  00         # GlobalGNB-ID
  02f839     # PLMN ID
  5000000001 # gNB-ID                            
  005240     # RANNodeName
  17         # Length
  0a00
  554552414e53494d2d676e622d3230382d39332d31 # UERANSIM-gnb-208-93-1
  006600     # SupportedTAList
  10         # Length
  0000
  000001     # TAC
  00
  02f839     # PLMN ID
  0000
  1008010203 # S-NSSAI
  001540     # DefaultPagingDRX
  01         # Length
  40         # v128
}

5. 現在実装中・次の課題

  • シナリオ制御 ※開発中
  • 信号のエンコード・デコード ※開発中
  • 必要なパラメータの自動マッピング機能 ※未着手

現在の実装中の機能が課題でシナリオ制御は出来ないとNG Setupプロシージャは良いがRegistrationは応答信号を受信した際に直ぐに次の信号を飛ばせないので重要な機能である。

信号のエンコード・デコード処理はAMFからの応答信号をデコードして必要なパラメータを疑似呼から送信する信号のパラメータにマッピングする必要があるためこちらも重要な機能である。

特に最初のAuthentication/Security ModeプロシージャはAMFから受信した信号パラメータの一部を疑似事言えども必要でエンコード・デコードが必要となる。

以下はシナリオのイメージで一旦は下記の通りシンプルに受信・送信を制御する形とするが今後機能は拡張予定である。シナリオはイメージであり記述方法は使い勝手を考えて変更する可能性がある。

scenario.txt
entry start

state start {
    on DownlinkNASTransport(AuthenticationRequest) {
        send UplinkNASTransport(AuthenticationResponse)
    }
    on DownlinkNASTransport(SecurityModeCommand) {
        send UplinkNASTransport(SecurityModeComplete)
        goto registered
    }
}

state registered {
    on InitialContextSetupRequest(RegistrationAccept) {
        send InitialContextSetupResponse
    }
}

6. まとめ

SCTPのリンクアップとNG Setupプロシージャは動作したので途中経過としてzenn記事にまとめた。
次回はシナリオ制御と自動マッピングの仕組みが出来Control Planeの1call Registration ~ PDU Session Establishmentまで動作したら続きのzenn記事を執筆しようと思う。

疑似呼開発の途中でもzenn記事の執筆ネタになりそうな事を思いついたら執筆するかもしれない。

Discussion