From 41fa60059c41a3106033b08de627c12069f9c341 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Tue, 26 Nov 2013 16:39:28 +0100 Subject: scheduling hacks.. --- src/bts.h | 1 + src/gprs_rlcmac_sched.cpp | 40 ++++++++++++++++++++++++---------------- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/bts.h b/src/bts.h index 924e2e1e..128b1e0a 100644 --- a/src/bts.h +++ b/src/bts.h @@ -67,6 +67,7 @@ struct gprs_rlcmac_pdch { uint8_t tsc; /* TSC of this slot */ uint8_t next_ul_tfi; /* next uplink TBF/TFI to schedule (0..31) */ uint8_t next_dl_tfi; /* next downlink TBF/TFI to schedule (0..31) */ + uint8_t next_ctrl_prio; /* next kind of ctrl message to schedule */ struct gprs_rlcmac_tbf *ul_tbf[32]; /* array of UL TBF, by UL TFI */ struct gprs_rlcmac_tbf *dl_tbf[32]; /* array of DL TBF, by DL TFI */ struct llist_head paging_list; /* list of paging messages */ diff --git a/src/gprs_rlcmac_sched.cpp b/src/gprs_rlcmac_sched.cpp index a3211ee2..3df86105 100644 --- a/src/gprs_rlcmac_sched.cpp +++ b/src/gprs_rlcmac_sched.cpp @@ -106,7 +106,7 @@ static uint8_t sched_select_uplink(uint8_t trx, uint8_t ts, uint32_t fn, return usf; } -static struct msgb *sched_select_ctrl_msg(struct gprs_rlcmac_bts *bts, +static struct msgb *sched_select_ctrl_msg( uint8_t trx, uint8_t ts, uint32_t fn, uint8_t block_nr, struct gprs_rlcmac_pdch *pdch, struct gprs_rlcmac_tbf *ul_ass_tbf, @@ -115,22 +115,30 @@ static struct msgb *sched_select_ctrl_msg(struct gprs_rlcmac_bts *bts, { struct msgb *msg = NULL; struct gprs_rlcmac_tbf *tbf = NULL; + struct gprs_rlcmac_tbf *tbf_list[3] = { ul_ass_tbf, dl_ass_tbf, ul_ack_tbf }; - /* schedule PACKET UPLINK ASSIGNMENT (1st priority) */ - if (ul_ass_tbf) { - tbf = ul_ass_tbf; - msg = tbf->create_ul_ass(fn); - } - /* schedule PACKET DOWNLINK ASSIGNMENT (2nd priotiry) */ - if (!msg && dl_ass_tbf) { - tbf = dl_ass_tbf; - msg = tbf->create_dl_ass(fn); - } - /* schedule PACKET UPLINK ACK (3rd priority) */ - if (!msg && ul_ack_tbf) { - tbf = ul_ack_tbf; - msg = tbf->create_ul_ack(fn); + for (size_t i = 0; i < ARRAY_SIZE(tbf_list); ++i) { + tbf = tbf_list[(pdch->next_ctrl_prio + i) % 3]; + if (!tbf) + continue; + + if (tbf == ul_ass_tbf) + msg = tbf->create_ul_ass(fn); + else if (tbf == dl_ass_tbf) + msg = tbf->create_dl_ass(fn); + else + msg = tbf->create_ul_ack(fn); + + if (!msg) { + tbf = NULL; + continue; + } + + pdch->next_ctrl_prio += i; + pdch->next_ctrl_prio %= 3; + break; } + /* any message */ if (msg) { tbf->rotate_in_list(); @@ -257,7 +265,7 @@ int gprs_rlcmac_rcv_rts_block(struct gprs_rlcmac_bts *bts, usf = sched_select_uplink(trx, ts, fn, block_nr, pdch); /* Prio 1: select control message */ - msg = sched_select_ctrl_msg(bts, trx, ts, fn, block_nr, pdch, ul_ass_tbf, + msg = sched_select_ctrl_msg(trx, ts, fn, block_nr, pdch, ul_ass_tbf, dl_ass_tbf, ul_ack_tbf); /* Prio 2: select data message for downlink */ -- cgit v1.2.3