From 02beed5e98766b990d1a022cb01721f8e400752c Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Sat, 26 Oct 2013 20:56:20 +0200 Subject: bts: Move gprs_rlcmac_rcv_rach into the BTS class --- src/bts.cpp | 81 ++++++++++++++++++++++++++++++++++++++++++++++ src/bts.h | 1 + src/gprs_rlcmac.h | 2 -- src/gprs_rlcmac_data.cpp | 83 ------------------------------------------------ src/pcu_l1_if.cpp | 2 +- 5 files changed, 83 insertions(+), 86 deletions(-) diff --git a/src/bts.cpp b/src/bts.cpp index 9fd4fc3e..1fc0c32a 100644 --- a/src/bts.cpp +++ b/src/bts.cpp @@ -331,6 +331,87 @@ int BTS::rcv_imm_ass_cnf(const uint8_t *data, uint32_t fn) return 0; } +int BTS::rcv_rach(uint8_t ra, uint32_t Fn, int16_t qta) +{ + struct gprs_rlcmac_tbf *tbf; + uint8_t trx, ts = 0; + int8_t tfi; /* must be signed */ + uint8_t sb = 0; + uint32_t sb_fn = 0; + int rc; + uint8_t plen; + + LOGP(DRLCMAC, LOGL_DEBUG, "MS requests UL TBF on RACH, so we provide " + "one:\n"); + if ((ra & 0xf8) == 0x70) { + LOGP(DRLCMAC, LOGL_DEBUG, "MS requests single block " + "allocation\n"); + sb = 1; + } else if (m_bts.force_two_phase) { + LOGP(DRLCMAC, LOGL_DEBUG, "MS requests single phase access, " + "but we force two phase access\n"); + sb = 1; + } + if (qta < 0) + qta = 0; + if (qta > 252) + qta = 252; + if (sb) { + rc = sba()->alloc(&trx, &ts, &sb_fn, qta >> 2); + if (rc < 0) + return rc; + LOGP(DRLCMAC, LOGL_DEBUG, "RX: [PCU <- BTS] RACH qbit-ta=%d " + "ra=0x%02x, Fn=%d (%d,%d,%d)\n", qta, ra, Fn, + (Fn / (26 * 51)) % 32, Fn % 51, Fn % 26); + LOGP(DRLCMAC, LOGL_INFO, "TX: Immediate Assignment Uplink " + "(AGCH)\n"); + } else { + // Create new TBF + #warning "Copy and pate with other routines.." + tfi = tfi_find_free(GPRS_RLCMAC_UL_TBF, &trx, -1); + if (tfi < 0) { + LOGP(DRLCMAC, LOGL_NOTICE, "No PDCH ressource\n"); + /* FIXME: send reject */ + return -EBUSY; + } + /* set class to 0, since we don't know the multislot class yet */ + tbf = tbf_alloc(&m_bts, NULL, GPRS_RLCMAC_UL_TBF, tfi, trx, 0, 1); + if (!tbf) { + LOGP(DRLCMAC, LOGL_NOTICE, "No PDCH ressource\n"); + /* FIXME: send reject */ + return -EBUSY; + } + tbf->ta = qta >> 2; + tbf_new_state(tbf, GPRS_RLCMAC_FLOW); + tbf->state_flags |= (1 << GPRS_RLCMAC_FLAG_CCCH); + tbf_timer_start(tbf, 3169, m_bts.t3169, 0); + LOGP(DRLCMAC, LOGL_DEBUG, "TBF: [UPLINK] START TFI: %u\n", + tbf->tfi); + LOGP(DRLCMAC, LOGL_DEBUG, "RX: [PCU <- BTS] TFI: %u RACH " + "qbit-ta=%d ra=0x%02x, Fn=%d (%d,%d,%d)\n", tbf->tfi, + qta, ra, Fn, (Fn / (26 * 51)) % 32, Fn % 51, Fn % 26); + LOGP(DRLCMAC, LOGL_INFO, "TX: START TFI: %u Immediate " + "Assignment Uplink (AGCH)\n", tbf->tfi); + } + bitvec *immediate_assignment = bitvec_alloc(22) /* without plen */; + bitvec_unhex(immediate_assignment, + "2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b"); + if (sb) + plen = Encoding::write_immediate_assignment(&m_bts, immediate_assignment, 0, ra, + Fn, qta >> 2, m_bts.trx[trx].arfcn, ts, + m_bts.trx[trx].pdch[ts].tsc, 0, 0, 0, 0, sb_fn, 1, + m_bts.alpha, m_bts.gamma, -1); + else + plen = Encoding::write_immediate_assignment(&m_bts, immediate_assignment, 0, ra, + Fn, tbf->ta, tbf->arfcn, tbf->first_ts, tbf->tsc, + tbf->tfi, tbf->dir.ul.usf[tbf->first_ts], 0, 0, 0, 0, + m_bts.alpha, m_bts.gamma, -1); + pcu_l1if_tx_agch(immediate_assignment, plen); + bitvec_free(immediate_assignment); + + return 0; +} + /* depending on the current TBF, we assign on PACCH or AGCH */ void BTS::trigger_dl_ass( struct gprs_rlcmac_tbf *tbf, diff --git a/src/bts.h b/src/bts.h index 00d81731..f1df398b 100644 --- a/src/bts.h +++ b/src/bts.h @@ -169,6 +169,7 @@ 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); + int rcv_rach(uint8_t ra, uint32_t Fn, int16_t qta); void trigger_dl_ass(gprs_rlcmac_tbf *tbf, gprs_rlcmac_tbf *old_tbf, const char *imsi); void snd_dl_ass(gprs_rlcmac_tbf *tbf, uint8_t poll, const char *imsi); diff --git a/src/gprs_rlcmac.h b/src/gprs_rlcmac.h index 94b2a4b1..487f3751 100644 --- a/src/gprs_rlcmac.h +++ b/src/gprs_rlcmac.h @@ -94,8 +94,6 @@ enum gprs_rlcmac_block_type { int gprs_rlcmac_tx_ul_ud(gprs_rlcmac_tbf *tbf); -int gprs_rlcmac_rcv_rach(struct gprs_rlcmac_bts *bts, uint8_t ra, uint32_t Fn, int16_t qta); - struct msgb *gprs_rlcmac_send_packet_uplink_assignment( struct gprs_rlcmac_tbf *tbf, uint32_t fn); diff --git a/src/gprs_rlcmac_data.cpp b/src/gprs_rlcmac_data.cpp index 3a0680ac..ae28a0b7 100644 --- a/src/gprs_rlcmac_data.cpp +++ b/src/gprs_rlcmac_data.cpp @@ -178,89 +178,6 @@ struct msgb *gprs_rlcmac_send_packet_uplink_assignment( return msg; } -int gprs_rlcmac_rcv_rach(struct gprs_rlcmac_bts *bts, - uint8_t ra, uint32_t Fn, int16_t qta) -{ - struct gprs_rlcmac_tbf *tbf; - uint8_t trx, ts = 0; - int8_t tfi; /* must be signed */ - uint8_t sb = 0; - uint32_t sb_fn = 0; - int rc; - uint8_t plen; - - LOGP(DRLCMAC, LOGL_DEBUG, "MS requests UL TBF on RACH, so we provide " - "one:\n"); - if ((ra & 0xf8) == 0x70) { - LOGP(DRLCMAC, LOGL_DEBUG, "MS requests single block " - "allocation\n"); - sb = 1; - } else if (bts->force_two_phase) { - LOGP(DRLCMAC, LOGL_DEBUG, "MS requests single phase access, " - "but we force two phase access\n"); - sb = 1; - } - if (qta < 0) - qta = 0; - if (qta > 252) - qta = 252; - if (sb) { - rc = bts->bts->sba()->alloc(&trx, &ts, &sb_fn, qta >> 2); - if (rc < 0) - return rc; - LOGP(DRLCMAC, LOGL_DEBUG, "RX: [PCU <- BTS] RACH qbit-ta=%d " - "ra=0x%02x, Fn=%d (%d,%d,%d)\n", qta, ra, Fn, - (Fn / (26 * 51)) % 32, Fn % 51, Fn % 26); - LOGP(DRLCMAC, LOGL_INFO, "TX: Immediate Assignment Uplink " - "(AGCH)\n"); - } else { - // Create new TBF - #warning "Copy and pate with other routines.." - tfi = bts->bts->tfi_find_free(GPRS_RLCMAC_UL_TBF, &trx, -1); - if (tfi < 0) { - LOGP(DRLCMAC, LOGL_NOTICE, "No PDCH ressource\n"); - /* FIXME: send reject */ - return -EBUSY; - } - /* set class to 0, since we don't know the multislot class yet */ - tbf = tbf_alloc(bts, NULL, GPRS_RLCMAC_UL_TBF, tfi, trx, 0, 1); - if (!tbf) { - LOGP(DRLCMAC, LOGL_NOTICE, "No PDCH ressource\n"); - /* FIXME: send reject */ - return -EBUSY; - } - tbf->ta = qta >> 2; - tbf_new_state(tbf, GPRS_RLCMAC_FLOW); - tbf->state_flags |= (1 << GPRS_RLCMAC_FLAG_CCCH); - tbf_timer_start(tbf, 3169, bts->t3169, 0); - LOGP(DRLCMAC, LOGL_DEBUG, "TBF: [UPLINK] START TFI: %u\n", - tbf->tfi); - LOGP(DRLCMAC, LOGL_DEBUG, "RX: [PCU <- BTS] TFI: %u RACH " - "qbit-ta=%d ra=0x%02x, Fn=%d (%d,%d,%d)\n", tbf->tfi, - qta, ra, Fn, (Fn / (26 * 51)) % 32, Fn % 51, Fn % 26); - LOGP(DRLCMAC, LOGL_INFO, "TX: START TFI: %u Immediate " - "Assignment Uplink (AGCH)\n", tbf->tfi); - } - bitvec *immediate_assignment = bitvec_alloc(22) /* without plen */; - bitvec_unhex(immediate_assignment, - "2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b"); - if (sb) - plen = Encoding::write_immediate_assignment(bts, immediate_assignment, 0, ra, - Fn, qta >> 2, bts->trx[trx].arfcn, ts, - bts->trx[trx].pdch[ts].tsc, 0, 0, 0, 0, sb_fn, 1, - bts->alpha, bts->gamma, -1); - else - plen = Encoding::write_immediate_assignment(bts, immediate_assignment, 0, ra, - Fn, tbf->ta, tbf->arfcn, tbf->first_ts, tbf->tsc, - tbf->tfi, tbf->dir.ul.usf[tbf->first_ts], 0, 0, 0, 0, - bts->alpha, bts->gamma, -1); - pcu_l1if_tx_agch(immediate_assignment, plen); - bitvec_free(immediate_assignment); - - return 0; -} - - /* send DL data block * * The messages are fragmented and forwarded as data blocks. diff --git a/src/pcu_l1_if.cpp b/src/pcu_l1_if.cpp index f759330d..ce13b96f 100644 --- a/src/pcu_l1_if.cpp +++ b/src/pcu_l1_if.cpp @@ -283,7 +283,7 @@ static int pcu_rx_rach_ind(struct gsm_pcu_if_rach_ind *rach_ind) switch (rach_ind->sapi) { case PCU_IF_SAPI_RACH: - rc = gprs_rlcmac_rcv_rach(bts_main_data(), + rc = BTS::main_bts()->rcv_rach( rach_ind->ra, rach_ind->fn, rach_ind->qta); break; -- cgit v1.2.3