addition of paging in UE, modifications for dlsim
This commit is contained in:
@@ -960,6 +960,7 @@ set(PHY_SRC
|
|||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pucch.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pucch.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/prach.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/prach.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pmch.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pmch.c
|
||||||
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pch.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/group_hopping.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/group_hopping.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/srs_modulation.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/srs_modulation.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/drs_modulation.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/drs_modulation.c
|
||||||
|
|||||||
+315
-347
File diff suppressed because it is too large
Load Diff
@@ -2664,8 +2664,10 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **pdcch_vars,
|
|||||||
uint8_t mi,
|
uint8_t mi,
|
||||||
uint16_t si_rnti,
|
uint16_t si_rnti,
|
||||||
uint16_t ra_rnti,
|
uint16_t ra_rnti,
|
||||||
|
uint16_t p_rnti,
|
||||||
uint8_t L,
|
uint8_t L,
|
||||||
uint8_t format_si,
|
uint8_t format_si,
|
||||||
|
uint8_t format_p,
|
||||||
uint8_t format_ra,
|
uint8_t format_ra,
|
||||||
uint8_t format_c,
|
uint8_t format_c,
|
||||||
uint8_t sizeof_bits,
|
uint8_t sizeof_bits,
|
||||||
@@ -2797,6 +2799,7 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **pdcch_vars,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (((L>1) && ((crc == si_rnti)||
|
if (((L>1) && ((crc == si_rnti)||
|
||||||
|
(crc == p_rnti)||
|
||||||
(crc == ra_rnti)))||
|
(crc == ra_rnti)))||
|
||||||
(crc == pdcch_vars[eNB_id]->crnti)) {
|
(crc == pdcch_vars[eNB_id]->crnti)) {
|
||||||
dci_alloc[*dci_cnt].dci_length = sizeof_bits;
|
dci_alloc[*dci_cnt].dci_length = sizeof_bits;
|
||||||
@@ -2831,6 +2834,9 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **pdcch_vars,
|
|||||||
if (crc==si_rnti) {
|
if (crc==si_rnti) {
|
||||||
dci_alloc[*dci_cnt].format = format_si;
|
dci_alloc[*dci_cnt].format = format_si;
|
||||||
*dci_cnt = *dci_cnt+1;
|
*dci_cnt = *dci_cnt+1;
|
||||||
|
} else if (crc==p_rnti) {
|
||||||
|
dci_alloc[*dci_cnt].format = format_p;
|
||||||
|
*dci_cnt = *dci_cnt+1;
|
||||||
} else if (crc==ra_rnti) {
|
} else if (crc==ra_rnti) {
|
||||||
dci_alloc[*dci_cnt].format = format_ra;
|
dci_alloc[*dci_cnt].format = format_ra;
|
||||||
// store first nCCE of group for PUCCH transmission of ACK/NAK
|
// store first nCCE of group for PUCCH transmission of ACK/NAK
|
||||||
@@ -3118,7 +3124,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
|||||||
if (ue->prach_resources[eNB_id])
|
if (ue->prach_resources[eNB_id])
|
||||||
ra_rnti = ue->prach_resources[eNB_id]->ra_RNTI;
|
ra_rnti = ue->prach_resources[eNB_id]->ra_RNTI;
|
||||||
|
|
||||||
// First check common search spaces at aggregation 4 (SI_RNTI and RA_RNTI format 0/1A),
|
// First check common search spaces at aggregation 4 (SI_RNTI, P_RNTI and RA_RNTI format 0/1A),
|
||||||
// and UE_SPEC format0 (PUSCH) too while we're at it
|
// and UE_SPEC format0 (PUSCH) too while we're at it
|
||||||
dci_decoding_procedure0(pdcch_vars,1,subframe,
|
dci_decoding_procedure0(pdcch_vars,1,subframe,
|
||||||
dci_alloc,
|
dci_alloc,
|
||||||
@@ -3127,9 +3133,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
|||||||
mi,
|
mi,
|
||||||
SI_RNTI,
|
SI_RNTI,
|
||||||
ra_rnti,
|
ra_rnti,
|
||||||
|
P_RNTI,
|
||||||
2,
|
2,
|
||||||
format1A,
|
format1A,
|
||||||
format1A,
|
format1A,
|
||||||
|
format1A,
|
||||||
format0,
|
format0,
|
||||||
format1A_size_bits,
|
format1A_size_bits,
|
||||||
format1A_size_bytes,
|
format1A_size_bytes,
|
||||||
@@ -3144,7 +3152,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
|||||||
((format0_found==1)&&(format_c_found==1)))
|
((format0_found==1)&&(format_c_found==1)))
|
||||||
return(dci_cnt);
|
return(dci_cnt);
|
||||||
|
|
||||||
// Now check common search spaces at aggregation 4 (SI_RNTI and RA_RNTI and C-RNTI format 1C),
|
// Now check common search spaces at aggregation 4 (SI_RNTI,P_RNTI and RA_RNTI and C-RNTI format 1C),
|
||||||
// and UE_SPEC format0 (PUSCH) too while we're at it
|
// and UE_SPEC format0 (PUSCH) too while we're at it
|
||||||
dci_decoding_procedure0(pdcch_vars,1,subframe,
|
dci_decoding_procedure0(pdcch_vars,1,subframe,
|
||||||
dci_alloc,
|
dci_alloc,
|
||||||
@@ -3153,10 +3161,12 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
|||||||
mi,
|
mi,
|
||||||
SI_RNTI,
|
SI_RNTI,
|
||||||
ra_rnti,
|
ra_rnti,
|
||||||
|
P_RNTI,
|
||||||
2,
|
2,
|
||||||
format1C,
|
format1C,
|
||||||
format1C,
|
format1C,
|
||||||
format1C,
|
format1C,
|
||||||
|
format1C,
|
||||||
format1C_size_bits,
|
format1C_size_bits,
|
||||||
format1C_size_bytes,
|
format1C_size_bytes,
|
||||||
&dci_cnt,
|
&dci_cnt,
|
||||||
@@ -3170,7 +3180,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
|||||||
((format0_found==1)&&(format_c_found==1)))
|
((format0_found==1)&&(format_c_found==1)))
|
||||||
return(dci_cnt);
|
return(dci_cnt);
|
||||||
|
|
||||||
// Now check common search spaces at aggregation 8 (SI_RNTI and RA_RNTI format 1A),
|
// Now check common search spaces at aggregation 8 (SI_RNTI,P_RNTI and RA_RNTI format 1A),
|
||||||
// and UE_SPEC format0 (PUSCH) too while we're at it
|
// and UE_SPEC format0 (PUSCH) too while we're at it
|
||||||
// printf("[DCI search] doing common search/format0 aggregation 3\n");
|
// printf("[DCI search] doing common search/format0 aggregation 3\n");
|
||||||
#ifdef DEBUG_DCI_DECODING
|
#ifdef DEBUG_DCI_DECODING
|
||||||
@@ -3182,10 +3192,12 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
|||||||
frame_parms,
|
frame_parms,
|
||||||
mi,
|
mi,
|
||||||
SI_RNTI,
|
SI_RNTI,
|
||||||
|
P_RNTI,
|
||||||
ra_rnti,
|
ra_rnti,
|
||||||
3,
|
3,
|
||||||
format1A,
|
format1A,
|
||||||
format1A,
|
format1A,
|
||||||
|
format1A,
|
||||||
format0,
|
format0,
|
||||||
format1A_size_bits,
|
format1A_size_bits,
|
||||||
format1A_size_bytes,
|
format1A_size_bytes,
|
||||||
@@ -3209,7 +3221,9 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
|||||||
mi,
|
mi,
|
||||||
SI_RNTI,
|
SI_RNTI,
|
||||||
ra_rnti,
|
ra_rnti,
|
||||||
3,
|
P_RNTI,
|
||||||
|
3,
|
||||||
|
format1C,
|
||||||
format1C,
|
format1C,
|
||||||
format1C,
|
format1C,
|
||||||
format1C,
|
format1C,
|
||||||
@@ -3241,7 +3255,9 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
|||||||
mi,
|
mi,
|
||||||
SI_RNTI,
|
SI_RNTI,
|
||||||
ra_rnti,
|
ra_rnti,
|
||||||
3,
|
P_RNTI,
|
||||||
|
3,
|
||||||
|
format1A,
|
||||||
format1A,
|
format1A,
|
||||||
format1A,
|
format1A,
|
||||||
format0,
|
format0,
|
||||||
@@ -3268,7 +3284,9 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
|||||||
mi,
|
mi,
|
||||||
SI_RNTI,
|
SI_RNTI,
|
||||||
ra_rnti,
|
ra_rnti,
|
||||||
2,
|
P_RNTI,
|
||||||
|
2,
|
||||||
|
format1A,
|
||||||
format1A,
|
format1A,
|
||||||
format1A,
|
format1A,
|
||||||
format0,
|
format0,
|
||||||
@@ -3299,9 +3317,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
|||||||
mi,
|
mi,
|
||||||
SI_RNTI,
|
SI_RNTI,
|
||||||
ra_rnti,
|
ra_rnti,
|
||||||
|
P_RNTI,
|
||||||
1,
|
1,
|
||||||
format1A,
|
format1A,
|
||||||
format1A,
|
format1A,
|
||||||
|
format1A,
|
||||||
format0,
|
format0,
|
||||||
format0_size_bits,
|
format0_size_bits,
|
||||||
format0_size_bytes,
|
format0_size_bytes,
|
||||||
@@ -3326,9 +3346,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
|||||||
mi,
|
mi,
|
||||||
SI_RNTI,
|
SI_RNTI,
|
||||||
ra_rnti,
|
ra_rnti,
|
||||||
|
P_RNTI,
|
||||||
0,
|
0,
|
||||||
format1A,
|
format1A,
|
||||||
format1A,
|
format1A,
|
||||||
|
format1A,
|
||||||
format0,
|
format0,
|
||||||
format0_size_bits,
|
format0_size_bits,
|
||||||
format0_size_bytes,
|
format0_size_bytes,
|
||||||
@@ -3357,9 +3379,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
|||||||
mi,
|
mi,
|
||||||
SI_RNTI,
|
SI_RNTI,
|
||||||
ra_rnti,
|
ra_rnti,
|
||||||
|
P_RNTI,
|
||||||
0,
|
0,
|
||||||
format1A,
|
format1A,
|
||||||
format1A,
|
format1A,
|
||||||
|
format1A,
|
||||||
format1,
|
format1,
|
||||||
format1_size_bits,
|
format1_size_bits,
|
||||||
format1_size_bytes,
|
format1_size_bytes,
|
||||||
@@ -3386,9 +3410,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
|||||||
mi,
|
mi,
|
||||||
SI_RNTI,
|
SI_RNTI,
|
||||||
ra_rnti,
|
ra_rnti,
|
||||||
|
P_RNTI,
|
||||||
1,
|
1,
|
||||||
format1A,
|
format1A,
|
||||||
format1A,
|
format1A,
|
||||||
|
format1A,
|
||||||
format1,
|
format1,
|
||||||
format1_size_bits,
|
format1_size_bits,
|
||||||
format1_size_bytes,
|
format1_size_bytes,
|
||||||
@@ -3416,7 +3442,9 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
|||||||
mi,
|
mi,
|
||||||
SI_RNTI,
|
SI_RNTI,
|
||||||
ra_rnti,
|
ra_rnti,
|
||||||
2,
|
P_RNTI,
|
||||||
|
2,
|
||||||
|
format1A,
|
||||||
format1A,
|
format1A,
|
||||||
format1A,
|
format1A,
|
||||||
format1,
|
format1,
|
||||||
@@ -3446,9 +3474,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
|||||||
mi,
|
mi,
|
||||||
SI_RNTI,
|
SI_RNTI,
|
||||||
ra_rnti,
|
ra_rnti,
|
||||||
|
P_RNTI,
|
||||||
3,
|
3,
|
||||||
format1A,
|
format1A,
|
||||||
format1A,
|
format1A,
|
||||||
|
format1A,
|
||||||
format1,
|
format1,
|
||||||
format1_size_bits,
|
format1_size_bits,
|
||||||
format1_size_bytes,
|
format1_size_bytes,
|
||||||
@@ -3479,9 +3509,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
|||||||
mi,
|
mi,
|
||||||
SI_RNTI,
|
SI_RNTI,
|
||||||
ra_rnti,
|
ra_rnti,
|
||||||
|
P_RNTI,
|
||||||
0,
|
0,
|
||||||
format1A,
|
format1A,
|
||||||
format1A,
|
format1A,
|
||||||
|
format1A,
|
||||||
format2A,
|
format2A,
|
||||||
format2A_size_bits,
|
format2A_size_bits,
|
||||||
format2A_size_bytes,
|
format2A_size_bytes,
|
||||||
@@ -3508,9 +3540,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
|||||||
mi,
|
mi,
|
||||||
SI_RNTI,
|
SI_RNTI,
|
||||||
ra_rnti,
|
ra_rnti,
|
||||||
|
P_RNTI,
|
||||||
1,
|
1,
|
||||||
format1A,
|
format1A,
|
||||||
format1A,
|
format1A,
|
||||||
|
format1A,
|
||||||
format2A,
|
format2A,
|
||||||
format2A_size_bits,
|
format2A_size_bits,
|
||||||
format2A_size_bytes,
|
format2A_size_bytes,
|
||||||
@@ -3537,9 +3571,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
|||||||
mi,
|
mi,
|
||||||
SI_RNTI,
|
SI_RNTI,
|
||||||
ra_rnti,
|
ra_rnti,
|
||||||
|
P_RNTI,
|
||||||
2,
|
2,
|
||||||
format1A,
|
format1A,
|
||||||
format1A,
|
format1A,
|
||||||
|
format1A,
|
||||||
format2A,
|
format2A,
|
||||||
format2A_size_bits,
|
format2A_size_bits,
|
||||||
format2A_size_bytes,
|
format2A_size_bytes,
|
||||||
@@ -3567,9 +3603,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
|||||||
mi,
|
mi,
|
||||||
SI_RNTI,
|
SI_RNTI,
|
||||||
ra_rnti,
|
ra_rnti,
|
||||||
|
P_RNTI,
|
||||||
3,
|
3,
|
||||||
format1A,
|
format1A,
|
||||||
format1A,
|
format1A,
|
||||||
|
format1A,
|
||||||
format2A,
|
format2A,
|
||||||
format2A_size_bits,
|
format2A_size_bits,
|
||||||
format2A_size_bytes,
|
format2A_size_bytes,
|
||||||
@@ -3591,9 +3629,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
|||||||
mi,
|
mi,
|
||||||
SI_RNTI,
|
SI_RNTI,
|
||||||
ra_rnti,
|
ra_rnti,
|
||||||
|
P_RNTI,
|
||||||
0,
|
0,
|
||||||
format1A,
|
format1A,
|
||||||
format1A,
|
format1A,
|
||||||
|
format1A,
|
||||||
format2,
|
format2,
|
||||||
format2_size_bits,
|
format2_size_bits,
|
||||||
format2_size_bytes,
|
format2_size_bytes,
|
||||||
@@ -3620,9 +3660,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
|||||||
mi,
|
mi,
|
||||||
SI_RNTI,
|
SI_RNTI,
|
||||||
ra_rnti,
|
ra_rnti,
|
||||||
|
P_RNTI,
|
||||||
1,
|
1,
|
||||||
format1A,
|
format1A,
|
||||||
format1A,
|
format1A,
|
||||||
|
format1A,
|
||||||
format2,
|
format2,
|
||||||
format2_size_bits,
|
format2_size_bits,
|
||||||
format2_size_bytes,
|
format2_size_bytes,
|
||||||
@@ -3649,9 +3691,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
|||||||
mi,
|
mi,
|
||||||
SI_RNTI,
|
SI_RNTI,
|
||||||
ra_rnti,
|
ra_rnti,
|
||||||
|
P_RNTI,
|
||||||
2,
|
2,
|
||||||
format1A,
|
format1A,
|
||||||
format1A,
|
format1A,
|
||||||
|
format1A,
|
||||||
format2,
|
format2,
|
||||||
format2_size_bits,
|
format2_size_bits,
|
||||||
format2_size_bytes,
|
format2_size_bytes,
|
||||||
@@ -3679,9 +3723,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
|||||||
mi,
|
mi,
|
||||||
SI_RNTI,
|
SI_RNTI,
|
||||||
ra_rnti,
|
ra_rnti,
|
||||||
|
P_RNTI,
|
||||||
3,
|
3,
|
||||||
format1A,
|
format1A,
|
||||||
format1A,
|
format1A,
|
||||||
|
format1A,
|
||||||
format2,
|
format2,
|
||||||
format2_size_bits,
|
format2_size_bits,
|
||||||
format2_size_bytes,
|
format2_size_bytes,
|
||||||
@@ -3706,9 +3752,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
|||||||
mi,
|
mi,
|
||||||
SI_RNTI,
|
SI_RNTI,
|
||||||
ra_rnti,
|
ra_rnti,
|
||||||
|
P_RNTI,
|
||||||
0,
|
0,
|
||||||
format1A,
|
format1A,
|
||||||
format1A,
|
format1A,
|
||||||
|
format1A,
|
||||||
format1E_2A_M10PRB,
|
format1E_2A_M10PRB,
|
||||||
sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t,
|
sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t,
|
||||||
sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t),
|
sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t),
|
||||||
@@ -3736,9 +3784,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
|||||||
mi,
|
mi,
|
||||||
SI_RNTI,
|
SI_RNTI,
|
||||||
ra_rnti,
|
ra_rnti,
|
||||||
|
P_RNTI,
|
||||||
1,
|
1,
|
||||||
format1A,
|
format1A,
|
||||||
format1A,
|
format1A,
|
||||||
|
format1A,
|
||||||
format1E_2A_M10PRB,
|
format1E_2A_M10PRB,
|
||||||
sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t,
|
sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t,
|
||||||
sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t),
|
sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t),
|
||||||
@@ -3765,9 +3815,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
|||||||
mi,
|
mi,
|
||||||
SI_RNTI,
|
SI_RNTI,
|
||||||
ra_rnti,
|
ra_rnti,
|
||||||
|
P_RNTI,
|
||||||
2,
|
2,
|
||||||
format1A,
|
format1A,
|
||||||
format1A,
|
format1A,
|
||||||
|
format1A,
|
||||||
format1E_2A_M10PRB,
|
format1E_2A_M10PRB,
|
||||||
sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t,
|
sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t,
|
||||||
sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t),
|
sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t),
|
||||||
@@ -3796,9 +3848,11 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
|
|||||||
mi,
|
mi,
|
||||||
SI_RNTI,
|
SI_RNTI,
|
||||||
ra_rnti,
|
ra_rnti,
|
||||||
|
P_RNTI,
|
||||||
3,
|
3,
|
||||||
format1A,
|
format1A,
|
||||||
format1A,
|
format1A,
|
||||||
|
format1A,
|
||||||
format1E_2A_M10PRB,
|
format1E_2A_M10PRB,
|
||||||
sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t,
|
sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t,
|
||||||
sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t),
|
sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t),
|
||||||
|
|||||||
@@ -729,6 +729,7 @@ typedef enum {format0,
|
|||||||
typedef enum {
|
typedef enum {
|
||||||
SI_PDSCH=0,
|
SI_PDSCH=0,
|
||||||
RA_PDSCH,
|
RA_PDSCH,
|
||||||
|
P_PDSCH,
|
||||||
PDSCH,
|
PDSCH,
|
||||||
PDSCH1,
|
PDSCH1,
|
||||||
PMCH
|
PMCH
|
||||||
|
|||||||
@@ -1339,6 +1339,14 @@ int32_t generate_drs_pusch(PHY_VARS_UE *phy_vars_ue,
|
|||||||
@param frame_parms Pointer to a LTE_DL_FRAME_PARMS structure (eNB or UE)*/
|
@param frame_parms Pointer to a LTE_DL_FRAME_PARMS structure (eNB or UE)*/
|
||||||
void init_ul_hopping(LTE_DL_FRAME_PARMS *frame_parms);
|
void init_ul_hopping(LTE_DL_FRAME_PARMS *frame_parms);
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief This function implements the initialization of paging parameters for UE (See Section 7, 36.304).It must be called after setting IMSImod1024 during UE startup and after receiving SIB2
|
||||||
|
@param ue Pointer to UE context
|
||||||
|
@param defaultPagingCycle T from 36.304 (0=32,1=64,2=128,3=256)
|
||||||
|
@param nB nB from 36.304 (0=4T,1=2T,2=T,3=T/2,4=T/4,5=T/8,6=T/16,7=T/32*/
|
||||||
|
int init_ue_paging_info(PHY_VARS_UE *ue, long defaultPagingCycle, long nB);
|
||||||
|
|
||||||
int32_t compareints (const void * a, const void * b);
|
int32_t compareints (const void * a, const void * b);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+11
-26
@@ -53,11 +53,6 @@
|
|||||||
# define msg mexPrintf
|
# define msg mexPrintf
|
||||||
#else
|
#else
|
||||||
# ifdef OPENAIR2
|
# ifdef OPENAIR2
|
||||||
# if ENABLE_RAL
|
|
||||||
# include "collection/hashtable/hashtable.h"
|
|
||||||
# include "COMMON/ral_messages_types.h"
|
|
||||||
# include "UTIL/queue.h"
|
|
||||||
# endif
|
|
||||||
# include "log.h"
|
# include "log.h"
|
||||||
# define msg(aRGS...) LOG_D(PHY, ##aRGS)
|
# define msg(aRGS...) LOG_D(PHY, ##aRGS)
|
||||||
# else
|
# else
|
||||||
@@ -132,10 +127,6 @@ static inline void* malloc16_clear( size_t size )
|
|||||||
#include "PHY/TOOLS/defs.h"
|
#include "PHY/TOOLS/defs.h"
|
||||||
#include "platform_types.h"
|
#include "platform_types.h"
|
||||||
|
|
||||||
#ifdef OPENAIR_LTE
|
|
||||||
|
|
||||||
//#include "PHY/LTE_ESTIMATION/defs.h"
|
|
||||||
|
|
||||||
#include "PHY/LTE_TRANSPORT/defs.h"
|
#include "PHY/LTE_TRANSPORT/defs.h"
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
|
||||||
@@ -178,16 +169,6 @@ typedef struct UE_SCAN_INFO_s {
|
|||||||
int32_t freq_offset_Hz[3][10];
|
int32_t freq_offset_Hz[3][10];
|
||||||
} UE_SCAN_INFO_t;
|
} UE_SCAN_INFO_t;
|
||||||
|
|
||||||
#if ENABLE_RAL
|
|
||||||
typedef struct ral_threshold_phy_s {
|
|
||||||
SLIST_ENTRY(ral_threshold_phy_s) ral_thresholds;
|
|
||||||
ral_threshold_t threshold;
|
|
||||||
ral_th_action_t th_action;
|
|
||||||
ral_link_param_t link_param;
|
|
||||||
long timer_id;
|
|
||||||
} ral_threshold_phy_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/// Top-level PHY Data Structure for RN
|
/// Top-level PHY Data Structure for RN
|
||||||
typedef struct {
|
typedef struct {
|
||||||
/// Module ID indicator for this instance
|
/// Module ID indicator for this instance
|
||||||
@@ -647,17 +628,25 @@ typedef struct {
|
|||||||
LTE_UE_PDSCH_FLP *pdsch_vars_flp[NUMBER_OF_CONNECTED_eNB_MAX+1];
|
LTE_UE_PDSCH_FLP *pdsch_vars_flp[NUMBER_OF_CONNECTED_eNB_MAX+1];
|
||||||
LTE_UE_PDSCH *pdsch_vars_SI[NUMBER_OF_CONNECTED_eNB_MAX+1];
|
LTE_UE_PDSCH *pdsch_vars_SI[NUMBER_OF_CONNECTED_eNB_MAX+1];
|
||||||
LTE_UE_PDSCH *pdsch_vars_ra[NUMBER_OF_CONNECTED_eNB_MAX+1];
|
LTE_UE_PDSCH *pdsch_vars_ra[NUMBER_OF_CONNECTED_eNB_MAX+1];
|
||||||
|
LTE_UE_PDSCH *pdsch_vars_p[NUMBER_OF_CONNECTED_eNB_MAX+1];
|
||||||
LTE_UE_PDSCH *pdsch_vars_MCH[NUMBER_OF_CONNECTED_eNB_MAX];
|
LTE_UE_PDSCH *pdsch_vars_MCH[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||||
LTE_UE_PBCH *pbch_vars[NUMBER_OF_CONNECTED_eNB_MAX];
|
LTE_UE_PBCH *pbch_vars[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||||
LTE_UE_PDCCH *pdcch_vars[NUMBER_OF_CONNECTED_eNB_MAX];
|
LTE_UE_PDCCH *pdcch_vars[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||||
LTE_UE_PRACH *prach_vars[NUMBER_OF_CONNECTED_eNB_MAX];
|
LTE_UE_PRACH *prach_vars[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||||
LTE_UE_DLSCH_t *dlsch[NUMBER_OF_CONNECTED_eNB_MAX][2];
|
LTE_UE_DLSCH_t *dlsch[NUMBER_OF_CONNECTED_eNB_MAX][2];
|
||||||
LTE_UE_ULSCH_t *ulsch[NUMBER_OF_CONNECTED_eNB_MAX];
|
LTE_UE_ULSCH_t *ulsch[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||||
LTE_UE_DLSCH_t *dlsch_SI[NUMBER_OF_CONNECTED_eNB_MAX],*dlsch_ra[NUMBER_OF_CONNECTED_eNB_MAX];
|
LTE_UE_DLSCH_t *dlsch_SI[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||||
|
LTE_UE_DLSCH_t *dlsch_ra[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||||
|
LTE_UE_DLSCH_t *dlsch_p[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||||
LTE_UE_DLSCH_t *dlsch_MCH[NUMBER_OF_CONNECTED_eNB_MAX];
|
LTE_UE_DLSCH_t *dlsch_MCH[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||||
// This is for SIC in the UE, to store the reencoded data
|
// This is for SIC in the UE, to store the reencoded data
|
||||||
LTE_eNB_DLSCH_t *dlsch_eNB[NUMBER_OF_CONNECTED_eNB_MAX];
|
LTE_eNB_DLSCH_t *dlsch_eNB[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||||
|
|
||||||
|
//Paging parameters
|
||||||
|
uint32_t IMSImod1024;
|
||||||
|
uint32_t PF;
|
||||||
|
uint32_t PO;
|
||||||
|
|
||||||
// For abstraction-purposes only
|
// For abstraction-purposes only
|
||||||
uint8_t sr[10];
|
uint8_t sr[10];
|
||||||
uint8_t pucch_sel[10];
|
uint8_t pucch_sel[10];
|
||||||
@@ -712,6 +701,8 @@ typedef struct {
|
|||||||
int dlsch_SI_errors[NUMBER_OF_CONNECTED_eNB_MAX];
|
int dlsch_SI_errors[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||||
int dlsch_ra_received[NUMBER_OF_CONNECTED_eNB_MAX];
|
int dlsch_ra_received[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||||
int dlsch_ra_errors[NUMBER_OF_CONNECTED_eNB_MAX];
|
int dlsch_ra_errors[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||||
|
int dlsch_p_received[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||||
|
int dlsch_p_errors[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||||
int dlsch_mch_received_sf[MAX_MBSFN_AREA][NUMBER_OF_CONNECTED_eNB_MAX];
|
int dlsch_mch_received_sf[MAX_MBSFN_AREA][NUMBER_OF_CONNECTED_eNB_MAX];
|
||||||
int dlsch_mch_received[NUMBER_OF_CONNECTED_eNB_MAX];
|
int dlsch_mch_received[NUMBER_OF_CONNECTED_eNB_MAX];
|
||||||
int dlsch_mcch_received[MAX_MBSFN_AREA][NUMBER_OF_CONNECTED_eNB_MAX];
|
int dlsch_mcch_received[MAX_MBSFN_AREA][NUMBER_OF_CONNECTED_eNB_MAX];
|
||||||
@@ -835,11 +826,6 @@ typedef struct {
|
|||||||
/// RF and Interface devices per CC
|
/// RF and Interface devices per CC
|
||||||
openair0_device rfdevice;
|
openair0_device rfdevice;
|
||||||
|
|
||||||
#if ENABLE_RAL
|
|
||||||
hash_table_t *ral_thresholds_timed;
|
|
||||||
SLIST_HEAD(ral_thresholds_gen_poll_s, ral_threshold_phy_t) ral_thresholds_gen_polled[RAL_LINK_PARAM_GEN_MAX];
|
|
||||||
SLIST_HEAD(ral_thresholds_lte_poll_s, ral_threshold_phy_t) ral_thresholds_lte_polled[RAL_LINK_PARAM_LTE_MAX];
|
|
||||||
#endif
|
|
||||||
} PHY_VARS_UE;
|
} PHY_VARS_UE;
|
||||||
|
|
||||||
|
|
||||||
@@ -851,6 +837,5 @@ typedef struct {
|
|||||||
#include "PHY/LTE_ESTIMATION/defs.h"
|
#include "PHY/LTE_ESTIMATION/defs.h"
|
||||||
|
|
||||||
#include "SIMULATION/ETH_TRANSPORT/defs.h"
|
#include "SIMULATION/ETH_TRANSPORT/defs.h"
|
||||||
#endif //OPENAIR_LTE
|
|
||||||
|
|
||||||
#endif // __PHY_DEFS__H__
|
#endif // __PHY_DEFS__H__
|
||||||
|
|||||||
@@ -1627,8 +1627,10 @@ void restart_phy(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc, uint8_t eNB_id,uint8_t ab
|
|||||||
ue->dlsch_fer[eNB_id] = 0;
|
ue->dlsch_fer[eNB_id] = 0;
|
||||||
ue->dlsch_SI_received[eNB_id] = 0;
|
ue->dlsch_SI_received[eNB_id] = 0;
|
||||||
ue->dlsch_ra_received[eNB_id] = 0;
|
ue->dlsch_ra_received[eNB_id] = 0;
|
||||||
|
ue->dlsch_p_received[eNB_id] = 0;
|
||||||
ue->dlsch_SI_errors[eNB_id] = 0;
|
ue->dlsch_SI_errors[eNB_id] = 0;
|
||||||
ue->dlsch_ra_errors[eNB_id] = 0;
|
ue->dlsch_ra_errors[eNB_id] = 0;
|
||||||
|
ue->dlsch_p_errors[eNB_id] = 0;
|
||||||
|
|
||||||
ue->dlsch_mch_received[eNB_id] = 0;
|
ue->dlsch_mch_received[eNB_id] = 0;
|
||||||
|
|
||||||
@@ -2027,6 +2029,35 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else if ((dci_alloc_rx[i].rnti == P_RNTI) &&
|
||||||
|
((dci_alloc_rx[i].format == format1A) || (dci_alloc_rx[i].format == format1C))) {
|
||||||
|
|
||||||
|
#ifdef DEBUG_PHY_PROC
|
||||||
|
LOG_D(PHY,"[UE %d] subframe %d: Found 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);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
if (generate_ue_dlsch_params_from_dci(frame_rx,
|
||||||
|
subframe_rx,
|
||||||
|
(void *)&dci_alloc_rx[i].dci_pdu,
|
||||||
|
SI_RNTI,
|
||||||
|
dci_alloc_rx[i].format,
|
||||||
|
&ue->dlsch_SI[eNB_id],
|
||||||
|
&ue->frame_parms,
|
||||||
|
ue->pdsch_config_dedicated,
|
||||||
|
SI_RNTI,
|
||||||
|
0,
|
||||||
|
P_RNTI)==0) {
|
||||||
|
|
||||||
|
ue->dlsch_p_received[eNB_id]++;
|
||||||
|
|
||||||
|
|
||||||
|
LOG_D(PHY,"[UE %d] Frame %d, subframe %d : Generate UE DLSCH P_RNTI format 1%s\n",ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].format==format1A?"A":"C");
|
||||||
|
//dump_dci(&ue->frame_parms, &dci_alloc_rx[i]);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
else if ((ue->prach_resources[eNB_id]) &&
|
else if ((ue->prach_resources[eNB_id]) &&
|
||||||
(dci_alloc_rx[i].rnti == ue->prach_resources[eNB_id]->ra_RNTI) &&
|
(dci_alloc_rx[i].rnti == ue->prach_resources[eNB_id]->ra_RNTI) &&
|
||||||
(dci_alloc_rx[i].format == format1A)) {
|
(dci_alloc_rx[i].format == format1A)) {
|
||||||
@@ -2440,6 +2471,9 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
|
|||||||
case RA_PDSCH:
|
case RA_PDSCH:
|
||||||
pdsch_vars = ue->pdsch_vars_ra[eNB_id];
|
pdsch_vars = ue->pdsch_vars_ra[eNB_id];
|
||||||
break;
|
break;
|
||||||
|
case P_PDSCH:
|
||||||
|
pdsch_vars = ue->pdsch_vars_p[eNB_id];
|
||||||
|
break;
|
||||||
case PDSCH:
|
case PDSCH:
|
||||||
pdsch_vars = ue->pdsch_vars[eNB_id];
|
pdsch_vars = ue->pdsch_vars[eNB_id];
|
||||||
break;
|
break;
|
||||||
@@ -2557,6 +2591,14 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
|
|||||||
ue->dlsch_SI[eNB_id]->harq_processes[0]->b,
|
ue->dlsch_SI[eNB_id]->harq_processes[0]->b,
|
||||||
ue->dlsch_SI[eNB_id]->harq_processes[0]->TBS>>3);
|
ue->dlsch_SI[eNB_id]->harq_processes[0]->TBS>>3);
|
||||||
break;
|
break;
|
||||||
|
case P_PDSCH:
|
||||||
|
mac_xface->ue_decode_p(ue->Mod_id,
|
||||||
|
CC_id,
|
||||||
|
frame_rx,
|
||||||
|
eNB_id,
|
||||||
|
ue->dlsch_SI[eNB_id]->harq_processes[0]->b,
|
||||||
|
ue->dlsch_SI[eNB_id]->harq_processes[0]->TBS>>3);
|
||||||
|
break;
|
||||||
case RA_PDSCH:
|
case RA_PDSCH:
|
||||||
process_rar(ue,proc,eNB_id,mode,abstraction_flag);
|
process_rar(ue,proc,eNB_id,mode,abstraction_flag);
|
||||||
break;
|
break;
|
||||||
@@ -2630,6 +2672,8 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
|
|||||||
|
|
||||||
if (ue->dlsch_SI[eNB_id])
|
if (ue->dlsch_SI[eNB_id])
|
||||||
ue->dlsch_SI[eNB_id]->active = 0;
|
ue->dlsch_SI[eNB_id]->active = 0;
|
||||||
|
if (ue->dlsch_p[eNB_id])
|
||||||
|
ue->dlsch_p[eNB_id]->active = 0;
|
||||||
if (ue->dlsch_ra[eNB_id])
|
if (ue->dlsch_ra[eNB_id])
|
||||||
ue->dlsch_ra[eNB_id]->active = 0;
|
ue->dlsch_ra[eNB_id]->active = 0;
|
||||||
|
|
||||||
@@ -2726,6 +2770,20 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
|
|||||||
ue->frame_parms.symbols_per_tti>>1,
|
ue->frame_parms.symbols_per_tti>>1,
|
||||||
abstraction_flag);
|
abstraction_flag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// do procedures for SI-RNTI
|
||||||
|
if ((ue->dlsch_p[eNB_id]) && (ue->dlsch_p[eNB_id]->active == 1)) {
|
||||||
|
ue_pdsch_procedures(ue,
|
||||||
|
proc,
|
||||||
|
eNB_id,
|
||||||
|
P_PDSCH,
|
||||||
|
ue->dlsch_p[eNB_id],
|
||||||
|
NULL,
|
||||||
|
ue->pdcch_vars[eNB_id]->num_pdcch_symbols,
|
||||||
|
ue->frame_parms.symbols_per_tti>>1,
|
||||||
|
abstraction_flag);
|
||||||
|
}
|
||||||
|
|
||||||
// do procedures for RA-RNTI
|
// do procedures for RA-RNTI
|
||||||
if ((ue->dlsch_ra[eNB_id]) && (ue->dlsch_ra[eNB_id]->active == 1)) {
|
if ((ue->dlsch_ra[eNB_id]) && (ue->dlsch_ra[eNB_id]->active == 1)) {
|
||||||
ue_pdsch_procedures(ue,
|
ue_pdsch_procedures(ue,
|
||||||
@@ -2821,6 +2879,30 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
|
|||||||
abstraction_flag);
|
abstraction_flag);
|
||||||
ue->dlsch_SI[eNB_id]->active = 0;
|
ue->dlsch_SI[eNB_id]->active = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// do procedures for P-RNTI
|
||||||
|
if ((ue->dlsch_p[eNB_id]) && (ue->dlsch_p[eNB_id]->active == 1)) {
|
||||||
|
ue_pdsch_procedures(ue,
|
||||||
|
proc,
|
||||||
|
eNB_id,
|
||||||
|
P_PDSCH,
|
||||||
|
ue->dlsch_p[eNB_id],
|
||||||
|
NULL,
|
||||||
|
1+(ue->frame_parms.symbols_per_tti>>1),
|
||||||
|
ue->frame_parms.symbols_per_tti-1,
|
||||||
|
abstraction_flag);
|
||||||
|
|
||||||
|
ue_dlsch_procedures(ue,
|
||||||
|
proc,
|
||||||
|
eNB_id,
|
||||||
|
P_PDSCH,
|
||||||
|
ue->dlsch_p[eNB_id],
|
||||||
|
NULL,
|
||||||
|
&ue->dlsch_p_errors[eNB_id],
|
||||||
|
mode,
|
||||||
|
abstraction_flag);
|
||||||
|
ue->dlsch_p[eNB_id]->active = 0;
|
||||||
|
}
|
||||||
// do procedures for RA-RNTI
|
// do procedures for RA-RNTI
|
||||||
if ((ue->dlsch_ra[eNB_id]) && (ue->dlsch_ra[eNB_id]->active == 1)) {
|
if ((ue->dlsch_ra[eNB_id]) && (ue->dlsch_ra[eNB_id]->active == 1)) {
|
||||||
ue_pdsch_procedures(ue,
|
ue_pdsch_procedures(ue,
|
||||||
|
|||||||
@@ -129,7 +129,8 @@ void do_OFDM_mod_l(int32_t **txdataF, int32_t **txdata, uint16_t next_slot, LTE_
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DL_channel(PHY_VARS_eNB *eNB,PHY_VARS_UE *UE,int subframe,int awgn_flag,double SNR, int tx_lev,int hold_channel,int abstx, int num_rounds, int trials, int round, channel_desc_t *eNB2UE[4], double **s_re,double **s_im,double **r_re,double **r_im,FILE *csv_fd) {
|
void DL_channel(PHY_VARS_eNB *eNB,PHY_VARS_UE *UE,int subframe,int awgn_flag,double SNR, int tx_lev,int hold_channel,int abstx, int num_rounds, int trials, int round, channel_desc_t *eNB2UE[4],
|
||||||
|
double s_re[2][30720*2],double s_im[2][30720*2],double r_re[2][30720*2],double r_im[2][30720*2],FILE *csv_fd) {
|
||||||
|
|
||||||
int i,u;
|
int i,u;
|
||||||
int aa,aarx,aatx;
|
int aa,aarx,aatx;
|
||||||
@@ -1266,7 +1267,7 @@ int main(int argc, char **argv)
|
|||||||
double snr_step=1,input_snr_step=1, snr_int=30;
|
double snr_step=1,input_snr_step=1, snr_int=30;
|
||||||
|
|
||||||
LTE_DL_FRAME_PARMS *frame_parms;
|
LTE_DL_FRAME_PARMS *frame_parms;
|
||||||
double **s_re,**s_im,**r_re,**r_im;
|
double s_re[2][30720*2],s_im[2][30720*2],r_re[2][30720*2],r_im[2][30720*2];
|
||||||
double forgetting_factor=0.0; //in [0,1] 0 means a new channel every time, 1 means keep the same channel
|
double forgetting_factor=0.0; //in [0,1] 0 means a new channel every time, 1 means keep the same channel
|
||||||
|
|
||||||
|
|
||||||
@@ -1798,13 +1799,6 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
frame_parms = &eNB->frame_parms;
|
frame_parms = &eNB->frame_parms;
|
||||||
|
|
||||||
s_re = malloc(2*sizeof(double*));
|
|
||||||
s_im = malloc(2*sizeof(double*));
|
|
||||||
r_re = malloc(2*sizeof(double*));
|
|
||||||
r_im = malloc(2*sizeof(double*));
|
|
||||||
// r_re0 = malloc(2*sizeof(double*));
|
|
||||||
// r_im0 = malloc(2*sizeof(double*));
|
|
||||||
|
|
||||||
nsymb = (eNB->frame_parms.Ncp == 0) ? 14 : 12;
|
nsymb = (eNB->frame_parms.Ncp == 0) ? 14 : 12;
|
||||||
|
|
||||||
printf("Channel Model= (%s,%d)\n",channel_model_input, channel_model);
|
printf("Channel Model= (%s,%d)\n",channel_model_input, channel_model);
|
||||||
@@ -1948,14 +1942,6 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
for (i=0; i<2; i++) {
|
|
||||||
s_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
|
|
||||||
s_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
|
|
||||||
r_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
|
|
||||||
r_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
UE->pdcch_vars[0]->crnti = n_rnti;
|
UE->pdcch_vars[0]->crnti = n_rnti;
|
||||||
|
|
||||||
// Fill in UL_alloc
|
// Fill in UL_alloc
|
||||||
@@ -2329,165 +2315,7 @@ int main(int argc, char **argv)
|
|||||||
} // common_flag == 0
|
} // common_flag == 0
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
num_pdcch_symbols_2 = generate_dci_top(num_ue_spec_dci,
|
|
||||||
num_common_dci,
|
|
||||||
dci_alloc,
|
|
||||||
0,
|
|
||||||
AMP,
|
|
||||||
&eNB->frame_parms,
|
|
||||||
eNB->common_vars.txdataF[eNB_id],
|
|
||||||
subframe);
|
|
||||||
|
|
||||||
if (n_frames==1) printf("Generated DCI, num_pdcch_symbols %d\n",num_pdcch_symbols_2);
|
|
||||||
|
|
||||||
if (num_pdcch_symbols_2 > num_pdcch_symbols) {
|
|
||||||
printf("Error: given num_pdcch_symbols not big enough (%d > %d)\n",num_pdcch_symbols_2,num_pdcch_symbols);
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (k=0; k<n_users; k++) {
|
|
||||||
for (int cw=0; cw<Kmimo; cw++) {
|
|
||||||
coded_bits_per_codeword = get_G(&eNB->frame_parms,
|
|
||||||
eNB->dlsch[k][cw]->harq_processes[0]->nb_rb,
|
|
||||||
eNB->dlsch[k][cw]->harq_processes[0]->rb_alloc,
|
|
||||||
get_Qm(eNB->dlsch[k][cw]->harq_processes[0]->mcs),
|
|
||||||
eNB->dlsch[k][cw]->harq_processes[0]->Nl,
|
|
||||||
num_pdcch_symbols,
|
|
||||||
0,subframe);
|
|
||||||
|
|
||||||
tbs = eNB->dlsch[k][cw]->harq_processes[0]->TBS;
|
|
||||||
rate = (double)tbs/(double)coded_bits_per_codeword;
|
|
||||||
|
|
||||||
if ((SNR==snr0) && (trials==0) && (round==0))
|
|
||||||
printf("User %d, cw %d: Rate = %f (%f bits/dim) (G %d, TBS %d, mod %d, pdcch_sym %d, ndi %d)\n",
|
|
||||||
k,cw,rate,rate*get_Qm(eNB->dlsch[k][0]->harq_processes[0]->mcs),
|
|
||||||
coded_bits_per_codeword,
|
|
||||||
tbs,
|
|
||||||
get_Qm(eNB->dlsch[k][0]->harq_processes[0]->mcs),
|
|
||||||
num_pdcch_symbols,
|
|
||||||
eNB->dlsch[0][0]->harq_processes[0]->round);
|
|
||||||
|
|
||||||
// use the PMI from previous trial
|
|
||||||
if (DLSCH_alloc_pdu2_1E[0].tpmi == 5) {
|
|
||||||
eNB->dlsch[0][0]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,eNB->frame_parms.N_RB_DL);
|
|
||||||
UE->dlsch[0][0]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,UE->frame_parms.N_RB_DL);
|
|
||||||
|
|
||||||
if (n_users>1)
|
|
||||||
eNB->dlsch[1][0]->harq_processes[0]->pmi_alloc = (eNB->dlsch[0][0]->harq_processes[0]->pmi_alloc ^ 0x1555);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
start_meas(&eNB->dlsch_encoding_stats);
|
|
||||||
|
|
||||||
if (dlsch_encoding(((cw==0) ? input_buffer0[k] : input_buffer1[k]),
|
|
||||||
&eNB->frame_parms,
|
|
||||||
num_pdcch_symbols,
|
|
||||||
eNB->dlsch[k][cw],
|
|
||||||
0,subframe,
|
|
||||||
&eNB->dlsch_rate_matching_stats,
|
|
||||||
&eNB->dlsch_turbo_encoding_stats,
|
|
||||||
&eNB->dlsch_interleaving_stats
|
|
||||||
)<0)
|
|
||||||
exit(-1);
|
|
||||||
|
|
||||||
stop_meas(&eNB->dlsch_encoding_stats);
|
|
||||||
|
|
||||||
eNB->dlsch[k][cw]->rnti = (common_flag==0) ? n_rnti+k : SI_RNTI;
|
|
||||||
start_meas(&eNB->dlsch_scrambling_stats);
|
|
||||||
dlsch_scrambling(&eNB->frame_parms,
|
|
||||||
0,
|
|
||||||
eNB->dlsch[k][cw],
|
|
||||||
coded_bits_per_codeword,
|
|
||||||
0,
|
|
||||||
subframe<<1);
|
|
||||||
stop_meas(&eNB->dlsch_scrambling_stats);
|
|
||||||
|
|
||||||
if (n_frames==1) {
|
|
||||||
for (s=0; s<eNB->dlsch[k][cw]->harq_processes[0]->C; s++) {
|
|
||||||
if (s<eNB->dlsch[k][cw]->harq_processes[0]->Cminus)
|
|
||||||
Kr = eNB->dlsch[k][cw]->harq_processes[0]->Kminus;
|
|
||||||
else
|
|
||||||
Kr = eNB->dlsch[k][cw]->harq_processes[0]->Kplus;
|
|
||||||
|
|
||||||
Kr_bytes = Kr>>3;
|
|
||||||
|
|
||||||
for (i=0; i<Kr_bytes; i++)
|
|
||||||
printf("%d : (%x)\n",i,eNB->dlsch[k][cw]->harq_processes[0]->c[s][i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
start_meas(&eNB->dlsch_modulation_stats);
|
|
||||||
|
|
||||||
re_allocated = dlsch_modulation(eNB->common_vars.txdataF[eNB_id],
|
|
||||||
AMP,
|
|
||||||
subframe,
|
|
||||||
&eNB->frame_parms,
|
|
||||||
num_pdcch_symbols,
|
|
||||||
eNB->dlsch[k][0],
|
|
||||||
(transmission_mode==3)||(transmission_mode==4) ? eNB->dlsch[k][1] : NULL);
|
|
||||||
|
|
||||||
(void)re_allocated;
|
|
||||||
|
|
||||||
stop_meas(&eNB->dlsch_modulation_stats);
|
|
||||||
|
|
||||||
} //n_users
|
|
||||||
|
|
||||||
|
|
||||||
generate_pilots(eNB,
|
|
||||||
eNB->common_vars.txdataF[eNB_id],
|
|
||||||
AMP,
|
|
||||||
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME);
|
|
||||||
|
|
||||||
start_meas(&eNB->ofdm_mod_stats);
|
|
||||||
|
|
||||||
do_OFDM_mod_l(eNB->common_vars.txdataF[eNB_id],
|
|
||||||
eNB->common_vars.txdata[eNB_id],
|
|
||||||
(subframe*2),
|
|
||||||
&eNB->frame_parms);
|
|
||||||
|
|
||||||
do_OFDM_mod_l(eNB->common_vars.txdataF[eNB_id],
|
|
||||||
eNB->common_vars.txdata[eNB_id],
|
|
||||||
(subframe*2)+1,
|
|
||||||
&eNB->frame_parms);
|
|
||||||
|
|
||||||
stop_meas(&eNB->ofdm_mod_stats);
|
|
||||||
stop_meas(&eNB->phy_proc_tx);
|
|
||||||
|
|
||||||
do_OFDM_mod_l(eNB->common_vars.txdataF[eNB_id],
|
|
||||||
eNB->common_vars.txdata[eNB_id],
|
|
||||||
(subframe*2)+2,
|
|
||||||
&eNB->frame_parms);
|
|
||||||
|
|
||||||
if (n_frames==1) {
|
|
||||||
write_output("txsigF0.m","txsF0", &eNB->common_vars.txdataF[eNB_id][0][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size],
|
|
||||||
nsymb*eNB->frame_parms.ofdm_symbol_size,1,1);
|
|
||||||
|
|
||||||
if (eNB->frame_parms.nb_antennas_tx>1)
|
|
||||||
write_output("txsigF1.m","txsF1", &eNB->common_vars.txdataF[eNB_id][1][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size],
|
|
||||||
nsymb*eNB->frame_parms.ofdm_symbol_size,1,1);
|
|
||||||
}
|
|
||||||
tx_lev = 0;
|
|
||||||
|
|
||||||
for (aa=0; aa<eNB->frame_parms.nb_antennas_tx; aa++) {
|
|
||||||
tx_lev += signal_energy(&eNB->common_vars.txdata[eNB_id][aa]
|
|
||||||
[subframe*eNB->frame_parms.samples_per_tti],
|
|
||||||
eNB->frame_parms.samples_per_tti);
|
|
||||||
}
|
|
||||||
|
|
||||||
tx_lev_dB = (unsigned int) dB_fixed(tx_lev);
|
|
||||||
|
|
||||||
if (n_frames==1) {
|
|
||||||
printf("tx_lev = %d (%d dB)\n",tx_lev,tx_lev_dB);
|
|
||||||
write_output("txsig0.m","txs0", &eNB->common_vars.txdata[eNB_id][0][subframe* eNB->frame_parms.samples_per_tti],
|
|
||||||
|
|
||||||
eNB->frame_parms.samples_per_tti,1,1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
/*
|
/*
|
||||||
else { // Read signal from file
|
else { // Read signal from file
|
||||||
i=0;
|
i=0;
|
||||||
@@ -2533,7 +2361,6 @@ int main(int argc, char **argv)
|
|||||||
&eNB->frame_parms);
|
&eNB->frame_parms);
|
||||||
|
|
||||||
stop_meas(&eNB->ofdm_mod_stats);
|
stop_meas(&eNB->ofdm_mod_stats);
|
||||||
stop_meas(&eNB->phy_proc_tx);
|
|
||||||
|
|
||||||
// generate next subframe for channel estimation
|
// generate next subframe for channel estimation
|
||||||
|
|
||||||
@@ -2653,461 +2480,7 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
if (n_frames==1) {
|
|
||||||
printf("RX level in null symbol %d\n",dB_fixed(signal_energy(&UE->common_vars.rxdata[0][160+OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2)));
|
|
||||||
printf("RX level in data symbol %d\n",dB_fixed(signal_energy(&UE->common_vars.rxdata[0][160+(2*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES)],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2)));
|
|
||||||
printf("rx_level Null symbol %f\n",10*log10(signal_energy_fp(r_re,r_im,1,OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2,256+(OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES))));
|
|
||||||
printf("rx_level data symbol %f\n",10*log10(signal_energy_fp(r_re,r_im,1,OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2,256+(2*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES))));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (eNB->frame_parms.Ncp == 0) { // normal prefix
|
|
||||||
pilot1 = 4;
|
|
||||||
pilot2 = 7;
|
|
||||||
pilot3 = 11;
|
|
||||||
} else { // extended prefix
|
|
||||||
pilot1 = 3;
|
|
||||||
pilot2 = 6;
|
|
||||||
pilot3 = 9;
|
|
||||||
}
|
|
||||||
|
|
||||||
start_meas(&UE->phy_proc_rx);
|
|
||||||
|
|
||||||
// Inner receiver scheduling for 3 slots
|
|
||||||
for (Ns=(2*subframe); Ns<((2*subframe)+3); Ns++) {
|
|
||||||
for (l=0; l<pilot2; l++) {
|
|
||||||
if (n_frames==1)
|
|
||||||
printf("Ns %d, l %d, l2 %d\n",Ns, l, l+(Ns%2)*pilot2);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
start_meas(&UE->ofdm_demod_stats);
|
|
||||||
slot_fep(UE,
|
|
||||||
l,
|
|
||||||
Ns%20,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0);
|
|
||||||
stop_meas(&UE->ofdm_demod_stats);
|
|
||||||
|
|
||||||
if (UE->perfect_ce==1) {
|
|
||||||
if (awgn_flag==0) {
|
|
||||||
for(k=0; k<NUMBER_OF_eNB_MAX; k++) {
|
|
||||||
for(aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
|
||||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
|
||||||
for (i=0; i<frame_parms->N_RB_DL*12; i++) {
|
|
||||||
((int16_t *) UE->common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)(
|
|
||||||
eNB2UE[round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].x*AMP);
|
|
||||||
((int16_t *) UE->common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)(
|
|
||||||
eNB2UE[round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].y*AMP);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for(aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
|
||||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
|
||||||
for (i=0; i<frame_parms->N_RB_DL*12; i++) {
|
|
||||||
((int16_t *) UE->common_vars.dl_ch_estimates[0][(aa<<1)+aarx])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(short)(AMP);
|
|
||||||
((int16_t *) UE->common_vars.dl_ch_estimates[0][(aa<<1)+aarx])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=0/2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if ((Ns==((2*subframe))) && (l==0)) {
|
|
||||||
lte_ue_measurements(UE,
|
|
||||||
subframe*UE->frame_parms.samples_per_tti,
|
|
||||||
1,
|
|
||||||
0);
|
|
||||||
|
|
||||||
if (transmission_mode==5 || transmission_mode==6) {
|
|
||||||
if (pmi_feedback == 1) {
|
|
||||||
pmi_feedback = 0;
|
|
||||||
hold_channel = 1;
|
|
||||||
goto PMI_FEEDBACK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if ((Ns==(2*subframe)) && (l==pilot1)) {// process symbols 0,1,2
|
|
||||||
|
|
||||||
if (dci_flag == 1) {
|
|
||||||
UE->UE_mode[0] = PUSCH;
|
|
||||||
start_meas(&UE->dlsch_rx_pdcch_stats);
|
|
||||||
rx_pdcch(&UE->common_vars,
|
|
||||||
UE->pdcch_vars,
|
|
||||||
&UE->frame_parms,
|
|
||||||
subframe,
|
|
||||||
0,
|
|
||||||
(UE->frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI,
|
|
||||||
UE->high_speed_flag,
|
|
||||||
0);
|
|
||||||
stop_meas(&UE->dlsch_rx_pdcch_stats);
|
|
||||||
// overwrite number of pdcch symbols
|
|
||||||
UE->pdcch_vars[0]->num_pdcch_symbols = num_pdcch_symbols;
|
|
||||||
|
|
||||||
dci_cnt = dci_decoding_procedure(UE,
|
|
||||||
dci_alloc_rx,1,
|
|
||||||
eNB_id,
|
|
||||||
subframe);
|
|
||||||
//printf("dci_cnt %d\n",dci_cnt);
|
|
||||||
|
|
||||||
if (dci_cnt==0) {
|
|
||||||
dlsch_active = 0;
|
|
||||||
|
|
||||||
if (round==0) {
|
|
||||||
dci_errors++;
|
|
||||||
round=5;
|
|
||||||
errs[0]++;
|
|
||||||
//round_trials[0]++;
|
|
||||||
|
|
||||||
if (n_frames==1)
|
|
||||||
printf("DCI error trial %d errs[0] %d\n",trials,errs[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// for (i=1;i<=round;i++)
|
|
||||||
// round_trials[i]--;
|
|
||||||
// round=5;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i=0; i<dci_cnt; i++) {
|
|
||||||
// printf("Generating dlsch parameters for RNTI %x\n",dci_alloc_rx[i].rnti);
|
|
||||||
if (round == 0) UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->first_tx=1;
|
|
||||||
|
|
||||||
if ((dci_alloc_rx[i].rnti == n_rnti) &&
|
|
||||||
(generate_ue_dlsch_params_from_dci(0,
|
|
||||||
subframe,
|
|
||||||
dci_alloc_rx[i].dci_pdu,
|
|
||||||
dci_alloc_rx[i].rnti,
|
|
||||||
dci_alloc_rx[i].format,
|
|
||||||
UE->dlsch[0],
|
|
||||||
&UE->frame_parms,
|
|
||||||
UE->pdsch_config_dedicated,
|
|
||||||
SI_RNTI,
|
|
||||||
0,
|
|
||||||
P_RNTI)==0)) {
|
|
||||||
//dump_dci(&UE->frame_parms,&dci_alloc_rx[i]);
|
|
||||||
coded_bits_per_codeword = get_G(&eNB->frame_parms,
|
|
||||||
UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->nb_rb,
|
|
||||||
UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->rb_alloc_even,
|
|
||||||
get_Qm(UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->mcs),
|
|
||||||
UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->Nl,
|
|
||||||
UE->pdcch_vars[0]->num_pdcch_symbols,
|
|
||||||
0,subframe);
|
|
||||||
printf("num_pdcch_symbols %d, G %d, TBS %d\n",UE->pdcch_vars[0]->num_pdcch_symbols,coded_bits_per_codeword,
|
|
||||||
UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->TBS);
|
|
||||||
|
|
||||||
dlsch_active = 1;
|
|
||||||
} else {
|
|
||||||
dlsch_active = 0;
|
|
||||||
|
|
||||||
if (round==0) {
|
|
||||||
dci_errors++;
|
|
||||||
errs[0]++;
|
|
||||||
//round_trials[0]++;
|
|
||||||
round=5;
|
|
||||||
|
|
||||||
if (n_frames==1)
|
|
||||||
printf("DCI misdetection trial %d\n",trials);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// for (i=1;i<=round;i++)
|
|
||||||
// round_trials[i]--;
|
|
||||||
// round=5;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} // if dci_flag==1
|
|
||||||
else { //dci_flag == 0
|
|
||||||
|
|
||||||
UE->pdcch_vars[0]->crnti = n_rnti;
|
|
||||||
UE->pdcch_vars[0]->num_pdcch_symbols = num_pdcch_symbols;
|
|
||||||
|
|
||||||
if (round == 0) UE->dlsch[0][0]->harq_processes[0]->first_tx=1;
|
|
||||||
|
|
||||||
switch (transmission_mode) {
|
|
||||||
case 1:
|
|
||||||
case 2:
|
|
||||||
generate_ue_dlsch_params_from_dci(0,
|
|
||||||
subframe,
|
|
||||||
&DLSCH_alloc_pdu_1[0],
|
|
||||||
(common_flag==0)? C_RNTI : SI_RNTI,
|
|
||||||
(common_flag==0)? format1 : format1A,
|
|
||||||
UE->dlsch[0],
|
|
||||||
&UE->frame_parms,
|
|
||||||
UE->pdsch_config_dedicated,
|
|
||||||
SI_RNTI,
|
|
||||||
0,
|
|
||||||
P_RNTI);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 3:
|
|
||||||
// printf("Rate: TM3 (before) round %d (%d) first_tx %d\n",round,UE->dlsch[0][0]->harq_processes[0]->round,UE->dlsch[0][0]->harq_processes[0]->first_tx);
|
|
||||||
generate_ue_dlsch_params_from_dci(0,
|
|
||||||
subframe,
|
|
||||||
&DLSCH_alloc_pdu_1[0],
|
|
||||||
(common_flag==0)? C_RNTI : SI_RNTI,
|
|
||||||
(common_flag==0)? format2A : format1A,
|
|
||||||
UE->dlsch[0],
|
|
||||||
&UE->frame_parms,
|
|
||||||
UE->pdsch_config_dedicated,
|
|
||||||
SI_RNTI,
|
|
||||||
0,
|
|
||||||
P_RNTI);
|
|
||||||
// printf("Rate: TM3 (after) round %d (%d) first_tx %d\n",round,UE->dlsch[0][0]->harq_processes[0]->round,UE->dlsch[0][0]->harq_processes[0]->first_tx);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 4:
|
|
||||||
generate_ue_dlsch_params_from_dci(0,
|
|
||||||
subframe,
|
|
||||||
&DLSCH_alloc_pdu_1[0],
|
|
||||||
(common_flag==0)? C_RNTI : SI_RNTI,
|
|
||||||
(common_flag==0)? format2 : format1A,
|
|
||||||
UE->dlsch[0],
|
|
||||||
&UE->frame_parms,
|
|
||||||
UE->pdsch_config_dedicated,
|
|
||||||
SI_RNTI,
|
|
||||||
0,
|
|
||||||
P_RNTI);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 5:
|
|
||||||
case 6:
|
|
||||||
generate_ue_dlsch_params_from_dci(0,
|
|
||||||
subframe,
|
|
||||||
&DLSCH_alloc_pdu2_1E[0],
|
|
||||||
C_RNTI,
|
|
||||||
format1E_2A_M10PRB,
|
|
||||||
UE->dlsch[0],
|
|
||||||
&UE->frame_parms,
|
|
||||||
UE->pdsch_config_dedicated,
|
|
||||||
SI_RNTI,
|
|
||||||
0,
|
|
||||||
P_RNTI);
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
dlsch_active = 1;
|
|
||||||
} // if dci_flag == 1
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dlsch_active == 1) {
|
|
||||||
if ((Ns==(1+(2*subframe))) && (l==0)) {// process PDSCH symbols 1,2,3,4,5,(6 Normal Prefix)
|
|
||||||
|
|
||||||
if ((transmission_mode == 5) &&
|
|
||||||
(UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->dl_power_off==0) &&
|
|
||||||
(UE->use_ia_receiver ==1)) {
|
|
||||||
dual_stream_UE = 1;
|
|
||||||
} else {
|
|
||||||
dual_stream_UE = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
start_meas(&UE->dlsch_llr_stats);
|
|
||||||
|
|
||||||
for (m=UE->pdcch_vars[0]->num_pdcch_symbols;
|
|
||||||
m<pilot2;
|
|
||||||
m++) {
|
|
||||||
if (rx_pdsch(UE,
|
|
||||||
PDSCH,
|
|
||||||
eNB_id,
|
|
||||||
eNB_id_i,
|
|
||||||
subframe,
|
|
||||||
m,
|
|
||||||
(m==UE->pdcch_vars[0]->num_pdcch_symbols)?1:0,
|
|
||||||
dual_stream_UE,
|
|
||||||
i_mod,
|
|
||||||
UE->dlsch[0][0]->current_harq_pid)==-1) {
|
|
||||||
dlsch_active = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
stop_meas(&UE->dlsch_llr_stats);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((Ns==(1+(2*subframe))) && (l==pilot1)) {
|
|
||||||
// process symbols (6 Extended Prefix),7,8,9
|
|
||||||
start_meas(&UE->dlsch_llr_stats);
|
|
||||||
|
|
||||||
for (m=pilot2;
|
|
||||||
m<pilot3;
|
|
||||||
m++) {
|
|
||||||
if (rx_pdsch(UE,
|
|
||||||
PDSCH,
|
|
||||||
eNB_id,
|
|
||||||
eNB_id_i,
|
|
||||||
subframe,
|
|
||||||
m,
|
|
||||||
0,
|
|
||||||
dual_stream_UE,
|
|
||||||
i_mod,
|
|
||||||
UE->dlsch[0][0]->current_harq_pid)==-1) {
|
|
||||||
dlsch_active=0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
stop_meas(&UE->dlsch_llr_stats);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((Ns==(2+(2*subframe))) && (l==0)) { // process symbols 10,11,(12,13 Normal Prefix) do deinterleaving for TTI
|
|
||||||
start_meas(&UE->dlsch_llr_stats);
|
|
||||||
|
|
||||||
for (m=pilot3;
|
|
||||||
m<UE->frame_parms.symbols_per_tti;
|
|
||||||
m++) {
|
|
||||||
if (rx_pdsch(UE,
|
|
||||||
PDSCH,
|
|
||||||
eNB_id,
|
|
||||||
eNB_id_i,
|
|
||||||
subframe,
|
|
||||||
m,
|
|
||||||
0,
|
|
||||||
dual_stream_UE,
|
|
||||||
i_mod,
|
|
||||||
UE->dlsch[0][0]->current_harq_pid)==-1) {
|
|
||||||
dlsch_active=0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
stop_meas(&UE->dlsch_llr_stats);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (test_perf ==0 ) {
|
|
||||||
if ((n_frames==1) && (Ns==(2+(2*subframe))) && (l==0)) {
|
|
||||||
write_output("ch0.m","ch0",eNB2UE[0]->ch[0],eNB2UE[0]->channel_length,1,8);
|
|
||||||
|
|
||||||
if (eNB->frame_parms.nb_antennas_tx>1)
|
|
||||||
write_output("ch1.m","ch1",eNB2UE[0]->ch[eNB->frame_parms.nb_antennas_rx],eNB2UE[0]->channel_length,1,8);
|
|
||||||
|
|
||||||
//common vars
|
|
||||||
write_output("rxsig0.m","rxs0", &UE->common_vars.rxdata[0][0],10*UE->frame_parms.samples_per_tti,1,1);
|
|
||||||
write_output("rxsigF0.m","rxsF0", &UE->common_vars.rxdataF[0][0],UE->frame_parms.ofdm_symbol_size*nsymb,1,1);
|
|
||||||
|
|
||||||
if (UE->frame_parms.nb_antennas_rx>1) {
|
|
||||||
write_output("rxsig1.m","rxs1", UE->common_vars.rxdata[1],UE->frame_parms.samples_per_tti,1,1);
|
|
||||||
write_output("rxsigF1.m","rxsF1", UE->common_vars.rxdataF[1],UE->frame_parms.ofdm_symbol_size*nsymb,1,1);
|
|
||||||
}
|
|
||||||
|
|
||||||
write_output("dlsch00_r0.m","dl00_r0",
|
|
||||||
&(UE->common_vars.dl_ch_estimates[eNB_id][0][0]),
|
|
||||||
UE->frame_parms.ofdm_symbol_size*nsymb,1,1);
|
|
||||||
|
|
||||||
if (UE->frame_parms.nb_antennas_rx>1)
|
|
||||||
write_output("dlsch01_r0.m","dl01_r0",
|
|
||||||
&(UE->common_vars.dl_ch_estimates[eNB_id][1][0]),
|
|
||||||
UE->frame_parms.ofdm_symbol_size*nsymb,1,1);
|
|
||||||
|
|
||||||
if (eNB->frame_parms.nb_antennas_tx>1)
|
|
||||||
write_output("dlsch10_r0.m","dl10_r0",
|
|
||||||
&(UE->common_vars.dl_ch_estimates[eNB_id][2][0]),
|
|
||||||
UE->frame_parms.ofdm_symbol_size*nsymb,1,1);
|
|
||||||
|
|
||||||
if ((UE->frame_parms.nb_antennas_rx>1) && (eNB->frame_parms.nb_antennas_tx>1))
|
|
||||||
write_output("dlsch11_r0.m","dl11_r0",
|
|
||||||
&(UE->common_vars.dl_ch_estimates[eNB_id][3][0]),
|
|
||||||
UE->frame_parms.ofdm_symbol_size*nsymb/2,1,1);
|
|
||||||
|
|
||||||
//pdsch_vars
|
|
||||||
dump_dlsch2(UE,eNB_id,coded_bits_per_codeword,round);
|
|
||||||
//dump_dlsch2(UE,eNB_id_i,coded_bits_per_codeword);
|
|
||||||
write_output("dlsch_e.m","e",eNB->dlsch[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4);
|
|
||||||
|
|
||||||
//pdcch_vars
|
|
||||||
write_output("pdcchF0_ext.m","pdcchF_ext", UE->pdcch_vars[eNB_id]->rxdataF_ext[0],2*3*UE->frame_parms.ofdm_symbol_size,1,1);
|
|
||||||
write_output("pdcch00_ch0_ext.m","pdcch00_ch0_ext",UE->pdcch_vars[eNB_id]->dl_ch_estimates_ext[0],300*3,1,1);
|
|
||||||
|
|
||||||
write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",UE->pdcch_vars[eNB_id]->rxdataF_comp[0],4*300,1,1);
|
|
||||||
write_output("pdcch_rxF_llr.m","pdcch_llr",UE->pdcch_vars[eNB_id]->llr,2400,1,4);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//saving PMI in case of Transmission Mode > 5
|
|
||||||
|
|
||||||
if(abstx) {
|
|
||||||
if (trials==0 && round==0 && transmission_mode>=5) {
|
|
||||||
for (iii=0; iii<NB_RB; iii++) {
|
|
||||||
//fprintf(csv_fd, "%d, %d", (UE->lte_ue_pdsch_vars[eNB_id]->pmi_ext[iii]),(UE->lte_ue_pdsch_vars[eNB_id_i]->pmi_ext[iii]));
|
|
||||||
fprintf(csv_fd,"%x,%x,",(UE->pdsch_vars[eNB_id]->pmi_ext[iii]),(UE->pdsch_vars[eNB_id]->pmi_ext[iii]));
|
|
||||||
printf("%x ",(UE->pdsch_vars[eNB_id]->pmi_ext[iii]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int cw=Kmimo-1; cw>=0; cw--) {
|
|
||||||
UE->dlsch[0][cw]->rnti = (common_flag==0) ? n_rnti: SI_RNTI;
|
|
||||||
coded_bits_per_codeword = get_G(&eNB->frame_parms,
|
|
||||||
eNB->dlsch[0][cw]->harq_processes[0]->nb_rb,
|
|
||||||
eNB->dlsch[0][cw]->harq_processes[0]->rb_alloc,
|
|
||||||
get_Qm(eNB->dlsch[0][cw]->harq_processes[0]->mcs),
|
|
||||||
eNB->dlsch[0][cw]->harq_processes[0]->Nl,
|
|
||||||
num_pdcch_symbols,
|
|
||||||
0,subframe);
|
|
||||||
|
|
||||||
UE->dlsch[0][cw]->harq_processes[UE->dlsch[0][cw]->current_harq_pid]->G = coded_bits_per_codeword;
|
|
||||||
|
|
||||||
|
|
||||||
// calculate uncoded BLER
|
|
||||||
uncoded_ber=0;
|
|
||||||
for (i=0;i<coded_bits_per_codeword;i++)
|
|
||||||
if (eNB->dlsch[0][0]->harq_processes[0]->e[i] != (UE->pdsch_vars[0]->llr[0][i]<0)) {
|
|
||||||
uncoded_ber_bit[i] = 1;
|
|
||||||
uncoded_ber++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
uncoded_ber_bit[i] = 0;
|
|
||||||
|
|
||||||
uncoded_ber/=coded_bits_per_codeword;
|
|
||||||
avg_ber += uncoded_ber;
|
|
||||||
|
|
||||||
if (n_frames==1)
|
|
||||||
write_output("uncoded_ber_bit.m","uncoded_ber_bit",uncoded_ber_bit,coded_bits_per_codeword,1,0);
|
|
||||||
|
|
||||||
|
|
||||||
start_meas(&UE->dlsch_unscrambling_stats);
|
|
||||||
dlsch_unscrambling(&UE->frame_parms,
|
|
||||||
0,
|
|
||||||
UE->dlsch[0][cw],
|
|
||||||
coded_bits_per_codeword,
|
|
||||||
UE->pdsch_vars[eNB_id]->llr[cw],
|
|
||||||
0,
|
|
||||||
subframe<<1);
|
|
||||||
stop_meas(&UE->dlsch_unscrambling_stats);
|
|
||||||
|
|
||||||
start_meas(&UE->dlsch_decoding_stats);
|
|
||||||
ret = dlsch_decoding(UE,
|
|
||||||
UE->pdsch_vars[eNB_id]->llr[cw],
|
|
||||||
&UE->frame_parms,
|
|
||||||
UE->dlsch[0][cw],
|
|
||||||
UE->dlsch[0][cw]->harq_processes[UE->dlsch[0][cw]->current_harq_pid],
|
|
||||||
subframe,
|
|
||||||
UE->dlsch[0][cw]->current_harq_pid,
|
|
||||||
1,llr8_flag);
|
|
||||||
stop_meas(&UE->dlsch_decoding_stats);
|
|
||||||
|
|
||||||
if (cw==1) {
|
|
||||||
if (ret <= UE->dlsch[0][cw]->max_turbo_iterations) {
|
|
||||||
} else {
|
|
||||||
errs2[round]++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
stop_meas(&UE->phy_proc_rx);
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (UE->dlsch_errors[0] == 0) {
|
if (UE->dlsch_errors[0] == 0) {
|
||||||
|
|
||||||
@@ -3120,45 +2493,7 @@ int main(int argc, char **argv)
|
|||||||
UE->total_TBS[eNB_id] = UE->total_TBS[eNB_id] + UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->TBS;
|
UE->total_TBS[eNB_id] = UE->total_TBS[eNB_id] + UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->TBS;
|
||||||
TB0_active = 0;
|
TB0_active = 0;
|
||||||
|
|
||||||
if (UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->mimo_mode == LARGE_CDD) { //try to decode second stream using SIC
|
|
||||||
|
|
||||||
//for (round = 0 ; round < UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->round ; round++) {
|
|
||||||
// re-encoding of first stream
|
|
||||||
//dlsch0_ue_harq = UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid];
|
|
||||||
//dlsch0_eNB_harq = UE->dlsch[eNB_id]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid];
|
|
||||||
//dlsch0_eNB_harq->mimo_mode = LARGE_CDD;
|
|
||||||
//dlsch0_eNB_harq->rb_alloc[0] = dlsch0_ue_harq->rb_alloc_even[0];
|
|
||||||
//dlsch0_eNB_harq->nb_rb = dlsch0_ue_harq->nb_rb;
|
|
||||||
//dlsch0_eNB_harq->mcs = dlsch0_ue_harq->mcs;
|
|
||||||
//dlsch0_eNB_harq->rvidx = dlsch0_ue_harq->rvidx;
|
|
||||||
//dlsch0_eNB_harq->Nl = dlsch0_ue_harq->Nl;
|
|
||||||
|
|
||||||
//dlsch0_eNB_harq->TBS = dlsch0_ue_harq->TBS;
|
|
||||||
//dlsch0_eNB_harq->dl_power_off = dlsch0_ue_harq->dl_power_off;
|
|
||||||
//dlsch0_eNB_harq->status = dlsch0_ue_harq->status;
|
|
||||||
|
|
||||||
//UE->dlsch[eNB_id]->active = UE->dlsch[eNB_id][0]->active;
|
|
||||||
//UE->dlsch[eNB_id]->rnti = UE->dlsch[eNB_id][0]->rnti;
|
|
||||||
|
|
||||||
//dlsch_encoding(UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->b,
|
|
||||||
// &UE->frame_parms,
|
|
||||||
// num_pdcch_symbols,
|
|
||||||
// UE->dlsch[0],
|
|
||||||
// 0,subframe,
|
|
||||||
// &UE->dlsch_rate_matching_stats,
|
|
||||||
// &UE->dlsch_turbo_encoding_stats,
|
|
||||||
// &UE->dlsch_interleaving_stats
|
|
||||||
// );
|
|
||||||
|
|
||||||
//scrambling
|
|
||||||
|
|
||||||
//modulation
|
|
||||||
|
|
||||||
//stripping (from matched filter output?)
|
|
||||||
|
|
||||||
//detection of second stream
|
|
||||||
}
|
|
||||||
|
|
||||||
} // DLSCH received ok
|
} // DLSCH received ok
|
||||||
else {
|
else {
|
||||||
errs[round]++;
|
errs[round]++;
|
||||||
@@ -3449,13 +2784,14 @@ int main(int argc, char **argv)
|
|||||||
printf("eNB TX function statistics (per 1ms subframe)\n\n");
|
printf("eNB TX function statistics (per 1ms subframe)\n\n");
|
||||||
std_phy_proc_tx = sqrt((double)eNB->phy_proc_tx.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
|
std_phy_proc_tx = sqrt((double)eNB->phy_proc_tx.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
|
||||||
2)/eNB->phy_proc_tx.trials - pow((double)eNB->phy_proc_tx.diff/eNB->phy_proc_tx.trials/cpu_freq_GHz/1000,2));
|
2)/eNB->phy_proc_tx.trials - pow((double)eNB->phy_proc_tx.diff/eNB->phy_proc_tx.trials/cpu_freq_GHz/1000,2));
|
||||||
printf("Total PHY proc tx :%f us (%d trials)\n",(double)eNB->phy_proc_tx.diff/eNB->phy_proc_tx.trials/cpu_freq_GHz/1000.0,eNB->phy_proc_tx.trials);
|
|
||||||
printf("|__ Statistcs std: %fus max: %fus min: %fus median %fus q1 %fus q3 %fus n_dropped: %d packet \n",std_phy_proc_tx, t_tx_max, t_tx_min, tx_median, tx_q1, tx_q3,
|
|
||||||
n_tx_dropped);
|
|
||||||
std_phy_proc_tx_ifft = sqrt((double)eNB->ofdm_mod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
|
std_phy_proc_tx_ifft = sqrt((double)eNB->ofdm_mod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
|
||||||
2)/eNB->ofdm_mod_stats.trials - pow((double)eNB->ofdm_mod_stats.diff/eNB->ofdm_mod_stats.trials/cpu_freq_GHz/1000,2));
|
2)/eNB->ofdm_mod_stats.trials - pow((double)eNB->ofdm_mod_stats.diff/eNB->ofdm_mod_stats.trials/cpu_freq_GHz/1000,2));
|
||||||
printf("OFDM_mod time :%f us (%d trials)\n",(double)eNB->ofdm_mod_stats.diff/eNB->ofdm_mod_stats.trials/cpu_freq_GHz/1000.0,eNB->ofdm_mod_stats.trials);
|
printf("OFDM_mod time :%f us (%d trials)\n",(double)eNB->ofdm_mod_stats.diff/eNB->ofdm_mod_stats.trials/cpu_freq_GHz/1000.0,eNB->ofdm_mod_stats.trials);
|
||||||
printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_tx_ifft, tx_ifft_median, tx_ifft_q1, tx_ifft_q3);
|
printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_tx_ifft, tx_ifft_median, tx_ifft_q1, tx_ifft_q3);
|
||||||
|
printf("Total PHY proc tx :%f us (%d trials)\n",(double)eNB->phy_proc_tx.diff/eNB->phy_proc_tx.trials/cpu_freq_GHz/1000.0,eNB->phy_proc_tx.trials);
|
||||||
|
printf("|__ Statistcs std: %fus max: %fus min: %fus median %fus q1 %fus q3 %fus n_dropped: %d packet \n",std_phy_proc_tx, t_tx_max, t_tx_min, tx_median, tx_q1, tx_q3,
|
||||||
|
n_tx_dropped);
|
||||||
|
|
||||||
std_phy_proc_tx_mod = sqrt((double)eNB->dlsch_modulation_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
|
std_phy_proc_tx_mod = sqrt((double)eNB->dlsch_modulation_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
|
||||||
2)/eNB->dlsch_modulation_stats.trials - pow((double)eNB->dlsch_modulation_stats.diff/eNB->dlsch_modulation_stats.trials/cpu_freq_GHz/1000,2));
|
2)/eNB->dlsch_modulation_stats.trials - pow((double)eNB->dlsch_modulation_stats.diff/eNB->dlsch_modulation_stats.trials/cpu_freq_GHz/1000,2));
|
||||||
printf("DLSCH modulation time :%f us (%d trials)\n",(double)eNB->dlsch_modulation_stats.diff/eNB->dlsch_modulation_stats.trials/cpu_freq_GHz/1000.0,
|
printf("DLSCH modulation time :%f us (%d trials)\n",(double)eNB->dlsch_modulation_stats.diff/eNB->dlsch_modulation_stats.trials/cpu_freq_GHz/1000.0,
|
||||||
@@ -3809,24 +3145,6 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
printf("Freeing channel I/O\n");
|
|
||||||
|
|
||||||
for (i=0; i<2; i++) {
|
|
||||||
free(s_re[i]);
|
|
||||||
free(s_im[i]);
|
|
||||||
free(r_re[i]);
|
|
||||||
free(r_im[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
free(s_re);
|
|
||||||
free(s_im);
|
|
||||||
free(r_re);
|
|
||||||
free(r_im);
|
|
||||||
|
|
||||||
// lte_sync_time_free();
|
|
||||||
|
|
||||||
// printf("[MUMIMO] mcs %d, mcsi %d, offset %d, bler %f\n",mcs,mcs_i,offset_mumimo_llr_drange_fix,((double)errs[0])/((double)round_trials[0]));
|
|
||||||
|
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -82,6 +82,7 @@
|
|||||||
|
|
||||||
#define BCCH_PAYLOAD_SIZE_MAX 128
|
#define BCCH_PAYLOAD_SIZE_MAX 128
|
||||||
#define CCCH_PAYLOAD_SIZE_MAX 128
|
#define CCCH_PAYLOAD_SIZE_MAX 128
|
||||||
|
#define PCCH_PAYLOAD_SIZE_MAX 128
|
||||||
|
|
||||||
#define SCH_PAYLOAD_SIZE_MAX 4096
|
#define SCH_PAYLOAD_SIZE_MAX 4096
|
||||||
/// Logical channel ids from 36-311 (Note BCCH is not specified in 36-311, uses the same as first DRB)
|
/// Logical channel ids from 36-311 (Note BCCH is not specified in 36-311, uses the same as first DRB)
|
||||||
@@ -263,6 +264,10 @@ typedef struct {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t payload[BCCH_PAYLOAD_SIZE_MAX] ;
|
uint8_t payload[BCCH_PAYLOAD_SIZE_MAX] ;
|
||||||
} __attribute__((__packed__))BCCH_PDU;
|
} __attribute__((__packed__))BCCH_PDU;
|
||||||
|
/*! \brief BCCH payload */
|
||||||
|
typedef struct {
|
||||||
|
uint8_t payload[PCCH_PAYLOAD_SIZE_MAX] ;
|
||||||
|
} __attribute__((__packed__))PCCH_PDU;
|
||||||
|
|
||||||
#ifdef Rel10
|
#ifdef Rel10
|
||||||
/*! \brief MCCH payload */
|
/*! \brief MCCH payload */
|
||||||
@@ -291,6 +296,8 @@ typedef struct {
|
|||||||
#define CCCH_LCHANID 0
|
#define CCCH_LCHANID 0
|
||||||
/*!\brief Values of BCCH logical channel */
|
/*!\brief Values of BCCH logical channel */
|
||||||
#define BCCH 3 // SI
|
#define BCCH 3 // SI
|
||||||
|
/*!\brief Values of PCCH logical channel */
|
||||||
|
#define PCCH 4 // Paging
|
||||||
/*!\brief Value of CCCH / SRB0 logical channel */
|
/*!\brief Value of CCCH / SRB0 logical channel */
|
||||||
#define CCCH 0 // srb0
|
#define CCCH 0 // srb0
|
||||||
/*!\brief DCCH / SRB1 logical channel */
|
/*!\brief DCCH / SRB1 logical channel */
|
||||||
@@ -1104,6 +1111,8 @@ typedef struct {
|
|||||||
time_stats_t rx_mch_sdu;
|
time_stats_t rx_mch_sdu;
|
||||||
/// UE BCCH rx processing time including RLC interface (mac_rrc_data_ind)
|
/// UE BCCH rx processing time including RLC interface (mac_rrc_data_ind)
|
||||||
time_stats_t rx_si;
|
time_stats_t rx_si;
|
||||||
|
/// UE PCCH rx processing time including RLC interface (mac_rrc_data_ind)
|
||||||
|
time_stats_t rx_p;
|
||||||
} UE_MAC_INST;
|
} UE_MAC_INST;
|
||||||
/*! \brief ID of the neighboring cells used for HO*/
|
/*! \brief ID of the neighboring cells used for HO*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|||||||
@@ -480,6 +480,7 @@ int l2_init(LTE_DL_FRAME_PARMS *frame_parms,int eMBMS_active, char *uecap_xer,ui
|
|||||||
|
|
||||||
LOG_I(MAC,"[MAIN] init UE MAC functions \n");
|
LOG_I(MAC,"[MAIN] init UE MAC functions \n");
|
||||||
mac_xface->ue_decode_si = ue_decode_si;
|
mac_xface->ue_decode_si = ue_decode_si;
|
||||||
|
mac_xface->ue_decode_p = ue_decode_p;
|
||||||
mac_xface->ue_send_sdu = ue_send_sdu;
|
mac_xface->ue_send_sdu = ue_send_sdu;
|
||||||
#ifdef Rel10
|
#ifdef Rel10
|
||||||
mac_xface->ue_send_mch_sdu = ue_send_mch_sdu;
|
mac_xface->ue_send_mch_sdu = ue_send_mch_sdu;
|
||||||
|
|||||||
@@ -385,6 +385,8 @@ void mac_out_of_sync_ind(module_id_t module_idP, frame_t frameP, uint16_t CH_ind
|
|||||||
|
|
||||||
void ue_decode_si(module_id_t module_idP, int CC_id,frame_t frame, uint8_t CH_index, void *pdu, uint16_t len);
|
void ue_decode_si(module_id_t module_idP, int CC_id,frame_t frame, uint8_t CH_index, void *pdu, uint16_t len);
|
||||||
|
|
||||||
|
void ue_decode_p(module_id_t module_idP, int CC_id,frame_t frame, uint8_t CH_index, void *pdu, uint16_t len);
|
||||||
|
|
||||||
|
|
||||||
void ue_send_sdu(module_id_t module_idP, uint8_t CC_id,frame_t frame, uint8_t *sdu,uint16_t sdu_len,uint8_t CH_index);
|
void ue_send_sdu(module_id_t module_idP, uint8_t CC_id,frame_t frame, uint8_t *sdu,uint16_t sdu_len,uint8_t CH_index);
|
||||||
|
|
||||||
|
|||||||
@@ -525,6 +525,41 @@ void ue_decode_si(module_id_t module_idP,int CC_id,frame_t frameP, uint8_t eNB_i
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ue_decode_p(module_id_t module_idP,int CC_id,frame_t frameP, uint8_t eNB_index, void *pdu,uint16_t len)
|
||||||
|
{
|
||||||
|
|
||||||
|
start_meas(&UE_mac_inst[module_idP].rx_p);
|
||||||
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_PCCH, VCD_FUNCTION_IN);
|
||||||
|
|
||||||
|
LOG_D(MAC,"[UE %d] Frame %d Sending Paging message to RRC (LCID Id %d,len %d)\n",module_idP,frameP,PCCH,len);
|
||||||
|
|
||||||
|
mac_rrc_data_ind(module_idP,
|
||||||
|
CC_id,
|
||||||
|
frameP,0, // unknown subframe
|
||||||
|
P_RNTI,
|
||||||
|
PCCH,
|
||||||
|
(uint8_t *)pdu,
|
||||||
|
len,
|
||||||
|
ENB_FLAG_NO,
|
||||||
|
eNB_index,
|
||||||
|
0);
|
||||||
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_PCCH, VCD_FUNCTION_OUT);
|
||||||
|
stop_meas(&UE_mac_inst[module_idP].rx_p);
|
||||||
|
if (opt_enabled == 1) {
|
||||||
|
trace_pdu(0,
|
||||||
|
(uint8_t *)pdu,
|
||||||
|
len,
|
||||||
|
module_idP,
|
||||||
|
4,
|
||||||
|
P_RNTI,
|
||||||
|
UE_mac_inst[module_idP].subframe,
|
||||||
|
0,
|
||||||
|
0);
|
||||||
|
LOG_D(OPT,"[UE %d][BCH] Frame %d trace pdu for CC_id %d rnti %x with size %d\n",
|
||||||
|
module_idP, frameP, CC_id, P_RNTI, len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef Rel10
|
#ifdef Rel10
|
||||||
unsigned char *parse_mch_header(unsigned char *mac_header,
|
unsigned char *parse_mch_header(unsigned char *mac_header,
|
||||||
unsigned char *num_sdu,
|
unsigned char *num_sdu,
|
||||||
|
|||||||
@@ -146,6 +146,9 @@ typedef struct {
|
|||||||
/// Send a received SI sdu
|
/// Send a received SI sdu
|
||||||
void (*ue_decode_si)(module_id_t Mod_id,int CC_id,frame_t frameP, uint8_t CH_index, void *pdu, uint16_t len);
|
void (*ue_decode_si)(module_id_t Mod_id,int CC_id,frame_t frameP, uint8_t CH_index, void *pdu, uint16_t len);
|
||||||
|
|
||||||
|
/// Send a received Paging sdu
|
||||||
|
void (*ue_decode_p)(module_id_t Mod_id,int CC_id,frame_t frameP, uint8_t CH_index, void *pdu, uint16_t len);
|
||||||
|
|
||||||
/// Send a received DLSCH sdu to MAC
|
/// Send a received DLSCH sdu to MAC
|
||||||
void (*ue_send_sdu)(module_id_t Mod_id,uint8_t CC_id,frame_t frameP,uint8_t *sdu,uint16_t sdu_len,uint8_t CH_index);
|
void (*ue_send_sdu)(module_id_t Mod_id,uint8_t CC_id,frame_t frameP,uint8_t *sdu,uint16_t sdu_len,uint8_t CH_index);
|
||||||
|
|
||||||
|
|||||||
@@ -397,6 +397,10 @@ mac_rrc_data_ind(
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(srb_idP == PCCH) {
|
||||||
|
LOG_D(RRC,"[UE %d] Received SDU for PCCH on SRB %d from eNB %d\n",module_idP,srb_idP,eNB_indexP);
|
||||||
|
decode_PCCH_DLSCH_Message(&ctxt,eNB_indexP,(uint8_t*)sduP,sdu_lenP);
|
||||||
|
}
|
||||||
if((srb_idP & RAB_OFFSET) == CCCH) {
|
if((srb_idP & RAB_OFFSET) == CCCH) {
|
||||||
if (sdu_lenP>0) {
|
if (sdu_lenP>0) {
|
||||||
LOG_T(RRC,"[UE %d] Received SDU for CCCH on SRB %d from eNB %d\n",module_idP,srb_idP & RAB_OFFSET,eNB_indexP);
|
LOG_T(RRC,"[UE %d] Received SDU for CCCH on SRB %d from eNB %d\n",module_idP,srb_idP & RAB_OFFSET,eNB_indexP);
|
||||||
|
|||||||
@@ -357,6 +357,12 @@ int decode_BCCH_DLSCH_Message(
|
|||||||
const uint8_t rsrq,
|
const uint8_t rsrq,
|
||||||
const uint8_t rsrp );
|
const uint8_t rsrp );
|
||||||
|
|
||||||
|
int decode_PCCH_DLSCH_Message(
|
||||||
|
const protocol_ctxt_t* const ctxt_pP,
|
||||||
|
const uint8_t eNB_index,
|
||||||
|
uint8_t* const Sdu,
|
||||||
|
const uint8_t Sdu_len);
|
||||||
|
|
||||||
void
|
void
|
||||||
ue_meas_filtering(
|
ue_meas_filtering(
|
||||||
const protocol_ctxt_t* const ctxt_pP,
|
const protocol_ctxt_t* const ctxt_pP,
|
||||||
|
|||||||
@@ -58,6 +58,7 @@
|
|||||||
#include "UL-DCCH-Message.h"
|
#include "UL-DCCH-Message.h"
|
||||||
#include "DL-DCCH-Message.h"
|
#include "DL-DCCH-Message.h"
|
||||||
#include "BCCH-DL-SCH-Message.h"
|
#include "BCCH-DL-SCH-Message.h"
|
||||||
|
#include "PCCH-Message.h"
|
||||||
#ifdef Rel10
|
#ifdef Rel10
|
||||||
#include "MCCH-Message.h"
|
#include "MCCH-Message.h"
|
||||||
#endif
|
#endif
|
||||||
@@ -2463,6 +2464,39 @@ int decode_BCCH_DLSCH_Message(
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
int decode_PCCH_DLSCH_Message(
|
||||||
|
const protocol_ctxt_t* const ctxt_pP,
|
||||||
|
const uint8_t eNB_index,
|
||||||
|
uint8_t* const Sdu,
|
||||||
|
const uint8_t Sdu_len)
|
||||||
|
{
|
||||||
|
PCCH_Message_t *pcch_message = NULL;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_PCCH, VCD_FUNCTION_IN );
|
||||||
|
|
||||||
|
asn_dec_rval_t dec_rval = uper_decode_complete( NULL,
|
||||||
|
&asn_DEF_PCCH_Message,
|
||||||
|
(void **)&pcch_message,
|
||||||
|
(const void *)Sdu,
|
||||||
|
Sdu_len );
|
||||||
|
|
||||||
|
if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
|
||||||
|
LOG_E( RRC, "[UE %"PRIu8"] Failed to decode PCCH_MESSAGE (%zu bits)\n",
|
||||||
|
ctxt_pP->module_id,
|
||||||
|
dec_rval.consumed );
|
||||||
|
for (i=0;i<Sdu_len;i++)
|
||||||
|
printf("%02x ",Sdu[i]);
|
||||||
|
printf("\n");
|
||||||
|
// free the memory
|
||||||
|
SEQUENCE_free( &asn_DEF_PCCH_Message, (void*)pcch_message, 1 );
|
||||||
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_PCCH, VCD_FUNCTION_OUT );
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
static int decode_SIB1( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB_index, const uint8_t rsrq, const uint8_t rsrp )
|
static int decode_SIB1( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB_index, const uint8_t rsrq, const uint8_t rsrp )
|
||||||
|
|||||||
@@ -293,6 +293,7 @@ const char* eurecomFunctionsNames[] = {
|
|||||||
|
|
||||||
"macxface_out_of_sync_ind",
|
"macxface_out_of_sync_ind",
|
||||||
"macxface_ue_decode_si",
|
"macxface_ue_decode_si",
|
||||||
|
"macxface_ue_decode_pcch",
|
||||||
"macxface_ue_decode_ccch",
|
"macxface_ue_decode_ccch",
|
||||||
"macxface_ue_decode_bcch",
|
"macxface_ue_decode_bcch",
|
||||||
"macxface_ue_send_sdu",
|
"macxface_ue_send_sdu",
|
||||||
|
|||||||
@@ -267,6 +267,7 @@ typedef enum {
|
|||||||
|
|
||||||
VCD_SIGNAL_DUMPER_FUNCTIONS_OUT_OF_SYNC_IND,
|
VCD_SIGNAL_DUMPER_FUNCTIONS_OUT_OF_SYNC_IND,
|
||||||
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_SI,
|
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_SI,
|
||||||
|
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_PCCH,
|
||||||
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_CCCH,
|
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_CCCH,
|
||||||
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_BCCH,
|
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_BCCH,
|
||||||
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_SDU,
|
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_SDU,
|
||||||
|
|||||||
Reference in New Issue
Block a user