Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
zzha zzha
OpenXG-RAN
Commits
5c333cca
Commit
5c333cca
authored
Mar 23, 2023
by
francescomani
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
move radio link failure detection on pbch at MAC
parent
1f979696
Changes
15
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
126 additions
and
162 deletions
+126
-162
executables/nr-ue.c
executables/nr-ue.c
+0
-5
nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
+2
-1
openair1/PHY/INIT/nr_init_ue.c
openair1/PHY/INIT/nr_init_ue.c
+0
-3
openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
+1
-13
openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c
openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c
+32
-25
openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
+0
-1
openair1/PHY/defs_nr_UE.h
openair1/PHY/defs_nr_UE.h
+0
-14
openair1/SCHED_NR_UE/defs.h
openair1/SCHED_NR_UE/defs.h
+1
-1
openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+19
-42
openair1/SIMULATION/NR_PHY/pbchsim.c
openair1/SIMULATION/NR_PHY/pbchsim.c
+2
-3
openair2/LAYER2/NR_MAC_UE/mac_defs.h
openair2/LAYER2/NR_MAC_UE/mac_defs.h
+3
-2
openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
+1
-0
openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
+2
-2
openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
+4
-2
openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
+59
-48
No files found.
executables/nr-ue.c
View file @
5c333cca
...
...
@@ -755,7 +755,6 @@ void *UE_thread(void *arg) {
fapi_nr_config_request_t
*
cfg
=
&
UE
->
nrUE_config
;
AssertFatal
(
0
==
openair0_device_load
(
&
(
UE
->
rfdevice
),
&
openair0_cfg
[
0
]),
""
);
UE
->
rfdevice
.
host_type
=
RAU_HOST
;
UE
->
lost_sync
=
0
;
UE
->
is_synchronized
=
0
;
AssertFatal
(
UE
->
rfdevice
.
trx_start_func
(
&
UE
->
rfdevice
)
==
0
,
"Could not start the device
\n
"
);
...
...
@@ -776,10 +775,6 @@ void *UE_thread(void *arg) {
int
absolute_slot
=
0
,
decoded_frame_rx
=
INT_MAX
,
trashed_frames
=
0
;
while
(
!
oai_exit
)
{
if
(
UE
->
lost_sync
)
{
UE
->
is_synchronized
=
0
;
UE
->
lost_sync
=
0
;
}
if
(
syncRunning
)
{
notifiedFIFO_elt_t
*
res
=
tryPullTpool
(
&
nf
,
&
(
get_nrUE_params
()
->
Tpool
));
...
...
nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
View file @
5c333cca
...
...
@@ -116,7 +116,8 @@ typedef struct {
}
fapi_nr_pdsch_pdu_t
;
typedef
struct
{
uint8_t
*
pdu
;
// 3bytes
bool
decoded_pdu
;
uint8_t
pdu
[
3
];
uint8_t
additional_bits
;
uint8_t
ssb_index
;
uint8_t
ssb_length
;
...
...
openair1/PHY/INIT/nr_init_ue.c
View file @
5c333cca
...
...
@@ -202,7 +202,6 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
// create shortcuts
NR_DL_FRAME_PARMS
*
const
fp
=
&
ue
->
frame_parms
;
NR_UE_COMMON
*
const
common_vars
=
&
ue
->
common_vars
;
NR_UE_PBCH
**
const
pbch_vars
=
ue
->
pbch_vars
;
NR_UE_PRACH
**
const
prach_vars
=
ue
->
prach_vars
;
NR_UE_CSI_IM
**
const
csiim_vars
=
ue
->
csiim_vars
;
NR_UE_CSI_RS
**
const
csirs_vars
=
ue
->
csirs_vars
;
...
...
@@ -357,7 +356,6 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
// DLSCH
for
(
gNB_id
=
0
;
gNB_id
<
ue
->
n_connected_gNB
;
gNB_id
++
)
{
prach_vars
[
gNB_id
]
=
(
NR_UE_PRACH
*
)
malloc16_clear
(
sizeof
(
NR_UE_PRACH
));
pbch_vars
[
gNB_id
]
=
(
NR_UE_PBCH
*
)
malloc16_clear
(
sizeof
(
NR_UE_PBCH
));
csiim_vars
[
gNB_id
]
=
(
NR_UE_CSI_IM
*
)
malloc16_clear
(
sizeof
(
NR_UE_CSI_IM
));
csirs_vars
[
gNB_id
]
=
(
NR_UE_CSI_RS
*
)
malloc16_clear
(
sizeof
(
NR_UE_CSI_RS
));
srs_vars
[
gNB_id
]
=
(
NR_UE_SRS
*
)
malloc16_clear
(
sizeof
(
NR_UE_SRS
));
...
...
@@ -476,7 +474,6 @@ void term_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
free_and_zero
(
ue
->
csirs_vars
[
gNB_id
]);
free_and_zero
(
ue
->
srs_vars
[
gNB_id
]);
free_and_zero
(
ue
->
pbch_vars
[
gNB_id
]);
free_and_zero
(
ue
->
prach_vars
[
gNB_id
]);
}
...
...
openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
View file @
5c333cca
...
...
@@ -155,12 +155,11 @@ int nr_pbch_detection(UE_nr_rxtx_proc_t * proc, PHY_VARS_NR_UE *ue, int pbch_ini
proc
,
i
,
i
-
pbch_initial_symbol
,
temp_ptr
->
i_ssb
,
temp_ptr
->
n_hf
,
rxdataF
);
stop_meas
(
&
ue
->
dlsch_channel_estimation_stats
);
fapiPbch_t
result
;
fapiPbch_t
result
=
{
0
}
;
ret
=
nr_rx_pbch
(
ue
,
proc
,
estimateSz
,
dl_ch_estimates
,
ue
->
pbch_vars
[
0
],
frame_parms
,
temp_ptr
->
i_ssb
,
SISO
,
...
...
@@ -188,11 +187,6 @@ int nr_pbch_detection(UE_nr_rxtx_proc_t * proc, PHY_VARS_NR_UE *ue, int pbch_ini
// openair_daq_vars.dlsch_transmission_mode = (pbch_tx_ant>1) ? 2 : 1;
// flip byte endian on 24-bits for MIB
// dummy = ue->pbch_vars[0]->decoded_output[0];
// ue->pbch_vars[0]->decoded_output[0] = ue->pbch_vars[0]->decoded_output[2];
// ue->pbch_vars[0]->decoded_output[2] = dummy;
#ifdef DEBUG_INITIAL_SYNCH
LOG_I
(
PHY
,
"[UE%d] Initial sync: pbch decoded sucessfully
\n
"
,
ue
->
Mod_id
);
#endif
...
...
@@ -447,8 +441,6 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc,
// send sync status to higher layers later when timing offset converge to target timing
ue
->
pbch_vars
[
0
]
->
pdu_errors_conseq
=
0
;
}
...
...
@@ -466,10 +458,6 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc,
frame_parms
->
Nid_cell
,
frame_parms
->
frame_type
);
#endif
ue
->
pbch_vars
[
0
]
->
pdu_errors_last
=
ue
->
pbch_vars
[
0
]
->
pdu_errors
;
ue
->
pbch_vars
[
0
]
->
pdu_errors
++
;
ue
->
pbch_vars
[
0
]
->
pdu_errors_conseq
++
;
}
// gain control
...
...
openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c
View file @
5c333cca
...
...
@@ -302,8 +302,7 @@ void nr_pbch_detection_mrc(NR_DL_FRAME_PARMS *frame_parms,
#endif
}
static
void
nr_pbch_unscrambling
(
NR_UE_PBCH
*
pbch
,
int16_t
*
demod_pbch_e
,
static
void
nr_pbch_unscrambling
(
int16_t
*
demod_pbch_e
,
uint16_t
Nid
,
uint8_t
nushift
,
uint16_t
M
,
...
...
@@ -311,7 +310,8 @@ static void nr_pbch_unscrambling(NR_UE_PBCH *pbch,
uint8_t
bitwise
,
uint32_t
unscrambling_mask
,
uint32_t
pbch_a_prime
,
uint32_t
*
pbch_a_interleaved
)
{
uint32_t
*
pbch_a_interleaved
)
{
uint8_t
reset
,
offset
;
uint32_t
x1
=
0
,
x2
=
0
,
s
=
0
;
uint8_t
k
=
0
;
...
...
@@ -384,17 +384,17 @@ unsigned char sign(int8_t x) {
uint8_t
pbch_deinterleaving_pattern
[
32
]
=
{
28
,
0
,
31
,
30
,
7
,
29
,
25
,
27
,
5
,
8
,
24
,
9
,
10
,
11
,
12
,
13
,
1
,
4
,
3
,
14
,
15
,
16
,
17
,
2
,
26
,
18
,
19
,
20
,
21
,
22
,
6
,
23
};
int
nr_rx_pbch
(
PHY_VARS_NR_UE
*
ue
,
UE_nr_rxtx_proc_t
*
proc
,
int
estimateSz
,
struct
complex16
dl_ch_estimates
[][
estimateSz
]
,
NR_UE_PBCH
*
nr_ue_pbch_vars
,
NR_DL_FRAME_PARMS
*
frame_parms
,
uint8_t
i_ssb
,
MIMO_mode_t
mimo_mode
,
nr_phy_data_t
*
phy_data
,
fapiPbch_t
*
result
,
c16_t
rxdataF
[][
ue
->
frame_parms
.
samples_per_slot_wCP
])
{
int
nr_rx_pbch
(
PHY_VARS_NR_UE
*
ue
,
UE_nr_rxtx_proc_t
*
proc
,
int
estimateSz
,
struct
complex16
dl_ch_estimates
[][
estimateSz
]
,
NR_DL_FRAME_PARMS
*
frame_parms
,
uint8_t
i_ssb
,
MIMO_mode_t
mimo_mode
,
nr_phy_data_t
*
phy_data
,
fapiPbch_t
*
result
,
c16_t
rxdataF
[][
ue
->
frame_parms
.
samples_per_slot_wCP
])
{
int
max_h
=
0
;
int
symbol
;
//uint8_t pbch_a[64];
...
...
@@ -456,7 +456,7 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
}
#ifdef DEBUG_PBCH
LOG_I
(
PHY
,
"[PHY] PBCH log2_maxh = %d (%d)
\n
"
,
nr_ue_pbch_vars
->
log2_maxh
,
max_h
);
LOG_I
(
PHY
,
"[PHY] PBCH log2_maxh = %d (%d)
\n
"
,
log2_maxh
,
max_h
);
#endif
__attribute__
((
aligned
(
32
)))
struct
complex16
rxdataF_comp
[
frame_parms
->
nb_antennas_rx
][
PBCH_MAX_RE_PER_SYMBOL
];
nr_pbch_channel_compensation
(
rxdataF_ext
,
...
...
@@ -464,7 +464,7 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
nb_re
,
rxdataF_comp
,
frame_parms
,
log2_maxh
);
// log2_maxh+I0_shift
log2_maxh
);
// log2_maxh+I0_shift
/*if (frame_parms->nb_antennas_rx > 1)
pbch_detection_mrc(frame_parms,
...
...
@@ -504,16 +504,27 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
uint32_t
unscrambling_mask
=
(
Lmax
==
64
)
?
0x100006D
:
0x1000041
;
uint32_t
pbch_a_interleaved
=
0
;
uint32_t
pbch_a_prime
=
0
;
nr_pbch_unscrambling
(
nr_ue_pbch_vars
,
pbch_e_rx
,
frame_parms
->
Nid_cell
,
nushift
,
M
,
NR_POLAR_PBCH_E
,
nr_pbch_unscrambling
(
pbch_e_rx
,
frame_parms
->
Nid_cell
,
nushift
,
M
,
NR_POLAR_PBCH_E
,
0
,
0
,
pbch_a_prime
,
&
pbch_a_interleaved
);
//polar decoding de-rate matching
uint64_t
tmp
=
0
;
decoderState
=
polar_decoder_int16
(
pbch_e_rx
,(
uint64_t
*
)
&
tmp
,
0
,
NR_POLAR_PBCH_MESSAGE_TYPE
,
NR_POLAR_PBCH_PAYLOAD_BITS
,
NR_POLAR_PBCH_AGGREGATION_LEVEL
);
pbch_a_prime
=
tmp
;
if
(
decoderState
)
return
(
decoderState
);
pbch_a_prime
=
tmp
;
nr_downlink_indication_t
dl_indication
;
fapi_nr_rx_indication_t
*
rx_ind
=
calloc
(
sizeof
(
*
rx_ind
),
1
);
uint16_t
number_pdus
=
1
;
if
(
decoderState
)
{
nr_fill_dl_indication
(
&
dl_indication
,
NULL
,
rx_ind
,
proc
,
ue
,
phy_data
);
nr_fill_rx_indication
(
rx_ind
,
FAPI_NR_RX_PDU_TYPE_SSB
,
ue
,
NULL
,
NULL
,
number_pdus
,
proc
,
NULL
);
if
(
ue
->
if_inst
&&
ue
->
if_inst
->
dl_indication
)
ue
->
if_inst
->
dl_indication
(
&
dl_indication
,
NULL
);
else
free
(
rx_ind
);
// dl_indication would free(), so free() here if not called
return
(
decoderState
);
}
// printf("polar decoder output 0x%08x\n",pbch_a_prime);
// Decoder reversal
uint32_t
a_reversed
=
0
;
...
...
@@ -526,7 +537,7 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
M
=
(
Lmax
==
64
)
?
(
NR_POLAR_PBCH_PAYLOAD_BITS
-
6
)
:
(
NR_POLAR_PBCH_PAYLOAD_BITS
-
3
);
nushift
=
((
pbch_a_prime
>>
24
)
&
1
)
^
(((
pbch_a_prime
>>
6
)
&
1
)
<<
1
);
pbch_a_interleaved
=
0
;
nr_pbch_unscrambling
(
nr_ue_pbch_vars
,
pbch_e_rx
,
frame_parms
->
Nid_cell
,
nushift
,
M
,
NR_POLAR_PBCH_PAYLOAD_BITS
,
nr_pbch_unscrambling
(
pbch_e_rx
,
frame_parms
->
Nid_cell
,
nushift
,
M
,
NR_POLAR_PBCH_PAYLOAD_BITS
,
1
,
unscrambling_mask
,
pbch_a_prime
,
&
pbch_a_interleaved
);
//printf("nushift %d sfn 3rd %d 2nd %d", nushift,((pbch_a_prime>>6)&1), ((pbch_a_prime>>24)&1) );
//payload deinterleaving
...
...
@@ -577,10 +588,6 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
}
#endif
nr_downlink_indication_t
dl_indication
;
fapi_nr_rx_indication_t
*
rx_ind
=
calloc
(
sizeof
(
*
rx_ind
),
1
);
uint16_t
number_pdus
=
1
;
nr_fill_dl_indication
(
&
dl_indication
,
NULL
,
rx_ind
,
proc
,
ue
,
phy_data
);
nr_fill_rx_indication
(
rx_ind
,
FAPI_NR_RX_PDU_TYPE_SSB
,
ue
,
NULL
,
NULL
,
number_pdus
,
proc
,(
void
*
)
result
);
...
...
openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
View file @
5c333cca
...
...
@@ -285,7 +285,6 @@ int nr_rx_pbch(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t
*
proc
,
const
int
estimateSz
,
struct
complex16
dl_ch_estimates
[][
estimateSz
],
NR_UE_PBCH
*
nr_ue_pbch_vars
,
NR_DL_FRAME_PARMS
*
frame_parms
,
uint8_t
i_ssb
,
MIMO_mode_t
mimo_mode
,
...
...
openair1/PHY/defs_nr_UE.h
View file @
5c333cca
...
...
@@ -316,17 +316,6 @@ typedef struct {
#define PBCH_A 24
typedef
struct
{
/// \brief Total number of PDU errors.
uint32_t
pdu_errors
;
/// \brief Total number of PDU errors 128 frames ago.
uint32_t
pdu_errors_last
;
/// \brief Total number of consecutive PDU errors.
uint32_t
pdu_errors_conseq
;
/// \brief FER (in percent) .
//uint32_t pdu_fer;
}
NR_UE_PBCH
;
typedef
struct
{
int16_t
amp
;
bool
active
;
...
...
@@ -402,8 +391,6 @@ typedef struct {
int
is_synchronized
;
/// \brief Target gNB Nid_cell when UE is resynchronizing
int
target_Nid_cell
;
/// \brief Indicator that UE lost frame synchronization
int
lost_sync
;
/// Data structure for UE process scheduling
UE_nr_proc_t
proc
;
/// Flag to indicate the UE shouldn't do timing correction at all
...
...
@@ -444,7 +431,6 @@ typedef struct {
fapi_nr_config_request_t
nrUE_config
;
nr_synch_request_t
synch_request
;
NR_UE_PBCH
*
pbch_vars
[
NUMBER_OF_CONNECTED_gNB_MAX
];
NR_UE_PRACH
*
prach_vars
[
NUMBER_OF_CONNECTED_gNB_MAX
];
NR_UE_CSI_IM
*
csiim_vars
[
NUMBER_OF_CONNECTED_gNB_MAX
];
NR_UE_CSI_RS
*
csirs_vars
[
NUMBER_OF_CONNECTED_gNB_MAX
];
...
...
openair1/SCHED_NR_UE/defs.h
View file @
5c333cca
...
...
@@ -83,7 +83,7 @@
typedef
struct
{
uint8_t
decoded_output
[
64
];
uint8_t
decoded_output
[
3
];
// PBCH paylod not larger than 3B
uint8_t
xtra_byte
;
}
fapiPbch_t
;
...
...
openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
View file @
5c333cca
...
...
@@ -118,10 +118,8 @@ void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind,
NR_UE_DLSCH_t
*
dlsch1
,
uint16_t
n_pdus
,
UE_nr_rxtx_proc_t
*
proc
,
void
*
typeSpecific
){
NR_DL_FRAME_PARMS
*
frame_parms
=
&
ue
->
frame_parms
;
void
*
typeSpecific
)
{
if
(
n_pdus
>
1
){
LOG_E
(
PHY
,
"In %s: multiple number of DL PDUs not supported yet...
\n
"
,
__FUNCTION__
);
}
...
...
@@ -154,17 +152,23 @@ void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind,
AssertFatal
(
1
==
0
,
"Second codeword currently not supported
\n
"
);
}
break
;
case
FAPI_NR_RX_PDU_TYPE_SSB
:
rx_ind
->
rx_indication_body
[
n_pdus
-
1
].
ssb_pdu
.
pdu
=
malloc
(
sizeof
(((
fapiPbch_t
*
)
typeSpecific
)
->
decoded_output
));
memcpy
(
rx_ind
->
rx_indication_body
[
n_pdus
-
1
].
ssb_pdu
.
pdu
,
((
fapiPbch_t
*
)
typeSpecific
)
->
decoded_output
,
sizeof
(((
fapiPbch_t
*
)
typeSpecific
)
->
decoded_output
));
rx_ind
->
rx_indication_body
[
n_pdus
-
1
].
ssb_pdu
.
additional_bits
=
((
fapiPbch_t
*
)
typeSpecific
)
->
xtra_byte
;
rx_ind
->
rx_indication_body
[
n_pdus
-
1
].
ssb_pdu
.
ssb_index
=
(
frame_parms
->
ssb_index
)
&
0x7
;
rx_ind
->
rx_indication_body
[
n_pdus
-
1
].
ssb_pdu
.
ssb_length
=
frame_parms
->
Lmax
;
rx_ind
->
rx_indication_body
[
n_pdus
-
1
].
ssb_pdu
.
cell_id
=
frame_parms
->
Nid_cell
;
rx_ind
->
rx_indication_body
[
n_pdus
-
1
].
ssb_pdu
.
ssb_start_subcarrier
=
frame_parms
->
ssb_start_subcarrier
;
rx_ind
->
rx_indication_body
[
n_pdus
-
1
].
ssb_pdu
.
rsrp_dBm
=
ue
->
measurements
.
ssb_rsrp_dBm
[
frame_parms
->
ssb_index
];
case
FAPI_NR_RX_PDU_TYPE_SSB
:
{
fapi_nr_ssb_pdu_t
*
ssb_pdu
=
&
rx_ind
->
rx_indication_body
[
n_pdus
-
1
].
ssb_pdu
;
if
(
typeSpecific
)
{
NR_DL_FRAME_PARMS
*
frame_parms
=
&
ue
->
frame_parms
;
fapiPbch_t
*
pbch
=
(
fapiPbch_t
*
)
typeSpecific
;
memcpy
(
ssb_pdu
->
pdu
,
pbch
->
decoded_output
,
sizeof
(
pbch
->
decoded_output
));
ssb_pdu
->
additional_bits
=
pbch
->
xtra_byte
;
ssb_pdu
->
ssb_index
=
(
frame_parms
->
ssb_index
)
&
0x7
;
ssb_pdu
->
ssb_length
=
frame_parms
->
Lmax
;
ssb_pdu
->
cell_id
=
frame_parms
->
Nid_cell
;
ssb_pdu
->
ssb_start_subcarrier
=
frame_parms
->
ssb_start_subcarrier
;
ssb_pdu
->
rsrp_dBm
=
ue
->
measurements
.
ssb_rsrp_dBm
[
frame_parms
->
ssb_index
];
ssb_pdu
->
decoded_pdu
=
true
;
}
else
ssb_pdu
->
decoded_pdu
=
false
;
}
break
;
case
FAPI_NR_CSIRS_IND
:
memcpy
(
&
rx_ind
->
rx_indication_body
[
n_pdus
-
1
].
csirs_measurements
,
...
...
@@ -382,7 +386,6 @@ static void nr_ue_pbch_procedures(PHY_VARS_NR_UE *ue,
proc
,
estimateSz
,
dl_ch_estimates
,
ue
->
pbch_vars
[
gNB_id
],
&
ue
->
frame_parms
,
(
ue
->
frame_parms
.
ssb_index
)
&
7
,
SISO
,
...
...
@@ -392,8 +395,6 @@ static void nr_ue_pbch_procedures(PHY_VARS_NR_UE *ue,
if
(
ret
==
0
)
{
ue
->
pbch_vars
[
gNB_id
]
->
pdu_errors_conseq
=
0
;
#ifdef DEBUG_PHY_PROC
uint16_t
frame_tx
;
LOG_D
(
PHY
,
"[UE %d] frame %d, nr_slot_rx %d, Received PBCH (MIB): frame_tx %d. N_RB_DL %d
\n
"
,
...
...
@@ -426,36 +427,12 @@ static void nr_ue_pbch_procedures(PHY_VARS_NR_UE *ue,
write_output("H10.m","h10",&(ue->common_vars.dl_ch_estimates[0][2][0]),((ue->frame_parms.Ncp==0)?7:6)*(ue->frame_parms.ofdm_symbol_size),1,1);
write_output("rxsigF0.m","rxsF0", ue->common_vars.rxdataF[0],8*ue->frame_parms.ofdm_symbol_size,1,1);
write_output("PBCH_rxF0_ext.m","pbch0_ext",ue->pbch_vars[0]->rxdataF_ext[0],12*4*6,1,1);
write_output("PBCH_rxF0_comp.m","pbch0_comp",ue->pbch_vars[0]->rxdataF_comp[0],12*4*6,1,1);
write_output("PBCH_rxF_llr.m","pbch_llr",ue->pbch_vars[0]->llr,(ue->frame_parms.Ncp==0) ? 1920 : 1728,1,4);
exit(-1);
*/
ue
->
pbch_vars
[
gNB_id
]
->
pdu_errors_conseq
++
;
ue
->
pbch_vars
[
gNB_id
]
->
pdu_errors
++
;
if
(
ue
->
pbch_vars
[
gNB_id
]
->
pdu_errors_conseq
>=
100
)
{
if
(
get_softmodem_params
()
->
non_stop
)
{
LOG_E
(
PHY
,
"More that 100 consecutive PBCH errors! Going back to Sync mode!
\n
"
);
ue
->
lost_sync
=
1
;
}
else
{
LOG_E
(
PHY
,
"More that 100 consecutive PBCH errors! Exiting!
\n
"
);
exit_fun
(
"More that 100 consecutive PBCH errors! Exiting!
\n
"
);
}
}
}
if
(
frame_rx
%
100
==
0
)
{
ue
->
pbch_vars
[
gNB_id
]
->
pdu_errors_last
=
ue
->
pbch_vars
[
gNB_id
]
->
pdu_errors
;
}
#ifdef DEBUG_PHY_PROC
LOG_D
(
PHY
,
"[UE %d] frame %d, slot %d, PBCH errors = %d, consecutive errors = %d!
\n
"
,
ue
->
Mod_id
,
frame_rx
,
nr_slot_rx
,
ue
->
pbch_vars
[
gNB_id
]
->
pdu_errors
,
ue
->
pbch_vars
[
gNB_id
]
->
pdu_errors_conseq
);
#endif
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PBCH_PROCEDURES
,
VCD_FUNCTION_OUT
);
}
...
...
openair1/SIMULATION/NR_PHY/pbchsim.c
View file @
5c333cca
...
...
@@ -793,8 +793,8 @@ int main(int argc, char **argv)
fapiPbch_t
result
;
ret
=
nr_rx_pbch
(
UE
,
&
proc
,
estimateSz
,
dl_ch_estimates
,
UE
->
pbch_vars
[
0
]
,
estimateSz
,
dl_ch_estimates
,
frame_parms
,
ssb_index
%
8
,
SISO
,
...
...
@@ -813,7 +813,6 @@ int main(int argc, char **argv)
for
(
i
=
0
;
i
<
3
;
i
++
){
payload_ret
+=
(
result
.
decoded_output
[
i
]
==
((
msgDataTx
.
ssb
[
ssb_index
].
ssb_pdu
.
ssb_pdu_rel15
.
bchPayload
>>
(
8
*
i
))
&
0xff
));
}
//printf("xtra byte gNB: 0x%02x UE: 0x%02x\n",gNB_xtra_byte, UE->pbch_vars[0]->xtra_byte);
//printf("ret %d\n", payload_ret);
if
(
payload_ret
!=
4
)
n_errors_payload
++
;
...
...
openair2/LAYER2/NR_MAC_UE/mac_defs.h
View file @
5c333cca
...
...
@@ -376,8 +376,9 @@ typedef struct {
uint32_t
ssb_index
;
/// SSB RSRP in dBm
short
ssb_rsrp_dBm
;
int
consecutive_bch_failures
;
}
NR_
PHY
_meas_t
;
}
NR_
SSB
_meas_t
;
/*!\brief Top level UE MAC structure */
typedef
struct
{
...
...
@@ -465,7 +466,7 @@ typedef struct {
uint16_t
nr_band
;
uint8_t
ssb_subcarrier_offset
;
NR_
PHY_meas_t
phy
_measurements
;
NR_
SSB_meas_t
ssb
_measurements
;
dci_pdu_rel15_t
def_dci_pdu_rel15
[
8
];
...
...
openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
View file @
5c333cca
...
...
@@ -55,6 +55,7 @@ NR_UE_MAC_INST_t * nr_l2_init_ue(NR_UE_RRC_INST_t* rrc_inst) {
nr_ue_mac_inst
->
sib1_decoded
=
false
;
nr_ue_mac_inst
->
phy_config_request_sent
=
false
;
nr_ue_mac_inst
->
state
=
UE_NOT_SYNC
;
memset
(
&
nr_ue_mac_inst
->
ssb_measurements
,
0
,
sizeof
(
nr_ue_mac_inst
->
ssb_measurements
));
for
(
int
j
=
0
;
j
<
NB_NR_UE_MAC_INST
;
j
++
)
{
nr_ue_init_mac
(
j
);
...
...
openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
View file @
5c333cca
...
...
@@ -124,7 +124,7 @@ int16_t get_prach_tx_power(module_id_t mod_id) {
NR_UE_MAC_INST_t
*
mac
=
get_mac_inst
(
mod_id
);
RA_config_t
*
ra
=
&
mac
->
ra
;
int16_t
pathloss
=
compute_nr_SSB_PL
(
mac
,
mac
->
phy
_measurements
.
ssb_rsrp_dBm
);
int16_t
pathloss
=
compute_nr_SSB_PL
(
mac
,
mac
->
ssb
_measurements
.
ssb_rsrp_dBm
);
int16_t
ra_preamble_rx_power
=
(
int16_t
)(
ra
->
prach_resources
.
ra_PREAMBLE_RECEIVED_TARGET_POWER
-
pathloss
+
30
);
return
min
(
nr_get_Pcmax
(
mod_id
),
ra_preamble_rx_power
);
...
...
@@ -674,7 +674,7 @@ void nr_get_prach_resources(module_id_t mod_id,
}
else
{
/* TODO: This controls the tx_power of UE and the ramping procedure of RA of UE. Later we
can abstract this, perhaps in the proxy. But for the time being lets leave it as below. */
int16_t
dl_pathloss
=
!
get_softmodem_params
()
->
emulate_l1
?
compute_nr_SSB_PL
(
mac
,
mac
->
phy
_measurements
.
ssb_rsrp_dBm
)
:
0
;
int16_t
dl_pathloss
=
!
get_softmodem_params
()
->
emulate_l1
?
compute_nr_SSB_PL
(
mac
,
mac
->
ssb
_measurements
.
ssb_rsrp_dBm
)
:
0
;
ssb_rach_config
(
ra
,
prach_resources
,
nr_rach_ConfigCommon
);
ra_preambles_config
(
prach_resources
,
mac
,
dl_pathloss
);
LOG_D
(
MAC
,
"[RAPROC] - Selected RA preamble index %d for contention-based random access procedure...
\n
"
,
ra
->
ra_PreambleIndex
);
...
...
openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
View file @
5c333cca
...
...
@@ -238,6 +238,8 @@ int8_t nr_ue_decode_mib(module_id_t module_id,
AssertFatal
(
mac
->
mib
!=
NULL
,
"nr_ue_decode_mib() mac->mib == NULL
\n
"
);
mac
->
ssb_measurements
.
consecutive_bch_failures
=
0
;
// resetting decoding failures
uint16_t
frame
=
(
mac
->
mib
->
systemFrameNumber
.
buf
[
0
]
>>
mac
->
mib
->
systemFrameNumber
.
bits_unused
);
uint16_t
frame_number_4lsb
=
0
;
...
...
@@ -1564,7 +1566,7 @@ int16_t get_pucch_tx_power_ue(NR_UE_MAC_INST_t *mac,
return
(
PUCCH_POWER_DEFAULT
);
}
int16_t
pathloss
=
compute_nr_SSB_PL
(
mac
,
mac
->
phy
_measurements
.
ssb_rsrp_dBm
);
int16_t
pathloss
=
compute_nr_SSB_PL
(
mac
,
mac
->
ssb
_measurements
.
ssb_rsrp_dBm
);
int
M_pucch_component
=
(
10
*
log10
((
double
)(
pow
(
2
,
scs
)
*
nb_of_prbs
)));
int16_t
pucch_power
=
P_O_PUCCH
+
M_pucch_component
+
pathloss
+
delta_F_PUCCH
+
DELTA_TF
+
G_b_f_c
;
...
...
@@ -2179,7 +2181,7 @@ uint8_t get_ssb_rsrp_payload(NR_UE_MAC_INST_t *mac,
}
}
AssertFatal
(
*
SSB_resource
.
list
.
array
[
ssb_rsrp
[
0
][
0
]]
==
mac
->
mib_ssb
,
"Couldn't find corresponding SSB in csi_SSB_ResourceList
\n
"
);
ssb_rsrp
[
1
][
0
]
=
mac
->
phy
_measurements
.
ssb_rsrp_dBm
;
ssb_rsrp
[
1
][
0
]
=
mac
->
ssb
_measurements
.
ssb_rsrp_dBm
;
uint8_t
ssbi
;
...
...
openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
View file @
5c333cca
...
...
@@ -304,25 +304,24 @@ static void fill_dl_info_with_pdcch(fapi_nr_dci_indication_t *dci, nfapi_nr_dl_d
static
void
fill_mib_in_rx_ind
(
nfapi_nr_dl_tti_request_pdu_t
*
pdu_list
,
fapi_nr_rx_indication_t
*
rx_ind
,
int
pdu_idx
,
int
pdu_type
)
{
AssertFatal
(
pdu_idx
<
sizeof
(
rx_ind
->
rx_indication_body
)
/
sizeof
(
rx_ind
->
rx_indication_body
[
0
]),
"pdu_index (%d) is greater than rx_indication_body size!
\n
"
,
pdu_idx
);
AssertFatal
(
pdu_idx
==
rx_ind
->
number_pdus
,
"Invalid pdu_idx %d!
\n
"
,
pdu_idx
);
LOG_T
(
NR_MAC
,
"Recevied an SSB and are filling rx_ind with the MIB!
\n
"
);
nfapi_nr_dl_tti_ssb_pdu_rel15_t
*
ssb_pdu
=
&
pdu_list
->
ssb_pdu
.
ssb_pdu_rel15
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
cell_id
=
ssb_pdu
->
PhysCellId
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
pdu
=
MALLOC
(
3
*
sizeof
(
*
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
pdu
));
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
pdu
[
0
]
=
(
ssb_pdu
->
bchPayload
)
&
0xff
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
pdu
[
1
]
=
(
ssb_pdu
->
bchPayload
>>
8
)
&
0xff
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
pdu
[
2
]
=
(
ssb_pdu
->
bchPayload
>>
16
)
&
0xff
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
rsrp_dBm
=
ssb_pdu
->
ssbRsrp
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
ssb_index
=
ssb_pdu
->
SsbBlockIndex
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
ssb_length
=
pdu_list
->
PDUSize
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
ssb_start_subcarrier
=
ssb_pdu
->
SsbSubcarrierOffset
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
pdu_type
=
pdu_type
;
rx_ind
->
number_pdus
=
pdu_idx
+
1
;
AssertFatal
(
pdu_idx
<
sizeof
(
rx_ind
->
rx_indication_body
)
/
sizeof
(
rx_ind
->
rx_indication_body
[
0
]),
"pdu_index (%d) is greater than rx_indication_body size!
\n
"
,
pdu_idx
);
AssertFatal
(
pdu_idx
==
rx_ind
->
number_pdus
,
"Invalid pdu_idx %d!
\n
"
,
pdu_idx
);
LOG_T
(
NR_MAC
,
"Recevied an SSB and are filling rx_ind with the MIB!
\n
"
);
nfapi_nr_dl_tti_ssb_pdu_rel15_t
*
ssb_pdu
=
&
pdu_list
->
ssb_pdu
.
ssb_pdu_rel15
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
cell_id
=
ssb_pdu
->
PhysCellId
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
pdu
[
0
]
=
(
ssb_pdu
->
bchPayload
)
&
0xff
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
pdu
[
1
]
=
(
ssb_pdu
->
bchPayload
>>
8
)
&
0xff
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
pdu
[
2
]
=
(
ssb_pdu
->
bchPayload
>>
16
)
&
0xff
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
rsrp_dBm
=
ssb_pdu
->
ssbRsrp
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
ssb_index
=
ssb_pdu
->
SsbBlockIndex
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
ssb_length
=
pdu_list
->
PDUSize
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
ssb_start_subcarrier
=
ssb_pdu
->
SsbSubcarrierOffset
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
decoded_pdu
=
true
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
pdu_type
=
pdu_type
;
rx_ind
->
number_pdus
=
pdu_idx
+
1
;
}
static
bool
is_my_dci
(
NR_UE_MAC_INST_t
*
mac
,
nfapi_nr_dl_dci_pdu_t
*
received_pdu
)
...
...
@@ -1045,16 +1044,24 @@ int handle_bcch_bch(module_id_t module_id, int cc_id,
uint16_t
ssb_start_subcarrier
,
uint16_t
cell_id
){
return
nr_ue_decode_mib
(
module_id
,
cc_id
,
gNB_index
,
phy_data
,
additional_bits
,
ssb_length
,
// Lssb = 64 is not support
ssb_index
,
pduP
,
ssb_start_subcarrier
,
cell_id
);
cc_id
,
gNB_index
,
phy_data
,
additional_bits
,
ssb_length
,
// Lssb = 64 is not support
ssb_index
,
pduP
,
ssb_start_subcarrier
,
cell_id
);
}
void
handle_bch_failure
(
NR_UE_MAC_INST_t
*
mac
)
{
mac
->
ssb_measurements
.
consecutive_bch_failures
++
;
//TODO handle this properly by scheduling re-synchronization
AssertFatal
(
mac
->
ssb_measurements
.
consecutive_bch_failures
<
100
,
"Radio link failure caused by 100 consecutive PBCH detection failures.
\n
"
);
}
// L2 Abstraction Layer
...
...
@@ -1069,10 +1076,10 @@ int handle_dci(module_id_t module_id, int cc_id, unsigned int gNB_index, frame_t
}
void
handle_ssb_meas
(
NR_UE_MAC_INST_t
*
mac
,
uint8_t
ssb_index
,
int16_t
rsrp_dbm
)
void
handle_ssb_meas
(
NR_UE_MAC_INST_t
*
mac
,
uint8_t
ssb_index
,
int16_t
rsrp_dbm
)
{
mac
->
phy
_measurements
.
ssb_index
=
ssb_index
;
mac
->
phy
_measurements
.
ssb_rsrp_dBm
=
rsrp_dbm
;
mac
->
ssb
_measurements
.
ssb_index
=
ssb_index
;
mac
->
ssb
_measurements
.
ssb_rsrp_dBm
=
rsrp_dbm
;
}
// L2 Abstraction Layer
...
...
@@ -1180,31 +1187,35 @@ int nr_ue_dl_indication(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_
for
(
int
i
=
0
;
i
<
dl_info
->
rx_ind
->
number_pdus
;
++
i
)
{
fapi_nr_rx_indication_body_t
rx_indication_body
=
dl_info
->
rx_ind
->
rx_indication_body
[
i
];
LOG_D
(
NR_MAC
,
"In %s sending DL indication to MAC. 1 PDU type %d of %d total number of PDUs
\n
"
,
__FUNCTION__
,
dl_info
->
rx_ind
->
rx_indication_body
[
i
]
.
pdu_type
,
rx_indication_body
.
pdu_type
,
dl_info
->
rx_ind
->
number_pdus
);
switch
(
dl_info
->
rx_ind
->
rx_indication_body
[
i
]
.
pdu_type
){
switch
(
rx_indication_body
.
pdu_type
){
case
FAPI_NR_RX_PDU_TYPE_SSB
:
handle_ssb_meas
(
mac
,
(
dl_info
->
rx_ind
->
rx_indication_body
+
i
)
->
ssb_pdu
.
ssb_index
,
(
dl_info
->
rx_ind
->
rx_indication_body
+
i
)
->
ssb_pdu
.
rsrp_dBm
);
ret_mask
|=
(
handle_bcch_bch
(
dl_info
->
module_id
,
dl_info
->
cc_id
,
dl_info
->
gNB_index
,
dl_info
->
phy_data
,
(
dl_info
->
rx_ind
->
rx_indication_body
+
i
)
->
ssb_pdu
.
pdu
,
(
dl_info
->
rx_ind
->
rx_indication_body
+
i
)
->
ssb_pdu
.
additional_bits
,
(
dl_info
->
rx_ind
->
rx_indication_body
+
i
)
->
ssb_pdu
.
ssb_index
,
(
dl_info
->
rx_ind
->
rx_indication_body
+
i
)
->
ssb_pdu
.
ssb_length
,
(
dl_info
->
rx_ind
->
rx_indication_body
+
i
)
->
ssb_pdu
.
ssb_start_subcarrier
,
(
dl_info
->
rx_ind
->
rx_indication_body
+
i
)
->
ssb_pdu
.
cell_id
))
<<
FAPI_NR_RX_PDU_TYPE_SSB
;
free
((
dl_info
->
rx_ind
->
rx_indication_body
+
i
)
->
ssb_pdu
.
pdu
);
if
(
rx_indication_body
.
ssb_pdu
.
decoded_pdu
)
{
handle_ssb_meas
(
mac
,
rx_indication_body
.
ssb_pdu
.
ssb_index
,
rx_indication_body
.
ssb_pdu
.
rsrp_dBm
);
ret_mask
|=
(
handle_bcch_bch
(
dl_info
->
module_id
,
dl_info
->
cc_id
,
dl_info
->
gNB_index
,
dl_info
->
phy_data
,
rx_indication_body
.
ssb_pdu
.
pdu
,
rx_indication_body
.
ssb_pdu
.
additional_bits
,
rx_indication_body
.
ssb_pdu
.
ssb_index
,
rx_indication_body
.
ssb_pdu
.
ssb_length
,
rx_indication_body
.
ssb_pdu
.
ssb_start_subcarrier
,
rx_indication_body
.
ssb_pdu
.
cell_id
))
<<
FAPI_NR_RX_PDU_TYPE_SSB
;
}
else
handle_bch_failure
(
mac
);
break
;
case
FAPI_NR_RX_PDU_TYPE_SIB
:
ret_mask
|=
(
handle_bcch_dlsch
(
dl_info
->
module_id
,
dl_info
->
cc_id
,
dl_info
->
gNB_index
,
(
dl_info
->
rx_ind
->
rx_indication_body
+
i
)
->
pdsch_pdu
.
ack_nack
,
(
dl_info
->
rx_ind
->
rx_indication_body
+
i
)
->
pdsch_pdu
.
pdu
,
(
dl_info
->
rx_ind
->
rx_indication_body
+
i
)
->
pdsch_pdu
.
pdu_length
))
<<
FAPI_NR_RX_PDU_TYPE_SIB
;
rx_indication_body
.
pdsch_pdu
.
ack_nack
,
rx_indication_body
.
pdsch_pdu
.
pdu
,
rx_indication_body
.
pdsch_pdu
.
pdu_length
))
<<
FAPI_NR_RX_PDU_TYPE_SIB
;
break
;
case
FAPI_NR_RX_PDU_TYPE_DLSCH
:
ret_mask
|=
(
handle_dlsch
(
dl_info
,
ul_time_alignment
,
i
))
<<
FAPI_NR_RX_PDU_TYPE_DLSCH
;
...
...
@@ -1216,7 +1227,7 @@ int nr_ue_dl_indication(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_
ret_mask
|=
(
handle_csirs_measurements
(
dl_info
->
module_id
,
dl_info
->
frame
,
dl_info
->
slot
,
&
(
dl_info
->
rx_ind
->
rx_indication_body
+
i
)
->
csirs_measurements
))
<<
FAPI_NR_CSIRS_IND
;
&
rx_indication_body
.
csirs_measurements
))
<<
FAPI_NR_CSIRS_IND
;
break
;
default:
break
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment