Open5GS 5GCとUERANSIM UE/RANでSCP Indirect communication Model Cの使用方法

本記事は、Open5GSとUERANSIMを使用して、SCP(Service Communication Proxy)のIndirect communication Model Cを使用する場合の簡単な設定について説明します。これにより、複数のNFが直接通信することなく、SCPが中継することにより、NFによるサービス提供の負荷分散やサービス提供者・利用者のトポロジーがシンプルになることを期待しています。
なお、5GCのコア網に登場する各NF(Network Function)の役割やインターフェースについて概ね知っていることを期待して書いており、これらの説明は省略します。

---

## 目次

- [Open5GS 5GCのシミュレーション携帯網の概要](#open5gs-5gcのシミュレーション携帯網の概要)
- [Open5GS 5GC C-Planeの設定ファイルの追加の変更点](#open5gs-5gc-c-planeの設定ファイルの追加の変更点)
- [Open5GS 5GC C-Planeを実行](#open5gs-5gc-c-planeを実行)
- [5G Trace Visualizerでpcapファイルを処理](#5g-trace-visualizerでpcapファイルを処理)
- [最後に](#最後に)
- [主な変更履歴](#主な変更履歴)

---

## Open5GS 5GCのシミュレーション携帯網の概要

これは、以下の構成例にSCP Model Cを適用した際の追加の設定例です。

- [Open5GS 5GC & UERANSIM UE / RAN Sample Configuration - Select UPF based on S-NSSAI](https://github.com/s5uishida/open5gs_5gc_ueransim_snssai_upf_sample_config)

SCPについては、3GPP TS 23.501 6.2.19, 6.3.16 and Annex E.1 Generalで説明されており、Model Cは図のオレンジ枠で囲んだ方式になります。

<img width="800" alt="network-overview.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457466/36ca7005-652b-b998-f6d9-03b7588c9440.png">

***(Reference source: 3GPP TS 23.501 Annex E.1 General)***

Model Cでは、指定した条件に合うNFのDiscovery機能にはNRFを使用し、その後、選択したNFと通信する際にSCPを経由します。

5GCとUE/RANに使用しているOSSは以下の通りです。

- 5GC - Open5GS v2.4.9 - https://github.com/open5gs/open5gs
- UE / RAN - UERANSIM v3.2.6 - https://github.com/aligungr/UERANSIM

NRFとSCPのSBIのIPアドレスは以下の通りです。

| NF | IP address on SBI |
| --- | --- |
| NRF | 127.0.0.10 |
| SCP | 127.0.1.10 |

## Open5GS 5GC C-Planeの設定ファイルの追加の変更点

この場合、次の構成に対して、SCP Model C用に更なる変更を行います。

- [Open5GS 5GC & UERANSIM UE / RAN Sample Configuration - Select UPF based on S-NSSAI](https://github.com/s5uishida/open5gs_5gc_ueransim_snssai_upf_sample_config)

ここでは、追加で設定する内容について説明します。SCPを使う時、C-Planeの各NFの以下の設定ファイルを編集します。

- `open5gs/install/etc/open5gs/*.yaml`

```
amf.yaml
ausf.yaml
bsf.yaml
nssf.yaml
pcf.yaml
smf1.yaml smf2.yaml
udm.yaml
udr.yaml
```

各NFの変更内容は同じです。以下に`ausf.yaml`の変更例を示します。

```diff
--- ausf.yaml.orig      2022-08-04 20:22:09.222046717 +0900
+++ ausf.yaml   2022-08-04 20:46:19.747846735 +0900
@@ -141,7 +141,11 @@
     sbi:
       - addr:
           - 127.0.0.10
-          - ::1
+        port: 7777
+
+scp:
+    sbi:
+      - addr: 127.0.1.10
         port: 7777
 
 #
```

なお、設定ファイルからSBIのIPv6アドレス`::1`を削除しました。理由は、pcapファイルを5Gプロトコルのシーケンス図に変換するツールの[5G Trace Visualizer](https://github.com/telekom/5g-trace-visualizer)が、`::1`を適切に処理できないためです。このため、今回はIPv6アドレスを使用していません。

- `open5gs/install/etc/open5gs/nrf.yaml`

`nrf.yaml`も以下のように変更します。

```diff
--- nrf.yaml.orig       2022-08-04 20:22:09.164046273 +0900
+++ nrf.yaml    2022-08-04 20:49:31.213976148 +0900
@@ -91,7 +91,6 @@
     sbi:
       addr:
         - 127.0.0.10
-        - ::1
       port: 7777
 
 #
```

- `open5gs/install/etc/open5gs/scp.yaml`

`scp.yaml`も以下のように変更します。

```diff
--- scp.yaml.orig       2022-08-04 20:22:09.193046495 +0900
+++ scp.yaml    2022-08-04 20:51:18.153636042 +0900
@@ -164,7 +164,6 @@
     sbi:
       - addr:
           - 127.0.0.10
-          - ::1
         port: 7777
 
 #
```

## Open5GS 5GC C-Planeを実行

`open5gs-scpd`を追加して、Open5GS 5GC C-Planeを実行します。

```
./install/bin/open5gs-nrfd &
sleep 5
./install/bin/open5gs-scpd &
sleep 5
./install/bin/open5gs-smfd -c install/etc/open5gs/smf1.yaml &
./install/bin/open5gs-smfd -c install/etc/open5gs/smf2.yaml &
./install/bin/open5gs-amfd &
./install/bin/open5gs-ausfd &
./install/bin/open5gs-udmd &
./install/bin/open5gs-udrd &
./install/bin/open5gs-pcfd &
./install/bin/open5gs-nssfd &
./install/bin/open5gs-bsfd &
```

## 5G Trace Visualizerでpcapファイルを処理

5G通信の際、C-Plane VM上でtcpdumpを実行してpcapファイルを取得し、[5G Trace Visualizer](https://github.com/telekom/5g-trace-visualizer)を使用して、5GプロトコルシーケンスをSVG図に変換します。

今回は以下の5G通信シナリオでpcapファイルを取得します。

```
              C-Plane started
                         |
                         V
             U-Plane1 started
                         |
                         V
             U-Plane2 started
                         |
                         V
               gNodeB started
                         |
                         V
UE(SST:1,SD:0x000001) started
                         |
                         V
                       ping google.com -I uesimtun0 -n
                         |
                         V
UE(SST:1,SD:0x000001) stopped
                         |
                         V
UE(SST:1,SD:0x000002) started
                         |
                         V
                       ping google.com -I uesimtun0 -n
                         |
                         V
UE(SST:1,SD:0x000002) stopped
```

そして、取得したpcapファイルを以下の通り処理します。

```
python3 trace_visualizer.py -wireshark "OS" -http2ports "1000-65535" <pcap file>
```

必要なら、次のオプションを追加することで見易い図を作成することができます。(他のオプションもあります)

```
-show_timestamp True -simple_diagrams True
```

なお、サンプルのpcapファイルとSVGファイルを[ここ](https://github.com/s5uishida/open5gs_5gc_ueransim_scp_model_c_sample_config/tree/main/files)に置きました。

pcapファイルについては、ダウンロードしてWiresharkで見ることができます。また、SVGファイルについては、各SVGファイルのリンクを辿り、Githubの`Raw`ボタンを押すことで、シーケンス図を見ることができます。

これにより、SCPのIndirect communication Model Cを簡単に確認することができました。

## 最後に

3GPP Rel.16で追加された規格のSCP(Service Communication Proxy)のIndirect communication Model Cを使用することにより、複数のNFが直接通信することなく、SCPが中継することで、NFによるサービス提供の負荷分散やサービス提供者・利用者のトポロジーがシンプルになると思います。また、2022年9月時点ではModel C対応ですが、Discovery機能をNRFの代わりにSCPでも提供するModel Dに対応する計画があるそうです。

最後に、元記事は[Github](https://github.com/s5uishida/open5gs_5gc_ueransim_scp_model_c_sample_config)に書いたものです。Open5GSの[チュートリアル](https://open5gs.org/open5gs/docs/)からもリンクして頂きました。

## 主な変更履歴

- [2022.09.13] 初版。