ue,mac_nr: fix generation of padding BSRs

* in Msg3 don't add explicit SBSR (rely on padding BSR to add)
* fix padding BSR generation to always use padding bytes to add it
This commit is contained in:
Andre Puschmann 2021-09-27 12:39:24 +02:00
parent 6054e1229b
commit bed4cfb5e5
6 changed files with 46 additions and 25 deletions

View File

@ -98,6 +98,7 @@ public:
/// Interface for MUX
srsran::mac_sch_subpdu_nr::lcg_bsr_t generate_sbsr();
void set_padding_bytes(uint32_t nof_bytes);
void msg3_flush() { mux.msg3_flush(); }
bool msg3_is_transmitted() { return mux.msg3_is_transmitted(); }

View File

@ -54,11 +54,17 @@ public:
class mac_interface_mux_nr
{
public:
// MUX can ask MAC if a C-RNTI is present
virtual bool has_crnti() = 0;
// MUX can query MAC for current C-RNTI for Msg3 transmission
virtual uint16_t get_crnti() = 0;
// MUX queries MAC to return LCG state for SBSR
virtual srsran::mac_sch_subpdu_nr::lcg_bsr_t generate_sbsr() = 0;
// MUX informs MAC about padding bytes so BSR proc can decide whether to create BSR or not
virtual void set_padding_bytes(uint32_t nof_bytes) = 0;
};
/**

View File

@ -69,7 +69,7 @@ public:
/// MUX interface for BSR generation
srsran::mac_sch_subpdu_nr::lcg_bsr_t generate_sbsr();
bool generate_padding_bsr(uint32_t nof_padding_bytes);
void set_padding_bytes(uint32_t nof_bytes);
private:
const static int QUEUE_STATUS_PERIOD_MS = 1000;

View File

@ -209,6 +209,11 @@ srsran::mac_sch_subpdu_nr::lcg_bsr_t mac_nr::generate_sbsr()
return proc_bsr.generate_sbsr();
}
void mac_nr::set_padding_bytes(uint32_t nof_bytes)
{
proc_bsr.set_padding_bytes(nof_bytes);
}
void mac_nr::bch_decoded_ok(uint32_t tti, srsran::unique_byte_buffer_t payload)
{
// Send MIB to RLC

View File

@ -63,14 +63,15 @@ srsran::unique_byte_buffer_t mux_nr::get_pdu(uint32_t max_pdu_len)
tx_pdu.init_tx(phy_tx_pdu.get(), max_pdu_len, true);
if (msg3_is_pending()) {
// If Msg3 is pending, pack it
// Use the CRNTI which is provided in the RRC reconfiguration (only for DC mode maybe other)
tx_pdu.add_crnti_ce(mac.get_crnti());
tx_pdu.add_sbsr_ce(mac.generate_sbsr());
// only C-RNTI or CCCH SDU can be transmitted in Msg3
if (mac.has_crnti()) {
tx_pdu.add_crnti_ce(mac.get_crnti());
}
// TODO: add CCCH check
msg3_transmitted();
} else {
// Pack normal UL data PDU
int32_t remaining_len = tx_pdu.get_remaing_len(); // local variable to reserv space for CEs
int32_t remaining_len = tx_pdu.get_remaing_len(); // local variable to reserve space for CEs
if (add_bsr_ce == sbsr_ce) {
// reserve space for SBSR
@ -115,16 +116,26 @@ srsran::unique_byte_buffer_t mux_nr::get_pdu(uint32_t max_pdu_len)
}
}
}
// Second add fixed-sized MAC CEs (e.g. SBSR)
if (add_bsr_ce == sbsr_ce) {
tx_pdu.add_sbsr_ce(mac.generate_sbsr());
add_bsr_ce = no_bsr;
}
// Lastly, add variable-sized MAC CEs
}
// check if
if (add_bsr_ce == no_bsr) {
// tell BSR proc we still have space in PDU and let it decide to create a padding BSR
mac.set_padding_bytes(tx_pdu.get_remaing_len());
}
// Second add fixed-sized MAC CEs (e.g. SBSR)
if (add_bsr_ce == sbsr_ce) {
tx_pdu.add_sbsr_ce(mac.generate_sbsr());
add_bsr_ce = no_bsr;
} else if (add_bsr_ce == lbsr_ce) {
// TODO: implement LBSR support
tx_pdu.add_sbsr_ce(mac.generate_sbsr());
add_bsr_ce = no_bsr;
}
// Lastly, add variable-sized MAC CEs
// Pack PDU
tx_pdu.pack();

View File

@ -209,8 +209,8 @@ void proc_bsr_nr::new_grant_ul(uint32_t grant_size)
sr->reset();
}
// This function is called by MUX only if Regular BSR has not been triggered before
bool proc_bsr_nr::generate_padding_bsr(uint32_t nof_padding_bytes)
// This function is called by MUX only if no BSR has been triggered before
void proc_bsr_nr::set_padding_bytes(uint32_t nof_bytes)
{
std::lock_guard<std::mutex> lock(mutex);
@ -219,16 +219,14 @@ bool proc_bsr_nr::generate_padding_bsr(uint32_t nof_padding_bytes)
const uint32_t LBSR_CE_SUBHEADER_LEN = 1;
// if the number of padding bits is equal to or larger than the size of the Short BSR plus its subheader but smaller
// than the size of the Long BSR plus its subheader
if (nof_padding_bytes >= SBSR_CE_SUBHEADER_LEN + srsran::mac_sch_subpdu_nr::sizeof_ce(SHORT_BSR, true) &&
nof_padding_bytes <= LBSR_CE_SUBHEADER_LEN + srsran::mac_sch_subpdu_nr::sizeof_ce(LONG_BSR, true)) {
// generate padding BSR
set_trigger(PADDING);
// generate_bsr(bsr, nof_padding_bytes);
set_trigger(NONE);
return true;
if (nof_bytes >= SBSR_CE_SUBHEADER_LEN + srsran::mac_sch_subpdu_nr::sizeof_ce(SHORT_BSR, true) &&
nof_bytes < LBSR_CE_SUBHEADER_LEN + srsran::mac_sch_subpdu_nr::sizeof_ce(LONG_BSR, true)) {
// generate short padding BSR
mux->generate_bsr_mac_ce(SHORT_BSR);
} else if (nof_bytes >= LBSR_CE_SUBHEADER_LEN + srsran::mac_sch_subpdu_nr::sizeof_ce(LONG_BSR, true)) {
// report Long BSR if more than one LCG has data to send
mux->generate_bsr_mac_ce(LONG_BSR);
}
return false;
}
int proc_bsr_nr::setup_lcid(uint32_t lcid, uint32_t new_lcg, uint32_t priority)