OAI 5G-NR 源码架构分析
1 特性范围
目前 gNB 和 5G-NRUE 支持如下的配置
工作模式:TDD
CP 长度:Normal CP
子载波间隔: 30kHz
信道带宽:40MHz(106PRB)、80MHz(217PRB)、100MHz(237PRB)
天线端口:单波束
时隙格式:14 OFDM 符号
编码方式:LDPC、polar
当前开源项目进展:
具备 EN-DC 功能,从开发进展来看还有一些 bug;
SA 还在开发中,RRC、SDAP、N2 Interface 和 N3 Interface 还在开发中,随机接入的调
试中,Msg2 还不能被 UE 成功解析。
2 gNB 源码解析
2.1 代码框架时序图
gNB 源码主框架图如下图所示。
Main:主进程,主要功能包括:
1) 命令行参数解析
2) 系统配置文件解析
3) 各子层初始化工作,包括重要数据结构、接口初始化工作
4) 线程初始化,gNB 管理线程、包括 RRC 层处理线程、rx/tx 处理线程、传输网接口线程、
x2 口交互线程
5) 射频 phy 层及 RU 单元初始化及配置工作
6) 物理层算法模块数据初始化
7) 用户面数据业务缓存开辟
gNB_app_task:gNB 管理线程,主要功能包括:
1) gNB 主要数据结构初始化 RCconfig
2) MAC 层与 PHY 层的 P5&P7 接口初始化,回调函数注册
3) 调用 P5 接口向 RRC 发送承载配置命令
4) 处理核心网下发的一些消息
5) 处理各种超时处理消息等
rrc_gnb_task:RRC 处理线程,主要功能包括:
1) RRC 配置消息处理,如果支持 NSA 方式,还需要处理 MN 设备发送的 RRC 重配置消息。
2) 双连接副站添加相关处理
3) 随机接入消息处理(Msg3,Msg4)
4) 测量相关处理
5) 系统消息处理
sctp_eNB_task:传输网接口线程,主要功能包括:
1) NG 口连接建立相关的消息处理
2) 与 F1AP 控制面的消息处理(包括 CU 和 DU 两部分)
ru_thread:rx/tx 处理线程,主要功能包括:
1) RU 设备库加载
2) 上行流程处理,包括 PHY、MAC、RLC、PDCP
3) 下行流程处理, 包括 PHY、MAC、RLC、PDCP
2.2 重要函数及过程
2.2.1 主进程
[nr-softmodem.c]
Main()
1. get_options()
通过解析命令行参数来对系统做配置。
重要的数据结构:RAN_CONTEXT_t, 存储 gNb 实例、macrlc 实例、L1 实例,RU 实例信息。
2. netlink_init()
3.
init_pdcp()
4.
create_gNB_tasks(1)
起来几个主要线程
a.
1) L1 配置信息初始化
2) 完成对 phy 层、rlc 子层、PDCP 子层的初始配置工作,若支持 noS1 模式,还要读
itti_create_task(TASK_GNB_APP, gNB_app_task,NULL):
取 rrc 子层的配置信息。
3) 初始化 MAC 与 PHY 之间的接口(具体描述详见 ),回调函数注册:
Nr_ul_indication:层 2 上行接收接口函数,当物理层从空口接收到上行数据,经
过物理层过程后将会触发该函数将解码后的数据 pdu 上送至 MAC 层
nr_phy_config_request:系统参数配置入口处理函数。在 SA 模式下,系统读取初
始化配置文件,然后将其传送给 RRC 层,RRC 层根据配置文件信息形成 RRC message
(如:SI 系统消息),在 5G NR NSA 模式下,其接收的配置消息基本上就是 MIB 以及
服务小区从 X2 接口传来的重配置消息。(目前 SA 下该过程还没有)
nr_schedul_response:MAC 与 PHY 的下行接口处理函数。该函数可对 MAC 层下
行 pdu 进行调度,包括 MIB、PRACH 消息、rrc 消息业务数据 pdu 以及一些半动态配
置消息,并根据调度结果生成 DCI。
4) configure_nr_rrc:初始化 RRC 实体,生成 rrc 配置消息,包括物理层及射频单元配
置。通知 RRC 处理线程。
b.
c.
d.
itti_create_task(TASK_SCTP, sctp_eNB_task,NULL):
gNB NG-C 的接口线程,也可作为 F1-C 的接口。
itti_create_task(TASK_X2AP, x2ap_task,NULL):
X2 接口线程
itti_create_task(TASK_RRC_GNB, rrc_gnb_task,NULL)
RRC 子层的处理线程,主要应包括系统消息、随机接入的 Msg3、Msg4 相关处理、
一些测量相关消息处理(但目前该部分只有初始的静态配置消息处理以及 X2 接口收到的 rrc
重配置消息,其他部分有待后续跟踪关注)。
5.
init_gNB()
注 册 MAC 层 与 PHY 层 接 口 回 调 函 数 : Nr_ul_indication 、 nr_phy_config_request 、
nr_schedul_response(详细描述见 4)。
6. wait_gNBs()
此处采用了停等的模式。至此,系统参数配置以及生效,phy 及 mac 层以上子层均完
成初始配置工作。
7.
init_NR_RU()
1) 射频单元参数初始化。主要参数包括:uhd driver 地址、类型、同步时钟源,接收
增益,参考信号能量等。
2) 回调函数注册,主要回调有:
ru->fh_south_in:RU 与 phy 的上行接口处理函数
ru->fh_south_out:RU 与 phy 的下行接口处理函数
ru->feptx_ofdm:射频前端处理函数
ru->feprx :射频前端处理函数
3) init_RU_proc():空口线程管理,此处起了 gNB 上下行处理的主线程 ru_thread
8. wait_RUs()
此处采用线程同步方式(pthread_cond_signal(&RC.ru_cond),RC.ru_mask)。至此,包
括射频单元在内的所有模块初始配置工作完成。
9.
init_eNB_afterRU()
1) 初始化物理层算法模块使用的数据表格、配置物理层处理过程的一些关键参数
2) 回调函数注册:gNB_top, gNB 上/下行数据处理入口函数。
3) 为 ULSCH/DLSCH 开辟存储 buffer
10. 至此,所有 RU 单元及 gNB 实体 ok,发送同步信号(pthread_cond_broadcast(&sync_cond))
通知所有处理线程可以开始上/下行数据处理。
2.2.2 ru_thread 线程
1. nr_init_frame_parms()
这里计算了空口帧的许多重要参数信息,包括每帧的时隙数、每子帧的时隙数、每个时
隙的符号数、每帧的采样点数、每个时隙的点数、接收/发送天线数、频率范围、帧类型、
子载波间隔等信息。
2.
fill_rf_config()
根据 numerology 及 PRB 配置信息得到系统的信道带宽及采用率等信息上下
行频点,天线 tx_gain,rx_gain 等信息
3. nr_phy_init_RU()
初始化与 phy 层的接口 buffer
4. openair0_device_load()
加载 RF 设备库
5. 线程同步,启动 RF 设备,开始正常的接收发送
6. 上行处理流程
7. 下行处理流程
2.2.3 rrc_gnb_task 线程
RRC 子层处理线程
1. RRC 配置/重配置
接收 gNB 管理线程的 rrc 配置消息 NRRRC_CONFIGURATION_REQ,调用 init_NR_SI,该函
数最终会调用 P5 接口对底层设备进行配置。如下图所示:
2. 副站添加
接收 X2 接口发送的副站添加消息 X2AP_ENDC_SGNB_ADDITION_REQ
2.2.4 随机接入过程
1. preamble 接收
调用函数 L1_nr_prach_procedures()在上行 PRACH 信道上接收 preamble,最多能检测
到 64 个 preamble。获取 preamble 序列,找到当前 root 序列下的 preamble 循环偏移
位置,计算输出检测到的 pramble 的 TA(时间调整值)和能量。
选取能量最大的 preamble
gNB->UL_INFO.rach_ind.number_of_pdus = 1, 发起随机接入流程
2. 初始化发起随机接入
handle_nr_rach()
调用 nr_initiate_ra_proc()
将状态改为 ra->state = Msg2
初始化随机接入过程
3. 发送 RAR
nr_schedule_RA()
nr_generate_Msg2()生成 Msg2,分别处理 DCI,PDCCH,PDSCH 设置,
赋值 tx_req
在发送时隙,调用 phy_procedures_gNB_TX()
生成 DCI
执行 PDCCH、PDSCH 过程
将状态改为 ra->state = WAIT_Msg3
4. Msg3 接收
调用 nr_schedule_reception_msg3()存储 msg3 主要信息(ul_req):包大小,包地址,
当前帧号和时隙。
ifi->NR_Schedule_response[回调函数:nr_schedule_response]
调用函数 handle_nfapi_nr_ul_dci_pdu 解出 ul dci
调用函数 nr_fill_ulsch()根据 dci 找到 ulsch 位置
在 物 理 层 接 收 主 函 数 phy_procedures_gNB_uespec_RX 中 调 用 函 数
nr_ulsch_procedures()
调用函数 nr_ulsch_decoding()得到解码后的 mac_pdu
rx_ind.number_of_pdus++ , crc_ind.number_crcs++
mac 上行接收主函数中调用 nr_rx_sdu()
注:openairinterface5g-NR_RRC_PRACH_procedures 分支中并无提供 Msg3 sdu 的解析处理。
2.3 数据结构
3 接口
3.1 nFAPI(P5 &P7)
3.1.1 架构
FAPI 提供了 MAC 层与 PHY 层之间的接口,实现了 phy 层与 mac 层的分离,其接口架
构如下图所示,其中 P5 口主要用于传送静态配置信息,P7 口主要用来传送数据和半动态配
置信息。
3.1.2 过程
如上图所示,MAC 层从命令行或配置文件获取系统配置参数,然后将其传送至 RRC 层,
RRC 层会通过 P5 接口触发 nr_phy_config_req()对 PHY 及 RU 进行配置。在 5G NR NSA 方式
下,RRC 子层接收从 X2 接口来的主校区 rrc 重配置消息。
对于半动态配置消息以及用户面数据信息的传送,MAC 层与 PHY 层之间使用 P7 接口,
对于上行数据,触发 nr_ul_indication();对于下行数据,触发 nr_schedule_response()。
NR_UL_INDICATION
NR_SCHEDULE_RESPONNSE
TX_REQ
携带从 MAC 层到 PHY 层的 PDU.
RX_IND
携带从 PHY 层到 MAC 层的 PDU
3.2 EN-DC
gNB 支持双连接模式下的 UE 接入,eNB 作为主站 MN,gNB 作为副站 SN。
3.2.1 架构
如下图所示,针对控制信令,gNB 可以通过 X2-C 接口传递给 eNB,再由 eNB 与 EPC
和 UE 进行通信。针对数据信息,gNB 可以通过 X2-U 接口传递给 eNB,再由 eNB 与 EPC
和 UE 进行通信。针对于核心网交互的数据报文,可以通过 S1-U 接口直接与 EPC 进行通信,
也可以通过 X2-U 接口转交给 eNB,再由其将数据发送至 EPC。
3.2.2 过程
副站添加过程如上图所示,过程描述如下:
1. MN 向 SN 发送 SgNB Addition Request 请求为 UE 分配无线资源,消息中包括:UE 的能
力;最近一次的测量结果;SRB3 的安全验证信息;X2-U 的隧道地址配置信息;Qos level
等信息
2. gNB rrc 处理进程处理该消息,调用函数 rrc_gNB_process_AdditionInformation,副小区组
参 数 中 包 括 无 线 承 载 配 置 以 及 RACH 专 用 配 置 参 数 两 个 部 分 , 前 者 会 触 发
rrc_mac_config_gNB 函数调用 F5 接口开始物理层参数设置过程。后者是为了与 UE 发起
随机接入过程。
3. gNB 发送 SgNB Addition Request Acknowledge 给 eNB。其中 SgNB Addition Request
Acknowledge 包含:分配的无线资源,…
5-9.eNB 接收 SgNB Addition Request Acknowledge 消息,生成RRC重配置消息,发送给
UE。
10.UE收到重配置消息后检测是否所有的配置信息都满足,然后向eNB回复重配置完成
消息,消息中携带NR RRC Response消息
11-12. 一旦eNB收到了重配置完成消息,则通知gNB,表示UE已经完成了rrc重
配置过程
13-15. 如果配置的承载有副小区的无线资源,UE 将执行与 SN 的随机接入过程,并发送
RRCConnectionReconfigurationComplete消息。
16. MN 向 SN 发送 SN status Transfer
17. MN 将其上的数据业务转给 SN,并撤销其对 UE 的无线承载
18 - 21.数据路径更新
3.3 F1AP(CU-DU)[38.401 38.473]
F1AP 提供 gNB-CU 节点与 gNB-DU 节点之间的信令服务。服务分为两类:
1)非 UE 相关服务:在 gNB-CU 与 gNB-DU 之间建立 F1 接口实例。
2)UE 相关服务:为 UE 接入核心网提供信令和数据连接。
代码驻留目录 openair2->F1AP