Merge remote-tracking branch 'origin/336-fhg-embms-changes' into develop_integration_2018_w35
This commit is contained in:
@@ -450,11 +450,11 @@ void phy_config_sib2_eNB(uint8_t Mod_id,
|
||||
} else if (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_fourFrames) { // 24-bit subframe configuration
|
||||
fp->MBSFN_config[i].fourFrames_flag = 1;
|
||||
fp->MBSFN_config[i].mbsfn_SubframeConfig =
|
||||
mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]|
|
||||
mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[2]|
|
||||
(mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[1]<<8)|
|
||||
(mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[2]<<16);
|
||||
(mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]<<16);
|
||||
|
||||
LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %d\n", i,
|
||||
LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %x\n", i,
|
||||
fp->MBSFN_config[i].mbsfn_SubframeConfig);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -165,11 +165,11 @@ void phy_config_sib2_ue(module_id_t Mod_id,int CC_id,
|
||||
} else if (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_fourFrames) { // 24-bit subframe configuration
|
||||
fp->MBSFN_config[i].fourFrames_flag = 1;
|
||||
fp->MBSFN_config[i].mbsfn_SubframeConfig =
|
||||
mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]|
|
||||
mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[2]|
|
||||
(mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[1]<<8)|
|
||||
(mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[2]<<16);
|
||||
(mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]<<16);
|
||||
|
||||
LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %d\n", i,
|
||||
LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %x\n", i,
|
||||
fp->MBSFN_config[i].mbsfn_SubframeConfig);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -61,8 +61,8 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
temp = 0;
|
||||
|
||||
for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
|
||||
Re = ((int16_t*)ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_id][aa])[(i<<2)];
|
||||
Im = ((int16_t*)ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_id][aa])[1+(i<<2)];
|
||||
Re = ((int16_t*)ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_id][aa])[(i<<1)];
|
||||
Im = ((int16_t*)ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_id][aa])[1+(i<<1)];
|
||||
temp += (Re*Re/2) + (Im*Im/2);
|
||||
}
|
||||
|
||||
@@ -81,7 +81,7 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
// do not filter to have proactive timing adjustment
|
||||
max_pos_fil = max_pos;
|
||||
|
||||
if(subframe == 6)
|
||||
if(subframe == 5)
|
||||
{
|
||||
diff = max_pos_fil - (frame_parms->nb_prefix_samples>>3);
|
||||
|
||||
|
||||
@@ -62,8 +62,8 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
temp = 0;
|
||||
|
||||
for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
|
||||
Re = ((int16_t*)ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_id][aa])[(i<<2)];
|
||||
Im = ((int16_t*)ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_id][aa])[1+(i<<2)];
|
||||
Re = ((int16_t*)ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_id][aa])[(i<<1)];
|
||||
Im = ((int16_t*)ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_id][aa])[1+(i<<1)];
|
||||
temp += (Re*Re/2) + (Im*Im/2);
|
||||
}
|
||||
|
||||
@@ -82,7 +82,7 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
// do not filter to have proactive timing adjustment
|
||||
max_pos_fil = max_pos;
|
||||
|
||||
if(subframe == 6)
|
||||
if(subframe == 5)
|
||||
{
|
||||
diff = max_pos_fil - (frame_parms->nb_prefix_samples>>3);
|
||||
|
||||
|
||||
@@ -54,9 +54,9 @@ void lte_gold_mbsfn(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_mbsfn_tabl
|
||||
for (l=0; l<3; l++) {
|
||||
|
||||
if (l==0)
|
||||
x2 = (Nid_mbsfn) + (((1+(Nid_mbsfn<<1))*(1 + 2 + (7*(1+(sfn>>1)))))<<9); //cinit
|
||||
x2 = (Nid_mbsfn) + (((1+(Nid_mbsfn<<1))*(1 + 2 + (7*(1+(sfn<<1)))))<<9); //cinit
|
||||
else
|
||||
x2 = (Nid_mbsfn) + (((1+(Nid_mbsfn<<1))*(1 + ((l-1)<<2) + (7*(2+(sfn>>1)))))<<9); //cinit
|
||||
x2 = (Nid_mbsfn) + (((1+(Nid_mbsfn<<1))*(1 + ((l-1)<<2) + (7*(2+(sfn<<1)))))<<9); //cinit
|
||||
|
||||
//x2 = frame_parms->Ncp + (Nid_cell<<1) + (1+(Nid_cell<<1))*(1 + (3*l) + (7*(1+ns))); //cinit
|
||||
//n = 0
|
||||
|
||||
@@ -27,6 +27,7 @@ int is_pmch_subframe(uint32_t frame, int subframe, LTE_DL_FRAME_PARMS *frame_par
|
||||
|
||||
uint32_t period;
|
||||
uint8_t i;
|
||||
uint8_t j;
|
||||
|
||||
// LOG_D(PHY,"is_pmch_subframe: frame %d, subframe %d, num_MBSFN_config %d\n",
|
||||
// frame,subframe,frame_parms->num_MBSFN_config);
|
||||
@@ -34,8 +35,8 @@ int is_pmch_subframe(uint32_t frame, int subframe, LTE_DL_FRAME_PARMS *frame_par
|
||||
for (i=0; i<frame_parms->num_MBSFN_config; i++) { // we have at least one MBSFN configuration
|
||||
period = 1<<frame_parms->MBSFN_config[i].radioframeAllocationPeriod;
|
||||
|
||||
if ((frame % period) == frame_parms->MBSFN_config[i].radioframeAllocationOffset) {
|
||||
if (frame_parms->MBSFN_config[i].fourFrames_flag == 0) {
|
||||
if (frame_parms->MBSFN_config[i].fourFrames_flag == 0) {
|
||||
if ((frame % period) == frame_parms->MBSFN_config[i].radioframeAllocationOffset) {
|
||||
if (frame_parms->frame_type == FDD) {
|
||||
switch (subframe) {
|
||||
|
||||
@@ -108,9 +109,96 @@ int is_pmch_subframe(uint32_t frame, int subframe, LTE_DL_FRAME_PARMS *frame_par
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} else { // handle 4 frames case
|
||||
} else { // handle 4 frames case
|
||||
|
||||
for(j=0;j<4;j++) {
|
||||
if ((frame % period) == (frame_parms->MBSFN_config[i].radioframeAllocationOffset + j)) {
|
||||
if (frame_parms->frame_type == FDD) {
|
||||
switch (subframe) {
|
||||
case 1:
|
||||
if (((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig) & (0x800000>>(j*6))) > 0) {
|
||||
//LOG_E(PHY,"SubframeConfig<<6(%x),MBSFN_FDD_SF1(%x)\n",frame_parms->MBSFN_config[i].mbsfn_SubframeConfig,0x800000>>(j*6));
|
||||
return(1);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 2:
|
||||
if (((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig) & (0x400000>>(j*6))) > 0) {
|
||||
//LOG_E(PHY,"SubframeConfig<<6(%x),MBSFN_FDD_SF1(%x)\n",frame_parms->MBSFN_config[i].mbsfn_SubframeConfig,0x400000>>(j*6));
|
||||
return(1);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 3:
|
||||
if (((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig) & (0x200000>>(j*6))) > 0) {
|
||||
//LOG_E(PHY,"SubframeConfig<<6(%x),MBSFN_FDD_SF1(%x)\n",frame_parms->MBSFN_config[i].mbsfn_SubframeConfig,0x200000>>(j*6));
|
||||
return(1);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 6:
|
||||
if (((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig) & (0x100000>>(j*6))) > 0) {
|
||||
//LOG_E(PHY,"SubframeConfig<<6(%x),MBSFN_FDD_SF1(%x)\n",frame_parms->MBSFN_config[i].mbsfn_SubframeConfig,0x100000>>(j*6));
|
||||
return(1);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 7:
|
||||
if (((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig) & (0x80000>>(j*6))) > 0) {
|
||||
//LOG_E(PHY,"SubframeConfig<<6(%x),MBSFN_FDD_SF1(%x)\n",frame_parms->MBSFN_config[i].mbsfn_SubframeConfig,0x80000>>(j*6));
|
||||
return(1);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 8:
|
||||
if (((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig) & (0x40000>>(j*6))) > 0) {
|
||||
//LOG_E(PHY,"SubframeConfig<<6(%x),MBSFN_FDD_SF1(%x)\n",frame_parms->MBSFN_config[i].mbsfn_SubframeConfig,0x40000>>(j*6));
|
||||
return(1);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
switch (subframe) {
|
||||
case 3:
|
||||
if (((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig>>j*6) & MBSFN_TDD_SF3) > 0)
|
||||
return(1);
|
||||
|
||||
break;
|
||||
|
||||
case 4:
|
||||
if (((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig>>j*6) & MBSFN_TDD_SF4) > 0)
|
||||
return(1);
|
||||
|
||||
break;
|
||||
|
||||
case 7:
|
||||
if (((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig>>j*6) & MBSFN_TDD_SF7) > 0)
|
||||
return(1);
|
||||
|
||||
break;
|
||||
|
||||
case 8:
|
||||
if (((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig>>j*6) & MBSFN_TDD_SF8) > 0)
|
||||
return(1);
|
||||
|
||||
break;
|
||||
|
||||
case 9:
|
||||
if (((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig>>j*6) & MBSFN_TDD_SF9) > 0)
|
||||
return(1);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -179,29 +179,29 @@ void extract_dci1C_info(uint8_t N_RB_DL, lte_frame_type_t frame_type, void *dci_
|
||||
|
||||
uint32_t rballoc=0;
|
||||
uint8_t mcs=0;
|
||||
uint8_t Ngap=0;
|
||||
|
||||
switch (N_RB_DL) {
|
||||
case 6:
|
||||
mcs = ((DCI1C_5MHz_t *)dci_pdu)->mcs;
|
||||
rballoc = conv_1C_RIV(((DCI1C_5MHz_t *)dci_pdu)->rballoc,6);
|
||||
|
||||
mcs = ((DCI1C_1_5MHz_t *)dci_pdu)->mcs;
|
||||
rballoc = conv_1C_RIV(((DCI1C_1_5MHz_t *)dci_pdu)->rballoc, 6);
|
||||
break;
|
||||
|
||||
case 25:
|
||||
mcs = ((DCI1C_5MHz_t *)dci_pdu)->mcs;
|
||||
rballoc = conv_1C_RIV(((DCI1C_5MHz_t *)dci_pdu)->rballoc,6);
|
||||
|
||||
mcs = ((DCI1C_5MHz_t *)dci_pdu)->mcs;
|
||||
rballoc = conv_1C_RIV(((DCI1C_5MHz_t *)dci_pdu)->rballoc, 25);
|
||||
break;
|
||||
|
||||
case 50:
|
||||
mcs = ((DCI1C_10MHz_t *)dci_pdu)->mcs;
|
||||
rballoc = conv_1C_RIV(((DCI1C_10MHz_t *)dci_pdu)->rballoc,6);
|
||||
|
||||
mcs = ((DCI1C_10MHz_t *)dci_pdu)->mcs;
|
||||
rballoc = conv_1C_RIV(((DCI1C_10MHz_t *)dci_pdu)->rballoc, 50);
|
||||
Ngap = ((DCI1C_10MHz_t *)dci_pdu)->Ngap;
|
||||
break;
|
||||
|
||||
case 100:
|
||||
mcs = ((DCI1C_20MHz_t *)dci_pdu)->mcs;
|
||||
rballoc = conv_1C_RIV(((DCI1C_20MHz_t *)dci_pdu)->rballoc,6);
|
||||
mcs = ((DCI1C_20MHz_t *)dci_pdu)->mcs;
|
||||
rballoc = conv_1C_RIV(((DCI1C_20MHz_t *)dci_pdu)->rballoc, 100);
|
||||
Ngap = ((DCI1C_20MHz_t *)dci_pdu)->Ngap;
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -211,6 +211,7 @@ void extract_dci1C_info(uint8_t N_RB_DL, lte_frame_type_t frame_type, void *dci_
|
||||
|
||||
pdci_info_extarcted->mcs1 = mcs;
|
||||
pdci_info_extarcted->rballoc = rballoc;
|
||||
pdci_info_extarcted->Ngap = Ngap;
|
||||
}
|
||||
|
||||
void extract_dci1_info(uint8_t N_RB_DL, lte_frame_type_t frame_type, void *dci_pdu, DCI_INFO_EXTRACTED_t *pdci_info_extarcted)
|
||||
|
||||
@@ -2516,7 +2516,7 @@ void ue_measurement_procedures(
|
||||
T_INT((int)ue->common_vars.freq_offset));
|
||||
}
|
||||
|
||||
if (l==(6-ue->frame_parms.Ncp)) {
|
||||
if (( (slot%2) == 0) && (l==(6-ue->frame_parms.Ncp))) {
|
||||
|
||||
// make sure we have signal from PSS/SSS for N0 measurement
|
||||
// LOG_I(PHY," l==(6-ue->frame_parms.Ncp) ue_rrc_measurements\n");
|
||||
@@ -2982,18 +2982,18 @@ LOG_DEBUG_END
|
||||
|
||||
else if ((ue->prach_resources[eNB_id]) &&
|
||||
(dci_alloc_rx[i].rnti == ue->prach_resources[eNB_id]->ra_RNTI) &&
|
||||
(dci_alloc_rx[i].format == format1A)) {
|
||||
((dci_alloc_rx[i].format == format1A) || (dci_alloc_rx[i].format == format1C))) {
|
||||
|
||||
LOG_DEBUG_BEGIN(DEBUG_UE_PHYPROC)
|
||||
LOG_D(PHY,"[UE %d][RAPROC] subframe %d: Found RA rnti %x, format 1A, dci_cnt %d\n",ue->Mod_id,subframe_rx,dci_alloc_rx[i].rnti,i);
|
||||
LOG_D(PHY,"[UE %d][RAPROC] subframe %d: Found RA rnti %x, format 1%s, dci_cnt %d\n",ue->Mod_id,subframe_rx,dci_alloc_rx[i].rnti,dci_alloc_rx[i].format==format1A?"A":"C",i);
|
||||
LOG_DEBUG_END
|
||||
|
||||
|
||||
if (generate_ue_dlsch_params_from_dci(frame_rx,
|
||||
subframe_rx,
|
||||
(DCI1A_5MHz_TDD_1_6_t *)&dci_alloc_rx[i].dci_pdu,
|
||||
(void *)&dci_alloc_rx[i].dci_pdu,
|
||||
ue->prach_resources[eNB_id]->ra_RNTI,
|
||||
format1A,
|
||||
dci_alloc_rx[i].format,
|
||||
ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id],
|
||||
ue->pdsch_vars_ra[eNB_id],
|
||||
&ue->dlsch_ra[eNB_id],
|
||||
@@ -3128,7 +3128,7 @@ void ue_pmch_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc,int eNB_id,int abs
|
||||
// LOG_D(PHY,"ue calling pmch subframe ..\n ");
|
||||
|
||||
LOG_D(PHY,"[UE %d] Frame %d, subframe %d: Querying for PMCH demodulation\n",
|
||||
ue->Mod_id,(subframe_rx==9?-1:0)+frame_rx,subframe_rx);
|
||||
ue->Mod_id,frame_rx,subframe_rx);
|
||||
#if (RRC_VERSION >= MAKE_VERSION(10, 0, 0))
|
||||
|
||||
pmch_mcs = ue_query_mch(ue->Mod_id,
|
||||
@@ -3147,9 +3147,7 @@ void ue_pmch_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc,int eNB_id,int abs
|
||||
LOG_D(PHY,"[UE %d] Frame %d, subframe %d: Programming PMCH demodulation for mcs %d\n",ue->Mod_id,frame_rx,subframe_rx,pmch_mcs);
|
||||
fill_UE_dlsch_MCH(ue,pmch_mcs,1,0,0);
|
||||
|
||||
|
||||
for (l=2; l<12; l++) {
|
||||
|
||||
slot_fep_mbsfn(ue,
|
||||
l,
|
||||
subframe_rx,
|
||||
@@ -3164,6 +3162,8 @@ void ue_pmch_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc,int eNB_id,int abs
|
||||
}
|
||||
|
||||
|
||||
ue->dlsch_MCH[0]->harq_processes[0]->Qm = get_Qm(pmch_mcs);
|
||||
|
||||
ue->dlsch_MCH[0]->harq_processes[0]->G = get_G(&ue->frame_parms,
|
||||
ue->dlsch_MCH[0]->harq_processes[0]->nb_rb,
|
||||
ue->dlsch_MCH[0]->harq_processes[0]->rb_alloc_even,
|
||||
@@ -3177,7 +3177,14 @@ void ue_pmch_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc,int eNB_id,int abs
|
||||
dlsch_unscrambling(&ue->frame_parms,1,ue->dlsch_MCH[0],
|
||||
ue->dlsch_MCH[0]->harq_processes[0]->G,
|
||||
ue->pdsch_vars_MCH[0]->llr[0],0,subframe_rx<<1);
|
||||
|
||||
|
||||
LOG_D(PHY,"start turbo decode for MCH %d.%d --> nb_rb %d \n", frame_rx, subframe_rx, ue->dlsch_MCH[0]->harq_processes[0]->nb_rb);
|
||||
LOG_D(PHY,"start turbo decode for MCH %d.%d --> rb_alloc_even %x \n", frame_rx, subframe_rx, (unsigned int)((intptr_t)ue->dlsch_MCH[0]->harq_processes[0]->rb_alloc_even));
|
||||
LOG_D(PHY,"start turbo decode for MCH %d.%d --> Qm %d \n", frame_rx, subframe_rx, ue->dlsch_MCH[0]->harq_processes[0]->Qm);
|
||||
LOG_D(PHY,"start turbo decode for MCH %d.%d --> Nl %d \n", frame_rx, subframe_rx, ue->dlsch_MCH[0]->harq_processes[0]->Nl);
|
||||
LOG_D(PHY,"start turbo decode for MCH %d.%d --> G %d \n", frame_rx, subframe_rx, ue->dlsch_MCH[0]->harq_processes[0]->G);
|
||||
LOG_D(PHY,"start turbo decode for MCH %d.%d --> Kmimo %d \n", frame_rx, subframe_rx, ue->dlsch_MCH[0]->Kmimo);
|
||||
|
||||
ret = dlsch_decoding(ue,
|
||||
ue->pdsch_vars_MCH[0]->llr[0],
|
||||
&ue->frame_parms,
|
||||
@@ -3206,7 +3213,7 @@ void ue_pmch_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc,int eNB_id,int abs
|
||||
ue->dlsch_MCH[0]->harq_processes[0]->TBS>>3,
|
||||
ue->dlsch_MCH[0]->max_turbo_iterations,
|
||||
ue->dlsch_MCH[0]->harq_processes[0]->G);
|
||||
dump_mch(ue,0,ue->dlsch_MCH[0]->harq_processes[0]->G,subframe_rx);
|
||||
// dump_mch(ue,0,ue->dlsch_MCH[0]->harq_processes[0]->G,subframe_rx);
|
||||
LOG_DEBUG_BEGIN(DEBUG_UE_PHYPROC)
|
||||
|
||||
for (int i=0; i<ue->dlsch_MCH[0]->harq_processes[0]->TBS>>3; i++) {
|
||||
@@ -3222,25 +3229,24 @@ LOG_DEBUG_END
|
||||
} else { // decoding successful
|
||||
#if (RRC_VERSION >= MAKE_VERSION(10, 0, 0))
|
||||
|
||||
if (mcch_active == 1) {
|
||||
ue_send_mch_sdu(ue->Mod_id,
|
||||
CC_id,
|
||||
frame_rx,
|
||||
ue->dlsch_MCH[0]->harq_processes[0]->b,
|
||||
ue->dlsch_MCH[0]->harq_processes[0]->TBS>>3,
|
||||
eNB_id,// not relevant in eMBMS context
|
||||
sync_area);
|
||||
ue_send_mch_sdu(ue->Mod_id,
|
||||
CC_id,
|
||||
frame_rx,
|
||||
ue->dlsch_MCH[0]->harq_processes[0]->b,
|
||||
ue->dlsch_MCH[0]->harq_processes[0]->TBS>>3,
|
||||
eNB_id,// not relevant in eMBMS context
|
||||
sync_area);
|
||||
|
||||
if (mcch_active == 1)
|
||||
ue->dlsch_mcch_received[sync_area][0]++;
|
||||
|
||||
|
||||
if (ue->dlsch_mch_received_sf[subframe_rx%5][0] == 1 ) {
|
||||
ue->dlsch_mch_received_sf[subframe_rx%5][0]=0;
|
||||
} else {
|
||||
ue->dlsch_mch_received[0]+=1;
|
||||
ue->dlsch_mch_received_sf[subframe_rx][0]=1;
|
||||
}
|
||||
|
||||
|
||||
else
|
||||
ue->dlsch_mtch_received[sync_area][0]++;
|
||||
|
||||
if (ue->dlsch_mch_received_sf[subframe_rx%5][0] == 1 ) {
|
||||
ue->dlsch_mch_received_sf[subframe_rx%5][0]=0;
|
||||
} else {
|
||||
ue->dlsch_mch_received[0]+=1;
|
||||
ue->dlsch_mch_received_sf[subframe_rx][0]=1;
|
||||
}
|
||||
|
||||
#endif // #if (RRC_VERSION >= MAKE_VERSION(10, 0, 0))
|
||||
@@ -4179,7 +4185,7 @@ LOG_DEBUG_END
|
||||
|
||||
|
||||
if (subframe_select(&ue->frame_parms,subframe_rx) == SF_S) { // S-subframe, do first 5 symbols only
|
||||
l2 = 5;
|
||||
l2 = 4;
|
||||
} else if (pmch_flag == 1) { // do first 2 symbols only
|
||||
l2 = 1;
|
||||
} else { // normal subframe, last symbol to be processed is the first of the second slot
|
||||
@@ -4665,7 +4671,7 @@ LOG_DEBUG_END
|
||||
|
||||
|
||||
if (subframe_select(&ue->frame_parms,subframe_rx) == SF_S) { // S-subframe, do first 5 symbols only
|
||||
l2 = 5;
|
||||
l2 = 4;
|
||||
} else if (pmch_flag == 1) { // do first 2 symbols only
|
||||
l2 = 1;
|
||||
} else { // normal subframe, last symbol to be processed is the first of the second slot
|
||||
@@ -4709,7 +4715,7 @@ LOG_DEBUG_END
|
||||
|
||||
if (do_pdcch_flag) {
|
||||
if ((l==pilot1) ||
|
||||
((pmch_flag==1)&(l==l2))) {
|
||||
((pmch_flag==1)&&(l==l2))) {
|
||||
LOG_D(PHY,"[UE %d] Frame %d: Calling pdcch procedures (eNB %d)\n",ue->Mod_id,frame_rx,eNB_id);
|
||||
|
||||
//start_meas(&ue->rx_pdcch_stats[ue->current_thread_id[subframe_rx]]);
|
||||
@@ -4729,9 +4735,22 @@ LOG_DEBUG_END
|
||||
ue_measurement_procedures(l-1,ue,proc,eNB_id,(subframe_rx<<1),abstraction_flag,mode);
|
||||
|
||||
LOG_D(PHY," ------ end FFT/ChannelEst/PDCCH slot 0: AbsSubframe %d.%d ------ \n", frame_rx%1024, subframe_rx);
|
||||
// If this is PMCH, call procedures and return
|
||||
|
||||
// If this is PMCH, call procedures, do channel estimation for first symbol of next DL subframe and return
|
||||
if (pmch_flag == 1) {
|
||||
ue_pmch_procedures(ue,proc,eNB_id,abstraction_flag);
|
||||
|
||||
int next_subframe_rx = (1+subframe_rx)%10;
|
||||
if (subframe_select(&ue->frame_parms,next_subframe_rx) != SF_UL)
|
||||
{
|
||||
slot_fep(ue,
|
||||
0,
|
||||
(next_subframe_rx<<1),
|
||||
0,
|
||||
0,
|
||||
0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -4841,6 +4860,7 @@ LOG_DEBUG_END
|
||||
ue_measurement_procedures(l-1,ue,proc,eNB_id,1+(subframe_rx<<1),abstraction_flag,mode);
|
||||
|
||||
} // for l=1..l2
|
||||
ue_measurement_procedures(l-1,ue,proc,eNB_id,1+(subframe_rx<<1),abstraction_flag,mode);
|
||||
|
||||
// do first symbol of next downlink subframe for channel estimation
|
||||
int next_subframe_rx = (1+subframe_rx)%10;
|
||||
|
||||
@@ -442,7 +442,7 @@ typedef struct {
|
||||
/*!\brief LCID of MCCH for DL */
|
||||
#define MCCH_LCHANID 0
|
||||
/*!\brief LCID of MCH scheduling info for DL */
|
||||
#define MCH_SCHDL_INFO 3
|
||||
#define MCH_SCHDL_INFO 30
|
||||
/*!\brief LCID of Carrier component activation/deactivation */
|
||||
#define CC_ACT_DEACT 27
|
||||
//TTN (for D2D)
|
||||
@@ -1502,7 +1502,16 @@ typedef struct {
|
||||
/// MCCH status
|
||||
uint8_t mcch_status;
|
||||
/// MSI status
|
||||
uint8_t msi_status; // could be an array if there are >1 MCH in one MBSFN area
|
||||
uint8_t msi_status_v[28];
|
||||
uint8_t msi_current_alloc;
|
||||
uint8_t msi_pmch;
|
||||
|
||||
struct MBSFN_SubframeConfig *commonSF_Alloc_r9_mbsfn_SubframeConfig[8]; // FIXME replace 8 by MAX_MBSFN_AREA?
|
||||
uint8_t commonSF_AllocPeriod_r9;
|
||||
int common_num_sf_alloc;
|
||||
|
||||
uint8_t pmch_lcids[28];
|
||||
uint16_t pmch_stop_mtch[28];
|
||||
#endif
|
||||
//#ifdef CBA
|
||||
/// CBA RNTI for each group
|
||||
|
||||
+591
-377
File diff suppressed because it is too large
Load Diff
@@ -30,6 +30,8 @@
|
||||
#define PDCP_C
|
||||
//#define DEBUG_PDCP_FIFO_FLUSH_SDU
|
||||
|
||||
#define MBMS_MULTICAST_OUT
|
||||
|
||||
#include "assertions.h"
|
||||
#include "hashtable.h"
|
||||
#include "pdcp.h"
|
||||
@@ -66,6 +68,17 @@ extern int otg_enabled;
|
||||
#include "common/ran_context.h"
|
||||
extern RAN_CONTEXT_t RC;
|
||||
|
||||
#ifdef MBMS_MULTICAST_OUT
|
||||
# include <sys/types.h>
|
||||
# include <sys/socket.h>
|
||||
# include <netinet/in.h>
|
||||
# include <netinet/ip.h>
|
||||
# include <netinet/udp.h>
|
||||
# include <unistd.h>
|
||||
|
||||
static int mbms_socket = -1;
|
||||
#endif
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
/*
|
||||
* If PDCP_UNIT_TEST is set here then data flow between PDCP and RLC is broken
|
||||
@@ -758,11 +771,26 @@ pdcp_data_ind(
|
||||
packet_forwarded = FALSE;
|
||||
#endif
|
||||
|
||||
#ifdef MBMS_MULTICAST_OUT
|
||||
if ((MBMS_flagP != 0) && (mbms_socket != -1)) {
|
||||
struct iphdr *ip_header = (struct iphdr*)&sdu_buffer_pP->data[payload_offset];
|
||||
struct udphdr *udp_header = (struct udphdr*)&sdu_buffer_pP->data[payload_offset + sizeof(struct iphdr)];
|
||||
struct sockaddr_in dest_addr;
|
||||
|
||||
dest_addr.sin_family = AF_INET;
|
||||
dest_addr.sin_port = udp_header->dest;
|
||||
dest_addr.sin_addr.s_addr = ip_header->daddr;
|
||||
|
||||
sendto(mbms_socket, &sdu_buffer_pP->data[payload_offset], sdu_buffer_sizeP - payload_offset, MSG_DONTWAIT, (struct sockaddr*)&dest_addr, sizeof(dest_addr));
|
||||
packet_forwarded = TRUE;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (FALSE == packet_forwarded) {
|
||||
new_sdu_p = get_free_mem_block(sdu_buffer_sizeP - payload_offset + sizeof (pdcp_data_ind_header_t), __func__);
|
||||
|
||||
if (new_sdu_p) {
|
||||
if (pdcp_p->rlc_mode == RLC_MODE_AM ) {
|
||||
if ((MBMS_flagP == 0) && (pdcp_p->rlc_mode == RLC_MODE_AM)) {
|
||||
pdcp_p->last_submitted_pdcp_rx_sn = sequence_number;
|
||||
}
|
||||
|
||||
@@ -803,7 +831,6 @@ pdcp_data_ind(
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/* Print octets of incoming data in hexadecimal form */
|
||||
LOG_D(PDCP, "Following content has been received from RLC (%d,%d)(PDCP header has already been removed):\n",
|
||||
@@ -839,13 +866,14 @@ pdcp_data_ind(
|
||||
|
||||
|
||||
#if defined(STOP_ON_IP_TRAFFIC_OVERLOAD)
|
||||
else {
|
||||
AssertFatal(0, PROTOCOL_PDCP_CTXT_FMT" PDCP_DATA_IND SDU DROPPED, OUT OF MEMORY \n",
|
||||
PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP, pdcp_p));
|
||||
}
|
||||
|
||||
else {
|
||||
AssertFatal(0, PROTOCOL_PDCP_CTXT_FMT" PDCP_DATA_IND SDU DROPPED, OUT OF MEMORY \n",
|
||||
PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP, pdcp_p));
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
free_mem_block(sdu_buffer_pP, __func__);
|
||||
|
||||
if (ctxt_pP->enb_flag) {
|
||||
@@ -1458,8 +1486,12 @@ rrc_pdcp_config_asn1_req (
|
||||
|
||||
for (j=0; j<mbms_SessionInfoList_r9_p->list.count; j++) {
|
||||
MBMS_SessionInfo_p = mbms_SessionInfoList_r9_p->list.array[j];
|
||||
lc_id = MBMS_SessionInfo_p->sessionId_r9->buf[0];
|
||||
if (MBMS_SessionInfo_p->sessionId_r9)
|
||||
lc_id = MBMS_SessionInfo_p->sessionId_r9->buf[0];
|
||||
else
|
||||
lc_id = MBMS_SessionInfo_p->logicalChannelIdentity_r9;
|
||||
mch_id = MBMS_SessionInfo_p->tmgi_r9.serviceId_r9.buf[2]; //serviceId is 3-octet string
|
||||
// mch_id = j;
|
||||
|
||||
// can set the mch_id = i
|
||||
if (ctxt_pP->enb_flag) {
|
||||
@@ -1480,6 +1512,14 @@ rrc_pdcp_config_asn1_req (
|
||||
}
|
||||
}
|
||||
|
||||
LOG_D(PDCP, "lc_id (%02ld) mch_id(%02x,%02x,%02x) drb_id(%ld) action(%d)\n",
|
||||
lc_id,
|
||||
MBMS_SessionInfo_p->tmgi_r9.serviceId_r9.buf[0],
|
||||
MBMS_SessionInfo_p->tmgi_r9.serviceId_r9.buf[1],
|
||||
MBMS_SessionInfo_p->tmgi_r9.serviceId_r9.buf[2],
|
||||
drb_id,
|
||||
action);
|
||||
|
||||
pdcp_config_req_asn1 (
|
||||
ctxt_pP,
|
||||
NULL, // unused for MBMS
|
||||
@@ -2018,6 +2058,12 @@ void pdcp_layer_init(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef MBMS_MULTICAST_OUT
|
||||
mbms_socket = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
|
||||
if (mbms_socket == -1)
|
||||
LOG_W(PDCP, "Could not create RAW socket, MBMS packets will not be put to the network\n");
|
||||
#endif
|
||||
|
||||
LOG_I(PDCP, "PDCP layer has been initialized\n");
|
||||
|
||||
pdcp_output_sdu_bytes_to_write=0;
|
||||
@@ -2068,6 +2114,12 @@ void pdcp_layer_cleanup (void)
|
||||
{
|
||||
list_free (&pdcp_sdu_list);
|
||||
hashtable_destroy(pdcp_coll_p);
|
||||
#ifdef MBMS_MULTICAST_OUT
|
||||
if(mbms_socket != -1) {
|
||||
close(mbms_socket);
|
||||
mbms_socket = -1;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef PDCP_USE_RT_FIFO
|
||||
|
||||
@@ -208,7 +208,7 @@ rlc_mbms_id_t rlc_mbms_lcid2service_session_id_eNB[MAX_eNB][RLC_MAX_MBMS_
|
||||
#define rlc_mbms_ue_get_lcid_by_rb_id(uE_mOD,rB_iD) rlc_mbms_rbid2lcid_ue[uE_mOD][rB_iD]
|
||||
|
||||
#define rlc_mbms_ue_set_lcid_by_rb_id(uE_mOD,rB_iD,lOG_cH_iD) do { \
|
||||
AssertFatal(rB_iD<NB_RB_MAX, "INVALID RB ID %u", rB_iD); \
|
||||
AssertFatal(rB_iD<NB_RB_MBMS_MAX, "INVALID RB ID %u", rB_iD); \
|
||||
rlc_mbms_rbid2lcid_ue[uE_mOD][rB_iD] = lOG_cH_iD; \
|
||||
} while (0);
|
||||
|
||||
|
||||
@@ -414,9 +414,13 @@ rlc_op_status_t rrc_rlc_config_asn1_req (const protocol_ctxt_t * const ctxt_pP
|
||||
|
||||
for (j=0; j<mbms_SessionInfoList_r9_p->list.count; j++) {
|
||||
MBMS_SessionInfo_p = mbms_SessionInfoList_r9_p->list.array[j];
|
||||
mbms_session_id = MBMS_SessionInfo_p->sessionId_r9->buf[0];
|
||||
if (MBMS_SessionInfo_p->sessionId_r9)
|
||||
mbms_session_id = MBMS_SessionInfo_p->sessionId_r9->buf[0];
|
||||
else
|
||||
mbms_session_id = MBMS_SessionInfo_p->logicalChannelIdentity_r9;
|
||||
lc_id = mbms_session_id;
|
||||
mbms_service_id = MBMS_SessionInfo_p->tmgi_r9.serviceId_r9.buf[2]; //serviceId is 3-octet string
|
||||
// mbms_service_id = j;
|
||||
|
||||
// can set the mch_id = i
|
||||
if (ctxt_pP->enb_flag) {
|
||||
|
||||
@@ -333,7 +333,7 @@ void oai_nw_drv_common_class_wireless2ip(uint16_t dlen,
|
||||
|
||||
printk("\n");
|
||||
#endif //OAI_DRV_DEBUG_RECEIVE
|
||||
netif_rx(skb);
|
||||
netif_rx_ni(skb);
|
||||
#ifdef OAI_DRV_DEBUG_RECEIVE
|
||||
printk("[OAI_IP_DRV][%s] end\n",__FUNCTION__);
|
||||
#endif
|
||||
|
||||
@@ -309,7 +309,7 @@ void nas_COMMON_receive(uint16_t dlen,
|
||||
|
||||
printk("\n");
|
||||
#endif //NAS_DEBUG_RECEIVE
|
||||
netif_rx(skb);
|
||||
netif_rx_ni(skb);
|
||||
#ifdef NAS_DEBUG_RECEIVE
|
||||
printk("NAS_COMMON_RECEIVE: end\n");
|
||||
#endif
|
||||
|
||||
@@ -222,7 +222,7 @@ skb_p->mark = rb_idP;
|
||||
|
||||
printk("\n");
|
||||
#endif //OAI_DRV_DEBUG_RECEIVE
|
||||
netif_rx(skb_p);
|
||||
netif_rx_ni(skb_p);
|
||||
#ifdef OAI_DRV_DEBUG_RECEIVE
|
||||
printk("[UE_IP_DRV][%s] end\n",__FUNCTION__);
|
||||
#endif
|
||||
|
||||
@@ -4594,10 +4594,30 @@ int decode_MCCH_Message( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB
|
||||
//-----------------------------------------------------------------------------
|
||||
void decode_MBSFNAreaConfiguration( module_id_t ue_mod_idP, uint8_t eNB_index, frame_t frameP, uint8_t mbsfn_sync_area )
|
||||
{
|
||||
uint8_t i;
|
||||
protocol_ctxt_t ctxt;
|
||||
|
||||
LOG_I(RRC,"[UE %d] Frame %d : Number of MCH(s) in the MBSFN Sync Area %d is %d\n",
|
||||
ue_mod_idP, frameP, mbsfn_sync_area, UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->pmch_InfoList_r9.list.count);
|
||||
|
||||
// Configure commonSF_Alloc
|
||||
for(i=0; i< UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->commonSF_Alloc_r9.list.count;i++){
|
||||
LOG_W(RRC,"[UE %d] Frame %d, commonSF_Alloc_r9: radioframeAllocationPeriod(%ldn),radioframeAllocationOffset(%ld), subframeAllocation(%x,%x,%x)\n",
|
||||
ue_mod_idP, frameP,
|
||||
UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->commonSF_Alloc_r9.list.array[i]->radioframeAllocationPeriod<<1,
|
||||
UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->commonSF_Alloc_r9.list.array[i]->radioframeAllocationOffset,
|
||||
UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->commonSF_Alloc_r9.list.array[i]->subframeAllocation.choice.oneFrame.buf[0],
|
||||
UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->commonSF_Alloc_r9.list.array[i]->subframeAllocation.choice.oneFrame.buf[1],
|
||||
UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->commonSF_Alloc_r9.list.array[i]->subframeAllocation.choice.oneFrame.buf[2]);
|
||||
UE_mac_inst[ue_mod_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[i] = UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->commonSF_Alloc_r9.list.array[i];
|
||||
}
|
||||
LOG_W(RRC,"[UE %d] Frame %d, commonSF_AllocPeriod_r9 %drf \n",
|
||||
ue_mod_idP, frameP,
|
||||
4<<UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->commonSF_AllocPeriod_r9);
|
||||
|
||||
// Configure commonSF_AllocPeriod
|
||||
UE_mac_inst[ue_mod_idP].commonSF_AllocPeriod_r9 = UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->commonSF_AllocPeriod_r9;
|
||||
|
||||
// store to MAC/PHY necessary parameters for receiving MTCHs
|
||||
|
||||
rrc_mac_config_req_ue(ue_mod_idP,0,eNB_index,
|
||||
|
||||
Reference in New Issue
Block a user