diff options
author | Jacob Erlbeck <jerlbeck@sysmocom.de> | 2015-06-30 14:10:13 +0200 |
---|---|---|
committer | Jacob Erlbeck <jerlbeck@sysmocom.de> | 2015-07-07 10:35:28 +0200 |
commit | cc9358f95aca618db451faf53971c45dfe0b505a (patch) | |
tree | 84b5d5e37292e609ddfb8c7a2336ba5cad42cb4c /src/bts.cpp | |
parent | 16c6ecc3657f62728845764731c189b3cb8daca2 (diff) |
tbf: Keep a set of used TFI and USF per PDCH
Currently is is rather expensive to get TFI and USF usage per PDCH,
because the TBFs need to be scanned to get that information.
This commit adds corresponding bit sets which get updated by the
attach_tbf/detach_tbf methods of the gprs_rlcmac_pdch class.
Sponsored-by: On-Waves ehf
Diffstat (limited to 'src/bts.cpp')
-rw-r--r-- | src/bts.cpp | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/src/bts.cpp b/src/bts.cpp index 87a22def..b96971db 100644 --- a/src/bts.cpp +++ b/src/bts.cpp @@ -1137,18 +1137,38 @@ gprs_rlcmac_dl_tbf *gprs_rlcmac_pdch::dl_tbf_by_tfi(uint8_t tfi) void gprs_rlcmac_pdch::attach_tbf(gprs_rlcmac_tbf *tbf) { + gprs_rlcmac_ul_tbf *ul_tbf; + m_num_tbfs[tbf->direction] += 1; - LOGP(DRLCMAC, LOGL_INFO, "PDCH(TS %d, TRX %d): Attaching %s, %d TBFs.\n", - ts_no, trx_no(), tbf->name(), m_num_tbfs[tbf->direction]); + if (tbf->direction == GPRS_RLCMAC_UL_TBF) { + ul_tbf = static_cast<gprs_rlcmac_ul_tbf *>(tbf); + m_assigned_usf |= 1 << ul_tbf->m_usf[ts_no]; + } + m_assigned_tfi |= 1UL << tbf->tfi(); + + LOGP(DRLCMAC, LOGL_INFO, "PDCH(TS %d, TRX %d): Attaching %s, %d TBFs, " + "USFs = %02x, TFIs = %08x.\n", + ts_no, trx_no(), tbf->name(), m_num_tbfs[tbf->direction], + m_assigned_usf, m_assigned_tfi); } void gprs_rlcmac_pdch::detach_tbf(gprs_rlcmac_tbf *tbf) { + gprs_rlcmac_ul_tbf *ul_tbf; + OSMO_ASSERT(m_num_tbfs[tbf->direction] > 0); m_num_tbfs[tbf->direction] -= 1; - LOGP(DRLCMAC, LOGL_INFO, "PDCH(TS %d, TRX %d): Detaching %s, %d TBFs.\n", - ts_no, trx_no(), tbf->name(), m_num_tbfs[tbf->direction]); + if (tbf->direction == GPRS_RLCMAC_UL_TBF) { + ul_tbf = static_cast<gprs_rlcmac_ul_tbf *>(tbf); + m_assigned_usf &= ~(1 << ul_tbf->m_usf[ts_no]); + } + m_assigned_tfi &= ~(1UL << tbf->tfi()); + + LOGP(DRLCMAC, LOGL_INFO, "PDCH(TS %d, TRX %d): Detaching %s, %d TBFs, " + "USFs = %02x, TFIs = %08x.\n", + ts_no, trx_no(), tbf->name(), m_num_tbfs[tbf->direction], + m_assigned_usf, m_assigned_tfi); } void gprs_rlcmac_pdch::reserve(enum gprs_rlcmac_tbf_direction dir) |