tbf: Separate the easy path out of the receive path

* Create a look up routine for the TBF that will allow us to
  easily find a TBF by IMSI...
* Separate the code that works on an existing TBF.
This commit is contained in:
Holger Hans Peter Freyther 2013-08-24 20:42:45 +02:00 committed by Ivan Kluchnikov
parent 17c31ce173
commit 31d0df92ac
1 changed files with 70 additions and 49 deletions

View File

@ -29,29 +29,28 @@ extern "C" {
#include <errno.h> #include <errno.h>
#include <string.h> #include <string.h>
/** static struct gprs_rlcmac_tbf *tbf_lookup_dl(const uint32_t tlli, const char *imsi)
* TODO: split into unit test-able parts... {
*/ /* TODO: look up by IMSI first, then tlli, then old_tlli */
int tbf_handle(struct gprs_rlcmac_bts *bts, return tbf_by_tlli(tlli, GPRS_RLCMAC_DL_TBF);
const uint32_t tlli, const char *imsi, }
const uint8_t ms_class, const uint16_t pdu_delay_csec,
static int tbf_append_data(struct gprs_rlcmac_tbf *tbf,
struct gprs_rlcmac_bts *bts,
const uint8_t ms_class,
const uint16_t pdu_delay_csec,
const uint8_t *data, const uint16_t len) const uint8_t *data, const uint16_t len)
{ {
struct gprs_rlcmac_tbf *tbf;
int8_t tfi; /* must be signed */
/* check for existing TBF */
if ((tbf = tbf_by_tlli(tlli, GPRS_RLCMAC_DL_TBF))) {
LOGP(DRLCMAC, LOGL_INFO, "TBF: APPEND TFI: %u TLLI: 0x%08x\n", tbf->tfi, tbf->tlli); LOGP(DRLCMAC, LOGL_INFO, "TBF: APPEND TFI: %u TLLI: 0x%08x\n", tbf->tfi, tbf->tlli);
if (tbf->state == GPRS_RLCMAC_WAIT_RELEASE) { if (tbf->state == GPRS_RLCMAC_WAIT_RELEASE) {
LOGP(DRLCMAC, LOGL_DEBUG, "TBF in WAIT RELEASE state " LOGP(DRLCMAC, LOGL_DEBUG, "TBF in WAIT RELEASE state "
"(T3193), so reuse TBF\n"); "(T3193), so reuse TBF\n");
memcpy(tbf->llc_frame, data, len); memcpy(tbf->llc_frame, data, len);
tbf->llc_length = len; tbf->llc_length = len;
memset(&tbf->dir.dl, 0, sizeof(tbf->dir.dl)); /* reset /* reset rlc states */
rlc states */ memset(&tbf->dir.dl, 0, sizeof(tbf->dir.dl));
tbf->state_flags &= GPRS_RLCMAC_FLAG_TO_MASK; /* keep /* keep to flags */
to flags */ tbf->state_flags &= GPRS_RLCMAC_FLAG_TO_MASK;
tbf->state_flags &= ~(1 << GPRS_RLCMAC_FLAG_CCCH); tbf->state_flags &= ~(1 << GPRS_RLCMAC_FLAG_CCCH);
if (!tbf->ms_class && ms_class) if (!tbf->ms_class && ms_class)
tbf->ms_class = ms_class; tbf->ms_class = ms_class;
@ -89,6 +88,28 @@ int tbf_handle(struct gprs_rlcmac_bts *bts,
if (!tbf->ms_class && ms_class) if (!tbf->ms_class && ms_class)
tbf->ms_class = ms_class; tbf->ms_class = ms_class;
} }
return 0;
}
/**
* TODO: split into unit test-able parts...
*/
int tbf_handle(struct gprs_rlcmac_bts *bts,
const uint32_t tlli, const char *imsi,
const uint8_t ms_class, const uint16_t delay_csec,
const uint8_t *data, const uint16_t len)
{
struct gprs_rlcmac_tbf *tbf;
int8_t tfi; /* must be signed */
/* check for existing TBF */
tbf = tbf_lookup_dl(tlli, imsi);
if (tbf) {
int rc = tbf_append_data(tbf, bts, ms_class,
delay_csec, data, len);
if (rc < 0)
return rc;
} else { } else {
uint8_t trx, ta, ss; uint8_t trx, ta, ss;
int8_t use_trx; int8_t use_trx;