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
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
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
OpenXG
OpenXG-RAN
Commits
25f77993
Commit
25f77993
authored
Nov 24, 2025
by
Robert Schmidt
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Refactor PUSCH processing into its own function
Signed-off-by:
Robert Schmidt
<
robert.schmidt@openairinterface.org
>
parent
cbe69c7d
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
88 additions
and
80 deletions
+88
-80
openair1/SCHED_NR/phy_procedures_nr_gNB.c
openair1/SCHED_NR/phy_procedures_nr_gNB.c
+88
-80
No files found.
openair1/SCHED_NR/phy_procedures_nr_gNB.c
View file @
25f77993
...
@@ -919,6 +919,92 @@ static void handle_pucch(PHY_VARS_gNB *gNB, c16_t **rxdataF, const NR_gNB_PUCCH_
...
@@ -919,6 +919,92 @@ static void handle_pucch(PHY_VARS_gNB *gNB, c16_t **rxdataF, const NR_gNB_PUCCH_
}
}
}
}
static
bool
handle_pusch_decode_trigger
(
PHY_VARS_gNB
*
gNB
,
NR_gNB_PUSCH
*
pusch_vars
,
NR_gNB_ULSCH_t
*
ulsch
,
NR_UL_IND_t
*
UL_INFO
,
int
*
pusch_DTX
)
{
NR_UL_gNB_HARQ_t
*
ulsch_harq
=
ulsch
->
harq_process
;
AssertFatal
(
ulsch_harq
!=
NULL
,
"harq_pid %d is not allocated
\n
"
,
ulsch
->
harq_pid
);
const
nfapi_nr_pusch_pdu_t
*
pdu
=
&
ulsch_harq
->
ulsch_pdu
;
#ifdef DEBUG_RXDATA
RU_t
*
ru
=
gNB
->
RU_list
[
0
];
int
slot_offset
=
frame_parms
->
get_samples_slot_timestamp
(
ulsch
->
slot
,
frame_parms
,
0
);
slot_offset
-=
ru
->
N_TA_offset
;
int32_t
sample_offset
=
gNB
->
common_vars
.
debugBuff_sample_offset
;
int16_t
buf
=
(
int16_t
*
)
&
gNB
->
common_vars
.
debugBuff
[
offset
];
buf
[
0
]
=
(
int16_t
)
ulsch
->
rnti
;
buf
[
1
]
=
(
int16_t
)
pdu
->
rb_size
;
buf
[
2
]
=
(
int16_t
)
pdu
->
rb_start
;
buf
[
3
]
=
(
int16_t
)
pdu
->
nr_of_symbols
;
buf
[
4
]
=
(
int16_t
)
pdu
->
start_symbol_index
;
buf
[
5
]
=
(
int16_t
)
pdu
->
mcs_index
;
buf
[
6
]
=
(
int16_t
)
pdu
->
pusch_data
.
rv_index
;
buf
[
7
]
=
(
int16_t
)
ulsch
->
harq_pid
;
memcpy
(
&
gNB
->
common_vars
.
debugBuff
[
gNB
->
common_vars
.
debugBuff_sample_offset
+
4
],
&
ru
->
common
.
rxdata
[
0
][
slot_offset
],
frame_parms
->
get_samples_per_slot
(
ulsch
->
slot
,
frame_parms
)
*
sizeof
(
int32_t
));
gNB
->
common_vars
.
debugBuff_sample_offset
+=
(
frame_parms
->
get_samples_per_slot
(
ulsch
->
slot
,
frame_parms
)
+
1000
+
4
);
if
(
gNB
->
common_vars
.
debugBuff_sample_offset
>
((
frame_parms
->
get_samples_per_slot
(
ulsch
->
slot
,
frame_parms
)
+
1000
+
2
)
*
20
))
{
FILE
*
f
;
f
=
fopen
(
"rxdata_buff.raw"
,
"w"
);
if
(
f
==
NULL
)
exit
(
1
);
fwrite
((
int16_t
*
)
gNB
->
common_vars
.
debugBuff
,
2
,
(
frame_parms
->
get_samples_per_slot
(
ulsch
->
slot
,
frame_parms
)
+
1000
+
4
)
*
20
*
2
,
f
);
fclose
(
f
);
exit
(
-
1
);
}
#endif
start_meas
(
&
gNB
->
rx_pusch_stats
);
nr_rx_pusch_tp
(
gNB
,
pusch_vars
,
pdu
,
&
ulsch
->
unav_res
,
ulsch
->
frame
,
ulsch
->
slot
,
ulsch
->
beam_nb
);
pusch_vars
->
ulsch_power_tot
=
0
;
pusch_vars
->
ulsch_noise_power_tot
=
0
;
for
(
int
aarx
=
0
;
aarx
<
gNB
->
frame_parms
.
nb_antennas_rx
;
aarx
++
)
{
pusch_vars
->
ulsch_power_tot
+=
pusch_vars
->
ulsch_power
[
aarx
];
pusch_vars
->
ulsch_noise_power_tot
+=
pusch_vars
->
ulsch_noise_power
[
aarx
];
}
if
(
dB_fixed_x10
(
pusch_vars
->
ulsch_power_tot
)
<
dB_fixed_x10
(
pusch_vars
->
ulsch_noise_power_tot
)
+
gNB
->
pusch_thres
)
{
NR_gNB_PHY_STATS_t
*
stats
=
get_phy_stats
(
gNB
,
ulsch
->
rnti
);
LOG_D
(
PHY
,
"PUSCH not detected in %d.%d (%d,%d,%d)
\n
"
,
ulsch
->
frame
,
ulsch
->
slot
,
dB_fixed_x10
(
pusch_vars
->
ulsch_power_tot
),
dB_fixed_x10
(
pusch_vars
->
ulsch_noise_power_tot
),
gNB
->
pusch_thres
);
pusch_vars
->
ulsch_power_tot
=
pusch_vars
->
ulsch_noise_power_tot
;
pusch_vars
->
DTX
=
1
;
if
(
stats
)
stats
->
ulsch_stats
.
DTX
++
;
if
(
!
get_softmodem_params
()
->
phy_test
)
{
/* in case of phy_test mode, we still want to decode to measure execution time.
Therefore, we don't yet call nr_fill_indication, it will be called later */
nfapi_nr_crc_t
*
crc
=
&
UL_INFO
->
crc_ind
.
crc_list
[
UL_INFO
->
crc_ind
.
number_crcs
++
];
nfapi_nr_rx_data_pdu_t
*
rx
=
&
UL_INFO
->
rx_ind
.
pdu_list
[
UL_INFO
->
rx_ind
.
number_of_pdus
++
];
nr_fill_indication
(
gNB
,
ulsch
->
frame
,
ulsch
->
slot
,
pusch_vars
,
pdu
,
stats
,
NULL
,
1
,
crc
,
rx
);
(
*
pusch_DTX
)
++
;
gNBdumpScopeData
(
gNB
,
ulsch
->
slot
,
ulsch
->
frame
,
"ULSCH_DTX"
);
return
false
;
}
}
else
{
LOG_D
(
PHY
,
"PUSCH detected in %d.%d (%d,%d,%d)
\n
"
,
ulsch
->
frame
,
ulsch
->
slot
,
dB_fixed_x10
(
pusch_vars
->
ulsch_power_tot
),
dB_fixed_x10
(
pusch_vars
->
ulsch_noise_power_tot
),
gNB
->
pusch_thres
);
pusch_vars
->
DTX
=
0
;
}
stop_meas
(
&
gNB
->
rx_pusch_stats
);
return
true
;
}
static
bool
drop_old_pucch
(
const
void
*
data
,
void
*
user
)
static
bool
drop_old_pucch
(
const
void
*
data
,
void
*
user
)
{
{
const
NR_gNB_PUCCH_job_t
*
pucch
=
data
;
const
NR_gNB_PUCCH_job_t
*
pucch
=
data
;
...
@@ -999,92 +1085,14 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, N
...
@@ -999,92 +1085,14 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, N
for
(
int
ULSCH_id
=
0
;
ULSCH_id
<
gNB
->
max_nb_pusch
;
ULSCH_id
++
)
{
for
(
int
ULSCH_id
=
0
;
ULSCH_id
<
gNB
->
max_nb_pusch
;
ULSCH_id
++
)
{
ulsch_idx_to_decode
[
ULSCH_id
]
=
-
1
;
ulsch_idx_to_decode
[
ULSCH_id
]
=
-
1
;
NR_gNB_ULSCH_t
*
ulsch
=
&
gNB
->
ulsch
[
ULSCH_id
];
NR_gNB_ULSCH_t
*
ulsch
=
&
gNB
->
ulsch
[
ULSCH_id
];
NR_UL_gNB_HARQ_t
*
ulsch_harq
=
ulsch
->
harq_process
;
AssertFatal
(
ulsch_harq
!=
NULL
,
"harq_pid %d is not allocated
\n
"
,
ulsch
->
harq_pid
);
if
(
!
(
ulsch
->
active
&&
ulsch
->
frame
==
frame_rx
&&
ulsch
->
slot
==
slot_rx
&&
!
ulsch
->
handled
))
if
(
!
(
ulsch
->
active
&&
ulsch
->
frame
==
frame_rx
&&
ulsch
->
slot
==
slot_rx
&&
!
ulsch
->
handled
))
continue
;
continue
;
LOG_D
(
PHY
,
"PUSCH ID %d with RNTI %x detection started in frame %d slot %d
\n
"
,
ULSCH_id
,
ulsch
->
rnti
,
frame_rx
,
slot_rx
);
const
nfapi_nr_pusch_pdu_t
*
pdu
=
&
ulsch_harq
->
ulsch_pdu
;
#ifdef DEBUG_RXDATA
RU_t
*
ru
=
gNB
->
RU_list
[
0
];
int
slot_offset
=
frame_parms
->
get_samples_slot_timestamp
(
slot_rx
,
frame_parms
,
0
);
slot_offset
-=
ru
->
N_TA_offset
;
int32_t
sample_offset
=
gNB
->
common_vars
.
debugBuff_sample_offset
;
int16_t
buf
=
(
int16_t
*
)
&
gNB
->
common_vars
.
debugBuff
[
offset
];
buf
[
0
]
=
(
int16_t
)
ulsch
->
rnti
;
buf
[
1
]
=
(
int16_t
)
pdu
->
rb_size
;
buf
[
2
]
=
(
int16_t
)
pdu
->
rb_start
;
buf
[
3
]
=
(
int16_t
)
pdu
->
nr_of_symbols
;
buf
[
4
]
=
(
int16_t
)
pdu
->
start_symbol_index
;
buf
[
5
]
=
(
int16_t
)
pdu
->
mcs_index
;
buf
[
6
]
=
(
int16_t
)
pdu
->
pusch_data
.
rv_index
;
buf
[
7
]
=
(
int16_t
)
ulsch
->
harq_pid
;
memcpy
(
&
gNB
->
common_vars
.
debugBuff
[
gNB
->
common_vars
.
debugBuff_sample_offset
+
4
],
&
ru
->
common
.
rxdata
[
0
][
slot_offset
],
get_samples_per_slot
(
slot_rx
,
frame_parms
)
*
sizeof
(
int32_t
));
gNB
->
common_vars
.
debugBuff_sample_offset
+=
(
get_samples_per_slot
(
slot_rx
,
frame_parms
)
+
1000
+
4
);
if
(
gNB
->
common_vars
.
debugBuff_sample_offset
>
((
get_samples_per_slot
(
slot_rx
,
frame_parms
)
+
1000
+
2
)
*
20
))
{
FILE
*
f
;
f
=
fopen
(
"rxdata_buff.raw"
,
"w"
);
if
(
f
==
NULL
)
exit
(
1
);
fwrite
((
int16_t
*
)
gNB
->
common_vars
.
debugBuff
,
2
,
(
get_samples_per_slot
(
slot_rx
,
frame_parms
)
+
1000
+
4
)
*
20
*
2
,
f
);
fclose
(
f
);
exit
(
-
1
);
}
#endif
pusch_decode_done
=
1
;
pusch_decode_done
=
1
;
start_meas
(
&
gNB
->
rx_pusch_stats
);
NR_gNB_PUSCH
*
pusch_vars
=
&
gNB
->
pusch_vars
[
ULSCH_id
];
NR_gNB_PUSCH
*
pusch_vars
=
&
gNB
->
pusch_vars
[
ULSCH_id
];
nr_rx_pusch_tp
(
gNB
,
pusch_vars
,
pdu
,
&
ulsch
->
unav_res
,
frame_rx
,
slot_rx
,
ulsch
->
beam_nb
);
pusch_vars
->
ulsch_power_tot
=
0
;
pusch_vars
->
ulsch_noise_power_tot
=
0
;
for
(
int
aarx
=
0
;
aarx
<
nb_antennas_rx
;
aarx
++
)
{
pusch_vars
->
ulsch_power_tot
+=
pusch_vars
->
ulsch_power
[
aarx
];
pusch_vars
->
ulsch_noise_power_tot
+=
pusch_vars
->
ulsch_noise_power
[
aarx
];
}
if
(
dB_fixed_x10
(
pusch_vars
->
ulsch_power_tot
)
<
dB_fixed_x10
(
pusch_vars
->
ulsch_noise_power_tot
)
+
gNB
->
pusch_thres
)
{
NR_gNB_PHY_STATS_t
*
stats
=
get_phy_stats
(
gNB
,
ulsch
->
rnti
);
LOG_D
(
PHY
,
if
(
handle_pusch_decode_trigger
(
gNB
,
pusch_vars
,
ulsch
,
UL_INFO
,
&
pusch_DTX
))
"PUSCH not detected in %d.%d (%d,%d,%d)
\n
"
,
ulsch_idx_to_decode
[
num_pusch
++
]
=
ULSCH_id
;
frame_rx
,
slot_rx
,
dB_fixed_x10
(
pusch_vars
->
ulsch_power_tot
),
dB_fixed_x10
(
pusch_vars
->
ulsch_noise_power_tot
),
gNB
->
pusch_thres
);
pusch_vars
->
ulsch_power_tot
=
pusch_vars
->
ulsch_noise_power_tot
;
pusch_vars
->
DTX
=
1
;
if
(
stats
)
stats
->
ulsch_stats
.
DTX
++
;
if
(
!
get_softmodem_params
()
->
phy_test
)
{
/* in case of phy_test mode, we still want to decode to measure execution time.
Therefore, we don't yet call nr_fill_indication, it will be called later */
nfapi_nr_crc_t
*
crc
=
&
UL_INFO
->
crc_ind
.
crc_list
[
UL_INFO
->
crc_ind
.
number_crcs
++
];
nfapi_nr_rx_data_pdu_t
*
rx
=
&
UL_INFO
->
rx_ind
.
pdu_list
[
UL_INFO
->
rx_ind
.
number_of_pdus
++
];
nr_fill_indication
(
gNB
,
frame_rx
,
slot_rx
,
pusch_vars
,
pdu
,
stats
,
NULL
,
1
,
crc
,
rx
);
pusch_DTX
++
;
gNBdumpScopeData
(
gNB
,
ulsch
->
slot
,
ulsch
->
frame
,
"ULSCH_DTX"
);
continue
;
}
}
else
{
LOG_D
(
PHY
,
"PUSCH detected in %d.%d (%d,%d,%d)
\n
"
,
frame_rx
,
slot_rx
,
dB_fixed_x10
(
pusch_vars
->
ulsch_power_tot
),
dB_fixed_x10
(
pusch_vars
->
ulsch_noise_power_tot
),
gNB
->
pusch_thres
);
pusch_vars
->
DTX
=
0
;
}
ulsch_idx_to_decode
[
num_pusch
++
]
=
ULSCH_id
;
stop_meas
(
&
gNB
->
rx_pusch_stats
);
// LOG_M("rxdataF_comp.m","rxF_comp",gNB->pusch_vars[0]->rxdataF_comp[0],6900,1,1);
// LOG_M("rxdataF_ext.m","rxF_ext",gNB->pusch_vars[0]->rxdataF_ext[0],6900,1,1);
}
}
/* Do ULSCH decoding time measurement only when number of PUSCH is limited to 1
/* Do ULSCH decoding time measurement only when number of PUSCH is limited to 1
...
...
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