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;
|
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 */
|
/* depending on the current TBF, we assign on PACCH or AGCH */
|
||||||
void BTS::trigger_dl_ass(
|
void BTS::trigger_dl_ass(
|
||||||
struct gprs_rlcmac_tbf *tbf,
|
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 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_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 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);
|
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_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 msgb *gprs_rlcmac_send_packet_uplink_assignment(
|
||||||
struct gprs_rlcmac_tbf *tbf, uint32_t fn);
|
struct gprs_rlcmac_tbf *tbf, uint32_t fn);
|
||||||
|
|
||||||
|
|
|
@ -178,89 +178,6 @@ struct msgb *gprs_rlcmac_send_packet_uplink_assignment(
|
||||||
return msg;
|
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
|
/* send DL data block
|
||||||
*
|
*
|
||||||
* The messages are fragmented and forwarded as data blocks.
|
* 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) {
|
switch (rach_ind->sapi) {
|
||||||
case PCU_IF_SAPI_RACH:
|
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->ra, rach_ind->fn,
|
||||||
rach_ind->qta);
|
rach_ind->qta);
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue