diff options
author | Holger Hans Peter Freyther <holger@moiji-mobile.com> | 2013-10-26 19:49:16 +0200 |
---|---|---|
committer | Holger Hans Peter Freyther <holger@moiji-mobile.com> | 2013-10-30 21:24:11 +0100 |
commit | 40cfaa6837827bc1b5812bca17aa043b7ec67cf7 (patch) | |
tree | ae8df189b9ec3dcd86d40610dddac27091ba580d /src | |
parent | 7292373f922da0561808a3dbdeef2710c7181c97 (diff) |
bts: Move rcv_imm_ass_cnf into the bts code
Diffstat (limited to 'src')
-rw-r--r-- | src/bts.cpp | 39 | ||||
-rw-r--r-- | src/bts.h | 2 | ||||
-rw-r--r-- | src/gprs_rlcmac.h | 2 | ||||
-rw-r--r-- | src/gprs_rlcmac_data.cpp | 40 | ||||
-rw-r--r-- | src/pcu_l1_if.cpp | 3 |
5 files changed, 42 insertions, 44 deletions
diff --git a/src/bts.cpp b/src/bts.cpp index cc53f254..0e451889 100644 --- a/src/bts.cpp +++ b/src/bts.cpp @@ -291,6 +291,45 @@ int BTS::tfi_find_free(enum gprs_rlcmac_tbf_direction dir, return -1; } +int BTS::rcv_imm_ass_cnf(const uint8_t *data, uint32_t fn) +{ + struct gprs_rlcmac_tbf *tbf; + uint8_t plen; + uint32_t tlli; + + /* move to IA Rest Octets */ + plen = data[0] >> 2; + data += 1 + plen; + + if ((*data & 0xf0) != 0xd0) { + LOGP(DRLCMAC, LOGL_ERROR, "Got IMM.ASS confirm, but rest " + "octets do not start with bit sequence 'HH01' " + "(Packet Downlink Assignment)\n"); + return -EINVAL; + } + + /* get TLLI from downlink assignment */ + tlli = (*data++) << 28; + tlli |= (*data++) << 20; + tlli |= (*data++) << 12; + tlli |= (*data++) << 4; + tlli |= (*data++) >> 4; + + tbf = tbf_by_tlli(tlli, GPRS_RLCMAC_DL_TBF); + if (!tbf) { + LOGP(DRLCMAC, LOGL_ERROR, "Got IMM.ASS confirm, but TLLI=%08x " + "does not exit\n", tlli); + return -EINVAL; + } + + LOGP(DRLCMAC, LOGL_DEBUG, "Got IMM.ASS confirm for TLLI=%08x\n", tlli); + + if (tbf->dir.dl.wait_confirm) + tbf_timer_start(tbf, 0, Tassign_agch); + + return 0; +} + /* * PDCH code below. TODO: move to a separate file @@ -168,6 +168,8 @@ public: int tfi_find_free(enum gprs_rlcmac_tbf_direction dir, uint8_t *_trx, int8_t use_trx); + int rcv_imm_ass_cnf(const uint8_t *data, uint32_t fn); + private: int m_cur_fn; struct gprs_rlcmac_bts m_bts; diff --git a/src/gprs_rlcmac.h b/src/gprs_rlcmac.h index 4fe5067a..f5a0ee69 100644 --- a/src/gprs_rlcmac.h +++ b/src/gprs_rlcmac.h @@ -126,8 +126,6 @@ int gprs_rlcmac_rcv_rts_block(struct gprs_rlcmac_bts *bts, uint8_t trx, uint8_t ts, uint16_t arfcn, uint32_t fn, uint8_t block_nr); -int gprs_rlcmac_imm_ass_cnf(BTS *bts, uint8_t *data, uint32_t fn); - extern "C" { #endif int alloc_algorithm_a(struct gprs_rlcmac_bts *bts, diff --git a/src/gprs_rlcmac_data.cpp b/src/gprs_rlcmac_data.cpp index 7e4ee132..00afa862 100644 --- a/src/gprs_rlcmac_data.cpp +++ b/src/gprs_rlcmac_data.cpp @@ -1002,43 +1002,3 @@ void gprs_rlcmac_trigger_downlink_assignment( } } -int gprs_rlcmac_imm_ass_cnf(BTS *bts, uint8_t *data, uint32_t fn) -{ - struct gprs_rlcmac_tbf *tbf; - uint8_t plen; - uint32_t tlli; - - /* move to IA Rest Octets */ - plen = data[0] >> 2; - data += 1 + plen; - - if ((*data & 0xf0) != 0xd0) { - LOGP(DRLCMAC, LOGL_ERROR, "Got IMM.ASS confirm, but rest " - "octets do not start with bit sequence 'HH01' " - "(Packet Downlink Assignment)\n"); - return -EINVAL; - } - - /* get TLLI from downlink assignment */ - tlli = (*data++) << 28; - tlli |= (*data++) << 20; - tlli |= (*data++) << 12; - tlli |= (*data++) << 4; - tlli |= (*data++) >> 4; - - tbf = bts->tbf_by_tlli(tlli, GPRS_RLCMAC_DL_TBF); - if (!tbf) { - LOGP(DRLCMAC, LOGL_ERROR, "Got IMM.ASS confirm, but TLLI=%08x " - "does not exit\n", tlli); - return -EINVAL; - } - - LOGP(DRLCMAC, LOGL_DEBUG, "Got IMM.ASS confirm for TLLI=%08x\n", tlli); - - if (tbf->dir.dl.wait_confirm) { - tbf_timer_start(tbf, 0, Tassign_agch); - } - - return 0; -} - diff --git a/src/pcu_l1_if.cpp b/src/pcu_l1_if.cpp index 1dac5dd3..f759330d 100644 --- a/src/pcu_l1_if.cpp +++ b/src/pcu_l1_if.cpp @@ -223,8 +223,7 @@ static int pcu_rx_data_cnf(struct gsm_pcu_if_data *data_cnf) switch (data_cnf->sapi) { case PCU_IF_SAPI_PCH: if (data_cnf->data[2] == 0x3f) - rc = gprs_rlcmac_imm_ass_cnf(BTS::main_bts(), - data_cnf->data, data_cnf->fn); + BTS::main_bts()->rcv_imm_ass_cnf(data_cnf->data, data_cnf->fn); break; default: LOGP(DL1IF, LOGL_ERROR, "Received PCU data confirm with " |