From 0ae22e0822daceeb82be6e66a1e00950187f6298 Mon Sep 17 00:00:00 2001 From: yagoda Date: Thu, 17 May 2018 20:20:20 +0200 Subject: [PATCH] fixing scheduling issues for mbms --- lib/include/srslte/upper/rlc_tx_queue.h | 5 +++++ lib/src/upper/rlc_um.cc | 7 +++++-- srsenb/src/mac/mac.cc | 6 +++++- srsenb/src/upper/gtpu.cc | 1 - srsue/src/mac/demux.cc | 5 ++--- srsue/src/main.cc | 6 ++---- srsue/src/phy/phch_common.cc | 4 ++-- 7 files changed, 21 insertions(+), 13 deletions(-) diff --git a/lib/include/srslte/upper/rlc_tx_queue.h b/lib/include/srslte/upper/rlc_tx_queue.h index dee326ab6..13dd04e75 100644 --- a/lib/include/srslte/upper/rlc_tx_queue.h +++ b/lib/include/srslte/upper/rlc_tx_queue.h @@ -50,6 +50,7 @@ public: void write(byte_buffer_t *msg) { queue.push(msg); + unread_bytes += msg->N_bytes; } @@ -78,6 +79,10 @@ public: } } + void resize(uint32_t capacity) + { + queue.resize(capacity); + } uint32_t size() { return (uint32_t) queue.size(); diff --git a/lib/src/upper/rlc_um.cc b/lib/src/upper/rlc_um.cc index a4cb116bb..1d5aaab29 100644 --- a/lib/src/upper/rlc_um.cc +++ b/lib/src/upper/rlc_um.cc @@ -44,7 +44,7 @@ rlc_um::rlc_um() : tx_sdu_queue(32) bzero(&cfg, sizeof(srslte_rlc_um_config_t)); tx_sdu = NULL; - + rx_sdu = NULL; pool = byte_buffer_pool::get_instance(); @@ -84,7 +84,9 @@ void rlc_um::init(srslte::log *log_, void rlc_um::configure(srslte_rlc_config_t cnfg_) { cfg = cnfg_.um; - + if(cnfg_.um.is_mrb){ + tx_sdu_queue.resize(512); + } switch(cnfg_.rlc_mode) { case LIBLTE_RRC_RLC_MODE_UM_BI: @@ -192,6 +194,7 @@ uint32_t rlc_um::get_buffer_state() { // Bytes needed for tx SDUs uint32_t n_sdus = tx_sdu_queue.size(); + uint32_t n_bytes = tx_sdu_queue.size_bytes(); if(tx_sdu) { diff --git a/srsenb/src/mac/mac.cc b/srsenb/src/mac/mac.cc index 989498d83..cb36bc25d 100644 --- a/srsenb/src/mac/mac.cc +++ b/srsenb/src/mac/mac.cc @@ -602,7 +602,7 @@ void mac::build_mch_sched(uint32_t tbs) total_bytes_to_tx += mch.mtch_sched[i].lcid_buffer_size; mch.mtch_sched[i].stop = 0; } - + int last_mtch_stop = 0; if(total_bytes_to_tx >= total_space_avail_bytes){ @@ -620,6 +620,9 @@ void mac::build_mch_sched(uint32_t tbs) } } + printf("buffer size is %d\n",total_bytes_to_tx); + printf("shed size is %d\n",total_space_avail_bytes); + printf("stop value is %d\n",mch.mtch_sched[0].stop); } int mac::get_mch_sched(bool is_mcch, dl_sched_t *dl_sched_res) @@ -662,6 +665,7 @@ int mac::get_mch_sched(bool is_mcch, dl_sched_t *dl_sched_res) } if(mch.current_sf_allocation_num <= mtch_stop) { int requested_bytes = (mcs_data.tbs/8 > mch.mtch_sched[mtch_index].lcid_buffer_size)?mch.mtch_sched[mtch_index].lcid_buffer_size:mcs_data.tbs/8; + requested_bytes = requested_bytes - 2; int bytes_received = ue_db[SRSLTE_MRNTI]->read_pdu(current_lcid, mtch_payload_buffer, requested_bytes); mch.pdu[0].lcid = current_lcid; mch.pdu[0].nbytes = bytes_received; diff --git a/srsenb/src/upper/gtpu.cc b/srsenb/src/upper/gtpu.cc index a5cde2c09..67c7be319 100644 --- a/srsenb/src/upper/gtpu.cc +++ b/srsenb/src/upper/gtpu.cc @@ -191,7 +191,6 @@ while(mch_run_enable) { } pdcp->write_sdu(rnti, lcid, pdu); - usleep(10000); do { pdu = pool_allocate; if (!pdu) { diff --git a/srsue/src/mac/demux.cc b/srsue/src/mac/demux.cc index 0b38b14a0..8851b78e0 100644 --- a/srsue/src/mac/demux.cc +++ b/srsue/src/mac/demux.cc @@ -202,7 +202,6 @@ void demux::process_sch_pdu(srslte::sch_pdu *pdu_msg) } } void demux::process_mch_pdu(srslte::mch_pdu *mch_msg){ - //disgarding headers that have already been processed //printf("in process cur idx, %d subheaders %d\n",mch_msg->cur_idx,mch_msg->nof_subheaders); while(mch_msg->next()){ @@ -217,10 +216,10 @@ void demux::process_mch_pdu(srslte::mch_pdu *mch_msg){ if(mch_msg->get()->is_sdu()) { uint32_t lcid = mch_msg->get()->get_sdu_lcid(); if(lcid < 0 || lcid >= SRSLTE_N_MCH_LCIDS) { - Error("Radio bearer id must be in [0:%d] - %d\n", SRSLTE_N_MCH_LCIDS, lcid); + printf("Radio bearer id must be in [0:%d] - %d\n", SRSLTE_N_MCH_LCIDS, lcid); return; } - Info("Wrote MCH LCID=%d to RLC\n", lcid); + Debug("Wrote MCH LCID=%d to RLC\n", lcid); if(1 == mch_lcids[lcid]) { rlc->write_pdu_mch(lcid, mch_msg->get()->get_sdu_ptr(), mch_msg->get()->get_payload_size()); } diff --git a/srsue/src/main.cc b/srsue/src/main.cc index 02aef933a..6cf2d4aa0 100644 --- a/srsue/src/main.cc +++ b/srsue/src/main.cc @@ -521,10 +521,8 @@ int main(int argc, char *argv[]) if (args.gui.enable) { ue->start_plot(); } - if(args.expert.mbms_service > -1) { - serv = args.expert.mbms_service; - port = 14321; - mbms_service_start = true; + if(args.expert.mbms_service > -1){ + ue->mbms_service_start(args.expert.mbms_service, 4321); } } int cnt=0; diff --git a/srsue/src/phy/phch_common.cc b/srsue/src/phy/phch_common.cc index 88352e6dd..a1ba50dca 100644 --- a/srsue/src/phy/phch_common.cc +++ b/srsue/src/phy/phch_common.cc @@ -446,7 +446,7 @@ bool phch_common::is_mch_subframe(subframe_cfg_t *cfg, uint32_t phy_tti) cfg->is_mcch = true; return true; } - + // Not MCCH, check for MCH LIBLTE_RRC_MBSFN_SUBFRAME_CONFIG_STRUCT *subfr_cnfg = &config->mbsfn.mbsfn_subfr_cnfg; LIBLTE_RRC_MBSFN_AREA_INFO_STRUCT *area_info = &config->mbsfn.mbsfn_area_info; @@ -461,7 +461,7 @@ bool phch_common::is_mch_subframe(subframe_cfg_t *cfg, uint32_t phy_tti) if(mcch_configured) { // Iterate through PMCH configs to see which one applies in the current frame LIBLTE_RRC_MCCH_MSG_STRUCT *mcch = &config->mbsfn.mcch; - uint32_t mbsfn_per_frame = mcch->pmch_infolist_r9[0].pmch_config_r9.sf_alloc_end_r9/mcch->pmch_infolist_r9[0].pmch_config_r9.mch_schedulingperiod_r9; + uint32_t mbsfn_per_frame = mcch->pmch_infolist_r9[0].pmch_config_r9.sf_alloc_end_r9/liblte_rrc_mch_scheduling_period_r9_num[mcch->pmch_infolist_r9[0].pmch_config_r9.mch_schedulingperiod_r9]; uint32_t frame_alloc_idx = sfn%liblte_rrc_mbsfn_common_sf_alloc_period_r9_num[mcch->commonsf_allocperiod_r9]; uint32_t sf_alloc_idx = frame_alloc_idx*mbsfn_per_frame + ((sf<4)?sf-1:sf-3); pthread_mutex_lock(&mtch_mutex);