diff --git a/lib/include/srslte/common/pdu.h b/lib/include/srslte/common/pdu.h index 15cbce3c5..3bdb8fe4d 100644 --- a/lib/include/srslte/common/pdu.h +++ b/lib/include/srslte/common/pdu.h @@ -223,25 +223,27 @@ public: typedef enum { /* Values of LCID for DL-SCH */ SCELL_ACTIVATION = 0b11011, - CON_RES_ID = 0b11100, - TA_CMD = 0b11101, - DRX_CMD = 0b11110, + CON_RES_ID = 0b11100, + TA_CMD = 0b11101, + DRX_CMD = 0b11110, /* Values of LCID for UL-SCH */ PHR_REPORT_EXT = 0b11001, - PHR_REPORT = 0b11010, - CRNTI = 0b11011, - TRUNC_BSR = 0b11100, - SHORT_BSR = 0b11101, - LONG_BSR = 0b11110, + PHR_REPORT = 0b11010, + CRNTI = 0b11011, + TRUNC_BSR = 0b11100, + SHORT_BSR = 0b11101, + LONG_BSR = 0b11110, /* Values of LCID for MCH */ - MTCH_MAX_LCID = 0b11100, + MTCH_MAX_LCID = 0b11100, MCH_SCHED_INFO = 0b11110, + /*MTCH STOP Value*/ + MTCH_STOP_EMPTY = 0b11111111111, /* Common */ PADDING = 0b11111, - SDU = 0b00000 + SDU = 0b00000 } cetype; // Size of MAC CEs diff --git a/lib/src/common/pdu.cc b/lib/src/common/pdu.cc index e26465efc..b0fde7dc3 100644 --- a/lib/src/common/pdu.cc +++ b/lib/src/common/pdu.cc @@ -454,13 +454,17 @@ int sch_subh::get_bsr(uint32_t buff_size[4]) bool sch_subh::get_next_mch_sched_info(uint8_t *lcid_, uint16_t *mtch_stop) { + uint16_t mtch_stop_ce; if(payload) { nof_mch_sched_ce = nof_bytes/2; if (cur_mch_sched_ce < nof_mch_sched_ce) { *lcid_ = (payload[cur_mch_sched_ce * 2] & 0xF8) >> 3; - *mtch_stop = ((uint16_t)(payload[cur_mch_sched_ce * 2] & 0x07)) << 8; - *mtch_stop += payload[cur_mch_sched_ce * 2 + 1]; + mtch_stop_ce = ((uint16_t)(payload[cur_mch_sched_ce * 2] & 0x07)) << 8; + mtch_stop_ce += payload[cur_mch_sched_ce * 2 + 1]; cur_mch_sched_ce++; + *mtch_stop = (mtch_stop_ce == srslte::mch_subh::MTCH_STOP_EMPTY) + ? (0) + : (mtch_stop_ce); return true; } } @@ -613,8 +617,11 @@ bool sch_subh::set_ta_cmd(uint8_t ta_cmd) bool sch_subh::set_next_mch_sched_info(uint8_t lcid_, uint16_t mtch_stop) { if (((sch_pdu*)parent)->has_space_ce(2, true)) { - w_payload_ce[nof_mch_sched_ce*2] = (lcid_&0x1F) << 3 | (uint8_t) ((mtch_stop&0x0700)>>8); - w_payload_ce[nof_mch_sched_ce*2+1] = (uint8_t) (mtch_stop&0xff); + uint16_t mtch_stop_ce = + (mtch_stop) ? (mtch_stop) : (srslte::mch_subh::MTCH_STOP_EMPTY); + w_payload_ce[nof_mch_sched_ce * 2] = + (lcid_ & 0x1F) << 3 | (uint8_t)((mtch_stop_ce & 0x0700) >> 8); + w_payload_ce[nof_mch_sched_ce * 2 + 1] = (uint8_t)(mtch_stop_ce & 0xff); nof_mch_sched_ce++; lcid = MCH_SCHED_INFO; ((sch_pdu*)parent)->update_space_ce(2, true); diff --git a/lib/src/phy/phch/test/pmch_file_test.c b/lib/src/phy/phch/test/pmch_file_test.c index 051cdc50d..16d38f202 100644 --- a/lib/src/phy/phch/test/pmch_file_test.c +++ b/lib/src/phy/phch/test/pmch_file_test.c @@ -159,7 +159,7 @@ int main(int argc, char **argv) { exit(-1); } parse_args(argc,argv); - + srslte_use_standard_symbol_size(false); if (base_init()) { ERROR("Error initializing memory\n"); exit(-1); @@ -215,9 +215,9 @@ int main(int argc, char **argv) { srslte_pdsch_res_t pdsch_res; pdsch_res.payload = data; ret = srslte_ue_dl_decode_pmch(&ue_dl, &dl_sf, &pmch_cfg, &pdsch_res); - if (ret >= 0) { - printf("PMCH Decoded OK!\n"); - } else if (ret < 0) { + if (pdsch_res.crc == 1) { + printf("PMCH Decoded OK!\n"); + } else if (pdsch_res.crc == 0) { printf("Error decoding PMCH\n"); } diff --git a/srsenb/src/mac/mac.cc b/srsenb/src/mac/mac.cc index 45f650cda..a9d410830 100644 --- a/srsenb/src/mac/mac.cc +++ b/srsenb/src/mac/mac.cc @@ -663,14 +663,14 @@ void mac::build_mch_sched(uint32_t tbs) int last_mtch_stop = 0; - if(total_bytes_to_tx >= total_space_avail_bytes){ + if (total_bytes_to_tx >= total_space_avail_bytes) { for(uint32_t i = 0; i < mch.num_mtch_sched;i++){ double ratio = mch.mtch_sched[i].lcid_buffer_size/total_bytes_to_tx; float assigned_sfs = floor(sfs_per_sched_period*ratio); mch.mtch_sched[i].stop = last_mtch_stop + (uint32_t)assigned_sfs; last_mtch_stop = mch.mtch_sched[i].stop; } - }else { + } else { for(uint32_t i = 0; i < mch.num_mtch_sched;i++){ float assigned_sfs = ceil(((float)mch.mtch_sched[i].lcid_buffer_size)/((float)bytes_per_sf)); mch.mtch_sched[i].stop = last_mtch_stop + (uint32_t)assigned_sfs; @@ -694,8 +694,10 @@ int mac::get_mch_sched(uint32_t tti, bool is_mcch, dl_sched_t* dl_sched_res) build_mch_sched(mcs_data.tbs); mch.mcch_payload = mcch_payload_buffer; mch.current_sf_allocation_num = 1; - Info("MCH Sched Info: LCID: %d, Stop: %d, tti is %d \n", mch.mtch_sched[0].lcid, mch.mtch_sched[0].stop, tti); - phy_h->set_mch_period_stop(mch.mtch_sched[0].stop); + Info("MCH Sched Info: LCID: %d, Stop: %d, tti is %d \n", + mch.mtch_sched[0].lcid, mch.mtch_sched[mch.num_mtch_sched - 1].stop, + tti); + phy_h->set_mch_period_stop(mch.mtch_sched[mch.num_mtch_sched - 1].stop); for(uint32_t i = 0; i < mch.num_mtch_sched; i++) { mch.pdu[i].lcid = srslte::sch_subh::MCH_SCHED_INFO; // mch.mtch_sched[i].lcid = 1+i; diff --git a/srsue/src/main.cc b/srsue/src/main.cc index 93a412ddd..4a4f7880e 100644 --- a/srsue/src/main.cc +++ b/srsue/src/main.cc @@ -536,6 +536,26 @@ int main(int argc, char* argv[]) exit(1); } + if (args.expert.mbms_service > -1) { + if (!args.expert.phy.interpolate_subframe_enabled) { + fprintf(stderr, "interpolate_subframe_enabled = %d, While using MBMS, " + "please set interpolate_subframe_enabled to true\n", + args.expert.phy.interpolate_subframe_enabled); + exit(1); + } + if (args.expert.phy.nof_phy_threads > 2) { + fprintf(stderr, "nof_phy_threads = %d, While using MBMS, please set " + "number of phy threads to 1 or 2\n", + args.expert.phy.nof_phy_threads); + exit(1); + } + if ((0 == args.expert.phy.snr_estim_alg.find("refs"))) { + fprintf(stderr, "snr_estim_alg = refs, While using MBMS, please set " + "algorithm to pss or empty \n"); + exit(1); + } + } + metricshub.init(ue, args.expert.metrics_period_secs); metricshub.add_listener(&metrics_screen); metrics_screen.set_ue_handle(ue);