OAISIM + NextEPCによるE-UTRAN + EPC構築方法
3GPPのお勉強や簡易検証を目的として使えそうなE-UTRAN & EPC構築方法を記載します。
UEとeNBはOAISIMにて構築し、残り*1はNextEPCで構築します。
また、MVNOライクにSGWとPGW間(S5/S8)を分離させます。
というのも、
- SPGW間にLBを入れてPGWのメンテ検証や移行設計したり
- QCIによる帯域制御検証したり
と色々遊べそうなので。
1.環境
1-1.VMWare
筐体 : 自作PC(Win10pro) CPU : Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz VMWare : VMware(R) Workstation 15 Pro 15.1.0 build-13591040 OS : Ubuntu 16.04.6 LTS Kernel : 4.4.0-142-generic
1-2.全体構成
1-3 .全体の流れ ~概要~
- 事前準備
- NextEPC設定
- OAISIM設定
- NextEPCの分離*2
2.事前準備
2-1.u16c132:NextEPCのNW設定
NextEPCは後ほど分離しますが、まずはまとめて設定だけしておきます。*3
そして、ワンコール確認まで完了した後、分離します。
vi /etc/network/interfaces auto ens33 iface ens33 inet static address 192.168.11.132 netmask 255.255.255.0 gateway 192.168.11.1 dns-nameserver 192.168.11.1 auto ens34 iface ens34 inet static address 10.10.0.135 netmask 255.255.255.0 auto ens35 iface ens35 inet static address 10.20.0.132 netmask 255.255.255.0 auto ens35:3 iface ens35:3 inet static address 10.20.0.133 netmask 255.255.255.0 auto ens35:4 iface ens35:4 inet static address 10.20.0.134 netmask 255.255.255.0 auto ens35:5 iface ens35:5 inet static address 10.20.0.135 netmask 255.255.255.0 auto ens35:6 iface ens35:6 inet static address 10.20.0.136 netmask 255.255.255.0
3.NextEPC設定
分離するまでは、u16c132のみで設定を行っていきます。
3-1.MongoDBのインストール
apt-get -y update && \ apt-get -y install mongodb && \ systemctl enable mongodb && \ systemctl start mongodb systemctl status mongodb
3-2.pgwtunの設定
PGWのGTP終端インターフェースを作成します。
sh -c "cat << EOF > /etc/systemd/network/99-nextepc.netdev [NetDev] Name=pgwtun Kind=tun EOF" sh -c "cat << EOF > /etc/systemd/network/99-nextepc.network [Match] Name=pgwtun [Network] Address=25.0.0.1/8 Address=cafe::1/64 EOF" systemctl enable systemd-networkd && \ systemctl restart systemd-networkd
3-3.依存関係パッケージのインストール
apt-get -y install autoconf libtool gcc pkg-config git flex bison libsctp-dev \ libgnutls28-dev libgcrypt-dev libssl-dev libidn11-dev libmongoc-dev libbson-dev libyaml-dev
3-4.ビルド
git clone https://github.com/nextepc/nextepc && \ cd /root/nextepc && \ autoreconf -iv ./configure --prefix=`pwd`/install && \ make -j `nproc` && \ make install
3-5.WebUIのインストール
apt-get -y install curl && \ curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash - && \ apt-get -y install nodejs cd /root/nextepc/webui/ && \ npm install #サービス起動 npm run dev #アクセス先URL http://192.168.11.132:3000/
インストール完了後、以下のページが表示されればOKです。
Username/Passwdは以下の通り。
admin/1423
3-6.SIM情報の登録
上記のアクセス先URLから以下のSIM情報を登録します。
IMSI | 001010100001111 |
Subscriber Key(Ki) | 8baf473f2f8fd09487cccbd7097c6862 |
Operator Key(OPc) | e734f8734007d6c5ce7a0508809e7e9c |
USIM Type | OPc |
APN | lte.md.jp |
MSISDN | 33611123456 |
IMSI | 001010100001112 |
Subscriber Key(Ki) | 8baf473f2f8fd09487cccbd7097c6862 |
Operator Key(OPc) | e734f8734007d6c5ce7a0508809e7e9c |
USIM Type | OPc |
APN | lte.md.jp |
MSISDN | 33611123457 |
IMSI, Subscriber Key(Ki), Operator Key(OPc), USIM Typeが必須項目となります。
APNは任意で構いません。
MSISDNは、ここでは設定不要ですが、OAISIMのビルド前に必要となりますので、念のため記載しています。
3-7.nextepc.conf設定
設定変更箇所のみ抜粋。
vi /root/nextepc/install/etc/nextepc/nextepc.conf 追記:青 コメントアウト&追記:緑 db_uri: mongodb://localhost/nextepc logger: file: /root/nextepc/install/var/log/nextepc/nextepc.log trace: app: 1 s1ap: 1 nas: 1 diameter: 1 gtpv2: 1 gtp: 1 parameter: no_ipv6: true mme: freeDiameter: mme.conf s1ap: - addr: 10.20.0.132 gtpc: - addr: 10.20.0.132 gummei: plmn_id: mcc: 001 mnc: 01 mme_gid: 2 mme_code: 1 tai: plmn_id: mcc: 001 mnc: 01 # tac: 12345 tac: 1 security: integrity_order : [ EIA1, EIA2, EIA0 ] ciphering_order : [ EEA0, EEA1, EEA2 ] network_name: full: NextEPC hss: freeDiameter: hss.conf sgw: gtpc: # addr: 127.0.0.2 addr: 10.20.0.134 gtpu: - addr: 10.20.0.134 pgw: freeDiameter: pgw.conf gtpc: addr: # - 127.0.0.3 - 10.20.0.135 - ::1 gtpu: # - addr: 127.0.0.3 - addr: 10.20.0.135 - addr: ::1 ue_pool: # - addr: 45.45.0.1/16 - addr: 25.0.0.1/8 - addr: cafe::1/64 dns: - 8.8.8.8 - 8.8.4.4 - 2001:4860:4860::8888 - 2001:4860:4860::8844 pcrf: freeDiameter: pcrf.conf
3-8.mme.conf設定
設定変更箇所のみ抜粋。
vi /root/nextepc/install/etc/nextepc/freeDiameter/mme.conf 追記:青 コメントアウト&追記:緑 #ListenOn = "127.0.0.2"; ListenOn = "10.20.0.132"; #ConnectPeer = "hss.localdomain" { ConnectTo = "127.0.0.4"; No_TLS; }; ConnectPeer = "hss.localdomain" { ConnectTo = "10.20.0.133"; No_TLS; };
3-9.hss.conf設定
設定変更箇所のみ抜粋。
vi /root/nextepc/install/etc/nextepc/freeDiameter/hss.conf 追記:青 コメントアウト&追記:緑 #ListenOn = "127.0.0.4"; ListenOn = "10.20.0.133"; #ConnectPeer = "mme.localdomain" { ConnectTo = "127.0.0.2"; No_TLS; }; ConnectPeer = "mme.localdomain" { ConnectTo = "10.20.0.132"; No_TLS; };
3-10.pgw.conf設定
設定変更箇所のみ抜粋。
vi /root/nextepc/install/etc/nextepc/freeDiameter/pgw.conf 追記:青 コメントアウト&追記:緑 #ListenOn = "127.0.0.3"; ListenOn = "10.20.0.135"; #ConnectPeer = "pcrf.localdomain" { ConnectTo = "127.0.0.5"; No_TLS; }; ConnectPeer = "pcrf.localdomain" { ConnectTo = "10.20.0.136"; No_TLS; };
3-11.pcrf.conf設定
設定変更箇所のみ抜粋。
vi /root/nextepc/install/etc/nextepc/freeDiameter/pcrf.conf 追記:青 コメントアウト&追記:緑 #ListenOn = "127.0.0.5"; ListenOn = "10.20.0.136"; #ConnectPeer = "pgw.localdomain" { ConnectTo = "127.0.0.3"; No_TLS; }; ConnectPeer = "pgw.localdomain" { ConnectTo = "10.20.0.135"; No_TLS; };
3-12.ip forwarding設定
設定変更箇所のみ抜粋。
vi /etc/sysctl.conf 追記:青 コメントアウト&追記:緑 #net.ipv4.ip_forward=0 net.ipv4.ip_forward=1
即時反映させる場合は以下のコマンド。
sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
3-13.NextEPC起動
「-d」オプションはDaemonとして起動させます。
/root/nextepc/install/bin/nextepc-epcd -d
出力例
以下のようにDaemonが起動していればOKです。
root@u16c132:~# /root/nextepc/install/bin/nextepc-epcd -d NextEPC daemon v0.3.10 - Oct 20 2019 23:04:44 [10/20 23:18:44.126] WARN: pid file /root/nextepc/install/var/run/nextepc-epcd/pid overwritten -- Unclean shutdown of previous NextEPC run? (application.c:133) PID[2136] : '/root/nextepc/install/var/run/nextepc-epcd/pid' root@u16c132:~# File Logging : '/root/nextepc/install/var/log/nextepc/nextepc.log' MongoDB URI : 'mongodb://localhost/nextepc' Configuration : '/root/nextepc/install/etc/nextepc/nextepc.conf' [10/20 23:18:44.129] PCRF try to initialize [10/20 23:18:44.148] PCRF initialize...done [10/20 23:18:44.148] PGW try to initialize [10/20 23:18:44.207] PGW initialize...done [10/20 23:18:44.207] gtp_server() [10.20.0.135]:2123 [10/20 23:18:44.208] gtp_server() [10.20.0.135]:2152 [10/20 23:18:44.208] SGW try to initialize [10/20 23:18:44.209] INFO: CONNECTED TO 'pgw.localdomain' (TCP,soc#7): (fd_logger.c:93) [10/20 23:18:44.210] INFO: CONNECTED TO 'pcrf.localdomain' (TCP,soc#10): (fd_logger.c:93) [10/20 23:18:44.217] SGW initialize...done [10/20 23:18:44.218] gtp_server() [10.20.0.134]:2123 [10/20 23:18:44.218] gtp_server() [10.20.0.134]:2152 [10/20 23:18:44.218] HSS try to initialize [10/20 23:18:44.268] HSS initialize...done [10/20 23:18:44.268] MME try to initialize [10/20 23:18:44.380] gtp_server() [10.20.0.132]:2123 [10/20 23:18:44.380] gtp_client() [10.20.0.134]:2123 [10/20 23:18:44.380] MME initialize...done [10/20 23:18:44.380] INFO: NextEPC daemon start (main.c:177) [10/20 23:18:44.381] INFO: CONNECTED TO 'mme.localdomain' (TCP,soc#7): (fd_logger.c:93) [10/20 23:18:44.381] INFO: CONNECTED TO 'hss.localdomain' (TCP,soc#10): (fd_logger.c:93) [10/20 23:18:44.387] s1ap_server() [10.20.0.132]:36412
終了させるときは、kill -9などで停止させてください。
分離させた後は以下のコマンドで個別に起動させますが、後ほど詳しく紹介します。
#u16c132:MME,HSS,SGW /root/nextepc/install/bin/nextepc-sgwd -d /root/nextepc/install/bin/nextepc-hssd -d /root/nextepc/install/bin/nextepc-mmed -d #u16c135:PGW,PCRF /root/nextepc/install/bin/nextepc-pcrfd -d /root/nextepc/install/bin/nextepc-pgwd -d
4.OAISIM設定
4-1.git リポジトリの取得
apt-get install git && \ git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git && \ cd /root/openairinterface5g && \ git reset --hard 67df8e0e7b46200b2ee43a2705def3340ddfd719
4-2.SIM情報の設定
変更箇所のみ抜粋。UEを2台アタッチさせられるように1台追加しています。
vi /root/openairinterface5g/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf #画面下の方にスクロール 追記:青 コメントアウト&追記:緑 UE0: { USER: { IMEI="356113022094149"; MANUFACTURER="EURECOM"; MODEL="LTE Android PC"; PIN="0000"; }; SIM: { MSIN="0100001111"; USIM_API_K="8baf473f2f8fd09487cccbd7097c6862"; OPC="e734f8734007d6c5ce7a0508809e7e9c"; MSISDN="33611123456"; }; # Home PLMN Selector with Access Technology # HPLMN= "20893"; HPLMN= "00101"; # User controlled PLMN Selector with Access Technology UCPLMN_LIST = (); # Operator PLMN List OPLMN_LIST = ("00101", "20810", "20811", "20813", "20893", "310280", "310028"); # Operator controlled PLMN Selector with Access Technology OCPLMN_LIST = ("22210", "21401", "21406", "26202", "26204"); # Forbidden plmns FPLMN_LIST = (); # List of Equivalent HPLMNs #TODO: UE does not connect if set, to be fixed in the UE # EHPLMN_LIST= ("20811", "20813"); EHPLMN_LIST= (); }; UE1: { USER: { IMEI="356113022094150"; MANUFACTURER="EURECOM"; MODEL="LTE Android PC"; PIN="0000"; }; SIM: { MSIN="0100001112"; USIM_API_K="8baf473f2f8fd09487cccbd7097c6862"; OPC="e734f8734007d6c5ce7a0508809e7e9c"; MSISDN="33611123457"; }; # Home PLMN Selector with Access Technology HPLMN= "00101"; # User controlled PLMN Selector with Access Technology UCPLMN_LIST = (); # Operator PLMN List OPLMN_LIST = ("00101", "20810", "20811", "20813", "20893", "310280", "310028"); # Operator controlled PLMN Selector with Access Technology OCPLMN_LIST = ("22210", "21401", "21406", "26202", "26204"); # Forbidden plmns FPLMN_LIST = (); # List of Equivalent HPLMNs #TODO: UE does not connect if set, to be fixed in the UE # EHPLMN_LIST= ("20811", "20813"); EHPLMN_LIST= (); };
4-3.ビルド
cd /root/openairinterface5g/cmake_targets && \ ./build_oai -I --oaisim --install-system-files
ビルドの最後の方で、以下のように文字化けしますが、ビルドは正常に完了している(ハズなので)ので、exitで抜けて、再度ログインし直してください。
出力例
文字化けしますが、前項で修正したue_eurecom_test_sfr.confの変更点が反映されていることが確認できます。
赤文字箇所
Log file for compilation has been written to: /root/openairinterface5g/cmake_targets/log/usim.Rel14.txt usim compiled Log file for compilation has been written to: /root/openairinterface5g/cmake_targets/log/nvram.Rel14.txt nvram compiled Log file for compilation has been written to: /root/openairinterface5g/cmake_targets/log/conf2uedata.Rel14.txt conf2uedata compiled generate .ue_emm.nvram .ue.nvram UE's non-volatile data: IMEI = 356113022094149 manufacturer = EURECOM model = LTE Android PC PIN = 0000 UE identity data file: /root/openairinterface5g/targets/bin/.ue.nvram0 EMM non-volatile data: IMSI = 001.010.100001111 RPLMN = 00101 EPS Mobility Management data file: /root/openairinterface5g/targets/bin/.ue_emm.nvram0 UE's non-volatile data: IMEI = 356113022094150 manufacturer = EURECOM model = LTE Android PC PIN = 0000 UE identity data file: /root/openairinterface5g/targets/bin/.ue.nvram1 EMM non-volatile data: IMSI = 001.010.100001112 RPLMN = 00101 EPS Mobility Management data file: /root/openairinterface5g/targets/bin/.ue_emm.nvram1 generate .usim.nvram USIM data: Administrative Data: UE_Operation_Mode = 0x00 Additional_Info = 0xffff MNC_Length = 2 IMSI: length = 8 parity = Odd digits = 15 digits = 001010100001111 Ciphering and Integrity Keys: KSI : 0x07 CK : "" IK : "" usim_api_k: 8b af 47 3f 2f 8f d0 94 87 cc cb d7 09 7c 68 62 opc : e7 34 f8 73 40 07 d6 c5 ce 7a 05 08 80 9e 7e 9c EPS NAS security context: KSIasme : 0x07 Kasme : "" ulNAScount : 0x00000000 dlNAScount : 0x00000000 algorithmID : 0x02 MSISDN = 336 1112 3456 PNN[0] = {Test network, OAI4G} PNN[1] = {SFR France, SFR} PNN[2] = {SFR France, SFR} PNN[3] = {SFR France, SFR} PNN[4] = {OAI LTEBOX, OAIALU} PNN[5] = {T-Mobile USA, T-MobileCニノテヤノヤノマユモ ユモチ ミホホロカン ス 鈼ノテヤノヤノマユモ ユモチャ ニノテヤノヤノマ ミホホロキン ス 譿 マミフローン ス ーーアーアャ ヤチテ ス ローーーア ュ 跏趾ンャ 胥゚鱠 ス ー マミフロアン ス イークアーャ ヤチテ ス ローーーア ュ 跏趾ンャ 胥゚鱠 ス ア ~~~ 中略 ~~~ ホチモテマホニノヌコ ホチモ゚モ鱸髜・鴃醪・鴟・ コ ーー ホヘマ゚ノ゚ツ裴磋鴆 コ ーー チ矼鞅鴟靄炫・ コ ーア ヘ鴃鳫ミ褪鴆蓚耨裔靫鳫褪 コ ーー ナ褓蒟菽聽褫碪鰀 コ ーー ヤ鳫褪゚ヤウイエオ゚ツ裴磋鴆 コ ーー ユモノヘ 蓊 跌・コ ッ・ッ・褓硅ⅵ褪趁肄オ遽襁粳鉧ョ鳫ョⅷ敎 フ・ 跌・ 跣・胥瀇鴈磑鴆・鞦・粢褓 鴟・コ ッ・ッ・褓硅ⅵ褪趁肄オ遽肬硴裃襁・遽・鱇襁鞜碚ョメ褌アエョ・ ・鱇襁鞜碚 胥瀇鴈裝 ・糀硅゚碚ョ 鴣 ・鸙裝 ナヤネナメホナヤ ・糘碪・ アーョ ツ碯鰀 ・ヤ褫 ョョョ ・タカ羈ウアコッ・褓硅ⅵ褪趁肄オ遽肬硴裃襁
<補足1>
ビルド実行時、バイナリ化されたnvramファイル*4にSIM情報が書き込まれ、以下のパスに保存されます。*5
/openairinterface5g/targets/bin
SIM情報を追加・変更・削除したい場合は、以下のファイルを再度編集の上、
vi /root/openairinterface5g/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf
以下のコマンドで再ビルドしてください。
./build_oai -c --oaisim
<補足2>
以前*6は、以下のコマンドにてSIM情報の書き換えが可能でした。
cd ~/openairinterface5g/targets/bin/ ./conf2uedata -c /root/openairinterface5g/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf -o ./
しかし、今回利用したリポジトリ
git reset --hard 67df8e0e7b46200b2ee43a2705def3340ddfd719
では、
conf2uedataコマンドを実行しても変更したSIM情報がnvramファイルに反映されなかったので、再ビルドしたところ正常に反映されました。
4-4.S1インターフェース周りの設定
vi /root/openairinterface5g/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_mme.conf 修正箇所 mobile_country_code = "001"; mobile_network_code = "01"; #画面下の方までスクロール ////////// MME parameters: mme_ip_address = ( { ipv4 = "10.20.0.132"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; } ); NETWORK_INTERFACES : { ENB_INTERFACE_NAME_FOR_S1_MME = "ens35"; ENB_IPV4_ADDRESS_FOR_S1_MME = "10.20.0.131/24"; ENB_INTERFACE_NAME_FOR_S1U = "ens35"; ENB_IPV4_ADDRESS_FOR_S1U = "10.20.0.131/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 };
4-5.UEの起動台数変更
vi /root/openairinterface5g/cmake_targets/tools/run_enb_ue_virt_s1 修正箇所 #vi上で、「AAWG」で検索してください。 # exe_arguments="$exe_arguments -s15 -AAWGN -y1 -b1 -u1 -Q0" exe_arguments="$exe_arguments -s15 -AAWGN -y1 -b1 -u2 -Q0"
4-6.eNB起動
以下のコマンドでeNBを起動させます。
/root/openairinterface5g/cmake_targets/tools/run_enb_ue_virt_s1
もし、u16c132:NextEPC側でEPC関連サービスを起動していない場合は、先に以下のコマンドを実行してから、上記のeNB起動を行ってください。
/root/nextepc/install/bin/nextepc-epcd -d
出力例1
u16c132:EPC側の出力例
root@u16c132:~# /root/nextepc/install/bin/nextepc-epcd -d NextEPC daemon v0.3.10 - Oct 20 2019 23:04:44 [10/21 00:16:27.288] WARN: pid file /root/nextepc/install/var/run/nextepc-epcd/pid overwritten -- Unclean shutdown of previous NextEPC run? (application.c:133) root@u16c132:~# PID[2495] : '/root/nextepc/install/var/run/nextepc-epcd/pid' File Logging : '/root/nextepc/install/var/log/nextepc/nextepc.log' MongoDB URI : 'mongodb://localhost/nextepc' Configuration : '/root/nextepc/install/etc/nextepc/nextepc.conf' [10/21 00:16:27.290] PCRF try to initialize [10/21 00:16:27.344] PCRF initialize...done [10/21 00:16:27.346] PGW try to initialize [10/21 00:16:27.418] PGW initialize...done [10/21 00:16:27.418] gtp_server() [10.20.0.135]:2123 [10/21 00:16:27.418] gtp_server() [10.20.0.135]:2152 [10/21 00:16:27.420] SGW try to initialize [10/21 00:16:27.420] INFO: CONNECTED TO 'pgw.localdomain' (TCP,soc#7): (fd_logger.c:93) [10/21 00:16:27.421] INFO: CONNECTED TO 'pcrf.localdomain' (TCP,soc#13): (fd_logger.c:93) [10/21 00:16:27.426] SGW initialize...done [10/21 00:16:27.427] gtp_server() [10.20.0.134]:2123 [10/21 00:16:27.427] gtp_server() [10.20.0.134]:2152 [10/21 00:16:27.427] HSS try to initialize [10/21 00:16:27.462] HSS initialize...done [10/21 00:16:27.462] MME try to initialize [10/21 00:16:27.583] MME initialize...done [10/21 00:16:27.584] INFO: NextEPC daemon start (main.c:177) [10/21 00:16:27.584] INFO: CONNECTED TO 'mme.localdomain' (TCP,soc#7): (fd_logger.c:93) [10/21 00:16:27.584] INFO: CONNECTED TO 'hss.localdomain' (TCP,soc#10): (fd_logger.c:93) [10/21 00:16:27.584] gtp_server() [10.20.0.132]:2123 [10/21 00:16:27.584] gtp_client() [10.20.0.134]:2123 [10/21 00:16:27.584] s1ap_server() [10.20.0.132]:36412 #NextEPC起動時はここまで出力されます。 eNBが起動しS1の通信が開始&アタッチ処理が正常に完了すると、さらに以下のログが出力されます。 UEにアドレスがアサインされていることが確認できます。 [10/21 00:18:07.933] eNB-S1 accepted[10.20.0.131]:36412 in s1_path module [10/21 00:18:07.934] eNB-S1 accepted[10.20.0.131] in master_sm module [10/21 00:18:13.416] gtp_client() [10.20.0.132]:2123 [10/21 00:18:13.416] gtp_client() [10.20.0.135]:2123 [10/21 00:18:13.416] gtp_client() [10.20.0.134]:2123 [10/21 00:18:13.416] UE IPv4:[25.0.0.2] IPv6: [10/21 00:18:13.416] gtp_client() [10.20.0.134]:2152 [10/21 00:18:13.419] gtp_client() [10.20.0.135]:2152 [10/21 00:18:13.821] gtp_client() [10.20.0.131]:2152 [10/21 00:18:14.204] UE IPv4:[25.0.0.3] IPv6:
出力例2
u16c131:eNB側の出力例
以下のようなログが最終的に出力している、かつ、UEのIPアドレスが確認できれば、アタッチは正常に完了しています。
ちなみに、eNB側のログは不定期に出力し続けます。また、ErrorやWarning、Fatalといったメッセージも、ちらほら見受けられますが、あまり気にしないでください。
eNB起動時のログは大量に出力されるため、こちらにアップしました。
[SCTP][I][4][50] Msg of length 62 received from port 36412, on stream 1, PPID 18 [S1AP][I]Decoding message S1ap_DownlinkNASTransportIEs (/root/openairinterface5g/cmake_targets/oaisim_build_oai/build/CMakeFiles/R10.5/s1ap_decoder.c:3150) [RRC][I][eNB 0] Received S1AP_DOWNLINK_NAS: ue_initial_id 0, eNB_ue_s1ap_id 116541 [PDCP][I][FRAME 00000][eNB][MOD 00][RNTI c745]Received RRC_DCCH_DATA_REQ from TASK_RRC_ENB: instance 0, rb_id 2, muiP 6, confirmP 0, mode 1 [RLC][I][FRAME 00000][eNB][MOD 00][RNTI c745][SRB AM 02] RLC_AM_DATA_REQ size 44 Bytes, NB SDU 1 current_sdu_index=0 next_sdu_index=1 conf 0 mui 6 vtA 0 vtS 0 [MAC][I][eNB 0], Frame 72, DCCH1->DLSCH, CC_id 0, Requesting 125 bytes from RLC (RRC message) [PHY][E]Format1A Retransmission but TBS are different: consider it as new transmission !!! [OSA][E]Mismatch found in integrity for algorithm 2, got 60.38.89.c0, expecting 00.00.00.00 [PDCP][E][OSA][RB 2] UE failed to validate MAC-I of incoming PDU [RRC][N][UE 0] Frame 72: received a DCCH 2 message on SRB 2 with Size 39 from eNB 0 [RRC][E][UE 0] Frame 72: Received message on DL-DCCH (SRB2), should not have ... [MAC][I][eNB 0], Frame 73, DCCH1->DLSCH, CC_id 0, Requesting 125 bytes from RLC (RRC message) bad DCI 1A !!! [PHY][I]bad dci mcs + round bad DCI 1 !!! [PHY][E][UE 0] Frame 287, subframe 8: Problem in DCI! [PHY][E]frame 681, subframe 7, rnti c745, format 0: FATAL ERROR: generate_ue_ulsch_params_from_dci, rb_alloc[450] > RIV_max[324] [PHY][E]Wrong DCI0 detection, do not transmit PUSCH for HARQID: 5 [PHY][I][UE 0] frame 683, subframe 2: received DCI 0 with RNTI=0 (C-RNTI:c745, CBA_RNTI 0) and format 2! [PHY][I]bad dci rballoc rballoc 7346 RIV_max 324 bad DCI 1 !!! [PHY][E][UE 1] Frame 795, subframe 9: Problem in DCI!
4-7.UEアドレス確認
oip1というインターフェースに25.0.0.x/8のアドレスがアサインされていれば、UEのアタッチ成功です。
今回はUE0とUE1の2台分のIPアドレスがアサインされています。
ip add show root@u16c131:~# ip add show 1: lo:mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:41:02:e1 brd ff:ff:ff:ff:ff:ff inet 192.168.11.131/24 brd 192.168.11.255 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe41:2e1/64 scope link valid_lft forever preferred_lft forever 3: ens34: mtu 1500 qdisc noop state DOWN group default qlen 1000 link/ether 00:0c:29:41:02:eb brd ff:ff:ff:ff:ff:ff 4: ens35: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:41:02:f5 brd ff:ff:ff:ff:ff:ff inet 10.20.0.131/24 brd 10.20.0.255 scope global ens35 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe41:2f5/64 scope link valid_lft forever preferred_lft forever 65: oip0: mtu 1500 qdisc noop state DOWN group default qlen 100 link/generic 00:00:00:00:00:00:00:00 brd 00:00:00:00:00:00:00:00 66: oip1: mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100 link/generic 00:00:00:00:00:00:00:00 brd 00:00:00:00:00:00:00:00 inet 25.0.0.5/8 brd 25.255.255.255 scope global oip1 valid_lft forever preferred_lft forever 67: oip2: mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100 link/generic 00:00:00:00:00:00:00:00 brd 00:00:00:00:00:00:00:00 inet 25.0.0.4/8 brd 25.255.255.255 scope global oip2 valid_lft forever preferred_lft forever 68: oip3: mtu 1500 qdisc noop state DOWN group default qlen 100 link/generic 00:00:00:00:00:00:00:00 brd 00:00:00:00:00:00:00:00 ~~~ 中略 ~~~ 84: oip19: mtu 1500 qdisc noop state DOWN group default qlen 100 link/generic 00:00:00:00:00:00:00:00 brd 00:00:00:00:00:00:00:00
SGiのGWアドレスにoip1を指定して、Pingを飛ばしてみてください。*7
root@u16c131:~# ping 10.10.0.254 -I oip1 PING 10.10.0.254 (10.10.0.254) from 25.0.0.5 oip1: 56(84) bytes of data. 64 bytes from 10.10.0.254: icmp_seq=1 ttl=63 time=131 ms 64 bytes from 10.10.0.254: icmp_seq=2 ttl=63 time=86.7 ms 64 bytes from 10.10.0.254: icmp_seq=3 ttl=63 time=98.3 ms 64 bytes from 10.10.0.254: icmp_seq=4 ttl=63 time=83.4 ms ^C --- 10.10.0.254 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3001ms rtt min/avg/max/mdev = 83.452/99.940/131.223/18.888 ms
4-8.route追加
うまくPingが飛ばない場合は、u16c131側にDefaultGWアドレスを設定し、既存のDefaultGWアドレスは削除してみてください。
DefaultGWアドレスの設定
route add default gw 25.0.0.1
既存DefaultGWアドレスの削除
vi /etc/network/interfaces 削除箇所 auto ens33 iface ens33 inet static address 192.168.11.131 netmask 255.255.255.0 gateway 192.168.11.1 dns-nameserver 192.168.11.1 auto ens35 iface ens35 inet static address 10.20.0.131 netmask 255.255.255.0 systemctl restart networking
ここまでで、ほぼ完成です。
あとは、MVNOライクにS5/S8でSPGWを分離する手順となります。
Pingが飛ばなかったり、IPアドレスがアサインされない場合は、u16c132のens35とens34をtcpdumpしてみてください。*8
5.NextEPCの分離
5-1.クローン作成&u16c135の起動
u16c132をシャットダウン後、u16c132のクローンをu16c135として作成してください。
u16c135を起動後、ネットワーク設定やホスト名を以下のように変更します。
#u16c135の設定 vi /etc/network/interfaces 追記箇所 修正箇所 削除箇所 auto ens33 iface ens33 inet static address 192.168.11.135 netmask 255.255.255.0 gateway 192.168.11.1 dns-nameserver 192.168.11.1 auto ens34 iface ens34 inet static address 10.10.0.135 netmask 255.255.255.0 gateway 10.10.0.254 auto ens35 iface ens35 inet static address 10.20.0.135 netmask 255.255.255.0 auto ens35:3 iface ens35:3 inet static address 10.20.0.133 netmask 255.255.255.0 auto ens35:4 iface ens35:4 inet static address 10.20.0.134 netmask 255.255.255.0 auto ens35:5 iface ens35:5 inet static address 10.20.0.135 netmask 255.255.255.0 auto ens35:6 iface ens35:6 inet static address 10.20.0.136 netmask 255.255.255.0 #ホスト名の変更 vi /etc/hostname u16c135 #再起動 reboot
5-2.u16c132のネットワーク設定変更
u16c132を起動してください。そして、以下の通りネットワーク設定を変更してください。
#u16c132の設定 vi /etc/network/interfaces 削除箇所 auto ens33 iface ens33 inet static address 192.168.11.132 netmask 255.255.255.0 gateway 192.168.11.1 dns-nameserver 192.168.11.1 auto ens34 iface ens34 inet static address 10.10.0.135 netmask 255.255.255.0 auto ens35 iface ens35 inet static address 10.20.0.132 netmask 255.255.255.0 auto ens35:3 iface ens35:3 inet static address 10.20.0.133 netmask 255.255.255.0 auto ens35:4 iface ens35:4 inet static address 10.20.0.134 netmask 255.255.255.0 auto ens35:5 iface ens35:5 inet static address 10.20.0.135 netmask 255.255.255.0 auto ens35:6 iface ens35:6 inet static address 10.20.0.136 netmask 255.255.255.0 #再起動 reboot
5-3.各種サービス起動
S5/S8でSPGW間を分離していますので、
/root/nextepc/install/bin/nextepc-epcd -d
は使用せず、それぞれ個別にサービスを起動します。
u16c132 | MME, HSS, SGW |
u16c135 | PGW, PCRF |
#u16c132のサービス起動:MME, HSS, SGW /root/nextepc/install/bin/nextepc-sgwd -d /root/nextepc/install/bin/nextepc-hssd -d /root/nextepc/install/bin/nextepc-mmed -d #u16c135のサービス起動:PGW, PCRF /root/nextepc/install/bin/nextepc-pcrfd -d /root/nextepc/install/bin/nextepc-pgwd -d
5-4.eNBの起動
以下のコマンドで再度eNBを起動します。
S5/S8で分離されても、「4-6.eNB起動」以降で動作確認したのと同様に疎通確認してください。
#u16c131で実行 /root/openairinterface5g/cmake_targets/tools/run_enb_ue_virt_s1
5-5.起動時のログ
eNB起動時の
- u16c132:MME,HSS,SGW
- u16c135:PGW,PCRF
におけるログとPcapファイルをアップしておきます。
なお、u16c131:UE,eNBの出力ログは4-6の出力例2に載せたものと同様です。
#u16c132の出力例
root@u16c132:~# /root/nextepc/install/bin/nextepc-sgwd -d root@u16c132:~# /root/nextepc/install/bin/nextepc-hssd -d root@u16c132:~# /root/nextepc/install/bin/nextepc-mmed -d NextEPC daemon v0.3.10 - Oct 20 2019 23:04:44 PID[1857] : '/root/nextepc/install/var/run/nextepc-sgwd/pid' File Logging : '/root/nextepc/install/var/log/nextepc/nextepc.log' MongoDB URI : 'mongodb://localhost/nextepc' Configuration : '/root/nextepc/install/etc/nextepc/nextepc.conf' [10/21 00:59:10.412] SGW try to initialize NextEPC daemon v0.3.10 - Oct 20 2019 23:04:44 PID[1860] : '/root/nextepc/install/var/run/nextepc-hssd/pid' File Logging : '/root/nextepc/install/var/log/nextepc/nextepc.log' MongoDB URI : 'mongodb://localhost/nextepc' Configuration : '/root/nextepc/install/etc/nextepc/nextepc.conf' [10/21 00:59:10.421] HSS try to initialize NextEPC daemon v0.3.10 - Oct 20 2019 23:04:44 [10/21 00:59:10.463] HSS initialize...done [10/21 00:59:10.464] INFO: NextEPC daemon start (main.c:177) PID[1873] : '/root/nextepc/install/var/run/nextepc-mmed/pid' File Logging : '/root/nextepc/install/var/log/nextepc/nextepc.log' MongoDB URI : 'mongodb://localhost/nextepc' Configuration : '/root/nextepc/install/etc/nextepc/nextepc.conf' [10/21 00:59:10.466] MME try to initialize [10/21 00:59:10.478] SGW initialize...done [10/21 00:59:10.478] INFO: NextEPC daemon start (main.c:177) [10/21 00:59:10.478] gtp_server() [10.20.0.134]:2123 [10/21 00:59:10.478] gtp_server() [10.20.0.134]:2152 [10/21 00:59:10.607] gtp_server() [10.20.0.132]:2123 [10/21 00:59:10.607] gtp_client() [10.20.0.134]:2123 [10/21 00:59:10.607] MME initialize...done [10/21 00:59:10.607] INFO: NextEPC daemon start (main.c:177) [10/21 00:59:10.608] INFO: CONNECTED TO 'mme.localdomain' (TCP,soc#8): (fd_logger.c:93) [10/21 00:59:10.608] INFO: CONNECTED TO 'hss.localdomain' (TCP,soc#11): (fd_logger.c:93) [10/21 00:59:10.615] s1ap_server() [10.20.0.132]:36412 ~~~以下はeNBが接続してきた際に出力されるログ~~~ [10/21 01:00:41.550] eNB-S1 accepted[10.20.0.131]:36412 in s1_path module [10/21 01:00:41.550] eNB-S1 accepted[10.20.0.131] in master_sm module [10/21 01:00:46.461] gtp_client() [10.20.0.132]:2123 [10/21 01:00:46.461] gtp_client() [10.20.0.135]:2123 [10/21 01:00:46.466] gtp_client() [10.20.0.135]:2152 [10/21 01:00:46.868] gtp_client() [10.20.0.131]:2152
#u16c135の出力例
root@u16c135:~# /root/nextepc/install/bin/nextepc-pcrfd -d root@u16c135:~# /root/nextepc/install/bin/nextepc-pgwd -d NextEPC daemon v0.3.10 - Oct 20 2019 23:04:44 PID[1870] : '/root/nextepc/install/var/run/nextepc-pcrfd/pid' File Logging : '/root/nextepc/install/var/log/nextepc/nextepc.log' NextEPC daemon v0.3.10 - Oct 20 2019 23:04:44 MongoDB URI : 'mongodb://localhost/nextepc' Configuration : '/root/nextepc/install/etc/nextepc/nextepc.conf' [10/21 00:59:23.198] PCRF try to initialize PID[1873] : '/root/nextepc/install/var/run/nextepc-pgwd/pid' File Logging : '/root/nextepc/install/var/log/nextepc/nextepc.log' MongoDB URI : 'mongodb://localhost/nextepc' Configuration : '/root/nextepc/install/etc/nextepc/nextepc.conf' [10/21 00:59:23.199] PGW try to initialize [10/21 00:59:23.235] PCRF initialize...done [10/21 00:59:23.236] INFO: NextEPC daemon start (main.c:177) [10/21 00:59:23.352] PGW initialize...done [10/21 00:59:23.352] INFO: NextEPC daemon start (main.c:177) [10/21 00:59:23.352] gtp_server() [10.20.0.135]:2123 [10/21 00:59:23.352] gtp_server() [10.20.0.135]:2152 [10/21 00:59:23.354] INFO: CONNECTED TO 'pgw.localdomain' (TCP,soc#9): (fd_logger.c:93) [10/21 00:59:23.355] INFO: CONNECTED TO 'pcrf.localdomain' (TCP,soc#13): (fd_logger.c:93) ~~~以下はUEにIPアドレスアサインされた際に出力されるログ~~~ [10/21 01:00:46.409] gtp_client() [10.20.0.134]:2123 [10/21 01:00:46.409] UE IPv4:[25.0.0.2] IPv6: [10/21 01:00:46.409] gtp_client() [10.20.0.134]:2152 [10/21 01:00:46.573] UE IPv4:[25.0.0.3] IPv6:
eNB起動時のPcapファイルはこちらにアップしました。
u16c135のens35でpcapしています。
以上です。
6.最後に
以下のサイトを参考にさせて頂きました。
【プライベートLTE】 第3回:プライベートLTE設備の構築 ~Open Air Interface(OAISIM)による端末(UE)・基地局(eNB)擬似環境の紹介~
LTEを自作してみる(Part2) - Qiita
LTEを自作してみる(Part3) - Qiita
最初の記事が@m0ch1_m0ch1さん、残り2つの記事が@K5Kさんによって書かれています。
お二方はE-UTRANやEPCに関して造詣が深く、大変よくまとめられた記事となっており、これらのサイトが無ければ、今回の記事は書けなかったので、ぜひぜひ読んでみてください。
私個人的にですが、モバイルネットワークの技術は、もっとコモディティ化してもよいと考えています。
最近、プライベートLTEやローカル5Gといった言葉(キーワード)をよく耳にしますが、誰でも簡単に扱えるか?というと、まだもう少し時間がかかるのだろうと思います。
とはいえ、ただただ時間が経つのを待っていれば扱えるようになるか?といえば、それもまた違うと思うで、自ら積極的かつ能動的にこれらの技術を獲りに行ける環境を、まずは構築してみるのが良いのでは?と考えています。
今回の記事はまだ初期段階ですが、次のステップとしては、最初に書いたようなことに加えて、
- LXC/LXDやDockerなどでコンテナ化してみる
- SGi側でBGPがしゃべれるようにQuaggaを入れてみる
- OAISIMが重く不安定なのでリッチな物理サーバに換装してみる
など、色々できることはあるのかなと考えています
*1:MME,HSS,SGW,PGW,PCRF
*2:S5/S8でMME, HSS, SGWとPGW, PCRFを2つのNextEPCに分離します。
*3:分離する際に削除すればいいので。
*4:出力例に表示されている通り、.ue.nvram0とか.ue.nvram1など
*5:本来はUSRPなどでH/W処理されるプロセスをOAISIMとしてS/Wでシミュレートするためバイナリ化するのだと考えています。実際、バイナリ化していても、UE&eNodeBを起動すると、4CoreのCPU使用率が30~40%くらいで推移するため、S/Wでシミュレートするには相当負荷が掛かる処理のようです。
*6:v0.6.1のbranchでは大丈夫でした。
*7:GWアドレスを持つL3デバイスに25.0.0.0/8宛の戻り経路を忘れずに設定してください。
*8:出力例2にも記載しましたが、Phy層でFatal Errorなどのログが出力されていてもPingが飛びます。このため、一度でも成功したことがないと、どういう状態になっていればOKか?の判断が極めて困難だと思います。私自身も最初は勘所が全く掴めなかったので苦労しました。