aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <holger@moiji-mobile.com>2013-10-26 20:56:20 +0200
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2013-10-30 21:24:11 +0100
commit02beed5e98766b990d1a022cb01721f8e400752c (patch)
tree3c7e691a45a1c46f5dbf35ba990123d4eaa28f00 /src
parent2db7e7e7dbb1f48bc2dbfe398449d3b0f4c367d1 (diff)
bts: Move gprs_rlcmac_rcv_rach into the BTS class
Diffstat (limited to 'src')
-rw-r--r--src/bts.cpp81
-rw-r--r--src/bts.h1
-rw-r--r--src/gprs_rlcmac.h2
-rw-r--r--src/gprs_rlcmac_data.cpp83
-rw-r--r--src/pcu_l1_if.cpp2
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;