LTEを自作してみる(Part4)

# はじめに

Part1からPart3でOAIとNextEPCにより呼処理のシミュレーションを行いました。

今回はsrsLTEをセットアップして、呼処理シミュレーションを行います。

# srsLTE

* SoftwareRadioSystemsが提供する3GPPに準拠したEUTRANとEPCのアプリケーション
* ソースコード : https://github.com/srsLTE/srsLTE
* C++ 製
* 機能
    * srsUE
        * UE(UEのシミュレーター)
    * srsENB
        * eNodeB
    * srsEPC
        * MME
        * HSS
        * SPGW
* Subscribe情報はCSVファイルに記述し、アプリ起動時にそれが読み込まれる(データベース非実装)

**今回はsrsEPCとOAI SIM(UE/eNodeBシミュレーター)を接続して、呼処理のシミュレーションを行います。**(srsUEとsrsENBは今回は利用しません。またの機会にできればと思います。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/f55bbba6-85b2-f4d8-c446-70b728d5a5fd.png)


# セットアップ(srsEPC)



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

* ホスト名 : sepc01
* OS : Ubuntu 16.04.5 LTS
* Spec
    * CPU : 4vcore
    * Memory : 4GB
    * Disk : 100GB
* Network
    * ens3 : 管理用インターフェース
    * ens9 :　内部通信(EUTRAN-EPC)用インターフェース
    * ens10 : インターネット接続用インターフェース

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/c59aceb6-cf93-e2be-9653-a0a01b8d14d3.png)


※OAI SIMは[その2](https://qiita.com/keiusukematsuda/private/d8b772cab2584558baa5)でセットアップしたものと同一のものです。

## 2.依存パッケージのインストール

```
# apt-get update
# apt-get install cmake libfftw3-dev libmbedtls-dev libboost-program-options-dev libconfig++-dev libsctp-dev
```

## 3.srsLTEのダウンロード/ビルド

最新リリースをダウンロードします。

```
# git clone https://github.com/srsLTE/srsLTE.git -b release_19_03
# cd srsLTE
# mkdir build
# cd build/
# cmake ../
# make
```


## 4.srsLTEのインストール

```
# make install
./srslte_install_configs.sh user
```

インストールスクリプトの引数にuserを指定すると、<実行ユーザのホームディレクトリ>/.config/srslteに設定ファイルなどがインストールされます。
※rootユーザで操作しているため、/root配下にディレクトリができます。

## 5.srsEPCの設定

以下の通り/root/.config/srslte/epc.confを編集します

左の数字は行番号です。(vimでset numberを有効化)

```
 23 [mme]
 24 mme_code = 0x1a
 25 mme_group = 0x0001
 26 tac = 0x0001
 27 mcc = 208
 28 mnc = 93
 29 mme_bind_addr = 172.16.0.56
 30 apn = srsapn.ipv4
 31 dns_addr = 8.8.8.8
 32 encryption_algo = EEA0
 33 integrity_algo = EIA1
 34 paging_timer = 2

 55 [spgw]
 56 gtpu_bind_addr   = 172.16.0.56
 57 sgi_if_addr      = 77.77.0.1
 58 sgi_if_name      = srs_spgw_sgi
 59 max_paging_queue = 100
```

MMEの設定(mcc,mncなど)はOAI SIMに合わせます。

29行目のmme_bind_addrがMMEのS1-MME側IF、56行目のgtpu_bind_addrがsgwのS1-U側IFの設定となります。
VMのIF設定に合わせて、IFアドレスを設定します。

また57行目のsgi_if_addrとVMのIFが同じセグメントになりそうなので、デフォルトから変更しています。
sgi_if_addrの次のアドレスからUEに払い出されるようです。

## 6.Subscriberの登録

epc.confと同一ディレクトリにあるuser_db.csvにSubscriber情報を登録します。
OAI SIMに合わせて以下のエントリーを登録します。

```
ue1,mil,208930100001111,8baf473f2f8fd09487cccbd7097c6862,op,1006020f0a478bf6b699f15c062e42b3,8000,0000000012b8,9,dynamic
```



## 7.NATの有効化

このままだとUE(OAI SIM)がSGi(インターネット)と接続する際にNATされません。そのためインターネットに接続しているIFにてNATを有効化する必要があります。

```
sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
iptables -t nat -A POSTROUTING -o ens10 -j MASQUERADE
iptables -I INPUT -i pgwtun -j ACCEPT
```

## 8.起動

```
# srsepc epc.conf

---  Software Radio Systems EPC  ---

Reading configuration file epc.conf...
HSS Initialized.
MME S11 Initialized
MME GTP-C Initialized
MME Initialized. MCC: 0xf208, MNC: 0xff93
SPGW GTP-U Initialized.
SPGW S11 Initialized.
SP-GW Initialized.
```

srsEPC VMは以下のように稼働しています。(多分)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/763ae53e-4bdb-b469-5ea7-46826acdeae7.png)

OAI EPC、NextEPCとの大きな違いとして、すべての機能が一つのプロセスに集約されています。
機能毎にプロセスが別れていないとコンテナ化してもあまり意味はなさそうです。


# OAI SIMとの接続

## 1. OAI SIMの設定変更

srsEPCに登録したSubscriber情報はOAI SIMに合わせているので、インターフェース設定(141行目)のみ変更します。

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

141     mme_ip_address      = ( { ipv4       = "172.16.0.56"; 
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
```


## 2.OAI SIMの起動


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

起動に成功したらsrsEPC VMにPGW(SPGW?)の仮想IFが作成されていることが確認できます。

```
srs_spgw_sgi Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:77.77.0.1  P-t-P:77.77.0.1  Mask:255.255.255.0
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:4 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500
          RX bytes:336 (336.0 B)  TX bytes:168 (168.0 B)
```


## 3. 接続確認

接続が成功したら以下の出力が表示されます。


```Text:srsEPC
S1 Setup Request - eNB Name: eNB_Eurecom_LTEBox, eNB id: 0xe00
S1 Setup Request - MCC:208, MNC:93, PLMN: 194617
S1 Setup Request - TAC 1, B-PLMN 0
S1 Setup Request - Paging DRX 2
Sending S1 Setup Response
Initial UE message: LIBLTE_MME_MSG_TYPE_ATTACH_REQUEST
Received Initial UE message -- Attach Request
Attach request -- IMSI Style Attach request
Attach request -- IMSI: 208930100001111
Attach request -- eNB-UE S1AP Id: 6535084
Attach request -- Attach type: 1
Attach Request -- UE Network Capabilities EEA: 10000000
Attach Request -- UE Network Capabilities EIA: 00100000
Attach Request -- MS Network Capabilities Present: false
PDN Connectivity Request -- EPS Bearer Identity requested: 0
PDN Connectivity Request -- Procedure Transaction Id: 1
PDN Connectivity Request -- ESM Information Transfer requested: false
Downlink NAS: Sending Authentication Request
UL NAS: Received Authentication Response
Authentication Response -- IMSI 208930100001111
UE Authentication Accepted.
Generating KeNB with UL NAS COUNT: 0
Downlink NAS: Sending NAS Security Mode Command.
UL NAS: Received Security Mode Complete
Security Mode Command Complete -- IMSI: 208930100001111
Getting subscription information -- QCI 9
Sending Create Session Request.
Creating Session Response -- IMSI: 208930100001111
Creating Session Response -- MME control TEID: 1
Received GTP-C PDU. Message type: GTPC_MSG_TYPE_CREATE_SESSION_REQUEST
SPGW: Allocated Ctrl TEID 1
SPGW: Allocated User TEID 1
SPGW: Allocate UE IP 77.77.0.2
```
UEに77.77.0.2のIPアドレスが払い出されていることがわかります。

OAI SIMのIFを確認するとoip1が作成され、77.77.0.2が付与されています。

```Text:SIM
# ifconfig oip1
oip1      Link encap:AMPR NET/ROM  HWaddr
          inet addr:77.77.0.2  Bcast:77.255.255.255  Mask:255.0.0.0
          UP BROADCAST RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:2 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:168 (168.0 B)  TX bytes:336 (336.0 B)
```


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

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

```text:SIM
# route add default gw 77.77.0.1

# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         77.77.0.1       0.0.0.0         UG        0 0          0 oip1
10.0.0.0        0.0.0.0         255.255.255.0   U         0 0          0 em1
45.0.0.0        0.0.0.0         255.0.0.0       U         0 0          0 oip1
172.16.0.0      0.0.0.0         255.255.255.0   U         0 0          0 em49
```

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

```text:SIM
# ping 8.8.8.8 -I oip1
PING 8.8.8.8 (8.8.8.8) from 77.77.0.2 oip1: 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=49 time=305 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=49 time=205 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=49 time=166 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=49 time=163 ms
```

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

パケットキャプチャを確認してみると、GTPトンネルを通りインターネットと接続できていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/8e69da5d-959b-bf5c-46cc-a258aa14ace9.png)



# 最後に
これでsrsEPCをセットアップしてOAI SIMと接続することができました。

srsEPCはインストール/設定はNextEPCと同じくらいよういに行うことができますが、機能ごとにプロセスがわかれていないという点でコンテナなどによる運用が難しいという欠点があります。

最後にまとめとしてOAI/NextEPC/srsLTEの比較について記事にできればと思います。