Open5GS EPCとZeroMQ対応srsRAN 4G UE/RANでeNodeBの最寄りのUPF(PGW-U)を選択する設定

2023.05.05に、Open5GS MMEにTACとe_CellIDでSMF(PGW-C)を選択する機能をPull Requestしてマージして頂きました。
そこで、本記事は、Open5GSとsrsRAN 4Gを使用して、端末(UE)が接続した基地局(eNodeB)の最寄りのUPF(PGW-U)を選択する場合の設定について簡単に説明します。これにより、5Gと同様に4Gでも、UEからのトラフィックを最寄りのeNodeBのPDNにルーティングしてMECを実現できるようになります。
なお、EPCのコア網に登場する各NF(Network Function)の役割やインターフェースについて概ね知っていることを期待して書いており、これらの説明は省略します。

---

## Open5GS CU分離EPCのシミュレーション携帯網の概要

今回、端末(UE)を異なる基地局(eNodeB)に接続した際に、eNodeBの最寄りのUPF(PGW-U)に接続して任意のパケットを流すことを目的に、シミュレーション環境を構築しました。EPCはC-PlaneとU-Planeに分離された携帯網で、PDNを通してインターネットと通信可能です。
このシミュレーション環境は以下の条件を満たす最小構成になります。

- eNodeB と SGW-U/UPF(PGW-U) のペアは同じロケーションに存在します。
- eNodeBに接続したUEは、同じロケーションにあるSGW-U/UPF(PGW-U)が管理するPDNに接続します。

この例では、eNodeBがOpen5GS MMEに接続する際、eNodeBのパラメータであるTAC(Tracking Area Code)を使用してSGW-C/SMF(PGW-C)を選択します。これにより、eNodeBと同じロケーションにあるSGW-U/PGW-Uが選択可能になります。

構築したシミュレーション環境は以下の通りです。
<img width="800" alt="network-overview.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457466/f219247f-6d2c-7712-52a2-1a2509d24f82.png">

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

- EPC - Open5GS v2.6.4 (2023.09.02) - https://github.com/open5gs/open5gs  
- UE/RAN - srsRAN 4G (2023.09.02) - https://github.com/srsran/srsRAN_4G

各VMは以下の通りです。

| VM | SW & Role | IP address | OS | Memory<br>(Min) | HDD<br>(Min) |
| --- | --- | --- | --- | --- | --- |
| VM1 | Open5GS EPC C-Plane | 192.168.0.111/24 <br> 192.168.0.112/24 <br> 192.168.0.113/24 <br> 192.168.0.114/24 <br> 192.168.0.115/24 | Ubuntu 22.04 | 1GB | 20GB |
| VM2 | Open5GS EPC U-Plane1 | 192.168.0.116/24 <br> 192.168.0.117/24 | Ubuntu 22.04 | 1GB | 20GB |
| VM3 | Open5GS EPC U-Plane2 | 192.168.0.118/24 <br> 192.168.0.119/24 | Ubuntu 22.04 | 1GB | 20GB |
| VM4 | srsRAN 4G ZMQ RAN<br>(eNodeB1) | 192.168.0.121/24 | Ubuntu 22.04 | 2GB | 10GB |
| VM5 | srsRAN 4G ZMQ RAN<br>(eNodeB2) | 192.168.0.122/24 | Ubuntu 22.04 | 2GB | 10GB |
| VM6 | srsRAN 4G ZMQ UE | 192.168.0.123/24 <br> 192.168.0.124/24 | Ubuntu 22.04 | 2GB | 10GB |

MME、SGW-C、SMF(PGW-C)、PCRFのIPアドレスは以下のとおりです。

| NF | IP address | Local address | Supported TACs |
| --- | --- | --- | --- |
| MME | 192.168.0.111 | 127.0.0.2 | 1, 2 |
| SGW-C1 | 192.168.0.112 | 127.0.0.3 | 1 |
| SMF1(PGW-C) | 192.168.0.113 | 127.0.0.4 | 1 |
| PCRF1 | -- | 127.0.0.9 | -- |
| SGW-C2 | 192.168.0.114 | 127.0.0.23 | 2 |
| SMF2(PGW-C) | 192.168.0.115 | 127.0.0.24 | 2 |
| PCRF2 | -- | 127.0.0.29 | -- |

eNodeBの主な情報は以下の通りです。

| eNodeB | Location |IP address | MCC | MNC | TAC | eNodeB ID | Cell<br>ID | E-UTRAN<br>Cell ID |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| eNodeB1 | Loc1 | 192.168.0.121 | 001 | 01 | 1 | 0x19b | 0x01 | 0x19b01 |
| eNodeB2 | Loc2 | 192.168.0.122 | 001 | 01 | 2 | 0x19c | 0x01 | 0x19c01 |

加入者情報は以下の通りです。(その他の項目はデフォルト値)
注意。srsRAN 4GのUEの設定に合わせて、OPあるいはOPcを選択してください。

| UE | IMSI | PDN | OP/OPc | eNodeB | IP address<br>in ue.conf<br>of srsRAN UE |
| --- | --- | --- | --- | --- | --- |
| UE | 001010000000100 | internet | OPc | eNodeB1 in Loc1<br>------------------<br>eNodeB2 in Loc2 | 192.168.0.123<br>in ue-loc1.conf<br>----------------<br>192.168.0.124<br>in ue-loc2.conf |

これらの情報の登録には、Open5GSが提供するWebUIを使用しました。なお、3GPP認証とキー生成機能(MILENAGE)の試験データとして、[3GPP TS 35.208](https://www.3gpp.org/DynaReport/35208.htm) "4.3 Test Sets"が公開されています。

各PDNは以下の通りです。

| PDN | Location |  TUNnel interface<br>of PDN | APN | TUNnel interface<br>of UE | U-Plane |
| --- | --- | --- | --- | --- | --- |
| 10.45.0.0/16 | Loc1 | ogstun | internet | tun_srsue | U-Plane1 |
| 10.46.0.0/16 | Loc2 | ogstun | internet | tun_srsue | U-Plane2 |

## Open5GS EPCとZMQ対応srsRAN 4G UE/RANの設定ファイルの変更点

Open5GSとZMQ対応srsRAN 4G UE/RANのビルド方法は以下を参照して下さい。

- Open5GS v2.6.4 (2023.09.02) - https://open5gs.org/open5gs/docs/guide/02-building-open5gs-from-sources/
- srsRAN 4G (2023.09.02) - https://docs.srsran.com/projects/4g/en/latest/

### Open5GS EPC C-Planeの設定ファイルの変更点

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

```diff
--- mme.yaml.orig       2023-09-03 15:52:59.000000000 +0900
+++ mme.yaml    2023-09-03 16:34:49.080255556 +0900
@@ -321,7 +321,7 @@
 mme:
     freeDiameter: /root/open5gs/install/etc/freeDiameter/mme.conf
     s1ap:
-      - addr: 127.0.0.2
+      - addr: 192.168.0.111
     gtpc:
       - addr: 127.0.0.2
     metrics:
@@ -329,15 +329,15 @@
         port: 9090
     gummei:
       plmn_id:
-        mcc: 999
-        mnc: 70
+        mcc: 001
+        mnc: 01
       mme_gid: 2
       mme_code: 1
     tai:
       plmn_id:
-        mcc: 999
-        mnc: 70
-      tac: 1
+        mcc: 001
+        mnc: 01
+      tac: [1, 2]
     security:
         integrity_order : [ EIA2, EIA1, EIA0 ]
         ciphering_order : [ EEA0, EEA1, EEA2 ]
@@ -407,6 +407,9 @@
 sgwc:
     gtpc:
       - addr: 127.0.0.3
+        tac: 1
+      - addr: 127.0.0.23
+        tac: 2
 
 #
 # smf:
@@ -470,9 +473,10 @@
 #       e_cell_id: [12345, a9413, 98765]
 smf:
     gtpc:
-      - addr:
-        - 127.0.0.4
-        - ::1
+      - addr: 127.0.0.4
+        tac: 1
+      - addr: 127.0.0.24
+        tac: 2
 
 #
 # <GTPv1C Client>
```

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

```diff
--- sgwc.yaml.orig      2023-04-30 00:53:20.000000000 +0900
+++ sgwc1.yaml  2023-05-03 10:50:12.000000000 +0900
@@ -20,7 +20,7 @@
 #    domain: core,sbi,ausf,event,tlv,mem,sock
 #
 logger:
-    file: /root/open5gs/install/var/log/open5gs/sgwc.log
+    file: /root/open5gs/install/var/log/open5gs/sgwc1.log
 
 #
 #  <GTP-C Server>
@@ -81,7 +81,7 @@
     gtpc:
       - addr: 127.0.0.3
     pfcp:
-      - addr: 127.0.0.3
+      - addr: 192.168.0.112
 
 #
 #  <PFCP Client>>
@@ -130,7 +130,8 @@
 #
 sgwu:
     pfcp:
-      - addr: 127.0.0.6
+      - addr: 192.168.0.116
+        apn: internet
 
 #
 #  o Disable use of IPv4 addresses (only IPv6)
```

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

```diff
--- sgwc.yaml.orig      2023-04-30 00:53:20.000000000 +0900
+++ sgwc2.yaml  2023-05-03 10:49:34.000000000 +0900
@@ -20,7 +20,7 @@
 #    domain: core,sbi,ausf,event,tlv,mem,sock
 #
 logger:
-    file: /root/open5gs/install/var/log/open5gs/sgwc.log
+    file: /root/open5gs/install/var/log/open5gs/sgwc2.log
 
 #
 #  <GTP-C Server>
@@ -79,9 +79,9 @@
 #
 sgwc:
     gtpc:
-      - addr: 127.0.0.3
+      - addr: 127.0.0.23
     pfcp:
-      - addr: 127.0.0.3
+      - addr: 192.168.0.114
 
 #
 #  <PFCP Client>>
@@ -130,7 +130,8 @@
 #
 sgwu:
     pfcp:
-      - addr: 127.0.0.6
+      - addr: 192.168.0.118
+        apn: internet
 
 #
 #  o Disable use of IPv4 addresses (only IPv6)
```

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

```diff
--- smf.yaml.orig       2023-04-30 00:53:20.000000000 +0900
+++ smf1.yaml   2023-05-03 10:51:06.000000000 +0900
@@ -20,7 +20,7 @@
 #    domain: core,sbi,ausf,event,tlv,mem,sock
 #
 logger:
-    file: /root/open5gs/install/var/log/open5gs/smf.log
+    file: /root/open5gs/install/var/log/open5gs/smf1.log
 
 #
 #  o TLS enable/disable
@@ -598,33 +598,24 @@
 #      maximum_integrity_protected_data_rate_downlink: bitrate64kbs|maximum-UE-rate
 #
 smf:
-    sbi:
-      - addr: 127.0.0.4
-        port: 7777
     pfcp:
-      - addr: 127.0.0.4
-      - addr: ::1
+      - addr: 192.168.0.113
     gtpc:
       - addr: 127.0.0.4
-      - addr: ::1
     gtpu:
-      - addr: 127.0.0.4
-      - addr: ::1
+      - addr: 192.168.0.113
     metrics:
       - addr: 127.0.0.4
         port: 9090
     subnet:
       - addr: 10.45.0.1/16
-      - addr: 2001:db8:cafe::1/48
     dns:
       - 8.8.8.8
       - 8.8.4.4
-      - 2001:4860:4860::8888
-      - 2001:4860:4860::8844
     mtu: 1400
     ctf:
       enabled: auto
-    freeDiameter: /root/open5gs/install/etc/freeDiameter/smf.conf
+    freeDiameter: /root/open5gs/install/etc/freeDiameter/smf1.conf
 
 #
 #  <SBI Client>>
@@ -690,10 +681,6 @@
 #          l_linger: 10
 #
 #
-scp:
-    sbi:
-      - addr: 127.0.1.10
-        port: 7777
 
 #
 #  <SBI Client>>
@@ -808,7 +795,8 @@
 #
 upf:
     pfcp:
-      - addr: 127.0.0.7
+      - addr: 192.168.0.117
+        dnn: internet
 
 #
 #  o Disable use of IPv4 addresses (only IPv6)
```

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

```diff
--- smf.yaml.orig       2023-04-30 00:53:20.000000000 +0900
+++ smf2.yaml   2023-05-03 10:51:32.000000000 +0900
@@ -20,7 +20,7 @@
 #    domain: core,sbi,ausf,event,tlv,mem,sock
 #
 logger:
-    file: /root/open5gs/install/var/log/open5gs/smf.log
+    file: /root/open5gs/install/var/log/open5gs/smf2.log
 
 #
 #  o TLS enable/disable
@@ -598,33 +598,24 @@
 #      maximum_integrity_protected_data_rate_downlink: bitrate64kbs|maximum-UE-rate
 #
 smf:
-    sbi:
-      - addr: 127.0.0.4
-        port: 7777
     pfcp:
-      - addr: 127.0.0.4
-      - addr: ::1
+      - addr: 192.168.0.115
     gtpc:
-      - addr: 127.0.0.4
-      - addr: ::1
+      - addr: 127.0.0.24
     gtpu:
-      - addr: 127.0.0.4
-      - addr: ::1
+      - addr: 192.168.0.115
     metrics:
-      - addr: 127.0.0.4
+      - addr: 127.0.0.24
         port: 9090
     subnet:
-      - addr: 10.45.0.1/16
-      - addr: 2001:db8:cafe::1/48
+      - addr: 10.46.0.1/16
     dns:
       - 8.8.8.8
       - 8.8.4.4
-      - 2001:4860:4860::8888
-      - 2001:4860:4860::8844
     mtu: 1400
     ctf:
       enabled: auto
-    freeDiameter: /root/open5gs/install/etc/freeDiameter/smf.conf
+    freeDiameter: /root/open5gs/install/etc/freeDiameter/smf2.conf
 
 #
 #  <SBI Client>>
@@ -690,10 +681,6 @@
 #          l_linger: 10
 #
 #
-scp:
-    sbi:
-      - addr: 127.0.1.10
-        port: 7777
 
 #
 #  <SBI Client>>
@@ -808,7 +795,8 @@
 #
 upf:
     pfcp:
-      - addr: 127.0.0.7
+      - addr: 192.168.0.119
+        dnn: internet
 
 #
 #  o Disable use of IPv4 addresses (only IPv6)
```

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

```diff
--- pcrf.yaml.orig      2023-04-30 00:53:20.000000000 +0900
+++ pcrf1.yaml  2023-05-03 11:22:28.000000000 +0900
@@ -22,10 +22,10 @@
 #    domain: core,sbi,ausf,event,tlv,mem,sock
 #
 logger:
-    file: /root/open5gs/install/var/log/open5gs/pcrf.log
+    file: /root/open5gs/install/var/log/open5gs/pcrf1.log
 
 pcrf:
-    freeDiameter: /root/open5gs/install/etc/freeDiameter/pcrf.conf
+    freeDiameter: /root/open5gs/install/etc/freeDiameter/pcrf1.conf
 
 #
 #  o Disable use of IPv4 addresses (only IPv6)
```

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

```diff
--- pcrf.yaml.orig      2023-04-30 00:53:20.000000000 +0900
+++ pcrf2.yaml  2023-05-03 11:23:00.000000000 +0900
@@ -22,10 +22,10 @@
 #    domain: core,sbi,ausf,event,tlv,mem,sock
 #
 logger:
-    file: /root/open5gs/install/var/log/open5gs/pcrf.log
+    file: /root/open5gs/install/var/log/open5gs/pcrf2.log
 
 pcrf:
-    freeDiameter: /root/open5gs/install/etc/freeDiameter/pcrf.conf
+    freeDiameter: /root/open5gs/install/etc/freeDiameter/pcrf2.conf
 
 #
 #  o Disable use of IPv4 addresses (only IPv6)
```

- `open5gs/install/etc/freeDiameter/smf1.conf`  
`smf1.conf`は元の`smf.conf`と同じです。

- `open5gs/install/etc/freeDiameter/smf2.conf`

```diff
--- smf.conf.orig       2023-04-30 00:53:22.000000000 +0900
+++ smf2.conf   2023-05-03 11:20:46.000000000 +0900
@@ -79,7 +79,7 @@
 #ListenOn = "202.249.37.5";
 #ListenOn = "2001:200:903:2::202:1";
 #ListenOn = "fe80::21c:5ff:fe98:7d62%eth0";
-ListenOn = "127.0.0.4";
+ListenOn = "127.0.0.24";
 
 
 ##############################################################
@@ -261,7 +261,7 @@
 # Examples:
 #ConnectPeer = "aaa.wide.ad.jp";
 #ConnectPeer = "old.diameter.serv" { TcTimer = 60; TLS_old_method; No_SCTP; Port=3868; } ;
-ConnectPeer = "pcrf.localdomain" { ConnectTo = "127.0.0.9"; No_TLS; };
+ConnectPeer = "pcrf.localdomain" { ConnectTo = "127.0.0.29"; No_TLS; };
 
 
 ##############################################################
```

- `open5gs/install/etc/freeDiameter/pcrf1.conf`  
`pcrf1.conf`は元の`pcrf.conf`と同じです。

- `open5gs/install/etc/freeDiameter/pcrf2.conf`

```diff
--- pcrf.conf.orig      2023-04-30 00:53:22.000000000 +0900
+++ pcrf2.conf  2023-05-07 18:32:04.246141671 +0900
@@ -79,7 +79,7 @@
 #ListenOn = "202.249.37.5";
 #ListenOn = "2001:200:903:2::202:1";
 #ListenOn = "fe80::21c:5ff:fe98:7d62%eth0";
-ListenOn = "127.0.0.9";
+ListenOn = "127.0.0.29";
 
 
 ##############################################################
@@ -261,6 +261,6 @@
 # Examples:
 #ConnectPeer = "aaa.wide.ad.jp";
 #ConnectPeer = "old.diameter.serv" { TcTimer = 60; TLS_old_method; No_SCTP; Port=3868; } ;
-ConnectPeer = "smf.localdomain" { ConnectTo = "127.0.0.4"; No_TLS; };
+ConnectPeer = "smf.localdomain" { ConnectTo = "127.0.0.24"; No_TLS; };
```

### Open5GS EPC U-Plane1の設定ファイルの変更点

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

```diff
--- sgwu.yaml.orig      2023-04-30 00:53:20.000000000 +0900
+++ sgwu.yaml   2023-05-03 10:54:32.000000000 +0900
@@ -114,9 +114,9 @@
 #
 sgwu:
     pfcp:
-      - addr: 127.0.0.6
+      - addr: 192.168.0.116
     gtpu:
-      - addr: 127.0.0.6
+      - addr: 192.168.0.116
 
 #
 #  <PFCP Client>>
```

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

```diff
--- upf.yaml.orig       2023-04-30 00:53:20.000000000 +0900
+++ upf.yaml    2023-05-03 10:55:12.000000000 +0900
@@ -196,12 +196,13 @@
 #
 upf:
     pfcp:
-      - addr: 127.0.0.7
+      - addr: 192.168.0.117
     gtpu:
-      - addr: 127.0.0.7
+      - addr: 192.168.0.117
     subnet:
       - addr: 10.45.0.1/16
-      - addr: 2001:db8:cafe::1/48
+        dnn: internet
+        dev: ogstun
     metrics:
       - addr: 127.0.0.7
         port: 9090
```

### Open5GS EPC U-Plane2の設定ファイルの変更点

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

```diff
--- sgwu.yaml.orig      2023-04-30 00:53:20.000000000 +0900
+++ sgwu.yaml   2023-05-03 10:56:36.000000000 +0900
@@ -114,9 +114,9 @@
 #
 sgwu:
     pfcp:
-      - addr: 127.0.0.6
+      - addr: 192.168.0.118
     gtpu:
-      - addr: 127.0.0.6
+      - addr: 192.168.0.118
 
 #
 #  <PFCP Client>>
```

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

```diff
--- upf.yaml.orig       2023-04-30 00:53:20.000000000 +0900
+++ upf.yaml    2023-05-03 10:57:36.000000000 +0900
@@ -196,12 +196,13 @@
 #
 upf:
     pfcp:
-      - addr: 127.0.0.7
+      - addr: 192.168.0.119
     gtpu:
-      - addr: 127.0.0.7
+      - addr: 192.168.0.119
     subnet:
-      - addr: 10.45.0.1/16
-      - addr: 2001:db8:cafe::1/48
+      - addr: 10.46.0.1/16
+        dnn: internet
+        dev: ogstun
     metrics:
       - addr: 127.0.0.7
         port: 9090
```

### ZMQ対応srsRAN 4G UE/RANの設定ファイルの変更点

#### RAN(eNodeB1)の設定ファイルの変更点

- `srsRAN_4G/build/srsenb/enb.conf`

```diff
--- enb.conf.example    2023-05-02 10:51:20.000000000 +0900
+++ enb.conf    2023-05-03 11:39:50.000000000 +0900
@@ -22,9 +22,9 @@
 enb_id = 0x19B
 mcc = 001
 mnc = 01
-mme_addr = 127.0.1.100
-gtp_bind_addr = 127.0.1.1
-s1c_bind_addr = 127.0.1.1
+mme_addr = 192.168.0.111
+gtp_bind_addr = 192.168.0.121
+s1c_bind_addr = 192.168.0.121
 s1c_bind_port = 0
 n_prb = 50
 #tm = 4
@@ -80,8 +80,8 @@
 #time_adv_nsamples = auto
 
 # Example for ZMQ-based operation with TCP transport for I/Q samples
-#device_name = zmq
-#device_args = fail_on_disconnect=true,tx_port=tcp://*:2000,rx_port=tcp://localhost:2001,id=enb,base_srate=23.04e6
+device_name = zmq
+device_args = fail_on_disconnect=true,tx_port=tcp://192.168.0.121:2000,rx_port=tcp://192.168.0.123:2001,id=enb,base_srate=23.04e6
 
 #####################################################################
 # Packet capture configuration
```

- `srsRAN_4G/build/srsenb/rr.conf`

```diff
--- rr.conf.example     2023-05-02 10:51:20.000000000 +0900
+++ rr.conf     2023-05-02 11:52:54.000000000 +0900
@@ -55,7 +55,7 @@
   {
     // rf_port = 0;
     cell_id = 0x01;
-    tac = 0x0007;
+    tac = 0x0001;
     pci = 1;
     // root_seq_idx = 204;
     dl_earfcn = 3350;
```

#### RAN(eNodeB2)の設定ファイルの変更点

- `srsRAN_4G/build/srsenb/enb.conf`

```diff
--- enb.conf.example    2023-05-02 10:51:20.000000000 +0900
+++ enb.conf    2023-05-05 16:47:30.000000000 +0900
@@ -19,12 +19,12 @@
 #
 #####################################################################
 [enb]
-enb_id = 0x19B
+enb_id = 0x19C
 mcc = 001
 mnc = 01
-mme_addr = 127.0.1.100
-gtp_bind_addr = 127.0.1.1
-s1c_bind_addr = 127.0.1.1
+mme_addr = 192.168.0.111
+gtp_bind_addr = 192.168.0.122
+s1c_bind_addr = 192.168.0.122
 s1c_bind_port = 0
 n_prb = 50
 #tm = 4
@@ -80,8 +80,8 @@
 #time_adv_nsamples = auto
 
 # Example for ZMQ-based operation with TCP transport for I/Q samples
-#device_name = zmq
-#device_args = fail_on_disconnect=true,tx_port=tcp://*:2000,rx_port=tcp://localhost:2001,id=enb,base_srate=23.04e6
+device_name = zmq
+device_args = fail_on_disconnect=true,tx_port=tcp://192.168.0.122:2000,rx_port=tcp://192.168.0.124:2001,id=enb,base_srate=23.04e6
 
 #####################################################################
 # Packet capture configuration
```

- `srsRAN_4G/build/srsenb/rr.conf`

```diff
--- rr.conf.example     2023-05-02 10:51:20.000000000 +0900
+++ rr.conf     2023-05-03 11:33:58.000000000 +0900
@@ -55,7 +55,7 @@
   {
     // rf_port = 0;
     cell_id = 0x01;
-    tac = 0x0007;
+    tac = 0x0002;
     pci = 1;
     // root_seq_idx = 204;
     dl_earfcn = 3350;
```

#### Loc1のUE(IMSI-001010000000100)の設定ファイルの変更点

- `srsRAN_4G/build/srsue/ue-loc1.conf`

```diff
--- ue.conf.example     2023-05-05 16:18:12.000000000 +0900
+++ ue-loc1.conf        2023-05-03 11:35:38.000000000 +0900
@@ -42,8 +42,8 @@
 #continuous_tx     = auto
 
 # Example for ZMQ-based operation with TCP transport for I/Q samples
-#device_name = zmq
-#device_args = tx_port=tcp://*:2001,rx_port=tcp://localhost:2000,id=ue,base_srate=23.04e6
+device_name = zmq
+device_args = tx_port=tcp://192.168.0.123:2001,rx_port=tcp://192.168.0.121:2000,id=ue,base_srate=23.04e6
 
 #####################################################################
 # EUTRA RAT configuration
@@ -139,9 +139,9 @@
 [usim]
 mode = soft
 algo = milenage
-opc  = 63BFA50EE6523365FF14C1F45F88737D
-k    = 00112233445566778899aabbccddeeff
-imsi = 001010123456780
+opc  = E8ED289DEBA952E4283B54E88E6183CA
+k    = 465B5CE8B199B49FAA5F0A2EE238A6BC
+imsi = 001010000000100
 imei = 353490069873319
 #reader =
 #pin  = 1234
@@ -180,8 +180,8 @@
 #                      Supported: 0 - NULL, 1 - Snow3G, 2 - AES, 3 - ZUC
 #####################################################################
 [nas]
-#apn = internetinternet
-#apn_protocol = ipv4
+apn = internet
+apn_protocol = ipv4
 #user = srsuser
 #pass = srspass
 #force_imsi_attach = false
```

#### Loc2のUE(IMSI-001010000000100)の設定ファイルの変更点

- `srsRAN_4G/build/srsue/ue-loc2.conf`

```diff
--- ue.conf.example     2023-05-05 16:18:12.000000000 +0900
+++ ue-loc2.conf        2023-05-05 16:33:18.000000000 +0900
@@ -42,8 +42,8 @@
 #continuous_tx     = auto
 
 # Example for ZMQ-based operation with TCP transport for I/Q samples
-#device_name = zmq
-#device_args = tx_port=tcp://*:2001,rx_port=tcp://localhost:2000,id=ue,base_srate=23.04e6
+device_name = zmq
+device_args = tx_port=tcp://192.168.0.124:2001,rx_port=tcp://192.168.0.122:2000,id=ue,base_srate=23.04e6
 
 #####################################################################
 # EUTRA RAT configuration
@@ -139,9 +139,9 @@
 [usim]
 mode = soft
 algo = milenage
-opc  = 63BFA50EE6523365FF14C1F45F88737D
-k    = 00112233445566778899aabbccddeeff
-imsi = 001010123456780
+opc  = E8ED289DEBA952E4283B54E88E6183CA
+k    = 465B5CE8B199B49FAA5F0A2EE238A6BC
+imsi = 001010000000100
 imei = 353490069873319
 #reader =
 #pin  = 1234
@@ -180,8 +180,8 @@
 #                      Supported: 0 - NULL, 1 - Snow3G, 2 - AES, 3 - ZUC
 #####################################################################
 [nas]
-#apn = internetinternet
-#apn_protocol = ipv4
+apn = internet
+apn_protocol = ipv4
 #user = srsuser
 #pass = srspass
 #force_imsi_attach = false
```

## Open5GS EPCとZMQ対応srsRAN 4G UE/RANのネットワーク設定

### Open5GS EPC C-Planeのネットワーク設定

SGW-C1/SMF1(PGW-C)とSGW-C2/SMF2(PGW-C)に以下の通りIPアドレスを追加します。

```
ip addr add 192.168.0.112/24 dev enp0s8
ip addr add 192.168.0.113/24 dev enp0s8
ip addr add 192.168.0.114/24 dev enp0s8
ip addr add 192.168.0.115/24 dev enp0s8
```

注意。本記事のVirtualBoxの環境では、`enp0s8`は`192.168.0.0/24`のネットワークインターフェースです。環境に応じて変更して下さい。

### Open5GS EPC U-Plane1のネットワーク設定

最初に、`/etc/sysctl.conf`ファイルの以下の行のコメントを外し、OSに反映します。

```
net.ipv4.ip_forward=1
```

```
# sysctl -p
```

次に、UPF(PGW-U)のIPアドレスを追加し、TUNnelインターフェースとNAPTを設定します。

```sh
ip addr add 192.168.0.117/24 dev enp0s8

ip tuntap add name ogstun mode tun
ip addr add 10.45.0.1/16 dev ogstun
ip link set ogstun up

iptables -t nat -A POSTROUTING -s 10.45.0.0/16 ! -o ogstun -j MASQUERADE
```

### Open5GS EPC U-Plane2のネットワーク設定

最初に、`/etc/sysctl.conf`ファイルの以下の行のコメントを外し、OSに反映します。

```
net.ipv4.ip_forward=1
```

```
# sysctl -p
```

次に、UPF(PGW-U)のIPアドレスを追加し、TUNnelインターフェースとNAPTを設定します。

```sh
ip addr add 192.168.0.119/24 dev enp0s8

ip tuntap add name ogstun mode tun
ip addr add 10.46.0.1/16 dev ogstun
ip link set ogstun up

iptables -t nat -A POSTROUTING -s 10.46.0.0/16 ! -o ogstun -j MASQUERADE
```

### ZMQ対応srsRAN 4G UEのネットワーク設定

Loc2用のUEのIPアドレスを追加します。

```
ip addr add 192.168.0.124/24 dev enp0s8
```

## Open5GSとZMQ対応srsRAN 4G UE/RANのビルド

Open5GSとZMQ対応srsRAN 4G UE/RANのビルド方法は以下を参照して下さい。

- Open5GS v2.6.4 (2023.09.02) - https://open5gs.org/open5gs/docs/guide/02-building-open5gs-from-sources/
- srsRAN 4G (2023.09.02) - https://docs.srsran.com/projects/4g/en/latest/

Open5GS EPC C-PlaneマシンにMongoDBをインストールして下さい。Open5GS EPC U-PlaneマシンにはMongoDBをインストールする必要はありません。なお、MongoDBのデータベースを簡単に確認するには、[MongoDB Compass](https://www.mongodb.com/products/compass)が便利です。**ZMQ対応srsRAN 4Gのビルドについては、[こちら](https://github.com/s5uishida/build_srsran_4g_zmq_disable_rf_plugins)も参考にして下さい。**

## Open5GS EPCとZMQ対応srsRAN 4G UE/RANを実行

以下のシナリオで確認します。このようなシナリオで確認する理由は次の通りです。

**[Open5GSの理由](https://github.com/open5gs/open5gs/issues/1791)**

- 現在のOpen5GSでは、SGWの変更はTAU/ハンドオーバー時にのみ行われるため。

**[ZMQ対応srsRAN 4G UE/RANの理由](https://docs.srsran.com/projects/4g/en/latest/app_notes/source/zeromq/source/index.html#known-issues)**

- 完全に停止するには、最初にUEを終了し、次にeNodeBを終了する必要があります。
- eNodeBとUEは1回だけ実行可能です。UEが切り離された後、再接続にはeNodeBを再起動する必要があります。
- 現在、一つのeNodeBと一つのUEの接続のみがサポートされています。

**今回のシナリオ**

```
1) EPC start

     C-Plane start
               |
               V
    U-Plane1 start
               |
               V
    U-Plane2 start

2) eNodeB1/UE(Loc1) start, ping and eNodeB1/UE(Loc1) stop

     eNodeB1 start
               |
               V
    UE(Loc1) start
               |
               V
             ping google.com -I tun_srsue -n
               |
               V
    UE(Loc1) stop
               |
               V
     eNodeB1 stop

3) MME restart

4) eNodeB2/UE(Loc2) start, ping and eNodeB2/UE(Loc2) stop

     eNodeB2 start
               |
               V
    UE(Loc2) start
               |
               V
             ping google.com -I tun_srsue -n
               |
               V
    UE(Loc2) stop
               |
               V
     eNodeB2 stop
```

なお、このシナリオは今回の機能を確認するためのものであり、MMEを再起動してSGWを変更する方法は、実際の使用には適切ではないと思います。

### Open5GS EPC C-Planeを実行

最初に、Open5GS EPC C-Planeを起動します。

- Open5GS EPC C-Plane

```
./install/bin/open5gs-mmed &
./install/bin/open5gs-sgwcd -c install/etc/open5gs/sgwc1.yaml &
./install/bin/open5gs-sgwcd -c install/etc/open5gs/sgwc2.yaml &
./install/bin/open5gs-smfd -c install/etc/open5gs/smf1.yaml &
./install/bin/open5gs-smfd -c install/etc/open5gs/smf2.yaml &
./install/bin/open5gs-hssd &
./install/bin/open5gs-pcrfd -c install/etc/open5gs/pcrf1.yaml &
./install/bin/open5gs-pcrfd -c install/etc/open5gs/pcrf2.yaml &
```

### Open5GS EPC U-Plane1とU-Plane2を実行

次に、Open5GS EPC U-Planeを起動します。

- Open5GS EPC U-Plane1

```
./install/bin/open5gs-sgwud &
./install/bin/open5gs-upfd &
```

- Open5GS EPC U-Plane2

```
./install/bin/open5gs-sgwud &
./install/bin/open5gs-upfd &
```

また、各U-PlaneのVMに追加で端末を開き、`tcpdump`を実行します。

- VM2 (U-Plane1)で`tcpdump`を実行

```
# tcpdump -i ogstun -n
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on ogstun, link-type RAW (Raw IP), snapshot length 262144 bytes
```

- VM3 (U-Plane2)で`tcpdump`を実行

```
# tcpdump -i ogstun -n
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on ogstun, link-type RAW (Raw IP), snapshot length 262144 bytes
```

### Loc1(TAC=1)で動作確認

#### Loc1(TAC=1)のZMQ対応srsRAN 4G RAN(eNodeB1)を起動

ZMQ対応srsRAN 4G RAN(eNodeB1)を起動し、Open5GS EPCに接続します。

```
# cd srsRAN_4G/build/srsenb
# ./src/srsenb enb.conf
---  Software Radio Systems LTE eNodeB  ---

Reading configuration file enb.conf...

Built in Release mode using commit fa56836b1 on branch master.

Opening 1 channels in RF device=zmq with args=fail_on_disconnect=true,tx_port=tcp://192.168.0.121:2000,rx_port=tcp://192.168.0.123:2001,id=enb,base_srate=23.04e6
Supported RF device list: zmq file
CHx base_srate=23.04e6
CHx id=enb
Current sample rate is 1.92 MHz with a base rate of 23.04 MHz (x12 decimation)
CH0 rx_port=tcp://192.168.0.123:2001
CH0 tx_port=tcp://192.168.0.121:2000
CH0 fail_on_disconnect=true
Current sample rate is 11.52 MHz with a base rate of 23.04 MHz (x2 decimation)
Current sample rate is 11.52 MHz with a base rate of 23.04 MHz (x2 decimation)
Setting frequency: DL=2680.0 Mhz, UL=2560.0 MHz for cc_idx=0 nof_prb=50

==== eNodeB started ===
Type <t> to view trace
```

Open5GS C-Planeのログは以下の通りです。

```
09/03 17:35:54.983: [mme] INFO: eNB-S1 accepted[192.168.0.121]:48973 in s1_path module (../src/mme/s1ap-sctp.c:114)
09/03 17:35:54.983: [mme] INFO: eNB-S1 accepted[192.168.0.121] in master_sm module (../src/mme/mme-sm.c:108)
09/03 17:35:54.983: [mme] INFO: [Added] Number of eNBs is now 1 (../src/mme/mme-context.c:2557)
09/03 17:35:54.983: [mme] INFO: eNB-S1[192.168.0.121] max_num_of_ostreams : 30 (../src/mme/mme-sm.c:150)
```

#### Loc1のeNodeB1に接続するZMQ対応srsRAN 4G UE(ue-loc1.conf)を起動

ZMQ対応srsRAN 4G UE(ue-loc1.conf)を起動し、Loc1のeNodeB1に接続し、Open5GS EPCに接続します。

```
# cd srsRAN_4G/build/srsue
# ./src/srsue ue-loc1.conf
Reading configuration file ue-loc1.conf...

Built in Release mode using commit fa56836b1 on branch master.

Opening 1 channels in RF device=zmq with args=tx_port=tcp://192.168.0.123:2001,rx_port=tcp://192.168.0.121:2000,id=ue,base_srate=23.04e6
Supported RF device list: zmq file
CHx base_srate=23.04e6
CHx id=ue
Current sample rate is 1.92 MHz with a base rate of 23.04 MHz (x12 decimation)
CH0 rx_port=tcp://192.168.0.121:2000
CH0 tx_port=tcp://192.168.0.123:2001
Waiting PHY to initialize ... done!
Attaching UE...
Current sample rate is 1.92 MHz with a base rate of 23.04 MHz (x12 decimation)
Current sample rate is 1.92 MHz with a base rate of 23.04 MHz (x12 decimation)
.
Found Cell:  Mode=FDD, PCI=1, PRB=50, Ports=1, CP=Normal, CFO=-0.2 KHz
Current sample rate is 11.52 MHz with a base rate of 23.04 MHz (x2 decimation)
Current sample rate is 11.52 MHz with a base rate of 23.04 MHz (x2 decimation)
Found PLMN:  Id=00101, TAC=1
Random Access Transmission: seq=32, tti=181, ra-rnti=0x2
RRC Connected
Random Access Complete.     c-rnti=0x46, ta=0
Network attach successful. IP: 10.45.0.2
 nTp) 3/9/2023 8:37:48 TZ:99
```

Open5GS C-Planeのログは以下の通りです。

```
09/03 17:37:47.657: [mme] INFO: InitialUEMessage (../src/mme/s1ap-handler.c:279)
09/03 17:37:47.657: [mme] INFO: [Added] Number of eNB-UEs is now 1 (../src/mme/mme-context.c:4426)
09/03 17:37:47.657: [mme] INFO: Unknown UE by S_TMSI[G:2,C:1,M_TMSI:0xc00001dc] (../src/mme/s1ap-handler.c:359)
09/03 17:37:47.657: [mme] INFO:     ENB_UE_S1AP_ID[1] MME_UE_S1AP_ID[1] TAC[1] CellID[0x19b01] (../src/mme/s1ap-handler.c:455)
09/03 17:37:47.658: [mme] INFO: Unknown UE by GUTI[G:2,C:1,M_TMSI:0xc00001dc] (../src/mme/mme-context.c:3280)
09/03 17:37:47.658: [mme] INFO: [Added] Number of MME-UEs is now 1 (../src/mme/mme-context.c:3089)
09/03 17:37:47.658: [emm] INFO: [] Attach request (../src/mme/emm-sm.c:412)
09/03 17:37:47.658: [emm] INFO:     GUTI[G:2,C:1,M_TMSI:0xc00001dc] IMSI[Unknown IMSI] (../src/mme/emm-handler.c:240)
09/03 17:37:47.710: [emm] INFO: Identity response (../src/mme/emm-sm.c:382)
09/03 17:37:47.710: [emm] INFO:     IMSI[001010000000100] (../src/mme/emm-handler.c:404)
09/03 17:37:47.859: [mme] INFO: [Added] Number of MME-Sessions is now 1 (../src/mme/mme-context.c:4440)
09/03 17:37:47.955: [sgwc] INFO: [Added] Number of SGWC-UEs is now 1 (../src/sgwc/context.c:237)
09/03 17:37:47.955: [sgwc] INFO: [Added] Number of SGWC-Sessions is now 1 (../src/sgwc/context.c:879)
09/03 17:37:47.955: [sgwc] INFO: UE IMSI[001010000000100] APN[internet] (../src/sgwc/s11-handler.c:237)
09/03 17:37:47.956: [gtp] INFO: gtp_connect() [127.0.0.4]:2123 (../lib/gtp/path.c:60)
09/03 17:37:47.957: [smf] INFO: [Added] Number of SMF-UEs is now 1 (../src/smf/context.c:1010)
09/03 17:37:47.957: [smf] INFO: [Added] Number of SMF-Sessions is now 1 (../src/smf/context.c:3050)
09/03 17:37:47.957: [smf] INFO: UE IMSI[001010000000100] APN[internet] IPv4[10.45.0.2] IPv6[] (../src/smf/s5c-handler.c:255)
09/03 17:37:47.961: [gtp] INFO: gtp_connect() [192.168.0.117]:2152 (../lib/gtp/path.c:60)
09/03 17:37:48.306: [emm] INFO: [001010000000100] Attach complete (../src/mme/emm-sm.c:1298)
09/03 17:37:48.307: [emm] INFO:     IMSI[001010000000100] (../src/mme/emm-handler.c:278)
09/03 17:37:48.307: [emm] INFO:     UTC [2023-09-03T08:37:48] Timezone[0]/DST[0] (../src/mme/emm-handler.c:285)
09/03 17:37:48.307: [emm] INFO:     LOCAL [2023-09-03T17:37:48] Timezone[32400]/DST[0] (../src/mme/emm-handler.c:289)
```

Open5GS U-Plane1のログは以下の通りです。

```
09/03 17:37:47.952: [sgwu] INFO: UE F-SEID[UP:0x89d CP:0x73e] (../src/sgwu/context.c:169)
09/03 17:37:47.952: [sgwu] INFO: [Added] Number of SGWU-Sessions is now 1 (../src/sgwu/context.c:174)
09/03 17:37:47.956: [upf] INFO: [Added] Number of UPF-Sessions is now 1 (../src/upf/context.c:206)
09/03 17:37:47.956: [gtp] INFO: gtp_connect() [192.168.0.116]:2152 (../lib/gtp/path.c:60)
09/03 17:37:47.956: [gtp] INFO: gtp_connect() [192.168.0.113]:2152 (../lib/gtp/path.c:60)
09/03 17:37:47.956: [upf] INFO: UE F-SEID[UP:0xded CP:0x791] APN[internet] PDN-Type[1] IPv4[10.45.0.2] IPv6[] (../src/upf/context.c:483)
09/03 17:37:47.956: [upf] INFO: UE F-SEID[UP:0xded CP:0x791] APN[internet] PDN-Type[1] IPv4[10.45.0.2] IPv6[] (../src/upf/context.c:483)
09/03 17:37:47.957: [gtp] INFO: gtp_connect() [192.168.0.117]:2152 (../lib/gtp/path.c:60)
09/03 17:37:48.304: [gtp] INFO: gtp_connect() [192.168.0.121]:2152 (../lib/gtp/path.c:60)
```

VM6(UE)での`ip addr show`は以下の通りです。TUNnelインターフェース`tun_srsue`は次のように作成され、IPアドレス`10.45.0.2`がUEに割り当てられたことが分かります。

```
# ip addr show
...
6: tun_srsue: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 500
    link/none 
    inet 10.45.0.2/24 scope global tun_srsue
       valid_lft forever preferred_lft forever
...
```

#### Loc1のDN=10.45.0.0/16を経由してgoogle.comにpingする

`tcpdump`を使用して、パケットがU-Plane1の`if=ogstun`を通過することを確認します。

```
# ping google.com -I tun_srsue -n
PING google.com (172.217.161.78) from 10.45.0.2 tun_srsue: 56(84) bytes of data.
64 bytes from 172.217.161.78: icmp_seq=1 ttl=61 time=438 ms
64 bytes from 172.217.161.78: icmp_seq=2 ttl=61 time=66.6 ms
64 bytes from 172.217.161.78: icmp_seq=3 ttl=61 time=69.9 ms
```

U-Plane1の`tcpdump`のログは以下の通りです。

```
17:39:33.917147 IP 10.45.0.2 > 172.217.161.78: ICMP echo request, id 3, seq 1, length 64
17:39:33.942728 IP 172.217.161.78 > 10.45.0.2: ICMP echo reply, id 3, seq 1, length 64
17:39:34.591150 IP 10.45.0.2 > 172.217.161.78: ICMP echo request, id 3, seq 2, length 64
17:39:34.606917 IP 172.217.161.78 > 10.45.0.2: ICMP echo reply, id 3, seq 2, length 64
17:39:35.593994 IP 10.45.0.2 > 172.217.161.78: ICMP echo request, id 3, seq 3, length 64
17:39:35.610527 IP 172.217.161.78 > 10.45.0.2: ICMP echo reply, id 3, seq 3, length 64
```

**パケットがU-Plane2を通過しないことを確認して下さい。UEは接続したLoc1のeNodeB1に従って、同じLoc1のU-Plane1のPDNに接続します。**

**この後、TAC=2でLoc2を確認する準備として、eNodeB1とUEを停止します。**

### Open5GS MME再起動

TAC=2でLoc2を確認する準備として、Open5GS MMEを再起動します。

```
pkill open5gs-mmed
./install/bin/open5gs-mmed &
```

### Loc2(TAC=2)で動作確認

#### Loc2(TAC=2)のZMQ対応srsRAN 4G RAN(eNodeB2)を起動

ZMQ対応srsRAN 4G RAN(eNodeB2)を起動し、Open5GS EPCに接続します。

```
# cd srsRAN_4G/build/srsenb
# ./src/srsenb enb.conf
---  Software Radio Systems LTE eNodeB  ---

Reading configuration file enb.conf...

Built in Release mode using commit fa56836b1 on branch master.

Opening 1 channels in RF device=zmq with args=fail_on_disconnect=true,tx_port=tcp://192.168.0.122:2000,rx_port=tcp://192.168.0.124:2001,id=enb,base_srate=23.04e6
Supported RF device list: zmq file
CHx base_srate=23.04e6
CHx id=enb
Current sample rate is 1.92 MHz with a base rate of 23.04 MHz (x12 decimation)
CH0 rx_port=tcp://192.168.0.124:2001
CH0 tx_port=tcp://192.168.0.122:2000
CH0 fail_on_disconnect=true
Current sample rate is 11.52 MHz with a base rate of 23.04 MHz (x2 decimation)
Current sample rate is 11.52 MHz with a base rate of 23.04 MHz (x2 decimation)
Setting frequency: DL=2680.0 Mhz, UL=2560.0 MHz for cc_idx=0 nof_prb=50

==== eNodeB started ===
Type <t> to view trace
```

Open5GS C-Planeのログは以下の通りです。

```
09/03 17:50:00.581: [mme] INFO: eNB-S1 accepted[192.168.0.122]:40020 in s1_path module (../src/mme/s1ap-sctp.c:114)
09/03 17:50:00.581: [mme] INFO: eNB-S1 accepted[192.168.0.122] in master_sm module (../src/mme/mme-sm.c:108)
09/03 17:50:00.581: [mme] INFO: [Added] Number of eNBs is now 1 (../src/mme/mme-context.c:2557)
09/03 17:50:00.581: [mme] INFO: eNB-S1[192.168.0.122] max_num_of_ostreams : 30 (../src/mme/mme-sm.c:150)
```

#### Loc2のeNodeB2に接続するZMQ対応srsRAN 4G UE(ue-loc2.conf)を起動

ZMQ対応srsRAN 4G UE(ue-loc2.conf)を起動し、Loc2のeNodeB2に接続し、Open5GS EPCに接続します。

```
# cd srsRAN_4G/build/srsue
# ./src/srsue ue-loc2.conf
Reading configuration file ue-loc2.conf...

Built in Release mode using commit fa56836b1 on branch master.

Opening 1 channels in RF device=zmq with args=tx_port=tcp://192.168.0.124:2001,rx_port=tcp://192.168.0.122:2000,id=ue,base_srate=23.04e6
Supported RF device list: zmq file
CHx base_srate=23.04e6
CHx id=ue
Current sample rate is 1.92 MHz with a base rate of 23.04 MHz (x12 decimation)
CH0 rx_port=tcp://192.168.0.122:2000
CH0 tx_port=tcp://192.168.0.124:2001
Waiting PHY to initialize ... done!
Attaching UE...
Current sample rate is 1.92 MHz with a base rate of 23.04 MHz (x12 decimation)
Current sample rate is 1.92 MHz with a base rate of 23.04 MHz (x12 decimation)
.
Found Cell:  Mode=FDD, PCI=1, PRB=50, Ports=1, CP=Normal, CFO=-0.2 KHz
Current sample rate is 11.52 MHz with a base rate of 23.04 MHz (x2 decimation)
Current sample rate is 11.52 MHz with a base rate of 23.04 MHz (x2 decimation)
Found PLMN:  Id=00101, TAC=2
Random Access Transmission: seq=33, tti=181, ra-rnti=0x2
RRC Connected
Random Access Complete.     c-rnti=0x46, ta=0
Network attach successful. IP: 10.46.0.2
 nTp) 3/9/2023 8:51:14 TZ:99
```

Open5GS C-Planeのログは以下の通りです。

```
09/03 17:51:13.952: [mme] INFO: InitialUEMessage (../src/mme/s1ap-handler.c:279)
09/03 17:51:13.952: [mme] INFO: [Added] Number of eNB-UEs is now 1 (../src/mme/mme-context.c:4426)
09/03 17:51:13.952: [mme] INFO: Unknown UE by S_TMSI[G:2,C:1,M_TMSI:0xc00005b2] (../src/mme/s1ap-handler.c:359)
09/03 17:51:13.952: [mme] INFO:     ENB_UE_S1AP_ID[1] MME_UE_S1AP_ID[1] TAC[2] CellID[0x19c01] (../src/mme/s1ap-handler.c:455)
09/03 17:51:13.952: [mme] INFO: Unknown UE by GUTI[G:2,C:1,M_TMSI:0xc00005b2] (../src/mme/mme-context.c:3280)
09/03 17:51:13.952: [mme] INFO: [Added] Number of MME-UEs is now 1 (../src/mme/mme-context.c:3089)
09/03 17:51:13.952: [emm] INFO: [] Attach request (../src/mme/emm-sm.c:412)
09/03 17:51:13.952: [emm] INFO:     GUTI[G:2,C:1,M_TMSI:0xc00005b2] IMSI[Unknown IMSI] (../src/mme/emm-handler.c:240)
09/03 17:51:14.004: [emm] INFO: Identity response (../src/mme/emm-sm.c:382)
09/03 17:51:14.004: [emm] INFO:     IMSI[001010000000100] (../src/mme/emm-handler.c:404)
09/03 17:51:14.106: [mme] INFO: [Added] Number of MME-Sessions is now 1 (../src/mme/mme-context.c:4440)
09/03 17:51:14.200: [sgwc] INFO: [Added] Number of SGWC-UEs is now 1 (../src/sgwc/context.c:237)
09/03 17:51:14.200: [sgwc] INFO: [Added] Number of SGWC-Sessions is now 1 (../src/sgwc/context.c:879)
09/03 17:51:14.200: [sgwc] INFO: UE IMSI[001010000000100] APN[internet] (../src/sgwc/s11-handler.c:237)
09/03 17:51:14.201: [gtp] INFO: gtp_connect() [127.0.0.24]:2123 (../lib/gtp/path.c:60)
09/03 17:51:14.201: [smf] INFO: [Added] Number of SMF-UEs is now 1 (../src/smf/context.c:1010)
09/03 17:51:14.201: [smf] INFO: [Added] Number of SMF-Sessions is now 1 (../src/smf/context.c:3050)
09/03 17:51:14.201: [smf] INFO: UE IMSI[001010000000100] APN[internet] IPv4[10.46.0.2] IPv6[] (../src/smf/s5c-handler.c:255)
09/03 17:51:14.205: [gtp] INFO: gtp_connect() [192.168.0.119]:2152 (../lib/gtp/path.c:60)
09/03 17:51:14.546: [emm] INFO: [001010000000100] Attach complete (../src/mme/emm-sm.c:1298)
09/03 17:51:14.547: [emm] INFO:     IMSI[001010000000100] (../src/mme/emm-handler.c:278)
09/03 17:51:14.547: [emm] INFO:     UTC [2023-09-03T08:51:14] Timezone[0]/DST[0] (../src/mme/emm-handler.c:285)
09/03 17:51:14.547: [emm] INFO:     LOCAL [2023-09-03T17:51:14] Timezone[32400]/DST[0] (../src/mme/emm-handler.c:289)
```

Open5GS U-Plane2のログは以下の通りです。

```
09/03 17:51:14.199: [sgwu] INFO: UE F-SEID[UP:0x804 CP:0x801] (../src/sgwu/context.c:169)
09/03 17:51:14.199: [sgwu] INFO: [Added] Number of SGWU-Sessions is now 1 (../src/sgwu/context.c:174)
09/03 17:51:14.203: [upf] INFO: [Added] Number of UPF-Sessions is now 1 (../src/upf/context.c:206)
09/03 17:51:14.203: [gtp] INFO: gtp_connect() [192.168.0.118]:2152 (../lib/gtp/path.c:60)
09/03 17:51:14.203: [gtp] INFO: gtp_connect() [192.168.0.115]:2152 (../lib/gtp/path.c:60)
09/03 17:51:14.203: [upf] INFO: UE F-SEID[UP:0x3b4 CP:0xff0] APN[internet] PDN-Type[1] IPv4[10.46.0.2] IPv6[] (../src/upf/context.c:483)
09/03 17:51:14.203: [upf] INFO: UE F-SEID[UP:0x3b4 CP:0xff0] APN[internet] PDN-Type[1] IPv4[10.46.0.2] IPv6[] (../src/upf/context.c:483)
09/03 17:51:14.204: [gtp] INFO: gtp_connect() [192.168.0.119]:2152 (../lib/gtp/path.c:60)
09/03 17:51:14.547: [gtp] INFO: gtp_connect() [192.168.0.122]:2152 (../lib/gtp/path.c:60)
```

VM6(UE)での`ip addr show`は以下の通りです。TUNnelインターフェース`tun_srsue`は次のように作成され、IPアドレス`10.46.0.2`がUEに割り当てられたことが分かります。

```
# ip addr show
...
8: tun_srsue: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 500
    link/none 
    inet 10.46.0.2/24 scope global tun_srsue
       valid_lft forever preferred_lft forever
...
```

#### Loc1のDN=10.46.0.0/16を経由してgoogle.comにpingする

`tcpdump`を使用して、パケットがU-Plane2の`if=ogstun`を通過することを確認します。

```
# ping google.com -I tun_srsue -n
PING google.com (172.217.161.78) from 10.46.0.2 tun_srsue: 56(84) bytes of data.
64 bytes from 172.217.161.78: icmp_seq=1 ttl=61 time=78.7 ms
64 bytes from 172.217.161.78: icmp_seq=2 ttl=61 time=71.7 ms
64 bytes from 172.217.161.78: icmp_seq=3 ttl=61 time=105 ms
```

U-Plane2の`tcpdump`のログは以下の通りです。

```
17:53:03.985589 IP 10.46.0.2 > 172.217.161.78: ICMP echo request, id 6, seq 1, length 64
17:53:04.007017 IP 172.217.161.78 > 10.46.0.2: ICMP echo reply, id 6, seq 1, length 64
17:53:04.985819 IP 10.46.0.2 > 172.217.161.78: ICMP echo request, id 6, seq 2, length 64
17:53:05.001360 IP 172.217.161.78 > 10.46.0.2: ICMP echo reply, id 6, seq 2, length 64
17:53:06.018756 IP 10.46.0.2 > 172.217.161.78: ICMP echo request, id 6, seq 3, length 64
17:53:06.034966 IP 172.217.161.78 > 10.46.0.2: ICMP echo reply, id 6, seq 3, length 64
```

**パケットがU-Plane1を通過しないことを確認して下さい。UEは接続したLoc2のeNodeB2に従って、同じLoc2のU-Plane2のPDNに接続します。**

これで、UEが接続したeNodeBと同じロケーションにあるSGW-U/UPF(PGW-U)のPDNに接続するというシンプルな構成を確認できました。UEからのトラフィックを最寄りのeNodeBのPDNにルーティングしてMECを実現する際の設定のヒントになることを期待しています。

## 最後に

端末(UE)が接続した基地局(eNodeB)に応じて、最寄りのデータネットワークにトラフィックを集約して処理することは、MECの視点からポピュラーなニーズと思います。

元々、Open5GS EPCには、eNodeBのパラメータであるTACやe_CellIDを用いて、SGW-Cを選択する仕組みは存在していますが、SMF(PGW-C)を選択する仕組みがなく、結果、同じロケーションのUPF(PGW-U)を柔軟に選択することができませんでした。これでは、CU分離なアーキテクチャでEPCを構成する場合、同じロケーションのU-Planeを選択する観点から不便に思いました。

そこで、これを可能にするコードを書いて、Open5GSにPull Requestしたところ、マージされました。なお、このような構成を実現する他のOSSなEPCを個人的には知りません。

これにより、5Gと同様に4Gでも、UEが接続した最寄りのeNodeBのU-Planeにトラフィックを流すことができ、CU分離なアーキテクチャで柔軟なMECの構成を試せると思います。

最後に、元記事は[Github](https://github.com/s5uishida/open5gs_epc_srsran_nearby_upf_sample_config)に書いたものです。

## 主な変更履歴

- [2023.09.04] 初版。