LTEを自作してみる(Part2)

# はじめに
[OSS LTE(その1)](https://qiita.com/K5K/items/d97d3f8ec4e1c2f05055)の続きです。前回OAI EPCをセットアップし、起動しました。
今回はOAI SIMでUEとeNodeBをシミュレートして、OAI EPCと接続してみます。

本当ならEUTRAN(enodeB)をセットアップして、UE(スマホ)-EUTRAN-EPCといったような実際にスマホを自作したLTE網を経由してインターネットに接続させるということを
想定していまいｓた。しかしEUTRANをセットアップする場合、無線HWを機器に取り付ける必要があるようです。手元に使えそうな無線機器がなかったので今回はOAI SIMをセットアップして、OAI EPCと接続するというおままごとで我慢することにします。

## OAI SIM
UEとeNodeBをエミュレートするシュミレータ。ソースファイルはOAI EUTRANのものを使用し、途中のビルド時にOAI SIMをセットアップするオプションを指定するとOAI SIMになるっぽいです(公式のドキュメントには記載ありませんでしたが、触っているとそのような造りになっていることがわかりました)



# セットアップ(OAI SIM)

[Tutorial](https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/T/howtoconnectoaisimwithoaiepc)にセットアップ手順が記載されていますが、ほぼガン無視でやりました。Ubuntuの推奨バージョンであったり、カーネルのバージョンアップだったり、CPUのチューニング等について記載されていますが、やっておりません。それでも動いたのでヨシとしています。


## 1.VM作成

以下の通りUbuntu VMを作成します。

* ホスト名: sim01
* OS: Ubuntu 16.04.5
* Spec
 - CPU : 4vcore
 - Memory : 4GB
 - Disk : 50GB
* Network
 - ens3 : 管理用インターフェース
 - ens9 : 内部通信(EUTRAN-EPC)用インターフェース
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354136/840bc0e5-cb41-1517-66cc-3516013bbac0.png)


## 2.ソースファイルのダウンロード

以下のコミットがスムーズにうごくという噂を聞いたため、ソースファイルのダウンロード後にそのコミットまでロールバックする。

```
# apt-get install git
# git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git
# cd openairinterface5g
# git reset --hard 67df8e0e7b46200b2ee43a2705def3340ddfd719 
```

## 3.ビルド

```
# ./build_oai -I --oaisim --install-system-files
```

実行後にターミナルが文字化けしてしまいますが、ビルドは成功しています。
一度ターミナルから抜けて、再びログインしてください。


## 4.設定ファイルの編集

OAI SIMとOAI EPC(もしくはEUTRAN)はデフォルトで接続できるように設定されています。そのためインターフェース設定のみ変更します。

```
# vi /root/openairinterface5g/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_mme.conf

141     mme_ip_address      = ( { ipv4       = "172.16.0.52";
142                               ipv6       = "192:168:30::17";
143                               active     = "yes";
144                               preference = "ipv4";
145                             }
146                           );

148     NETWORK_INTERFACES :
149     {
150         ENB_INTERFACE_NAME_FOR_S1_MME            = "ens9";
151         ENB_IPV4_ADDRESS_FOR_S1_MME              = "172.16.0.115/24";
152
153         ENB_INTERFACE_NAME_FOR_S1U               = "ens9";
154         ENB_IPV4_ADDRESS_FOR_S1U                 = "172.16.0.115/24";
155         ENB_PORT_FOR_S1U                         = 2152; # Spec 2152
```

## 5.OAI SIM起動確認


```
# cd /root/openairinterface5g/cmake_targets/tools/
# ./run_enb_ue_virt_s1

[S1AP][W]Received unsuccessful result for SCTP association (3), instance 0, cnx_id 1
[ENB_APP][I][eNB 0] Received S1AP_REGISTER_ENB_CNF: associated MME 0
[ENB_APP][W] 1 eNB is not associated with a MME, retrying registration in 10 seconds ...
^C
```

このコマンド実行時、OAI EPCを起動していないため、MMEと接続できないという旨のメッセージが出力されます。そのため一度起動できることを確認したらctrl + Cで抜けてください。

# 接続(OAI SIM <----> OAI EPC)

## 1.OAI EPCの起動

```text:EPC
# cd openair-cn/scripts/
# ./run_hss
# ./run_mme
# ./run_spgw
```

SPGW起動後にVMのインターフェースを確認すると、以下のようにgtp0という仮想IFが存在しています。これはPGWのインターフェースであり、接続されたUEはこのインターフェースを経由してインターネットへ接続します。
なおこのインターフェースのIPアドレスはSPGWで設定しているIPV4_LIST(UEのIPアドレスプールレンジ)の先頭アドレスが割り当てられるはずです。

```text:EPC
gtp0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:1.1.1.1  P-t-P:1.1.1.1  Mask:255.255.255.0
          inet6 addr: fe80::9046:6240:b838:9cfc/64 Scope:Link
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:3 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
```

## 2.OAI SIMの起動
※それぞれの起動は別のターミナルで行ってください。

```text:SIM
# cd /root/openairinterface5g/cmake_targets/tools
# ./run_enb_ue_virt_s1
```

ErrorとかWarningがでてきますが、気にしないでおきましょう。

## 3.接続確認

MMEを起動したらStatisticsテーブルが出力されます。
OAI SIMとOAI EPCが正しく接続できていれば、StatisticsテーブルのCurrent Status列のカウンターはすべて1になります。

```text:EPC
======================================= STATISTICS ============================================

               |   Current Status| Added since last display|  Removed since last display |
Connected eNBs |          1      |              0              |             0               |
Attached UEs   |          1      |              0              |             0               |
Connected UEs  |          1      |              0              |             0               |
Default Bearers|          1      |              0              |             0               |
S1-U Bearers   |          1      |              0              |             0               |

======================================= STATISTICS ============================================

```

## 4.インターネットへ接続

OAI SIMのインターフェースを確認するとoip1という仮想インターフェースが存在していることがわかります。これがOAI SIMのUEのインターフェースであり、IPV4_LIST内のIPアドレスが割り当てられていることがわかります。

```text:SIM
oip1      Link encap:AMPR NET/ROM  HWaddr
          inet addr:1.1.1.2  Bcast:1.255.255.255  Mask:255.0.0.0
          UP BROADCAST RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
```

このIFからPINGを8.8.8.8(Google Public DNSサーバ)に送信して、インターネットとの接続を確認します。ただ今のままではインターネットへのルーティング情報がないため、デフォルトゲートウェイをPGWに向ける必要があります。
以下の通り、PGWにデフォルトゲートウェイを向けるようにします。

```text:SIM
# route add default gw 1.1.1.1
# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         1.1.1.1         0.0.0.0         UG        0 0          0 oip1
1.0.0.0         0.0.0.0         255.0.0.0       U         0 0          0 oip1
10.0.0.0        0.0.0.0         255.255.255.0   U         0 0          0 ens3
172.16.0.0      0.0.0.0         255.255.255.0   U         0 0          0 ens9

```

これで準備が整いました。それではPINGを送信します。

```text:SIM
# ping 8.8.8.8 -I oip1
PING 8.8.8.8 (8.8.8.8) from 1.1.1.2 oip1: 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=49 time=449 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=49 time=169 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=49 time=146 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=49 time=165 ms
64 bytes from 8.8.8.8: icmp_seq=5 ttl=49 time=185 ms
64 bytes from 8.8.8.8: icmp_seq=6 ttl=49 time=124 ms
64 bytes from 8.8.8.8: icmp_seq=7 ttl=49 time=182 ms

```

インターネットと接続することができました！

現状の構成をまとめてみると以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354136/e60fa629-d050-b2a2-c911-fa620233425f.png)


# (ちょっと)詳しく見てみる

OAI SIMとOAI EPCが接続されて、OAI SIM内のUEがインターネットと接続できるようになりました。ではOAI SIMとOAI EPC間およびOAI EPC内でどういう通信をしているかパケットキャプチャを行い、通信フローを詳しく見てみます。

OAI SIM-OAI EPCの接続時、OAI EPCのens9とループバックインターフェースでパケットキャプチャを行ってみます。

```text:EPC
# tcpdump -i ens9 -w /tmp/epc_ens9.pcap
# tcpdump -i lo -w /tmp/epc_lo.pcap
```

いくつかのパケットを以下に載せておきます。

## Initial UE Message

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354136/7b2f7341-80bc-55af-e001-23a13dd81088.png)


## Authentication-Information Request

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354136/e1ce43c0-888b-a2d6-07d0-87812f63c359.png)


## Create Session Response

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354136/cd6d1cb6-1216-23e4-13f0-70bd051813fa.png)




## PING(U-Plane通信)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354136/fa4a1b7e-6715-520d-9b42-f806ded1a7a6.png)

PingのパケットがGTPでカプセリングされていることがわかります。


# 最後に
これでOAI SIMとOAI EPCを接続することができました。

OAI SIMとOAI EPCをセットアップしていて思ったこととして

* releaseやtagによって動いたり、動かなかったりする(=バージョンによって不安定)
* セットアップ手順がめんどくさい

他のOSS(NextEPC、srsLTE)を見てみると、OAIに比べてだいぶシンプルにセットアップできそうな印象を受けました。
そのため次回はNextEPCをセットアップして、それをOAI SIMと接続させてみようかと思います。


[7/17 修正]~~次回はOAI EPCをdocker上にセットアップしてみようかと思います。~~
~~もしくはOAI以外のOSS(NextEPC, srsLTE)をOAI SIMと接続させてみようかと思います。~~