OAILTE代码解读资料Word文档下载推荐.docx
《OAILTE代码解读资料Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《OAILTE代码解读资料Word文档下载推荐.docx(23页珍藏版)》请在冰点文库上搜索。
![OAILTE代码解读资料Word文档下载推荐.docx](https://file1.bingdoc.com/fileroot1/2023-5/5/b0bd27b2-4241-4574-807e-8fd03c795cfc/b0bd27b2-4241-4574-807e-8fd03c795cfc1.gif)
if(RA_template->
generate_rar==1)
后给eNB->
common_channels[CC_id].RA_template[i]->
RA_alloc_pdu1赋值。
然后调用add_common_dci
将eNB->
RA_alloc_pdu1
复制到&
eNB->
common_channels[CC_id].DCI_pdu。
并将ra_flag置1
接着在
这个函数里查到ra_flag为1后
elseif(DCI_pdu->
dci_alloc[i].ra_flag==1)
调用
generate_eNB_dlsch_params_from_dci
将根据DCI里的信息计算出的dlsch的参数放到phy_vars_eNB->
dlsch_eNB_ra,并将phy_vars_eNB->
dlsch_eNB_ra->
active置1。
接着接着在
判断if(phy_vars_eNB->
active==1)
在这个函数里填充RAR。
crnti=mac_xface->
fill_rar
在fill_rar里清除generate_rar标志。
eNB_mac_inst[module_idP].common_channels[CC_id].RA_template[i].generate_rar=0;
根据RAR算出接收MSG3的参数和子帧位置。
并置位Msg3_active。
generate_eNB_ulsch_params_from_rar
phy_vars_eNB->
ulsch_eNB[(uint32_t)UE_id]->
Msg3_active=1;
get_Msg3_alloc(&
lte_frame_parms,
subframe,
phy_vars_eNB->
proc[sched_subframe].frame_tx,
&
Msg3_frame,
Msg3_subframe);
接着物理层处理RAR并清除active标志。
dlsch_encoding
dlsch_scrambling
dlsch_modulation
active=0;
1.3接收MSG3
phy_procedures_eNB_RX
里调用
process_Msg3
这个函数里看Msg3_active是否为1,并且检查是否到了接收Msg3的子帧。
if((phy_vars_eNB->
Msg3_active==1)&
&
(phy_vars_eNB->
Msg3_subframe==subframe)&
Msg3_frame==frame))
phy_vars_eNB->
Msg3_active=0;
Msg3_flag=1;
harq_processes[harq_pid]->
subframe_scheduling_flag=1;
接着在phy_procedures_eNB_RX检查
ulsch_eNB[i])&
ulsch_eNB[i]->
rnti>
0)&
subframe_scheduling_flag==1))
{
ulsch_decoding
if(ret==(1+MAX_TURBO_ITERATIONS))//接收失败,重传MSG3
if(phy_vars_eNB->
Msg3_flag==1)
//到达最大重传次数,取消随机接入
round==
lte_frame_parms.maxHARQ_Msg3Tx)
cancel_ra_proc(phy_vars_eNB->
Mod_id,
phy_vars_eNB->
CC_id,
frame,
eNB_UE_stats[i].crnti);
//Msg3重新,重新计算接收的子帧。
else
ulsch_eNB[(uint32_t)i]->
get_Msg3_alloc_ret(&
subframe,
frame,
&
}
else//接收正确
rx_sdu
Msg3_flag=0;
在这个函数里判断如果是随机接则置位generate_Msg4
if((eNB->
common_channels[CC_id].RA_template[ii].rnti==rntiP)&
(eNB->
common_channels[CC_id].RA_template[ii].RA_active==TRUE))
eNB->
common_channels[CC_id].RA_template[ii].generate_Msg4=1;
common_channels[CC_id].RA_template[ii].wait_ack_Msg4=0;
1.4发送MSG4
elseif(RA_template[i].generate_Msg4==1)
给eNB->
common_channels[CC_id].RA_template[i].RA_alloc_pdu2这个DCI赋值。
RA_template[i].generate_Msg4=0;
RA_template[i].generate_Msg4_dci=1;
RA_template[i].wait_ack_Msg4=1;
RA_template[i].RA_active=FALSE;
generate_Msg4_dci==1)
RA_alloc_pdu2赋值
add_ue_spec_dci
RA_template->
generate_Msg4_dci=0;
elseif(RA_template->
wait_ack_Msg4==1)
if(round>
0)
//重传Msg4
2上行HARQ
2.1eNB检测UE发送上行SR
//checkSRavailability
do_SR=is_SR_subframe(phy_vars_eNB,i,sched_subframe);
if(do_SR==1)
{
metric0=rx_pucch(phy_vars_eNB,
pucch_format1,
i,phy_vars_eNB->
scheduling_request_config[i].sr_PUCCH_ResourceIndex,
0,//n2_pucch
1,//shortenedformat
SR_payload,
PUCCH1_THRES);
if(SR_payload==1)
mac_xface->
SR_indication(phy_vars_eNB->
dlsch_eNB[i][0]->
rnti,subframe);
}
SR_indication
UE_list->
UE_template[cc_idP][UE_id].ul_SR=1;
UE_template[cc_idP][UE_id].ul_active=TRUE;
2.2eNb上行调度BSR和一般调度
schedule_ulsch
schedule_ulsch_rnti
ret=mac_xface->
get_ue_active_harq_pid
if(round==0)//只处理初传
UE_template->
ul_SR=0;
buffer_occupancy=((UE_template->
bsr_info[LCGID0]==0)&
(UE_template->
bsr_info[LCGID1]==0)&
bsr_info[LCGID2]==0)&
bsr_info[LCGID3]==0))?
BSR_TABLE[11]:
//Thisiswhenwe'
vereceivedSRandbuffersarefullyserved
BSR_TABLE[UE_template->
bsr_info[LCGID0]]+
bsr_info[LCGID1]]+
bsr_info[LCGID2]]+
bsr_info[LCGID3]];
根据UE侧要传送的数据大小调整发送的大小,确定rballoc和first_rb。
eNB_mac_inst[module_idP]->
ULSCH_DCI[harq_pid]赋值。
将ULSCH_dci复制到&
common_channels[CC_id].DCI_pdu
add_ue_spec_dci(DCI_pdu,
ULSCH_dci,
rnti,
sizeof(DCI0_5MHz_TDD_1_6_t),
aggregation,
sizeof_DCI0_5MHz_TDD_1_6_t,
format0,
0);
在下行发送format0的DCI的时候,计算出对应的发送PUSCH的上行子帧及HARQid,置位subframe_scheduling_flag。
for(i=0;
i<
DCI_pdu->
Num_common_dci+DCI_pdu->
Num_ue_spec_dci;
i++)
if(DCI_pdu->
dci_alloc[i].format==format0)
{
harq_pid=subframe2harq_pid(&
pdcch_alloc2ul_frame
pdcch_alloc2ul_subframe);
generate_eNB_ulsch_params_from_dciphy_vars_eNB->
subframe_scheduling_flag=1
2.3eNB接收BSR和上行初传和重传
(phy_vars_eNB->
rx_ulsch
ulsch_decoding
if(ret==(1+MAX_TURBO_ITERATIONS))//接收错误
phich_active=1;
phich_ACK=0;
round++;
if(phy_vars_eNB->
round==phy_vars_eNB->
Mdlharq)
eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid]++;
eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid]==ULSCH_max_consecutive_errors)
remove_ue(phy_vars_eNB->
eNB_UE_stats[i].crnti,phy_vars_eNB,abstraction_flag);
else//正确接收
phich_ACK=1;
round=0;
//对于上行调度BSR,会在rx_sdu里处理BSRcontrolelement。
for(i=0;
num_ce;
i++)
caseTRUNCATED_BSR:
caseSHORT_BSR:
UE_template[CC_id][UE_id].bsr_info[lcgid]=(payload_ptr[0]&
0x3f);
caseLONG_BSR:
UE_template[CC_id][UE_id].bsr_info[LCGID0]=((payload_ptr[0]&
0xFC)>
>
2);
UE_list->
UE_template[CC_id][UE_id].bsr_info[LCGID1]=
((payload_ptr[0]&
0x03)<
<
4)|((payload_ptr[1]&
0xF0)>
4);
UE_template[CC_id][UE_id].bsr_info[LCGID2]=
((payload_ptr[1]&
0x0F)<
2)|((payload_ptr[2]&
0xC0)>
6);
UE_template[CC_id][UE_id].bsr_info[LCGID3]=(payload_ptr[2]&
0x3F);
//对于一般接收,将接收到的数据发到高层
num_sdu;
caseCCCH:
mac_rrc_data_ind
caseDCCH:
caseDCCH1:
mac_rlc_data_ind
caseDTCH:
2.4eNB反馈Ack/Nack
if(is_phich_subframe(&
lte_frame_parms,subframe))
generate_phich_top
//根据当前的phich子帧找到对应的上行发送PUSCH的子帧,再找到这个子帧对应的harq_pid
pusch_frame=phich_frame2_pusch_frame
pusch_subframe=phich_subframe2_pusch_subframe;
harq_pid=subframe2harq_pid(frame_parms,pusch_frame,pusch_subframe);
if(ulsch_eNB[UE_id]->
phich_active==1)
generate_phich
phich_ACK==0)
ulsch_eNB[UE_id]->
subframe_scheduling_flag=1;
//ulsch_eNB[UE_id]->
//thisisalreadydoneinphy_procedures
ulsch_eNB[UE_id]->
rvidx=rv_table[ulsch_eNB[UE_id]->
round&
3];
subframe_scheduling_flag=0;
round=0;
phich_active=0;
3下行HARQ
3.1eNB下行初传和重传
schedule_ue_spec
get_ue_active_harq_pid(module_idP,CC_id,rnti,frameP,subframeP,&
harq_pid,&
round,0);
//下行重传
if(round>
0)
//DLSCH_dci)->
ndi=0//NDI末赋值
DLSCH_dci)