部署参考:OAI CN5G Docker 和 OAI RFSIM

这篇介绍在WSL2下,使用Docker部署OAI核心网,并以RFSIM模式运行OAI基站和nrUE。这种使用方式一般是我在研究信令流程时使用的,同时你也可以在高层协议上使用这种方式来获取便捷的开发环境设置;如果你关注的是底层物理层,那么同样可以通过修改部分运行参数进行实现。想要实现如下的内容,请先确保你成功实现了OAI CN5G DOCKER的部署 以及 OAI RAN的构建。WSL2请自行安装,这里不再赘述,该流程可同样在正常的Linux环境下复现,不过在我们开始前,需要你做一些设置:

1
2
3
sudo sysctl net.ipv4.conf.all.forwarding=1
sudo iptables -P FORWARD ACCEPT
sudo ip route add 192.168.70.128/26 via <你的上网网卡IP> dev <你的上网网卡>

这样就可以保证搭建的nrUE和gNB、核心网之间的流量正常转发。

OAI CN5G 配置

在启动CN5G的Docker镜像前,我们需要对核心网网元进行一定的设置,并添加订阅用户。首先需要修改的配置文件位于conf/config.yaml,我们需要修改的内容有:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
amf:
pid_directory: "/var/run"
...
served_guami_list:
- mcc: 466 // 和UE信息对应上即可
mnc: 92 // 和UE信息对应上即可
amf_region_id: 01
amf_set_id: 001
amf_pointer: 01
plmn_support_list:
- mcc: 466
mnc: 92
tac: 0x0001
nssai:
- *embb_slice1
- *embb_slice2
- *embb_slice3

在这里我会修改PLMN的参数,46692对应的是台湾的中华电信运营商,这也是我的商用UE中的白卡写入的信息。

下一步我们需要修改其中一块切片信息,找到embb_slice1的定义,添加切片ID:

1
2
3
4
5
6
7
8
snssais:
- &embb_slice1
sst: 1
sd: 010203 //添加十六进制
- &embb_slice2
sst: 1
- &embb_slice3
sst: 1

同时还需要修改database/oai_db.sql中的注册UE信息,把我们的UE信息仿照OAI给出的案例填补上去,包含两部分:

1
2
3
4
5
6
--
-- Dumping data for table `SessionManagementSubscriptionData`
--
INSERT INTO `SessionManagementSubscriptionData` (`ueid`, `servingPlmnid`, `singleNssai`, `dnnConfigurations`) VALUES
('466920000000001', '46692', '{\"sst\": 1, \"sd\": \"66051\"}','{\"oai\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 6,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"},\"staticIpAddress\":[{\"ipv4Addr\": \"12.1.1.104\"}]},\"ims\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4V6\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 2,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"}}}');
-- --------------------------------------------------------

还有:

1
2
3
4
5
6
--
-- Dumping data for table `AuthenticationSubscription`
--
-- ......
INSERT INTO `AuthenticationSubscription` (`ueid`, `authenticationMethod`, `encPermanentKey`, `protectionParameterId`, `sequenceNumber`, `authenticationManagementField`, `algorithmId`, `encOpcKey`, `encTopcKey`, `vectorGenerationInHss`, `n5gcAuthMethod`, `rgAuthenticationInd`, `supi`) VALUES
('466920000000001', '5G_AKA', '00112233445566778899aabbccddeeff', '00112233445566778899aabbccddeeff', '{\"sqn\": \"000000000000\", \"sqnScheme\": \"NON_TIME_BASED\", \"lastIndexes\": {\"ausf\": 0}}', '8000', 'milenage', '000102030405060708090a0b0c0d0e0f', NULL, NULL, NULL, NULL, '466920000000001');

随后请在当前目录下运行 docker compose up -d 以启动所有的网元容器:

运行成功案例

你可以通过使用docker logs -f oai-amf命令来查看 AMF 网元运行的信息。

image-20240811203119051

OAI gNB 配置

需要修改的内容比较多。你可以在targets/PROJECTS/GENERIC-NR-5GC/CONF新建一个文件,比如说band78-106.conf来存储配置信息,里面的内容,可以先直接复制gnb.sa.band78.fr1.106PRB.usrpb210.conf下的全部内容,然后我们再进行修改。第一步,修改PLMN为46692,同时网络切片ID也更改与sql中一致。:

1
plmn_list = ({ mcc = 466; mnc = 92; mnc_length = 2; snssaiList = ({ sst = 1; sd=0x010203;}) });

接下来你可以运行了:

1
2
cd ~/openairinterface5g/cmake_targets/ran_build/build
sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/band78-106.conf --gNBs.[0].min_rxtxtime 6 --rfsim --sa

你可以注意到gNB information那一栏中出现了我们的运行的gNB,说明已经启动成功。

OAI nrUE 配置

nrUE的配置我推荐直接修改 openair3/UICC/usim_interface.c中的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
/* configuration parameters for the rfsimulator device */
/* optname helpstr paramflags XXXptr defXXXval type numelt */
/*-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
#define UICC_PARAMS_DESC { \
{"imsi", "USIM IMSI\n", 0, .strptr=&uicc->imsiStr, .defstrval="466920000000001", TYPE_STRING, 0 }, \
{"nmc_size" "number of digits in NMC", 0, .iptr=&uicc->nmc_size, .defintval=2, TYPE_INT, 0 }, \
{"key", "USIM Ki\n", 0, .strptr=&uicc->keyStr, .defstrval="00112233445566778899aabbccddeeff", TYPE_STRING, 0 }, \
{"opc", "USIM OPc\n", 0, .strptr=&uicc->opcStr, .defstrval="000102030405060708090a0b0c0d0e0f", TYPE_STRING, 0 }, \
{"amf", "USIM amf\n", 0, .strptr=&uicc->amfStr, .defstrval="8000", TYPE_STRING, 0 }, \
{"sqn", "USIM sqn\n", 0, .strptr=&uicc->sqnStr, .defstrval="000000", TYPE_STRING, 0 }, \
{"dnn", "UE dnn (apn)\n", 0, .strptr=&uicc->dnnStr, .defstrval="oai", TYPE_STRING, 0 }, \
{"nssai_sst", "UE nssai\n", 0, .iptr=&uicc->nssai_sst, .defintval=1, TYPE_INT, 0 }, \
{"nssai_sd", "UE nssai\n", 0, .iptr=&uicc->nssai_sd, .defintval=0x010203, TYPE_INT, 0 }, \
{"imeisv", "IMEISV\n", 0, .strptr=&uicc->imeisvStr, .defstrval="6754567890123413", TYPE_STRING, 0 }, \
};

修改的点和核心网中的对应上就好,主要修改的内容有 :

  • imsi: 修改成 466920000000001,我的常用ID。
  • opc: 000102030405060708090a0b0c0d0e0f
  • key: 00112233445566778899aabbccddeeff
  • nssai_sd: 0x010203

这些和你核心网内写入的数据对应上即可。当一切配置好后,请运行:

1
2
cd ~/openairinterface5g/cmake_targets
sudo ./build_oai -w USRP --gNB --nrUE --ninja

编译通过后,请执行下述命令启动nrUE:

1
2
cd ~/openairinterface5g/cmake_targets/ran_build/build
sudo ./nr-uesoftmodem -r 106 --numerology 1 --band 78 -C 3619200000 --sa --rfsim

你应该可以在AMF的日志中找到其成功接入的信息,如图所示:

nrUE 成功接入

注意到UEs’ Information中出现了我们的UE,说明运行成功。新建一个终端,输入ifconfig命令查看是否出现一个新的网口 oaitun_ue1,并尝试通过该接口上网:

如果能成功ping通,则说明部署成功,你可以在这个环境下开展你的开发或学习任务了🥰