diff options
author | Andreas Eversberg <jolly@eversberg.eu> | 2014-01-04 15:27:31 +0100 |
---|---|---|
committer | Holger Hans Peter Freyther <holger@moiji-mobile.com> | 2014-01-15 10:39:08 +0100 |
commit | 765736dc77966563c08c38c6561f75b3b91c55f9 (patch) | |
tree | 8977a836276d010a146c26e2ca586493d1fbf952 /src/gprs_rlcmac_ts_alloc.cpp | |
parent | 7a16d46fdcad1df8c525f10ed344cd28d75292cc (diff) |
alloc_algorithm_b: Do not select uplink slots that cannot be used for downlink
In order to poll MS, the mobile must be able to receive polling request.
In order to allow the MS to transmit, the USF must be received by the mobile.
Diffstat (limited to 'src/gprs_rlcmac_ts_alloc.cpp')
-rw-r--r-- | src/gprs_rlcmac_ts_alloc.cpp | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/src/gprs_rlcmac_ts_alloc.cpp b/src/gprs_rlcmac_ts_alloc.cpp index 62d1dd18..96fc0927 100644 --- a/src/gprs_rlcmac_ts_alloc.cpp +++ b/src/gprs_rlcmac_ts_alloc.cpp @@ -393,7 +393,7 @@ static void tx_win_from_rx(const int ms_type, static int select_ul_slots(gprs_rlcmac_trx *trx, const int ms_type, const int ms_max_txslots, uint8_t tx_win_min, uint8_t tx_range, - int8_t *usf, int8_t *first_common_ts) + int8_t *usf, int8_t *first_common_ts, uint8_t rx_window) { int tsc = -1; uint8_t tx_window = 0; @@ -411,6 +411,14 @@ static int select_ul_slots(gprs_rlcmac_trx *trx, goto inc_window; continue; } + /* check if used as downlink */ + if (!(rx_window & (1 << ts_no))) { + LOGP(DRLCMAC, LOGL_DEBUG, "- Skipping TS %d, " + "because not a downlink slot\n", ts_no); + if (ms_type == 1 && tx_window) + goto inc_window; + continue; + } /* check if TSC changes */ if (tsc < 0) tsc = pdch->tsc; @@ -479,7 +487,8 @@ inc_window: * Assign the first common ts, which is used for control or * single slot. */ -static int select_first_ts(gprs_rlcmac_trx *trx, uint8_t tx_win_min, uint8_t tx_range) +static int select_first_ts(gprs_rlcmac_trx *trx, uint8_t tx_win_min, + uint8_t tx_range, uint8_t rx_window) { uint8_t ts_no; int i; @@ -491,6 +500,12 @@ static int select_first_ts(gprs_rlcmac_trx *trx, uint8_t tx_win_min, uint8_t tx_ "because not enabled\n", ts_no); continue; } + /* check if used as downlink */ + if (!(rx_window & (1 << ts_no))) { + LOGP(DRLCMAC, LOGL_DEBUG, "- Skipping TS %d, " + "because not a downlink slot\n", ts_no); + continue; + } return ts_no; } @@ -589,12 +604,14 @@ int alloc_algorithm_b(struct gprs_rlcmac_bts *bts, uint8_t tx_window = 0; if (tbf->direction == GPRS_RLCMAC_UL_TBF) { rc = select_ul_slots(tbf->trx, ms_class->type, ms_class->tx, - tx_win_min, tx_range, usf, &first_common_ts); + tx_win_min, tx_range, usf, + &first_common_ts, rx_window); if (rc < 0) return rc; tx_window = rc; } else { - first_common_ts = select_first_ts(tbf->trx, tx_win_min, tx_range); + first_common_ts = select_first_ts(tbf->trx, tx_win_min, + tx_range, rx_window); } #warning "first_common_ts might be different if there was no free USF for the new uplink assignment" |