Skip to content

Commit f8978a6

Browse files
committed
ue,muxc,harq: save msg3 to be used in the following RACH attempts
1 parent 9b024ee commit f8978a6

File tree

3 files changed

+39
-6
lines changed

3 files changed

+39
-6
lines changed

srsue/hdr/stack/mac_nr/mux_nr.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ class mux_nr final : mux_base, public mux_interface_bsr_nr
3939
bool msg3_is_transmitted();
4040
bool msg3_is_pending();
4141
bool msg3_is_empty();
42+
srsran::unique_byte_buffer_t get_msg3(uint32_t max_pdu_len);
4243

4344
// MAC interface
4445
int setup_lcid(const srsran::logical_channel_config_t& config);
@@ -51,6 +52,7 @@ class mux_nr final : mux_base, public mux_interface_bsr_nr
5152

5253
private:
5354
// internal helper methods
55+
srsran::unique_byte_buffer_t pdu_get_nolock(uint32_t max_pdu_len);
5456

5557
// ctor configured members
5658
mac_interface_mux_nr& mac;

srsue/src/stack/mac_nr/mux_nr.cc

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,8 @@ int mux_nr::setup_lcid(const srsran::logical_channel_config_t& config)
4747
return mux_base::setup_lcid(config);
4848
}
4949

50-
srsran::unique_byte_buffer_t mux_nr::get_pdu(uint32_t max_pdu_len)
50+
srsran::unique_byte_buffer_t mux_nr::pdu_get_nolock(uint32_t max_pdu_len)
5151
{
52-
// Lock MAC PDU from current access from PHY workers (will be moved to UL HARQ)
53-
std::lock_guard<std::mutex> lock(mutex);
54-
5552
// initialize MAC PDU
5653
srsran::unique_byte_buffer_t phy_tx_pdu = srsran::make_byte_buffer();
5754
if (phy_tx_pdu == nullptr) {
@@ -190,6 +187,35 @@ bool mux_nr::msg3_is_empty()
190187
return msg3_buff->N_bytes == 0;
191188
}
192189

190+
srsran::unique_byte_buffer_t mux_nr::get_pdu(uint32_t max_pdu_len)
191+
{
192+
// Lock MAC PDU from current access from PHY workers (will be moved to UL HARQ)
193+
std::lock_guard<std::mutex> lock(mutex);
194+
return pdu_get_nolock(max_pdu_len);
195+
}
196+
197+
srsran::unique_byte_buffer_t mux_nr::get_msg3(uint32_t max_pdu_len)
198+
{
199+
// Lock MAC PDU from current access from PHY workers (will be moved to UL HARQ)
200+
std::lock_guard<std::mutex> lock(mutex);
201+
srsran::unique_byte_buffer_t phy_tx_pdu = srsran::make_byte_buffer();
202+
203+
if (max_pdu_len < msg3_buff->get_tailroom()) {
204+
if (msg3_is_empty()) {
205+
msg3_buff = pdu_get_nolock(max_pdu_len);
206+
if (msg3_buff == nullptr) {
207+
logger.error("Moving PDU from Mux unit to Msg3 buffer");
208+
return NULL;
209+
}
210+
}
211+
*phy_tx_pdu = *msg3_buff;
212+
return phy_tx_pdu;
213+
} else {
214+
logger.error("Msg3 size exceeds buffer");
215+
return nullptr;
216+
}
217+
}
218+
193219
void mux_nr::generate_bsr_mac_ce(const srsran::bsr_format_nr_t& format)
194220
{
195221
switch (format) {

srsue/src/stack/mac_nr/ul_harq_nr.cc

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,8 +189,13 @@ void ul_harq_entity_nr::ul_harq_process_nr::new_grant_ul(const mac_interface_phy
189189
) {
190190
// new transmission
191191

192-
// generate new PDU (Msg3 or normal UL)
193-
harq_buffer = harq_entity->mux->get_pdu(grant.tbs);
192+
if (grant.is_rar_grant) {
193+
// generate new PDU (Msg3)
194+
harq_buffer = harq_entity->mux->get_msg3(grant.tbs);
195+
} else {
196+
// generate new PDU (normal UL)
197+
harq_buffer = harq_entity->mux->get_pdu(grant.tbs);
198+
}
194199

195200
// 3> if a MAC PDU to transmit has been obtained
196201
if (harq_buffer != nullptr) {

0 commit comments

Comments
 (0)