bts: Move gprs_rlcmac_rcv_rach into the BTS class
This commit is contained in:
parent
2db7e7e7db
commit
02beed5e98
81
src/bts.cpp
81
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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue