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:
parent
17c31ce173
commit
31d0df92ac
51
src/tbf.cpp
51
src/tbf.cpp
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue