部署参考:Free5gc+OAI gNB & nrUE

本篇介绍使用一台Ubuntu运行free5gc充当核心网,另一台Ubuntu主机运行OAI 的gNB和模拟UE。本次使用的Free5GC版本为最新的v3.4.2,OAI版本为2024w26。在Ubuntu 20.04.6LTS版本下,该流程可复现。

Free5gc配置

在开始前,一如既往进行转发设置:

1
2
3
4
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A POSTROUTING -o <上网网卡名称> -j MASQUERADE
sudo systemctl stop ufw
sudo iptables -I FORWARD 1 -j ACCEPT

配置free5gc目录下的/config下面的amfcfg.yaml,smfcfg.yaml以及upfcfg.yaml。修改amfcfg.yamlplmnd字段下所有的mncmcc,同时修改ngapIpList中的IP地址为运行核心网的主机上网用的IP地址。比如我的运行核心网的主机IP地址为10.25.18.205,那么:

amfcfg.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
ngapIpList:  # the IP list of N2 interfaces on this AMF
- 10.25.18.205 # 修改这个
...
servedGuamiList: # Guami (Globally Unique AMF ID) list supported by this AMF
# <GUAMI> = <MCC><MNC><AMF ID>
- plmnId: # Public Land Mobile Network ID, <PLMN ID> = <MCC><MNC>
mcc: 466 # 修改这个
mnc: 92 # 修改这个
amfId: cafe00 # AMF identifier (3 bytes hex string, range: 000000~FFFFFF)
supportTaiList: # the TAI (Tracking Area Identifier) list supported by this AMF
- plmnId: # Public Land Mobile Network ID, <PLMN ID> = <MCC><MNC>
mcc: 466 # 修改这个
mnc: 92 # 修改这个
tac: 1 # Tracking Area Code (uinteger, range: 0~16777215)
plmnSupportList: # the PLMNs (Public land mobile network) list supported by this AMF
- plmnId: # Public Land Mobile Network ID, <PLMN ID> = <MCC><MNC>
mcc: 466 # 修改这个
mnc: 92 # 修改这个
snssaiList: # the S-NSSAI (Single Network Slice Selection Assistance Information) list supported by this AMF
- sst: 1 # Slice/Service Type (uinteger, range: 0~255)
sd: 010203 # Slice Differentiator (3 bytes hex string, range: 000000~FFFFFF)
- sst: 1 # Slice/Service Type (uinteger, range: 0~255)
sd: 112233 # Slice Differentiator (3 bytes hex string, range: 000000~FFFFFF)

smfcfg.yaml

修改N3接口的IP地址:

1
2
3
4
interfaces: # Interface list for this UPF
- interfaceType: N3 # the type of the interface (N3 or N9)
endpoints: # the IP address of this N3/N9 interface on this UPF
- 10.25.18.205 # 修改这个

同时也修改plmnlist中的mcc和mnc:

1
2
3
plmnList:
- mmc: 466
- mnc: 92

upfcfg.yaml

修改gtpude的N3接口的IP地址:

1
2
3
4
5
6
7
8
9
gtpu:
forwarder: gtp5g
# The IP list of the N3/N9 interfaces on this UPF
# If there are multiple connection, set addr to 0.0.0.0 or list all the addresses
ifList:
- addr: 10.25.18.205 # 修改这个
type: N3
# name: upf.5gc.nctu.me
# ifname: gtpif

另外还需要修改ausfcfg.yaml,nssfcfg.yaml还有nrfcfg.yaml中的PLMN信息,否则会运行报错。所有需要修改的文件在右侧以”M“标准出来了:

当一切准备就绪后,在free5gc目录下终端运行free5gc:

1
sudo ./run.sh

注意这个终端不要关闭!同时另开一个终端,我们运行Webconsole:

1
2
cd ~/free5gc/webconsole
sudo ./bin/webconsole

这个终端同样也不要关闭!他们两个正常运行起来应该是这样子的,左边是free5gc右边是webconsole,可以有黄色的Warning,但不能有红色的Error:

Webconsole添加订阅信息

打开Webconsole:http://127.0.0.1:5000 ,输入账号admin和密码free5gc登录查看核心网状态。在左侧的SUBSCRIBERs选项中,单击Create按钮创建新的订阅用户,修改订阅用户信息。

以我使用的测试为例,在Webconsole中新增订阅用户,把对应的信息复制到控制台并点击保存。

对应修改

第二部分

OAI RFSIM 配置与使用

进行此步需要你已经安装OAI RAN部分的代码,如不了解请参考OAI RAN 构建指南

创建Nets名称空间命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
sudo ip netns delete ueNameSpace2
sudo ip link delete v-eth2
sudo ip netns add ueNameSpace2
sudo ip link add v-eth2 type veth peer name v-ue2
sudo ip link set v-ue2 netns ueNameSpace2
sudo ip addr add 10.201.1.1/24 dev v-eth2
sudo ip link set v-eth2 up
sudo iptables -t nat -A POSTROUTING -s 10.201.1.0/255.255.255.0 -o {你上网的网卡名称} -j MASQUERADE
sudo iptables -A FORWARD -i {你上网的网卡名称} -o v-eth2 -j ACCEPT
sudo iptables -A FORWARD -o {你上网的网卡名称} -i v-eth2 -j ACCEPT
sudo ip netns exec ueNameSpace2 ip link set dev lo up
sudo ip netns exec ueNameSpace2 ip addr add 10.201.1.2/24 dev v-ue2
sudo ip netns exec ueNameSpace2 ip link set v-ue2 up

注意需要修改{你上网的网卡名称}的内容(包括花括号)。使用ifconfig命令查看网络连接情况并找到自己上网的网卡。

配置gNB和nrUE

gNB的一般配置文件格式参照targets/PROJECTS/GENERIC-NR-5GC/CONF/*.conf中的格式修改。先来到targets/PROJECTS/GENERIC-NR-5GC/CONF文件夹下,把gnb.sa.band78.fr1.106PRB.usrpb210.conf复制一份,重命名为band78-108-rfsim.conf。修改内容有如下几个关键点:plmn中的mmcmnc;以及amf对应的ip地址和gNB和amf之间的接口地址网卡名称

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
plmn_list = ({ mcc = 466; mnc = 92; mnc_length = 2; snssaiList = ({ sst = 1; sd=0x010203; }) });
...
amf_ip_address = ( { ipv4 = "10.25.18.205"; //核心网的ip地址
ipv6 = "192:168:30::17";
active = "yes"; //这个不用管
preference = "ipv4";
}
);

NETWORK_INTERFACES :
{
GNB_INTERFACE_NAME_FOR_NG_AMF = "v-eth2"; //gNB主机上网的网卡名称,新版OAI可能没有这一项
GNB_IPV4_ADDRESS_FOR_NG_AMF = "10.201.1.1/24"; //别改
GNB_INTERFACE_NAME_FOR_NGU = "v-eth2"; //gNB主机上网的网卡名称,新版OAI可能没有这一项
GNB_IPV4_ADDRESS_FOR_NGU = "10.201.1.1/24"; //别改
GNB_PORT_FOR_S1U = 2152; # Spec 2152
};

UE的配置比较简单,只要和刚刚在WebConsole中建立的对应起来即可。在openairinterface5g/openair3/UICC/usim_interface.c修改宏定义的UICC_PARAMS_DESC中的对应.defstrval内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
#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="00001111f833", TYPE_STRING, 0 }, \
{"dnn", "UE dnn (apn)\n", 0, .strptr=&uicc->dnnStr, .defstrval="internet", 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 }, \
};

需要注意的是nssai_sd使用的是十六进制数。写入的信息,需要和核心网中的匹配。另一处和nrUE相关的修改是openair3/NAS/NR_UE/nr_nas_msg_sim.c中搜索if 0,并把0改成1以适配非OAI官方的核心网:

1
2
3
4
5
6
7
8
9
10
11
#if 1 // 原本这是0
/* This cannot be sent in clear, the core network Open5GS rejects the UE.
* TODO: do we have to send this at some point?
* For the time being, let's keep it here for later proper fix.
*/
mm_msg->registration_request.presencemask |= REGISTRATION_REQUEST_5GMM_CAPABILITY_PRESENT;
mm_msg->registration_request.fgmmcapability.iei = REGISTRATION_REQUEST_5GMM_CAPABILITY_IEI;
mm_msg->registration_request.fgmmcapability.length = 1;
mm_msg->registration_request.fgmmcapability.value = 0x7;
size += 3;
#endif

运行基站

在运行基站和nrUE前,最好再重新编译一下:

1
2
3
cd ~/openairinterface5g/cmake_targets

sudo ./build_oai -w USRP --gNB --nrUE --ninja

然后我们运行基站:

1
2
3
cd ~/openairinterface5g/cmake_targets/ran_build/build

sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/band78-106-rfsim.conf --gNBs.[0].min_rxtxtime 6 --rfsim --sa

运行基站时,应该能看到核心网中有NG-Setup的信令:

运行RFSIM仿真

1
2
3
cd ~/openairinterface5g/cmake_targets/ran_build/build

sudo ./nr-uesoftmodem -r 106 --numerology 1 --band 78 -C 3619200000 --sa --rfsim

成功启动UE后,你应该可以在Webconsole中看到你编写的UE处于Connected的状态: