OAI 5G-NR源码架构
1 特性范围
目前gNB
和5G-NRUE
支持如下的配置:
- 工作模式:
TDD
- CP长度:
Normal CP
- 子载波间隔:
30kHz
- 信道带宽:
40MHz(106PRB)、80MHz(217PRB)、100MHz(237PRB)
- 天线端口:单波束
- 时隙格式:
14 OFDM
符号 - 编码方式:
LDPC、polar
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 主进程
Main() [nr-softmodem.c]
get_options()
通过解析命令行参数来对系统做配置。
重要的数据结构:RAN_CONTEXT_t, 存储gNb实例、macrlc实例、L1实例,RU实例信息。
netlink_init()
init_pdcp()
create_gNB_tasks(1)
起来几个主要线程
a.itti_create_task(TASK_GNB_APP, gNB_app_task,NULL):
1) L1配置信息初始化
2) 完成对phy层、rlc子层、PDCP子层的初始配置工作,若支持noS1模式,还要读取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接口传来的重配置消息。
nr_schedul_response:MAC与PHY的下行接口处理函数。该函数可对MAC层下行pdu进行调度,包括MIB、PRACH消息、rrc消息业务数据pdu以及一些半动态配置消息,并根据调度结果生成DCI。
4)configure_nr_rrc:初始化RRC实体,生成rrc配置消息,包括物理层及射频单元配置。通知RRC处理线程。
b.itti_create_task(TASK_SCTP, sctp_eNB_task,NULL):
gNB NG-C的接口线程,也可作为F1-C的接口。
c.itti_create_task(TASK_X2AP, x2ap_task,NULL):
X2接口线程
d.itti_create_task(TASK_RRC_GNB, rrc_gnb_task,NULL)
RRC子层的处理线程,主要应包括系统消息、随机接入的Msg3、Msg4相关处理、一些测量相关消息处理
init_gNB()
注册MAC层与PHY层接口回调函数:Nr_ul_indication、nr_phy_config_request、nr_schedul_response(详细描述见4)。
wait_gNBs()
此处采用了停等的模式。至此,系统参数配置以及生效,phy及mac层以上子层均完成初始配置工作。
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
wait_RUs()
此处采用线程同步方式(pthread_cond_signal(&RC.ru_cond),RC.ru_mask)
。至此,包括射频单元在内的所有模块初始配置工作完成。
init_eNB_afterRU()
1) 初始化物理层算法模块使用的数据表格、配置物理层处理过程的一些关键参数
2) 回调函数注册:gNB_top, gNB上/下行数据处理入口函数。
3) 为ULSCH/DLSCH开辟存储buffer
- 至此,所有RU单元及gNB实体ok,发送同步信号(pthread_cond_broadcast(&sync_cond))通知所有处理线程可以开始上/下行数据处理。
2.2.2 ru_thread线程
nr_init_frame_parms()
这里计算了空口帧的许多重要参数信息,包括每帧的时隙数、每子帧的时隙数、每个时隙的符号数、每帧的采样点数、每个时隙的点数、接收/发送天线数、频率范围、帧类型、子载波间隔等信息。
fill_rf_config()
根据numerology
及PRB配置信息得到系统的信道带宽及采用率等信息上下行频点,天线tx_gain,rx_gain等信息
nr_phy_init_RU()
初始化与phy层的接口buffer
openair0_device_load()
加载RF设备库
线程同步,启动RF设备,开始正常的接收发送
上行处理流程
下行处理流程
2.2.3 rrc_gnb_task线程
RRC子层处理线程
- RRC配置/重配置
接收gNB管理线程的rrc配置消息NRRRC_CONFIGURATION_REQ
,调用init_NR_SI
,该函数最终会调用P5接口对底层设备进行配置。如下图所示:
- 副站添加
接收X2接口发送的副站添加消息X2AP_ENDC_SGNB_ADDITION_REQ
2.2.4 随机接入过程
- preamble接收
调用函数L1_nr_prach_procedures()
在上行PRACH信道上接收preamble,最多能检测到64个preamble。获取preamble序列,找到当前root序列下的preamble循环偏移位置,计算输出检测到的pramble的TA(时间调整值)和能量。
选取能量最大的preamble
gNB->UL_INFO.rach_ind.number_of_pdus = 1,
发起随机接入流程
- 初始化发起随机接入
handle_nr_rach()
调用nr_initiate_ra_proc()
将状态改为 ra->state = Msg2
初始化随机接入过程
- 发送RAR
nr_schedule_RA()
nr_generate_Msg2()
生成Msg2,分别处理DCI,PDCCH,PDSCH
设置,
赋值tx_req
在发送时隙,调用phy_procedures_gNB_TX()
生成DCI
执行PDCCH、PDSCH
过程
将状态改为 ra->state = WAIT_Msg3
- 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()
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