OAI L3 与 L2 接口分析
1. RRC 与 PDCP 接口
1.1 上行数据
上行数据主要为 RRC Setup Complete,ULInformationTransfer 等。
PDCP 在 deliver_sdu_srb()中调用 itti_alloc_new_message()函数 malloc 新的消息体,消息 ID 为 NR_RRC_DCCH_DATA_IND;随后调用 itti_send_msg_to_task()将消息体 insert 到 TASK_RRC_GNB 的 queue 中。
RRC 在 rrc_gnb_task()中调用 itti_receive_msg()循环从自身队列里取数据,解析判断为 NR_RRC_DCCH_DATA_IND,进行 DCCH 解码。
1.2 下行数据
下行数据主要为 RRC Release,DLInformationTransfer 等。
RRC 调用 nr_rrc_data_req()发送消息,itti_alloc_new_message()函数 malloc 新的消息体,消息 ID 为 RRC_DCCH_DATA_REQ,itti_send_msg_to_task()将消息体 insert 到 TASK_PDCP_ENB 的 queue 中。
PDCP 在 pdcp_run()中调用 itti_poll_msg()函数从自身队列里取数据,判断消息 ID 为 RRC_DCCH_DATA_REQ 还是 RRC_PCCH_DATA_REQ。
2. RRC 与 MAC 接口
2.1 上行数据
上行数据主要为 CCCH 信道的 RRC Setup request,nr_process_mac_pdu()判断 LCID 类别为 CCCH 时,调用 RRC 模块内的 nr_mac_rrc_data_in(),调用时将 pdu 作为函数入参传到了 RRC 层。
2.2 下行数据
下行数据包括 MIB,SIB1,RRC Setup,RRC Reject,这部分数据传递并不以消息或队列形式来进行。
MIB,SIB1 数据 buffer 生成以后,存放于 RC.nrrrc[gnb_mod_idP]中。RRC Setup,RRC Reject 生成后,存放于 ue_context_p->Srb0.Tx_buffer.Payload 中,ue_context_p 是根节点在 RC.nrrrc 的红黑树结构。所有数据都是在创建时 malloc,并没有提前统一规划一片内存。
MIB 获取:MAC 在 schedule_nr_mib()函数中调用 mac_rrc_nr_data_req(),从 RC.nrrrc[Mod_idP]->carrier.MIB 获取 MIB;
SIB1 获取:MAC 在 schedule_nr_sib1()函数中调用 mac_rrc_nr_data_req(),从 RC.nrrrc[Mod_idP]->carrier.SIB1 获取 SIB1;
RRC Setup 或 RRC Reject 获取:MAC 在 nr_generate_Msg4()函数中调用 mac_rrc_nr_data_req(),从 ue_context_p->ue_context.Srb0.Tx_buffer.Payload 获取 RRC Setup 和 RRC reject。
RAN_CONTEXT_t RC 定义在 Nr-uesoftmodem.c,与主函数 main 在同一文件。
mac_rrc_nr_data_req()位于 L2_nr_interface.c,该文件处于 rrc 目录
2.3 下行参数配置
RRC setup 生成以后,RRC 会给 MAC、PDCP、RLC 发送配置命令,在 RRC 调用 MAC 层的 rrc_mac_config_req_gNB(),将 CellGroupConfig 作为入参传给 MAC,CellGroupConfig 包括 drx,bsr,phr 等配置信息。同时调用 RLC 层的 nr_rrc_rlc_config_asn1_req()和 PDCP 层的 nr_rrc_pdcp_config_asn1_req()将 RNTI 和 UE 上下文的 SRB_configList 传到对应模块。
版权声明: 本文为 InfoQ 作者【柒号华仔】的原创文章。
原文链接:【http://xie.infoq.cn/article/3aa8047cf9401d760b6697ea1】。文章转载请联系作者。
评论