diff --git a/lib/test/mac/mac_pdu_nr_test.cc b/lib/test/mac/mac_pdu_nr_test.cc index 8752fcf09..bf1636170 100644 --- a/lib/test/mac/mac_pdu_nr_test.cc +++ b/lib/test/mac/mac_pdu_nr_test.cc @@ -516,6 +516,90 @@ int mac_ul_sch_pdu_unpack_and_pack_test3() return SRSRAN_SUCCESS; } +int mac_ul_sch_pdu_unpack_and_pack_test4() +{ + // MAC PDU with UL-SCH with C-RNTI, Long BSR (all zeros) and padding + uint8_t mac_ul_sch_pdu_1[] = {0x3a, 0x46, 0x01, 0x3e, 0x01, 0x00, 0x3f, 0x21, 0x21, 0x21, 0x21}; + const uint16_t TV_CRNTI = 0x4601; + + // only LBSR with only one LCG (LCG7 leftmost bit) reporting buffer state + uint8_t mac_ul_sch_pdu_2[] = {0x3e, 0x02, 0x80, 0xab}; + + // only LBSR with only two LCG (LCG7 leftmost bit. LCG0) reporting buffer state + uint8_t mac_ul_sch_pdu_3[] = {0x3e, 0x03, 0x81, 0xab, 0xcd}; + + if (pcap_handle) { + pcap_handle->write_ul_crnti_nr(mac_ul_sch_pdu_1, sizeof(mac_ul_sch_pdu_1), PCAP_CRNTI, true, PCAP_TTI); + pcap_handle->write_ul_crnti_nr(mac_ul_sch_pdu_2, sizeof(mac_ul_sch_pdu_2), PCAP_CRNTI, true, PCAP_TTI); + pcap_handle->write_ul_crnti_nr(mac_ul_sch_pdu_3, sizeof(mac_ul_sch_pdu_3), PCAP_CRNTI, true, PCAP_TTI); + } + + // pretty print PDU + fmt::memory_buffer buff; + auto& mac_logger = srslog::fetch_basic_logger("MAC"); + + // first TV + srsran::mac_sch_pdu_nr pdu(true); + pdu.unpack(mac_ul_sch_pdu_1, sizeof(mac_ul_sch_pdu_1)); + pdu.to_string(buff); + mac_logger.info("Rx PDU: %s", srsran::to_c_str(buff)); + + TESTASSERT(pdu.get_num_subpdus() == 3); + + // 1st subPDU is C-RNTI CE + mac_sch_subpdu_nr subpdu = pdu.get_subpdu(0); + TESTASSERT(subpdu.get_total_length() == 3); + TESTASSERT(subpdu.get_sdu_length() == 2); + TESTASSERT(subpdu.get_lcid() == mac_sch_subpdu_nr::CRNTI); + TESTASSERT(subpdu.get_c_rnti() == TV_CRNTI); + + // 2nd subPDU is LBSR + subpdu = pdu.get_subpdu(1); + TESTASSERT(subpdu.get_lcid() == mac_sch_subpdu_nr::LONG_BSR); + mac_sch_subpdu_nr::lbsr_t lbsr = subpdu.get_lbsr(); + TESTASSERT(lbsr.list.size() == 0); + + // 3rd is padding + subpdu = pdu.get_subpdu(2); + TESTASSERT(subpdu.get_lcid() == mac_sch_subpdu_nr::PADDING); + + // TODO: pack again and test + + // 2nd TV + pdu.init_rx(true); + pdu.unpack(mac_ul_sch_pdu_2, sizeof(mac_ul_sch_pdu_2)); + buff.clear(); + pdu.to_string(buff); + mac_logger.info("Rx PDU: %s", srsran::to_c_str(buff)); + + TESTASSERT(pdu.get_num_subpdus() == 1); + subpdu = pdu.get_subpdu(0); + TESTASSERT(subpdu.get_lcid() == mac_sch_subpdu_nr::LONG_BSR); + lbsr = subpdu.get_lbsr(); + TESTASSERT(lbsr.list.size() == 1); + TESTASSERT(lbsr.list.at(0).lcg_id == 7); + TESTASSERT(lbsr.list.at(0).buffer_size == 0xab); + + // 3nd TV + pdu.init_rx(true); + pdu.unpack(mac_ul_sch_pdu_3, sizeof(mac_ul_sch_pdu_3)); + buff.clear(); + pdu.to_string(buff); + mac_logger.info("Rx PDU: %s", srsran::to_c_str(buff)); + + TESTASSERT(pdu.get_num_subpdus() == 1); + subpdu = pdu.get_subpdu(0); + TESTASSERT(subpdu.get_lcid() == mac_sch_subpdu_nr::LONG_BSR); + lbsr = subpdu.get_lbsr(); + TESTASSERT(lbsr.list.size() == 2); + TESTASSERT(lbsr.list.at(0).lcg_id == 0); + TESTASSERT(lbsr.list.at(0).buffer_size == 0xab); + TESTASSERT(lbsr.list.at(1).lcg_id == 7); + TESTASSERT(lbsr.list.at(1).buffer_size == 0xcd); + + return SRSRAN_SUCCESS; +} + int mac_ul_sch_pdu_pack_test4() { // MAC PDU with UL-SCH (with normal LCID) subheader for long SDU @@ -771,6 +855,11 @@ int main(int argc, char** argv) return SRSRAN_ERROR; } + if (mac_ul_sch_pdu_unpack_and_pack_test4()) { + fprintf(stderr, "mac_ul_sch_pdu_unpack_and_pack_test4() failed.\n"); + return SRSRAN_ERROR; + } + if (mac_ul_sch_pdu_pack_test4()) { fprintf(stderr, "mac_ul_sch_pdu_pack_test4() failed.\n"); return SRSRAN_ERROR;