tbf_dl: Update (egprs_)ms_class for already known MS
If SGSN provides us with MS class information upon DL data, let's use it and set it in an already existing MS object if not yet known. Also remove all unneeded code passing ms_class to append_data() which would simply try to (again) set the ms_class. Change-Id: I4979c9344bffd3ba7657bbab94981d233eab801f
This commit is contained in:
parent
16705a4db1
commit
758ace867b
|
@ -94,13 +94,6 @@ static const struct rate_ctr_group_desc tbf_dl_egprs_ctrg_desc = {
|
|||
tbf_dl_egprs_ctr_description,
|
||||
};
|
||||
|
||||
static inline void tbf_update_ms_class(struct gprs_rlcmac_tbf *tbf,
|
||||
const uint8_t ms_class)
|
||||
{
|
||||
if (!tbf->ms_class() && ms_class)
|
||||
tbf->ms()->set_ms_class(ms_class);
|
||||
}
|
||||
|
||||
static void llc_timer_cb(void *_tbf)
|
||||
{
|
||||
struct gprs_rlcmac_dl_tbf *tbf = (struct gprs_rlcmac_dl_tbf *)_tbf;
|
||||
|
@ -225,9 +218,8 @@ void gprs_rlcmac_dl_tbf::start_llc_timer()
|
|||
}
|
||||
}
|
||||
|
||||
int gprs_rlcmac_dl_tbf::append_data(const uint8_t ms_class,
|
||||
const uint16_t pdu_delay_csec,
|
||||
const uint8_t *data, const uint16_t len)
|
||||
int gprs_rlcmac_dl_tbf::append_data(uint16_t pdu_delay_csec,
|
||||
const uint8_t *data, uint16_t len)
|
||||
{
|
||||
struct timespec expire_time;
|
||||
|
||||
|
@ -240,7 +232,6 @@ int gprs_rlcmac_dl_tbf::append_data(const uint8_t ms_class,
|
|||
gprs_llc_queue::calc_pdu_lifetime(bts, pdu_delay_csec, &expire_time);
|
||||
memcpy(msgb_put(llc_msg, len), data, len);
|
||||
llc_queue()->enqueue(llc_msg, &expire_time);
|
||||
tbf_update_ms_class(this, ms_class);
|
||||
start_llc_timer();
|
||||
|
||||
if (state_is(GPRS_RLCMAC_WAIT_RELEASE)) {
|
||||
|
@ -308,15 +299,6 @@ int gprs_rlcmac_dl_tbf::handle(struct gprs_rlcmac_bts *bts,
|
|||
|
||||
/* check for existing TBF */
|
||||
ms = bts->bts->ms_store().get_ms(tlli, tlli_old, imsi);
|
||||
if (ms) {
|
||||
dl_tbf = ms->dl_tbf();
|
||||
|
||||
/* If we known the GPRS/EGPRS MS class, use it */
|
||||
if (ms->ms_class() || ms->egprs_ms_class()) {
|
||||
ms_class = ms->ms_class();
|
||||
egprs_ms_class = ms->egprs_ms_class();
|
||||
}
|
||||
}
|
||||
|
||||
if (ms && strlen(ms->imsi()) == 0) {
|
||||
ms_old = bts->bts->ms_store().get_ms(0, 0, imsi);
|
||||
|
@ -329,7 +311,7 @@ int gprs_rlcmac_dl_tbf::handle(struct gprs_rlcmac_bts *bts,
|
|||
|
||||
GprsMs::Guard guard_old(ms_old);
|
||||
|
||||
if (!dl_tbf && ms_old->dl_tbf()) {
|
||||
if (!ms->dl_tbf() && ms_old->dl_tbf()) {
|
||||
LOGP(DTBF, LOGL_NOTICE,
|
||||
"IMSI %s, old TBF %s: moving DL TBF to new MS object\n",
|
||||
imsi, ms_old->dl_tbf()->name());
|
||||
|
@ -345,15 +327,21 @@ int gprs_rlcmac_dl_tbf::handle(struct gprs_rlcmac_bts *bts,
|
|||
ms = bts->bts->ms_alloc(ms_class, egprs_ms_class);
|
||||
ms->set_imsi(imsi);
|
||||
ms->confirm_tlli(tlli);
|
||||
if (!ms->ms_class() && ms_class) {
|
||||
ms->set_ms_class(ms_class);
|
||||
}
|
||||
if (!ms->egprs_ms_class() && egprs_ms_class) {
|
||||
ms->set_egprs_ms_class(egprs_ms_class);
|
||||
}
|
||||
|
||||
dl_tbf = ms->dl_tbf();
|
||||
if (!dl_tbf) {
|
||||
rc = tbf_new_dl_assignment(bts, ms, &dl_tbf);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* TODO: ms_class vs. egprs_ms_class is not handled here */
|
||||
rc = dl_tbf->append_data(ms_class, delay_csec, data, len);
|
||||
rc = dl_tbf->append_data(delay_csec, data, len);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
|
|
@ -49,9 +49,8 @@ struct gprs_rlcmac_dl_tbf : public gprs_rlcmac_tbf {
|
|||
const uint8_t egprs_ms_class, const uint16_t delay_csec,
|
||||
const uint8_t *data, const uint16_t len);
|
||||
|
||||
int append_data(const uint8_t ms_class,
|
||||
const uint16_t pdu_delay_csec,
|
||||
const uint8_t *data, const uint16_t len);
|
||||
int append_data(uint16_t pdu_delay_csec,
|
||||
const uint8_t *data, uint16_t len);
|
||||
|
||||
int rcvd_dl_ack(bool final, uint8_t ssn, uint8_t *rbb);
|
||||
int rcvd_dl_ack(bool final_ack, unsigned first_bsn, struct bitvec *rbb);
|
||||
|
|
|
@ -277,8 +277,8 @@ static void test_tbf_final_ack(enum test_tbf_final_ack_mode test_mode)
|
|||
llc_data[i] = i%256;
|
||||
|
||||
/* Schedule two LLC frames */
|
||||
dl_tbf->append_data(ms_class, 1000, llc_data, sizeof(llc_data));
|
||||
dl_tbf->append_data(ms_class, 1000, llc_data, sizeof(llc_data));
|
||||
dl_tbf->append_data(1000, llc_data, sizeof(llc_data));
|
||||
dl_tbf->append_data(1000, llc_data, sizeof(llc_data));
|
||||
|
||||
|
||||
/* Send only a few RLC/MAC blocks */
|
||||
|
@ -362,8 +362,8 @@ static void test_tbf_delayed_release()
|
|||
OSMO_ASSERT(dl_tbf->state_is(GPRS_RLCMAC_FLOW));
|
||||
|
||||
/* Schedule two LLC frames */
|
||||
dl_tbf->append_data(ms_class, 1000, llc_data, sizeof(llc_data));
|
||||
dl_tbf->append_data(ms_class, 1000, llc_data, sizeof(llc_data));
|
||||
dl_tbf->append_data(1000, llc_data, sizeof(llc_data));
|
||||
dl_tbf->append_data(1000, llc_data, sizeof(llc_data));
|
||||
|
||||
OSMO_ASSERT(dl_tbf->state_is(GPRS_RLCMAC_FLOW));
|
||||
|
||||
|
@ -2668,7 +2668,7 @@ static void establish_and_use_egprs_dl_tbf(BTS *the_bts, int mcs)
|
|||
OSMO_ASSERT(dl_tbf->state_is(GPRS_RLCMAC_FLOW));
|
||||
|
||||
/* Schedule a small LLC frame */
|
||||
dl_tbf->append_data(ms_class, 1000, test_data, 10);
|
||||
dl_tbf->append_data(1000, test_data, 10);
|
||||
|
||||
OSMO_ASSERT(dl_tbf->state_is(GPRS_RLCMAC_FLOW));
|
||||
|
||||
|
@ -2678,7 +2678,7 @@ static void establish_and_use_egprs_dl_tbf(BTS *the_bts, int mcs)
|
|||
request_dl_rlc_block(dl_tbf, &fn);
|
||||
|
||||
/* Schedule a large LLC frame */
|
||||
dl_tbf->append_data(ms_class, 1000, test_data, sizeof(test_data));
|
||||
dl_tbf->append_data(1000, test_data, sizeof(test_data));
|
||||
|
||||
OSMO_ASSERT(dl_tbf->state_is(GPRS_RLCMAC_FLOW));
|
||||
|
||||
|
@ -2726,7 +2726,7 @@ static gprs_rlcmac_dl_tbf *tbf_init(BTS *the_bts,
|
|||
* 2 RLC data blocks. Which are enough to test Header Type 1
|
||||
* cases
|
||||
*/
|
||||
dl_tbf->append_data(ms_class, 1000, test_data, 100);
|
||||
dl_tbf->append_data(1000, test_data, 100);
|
||||
|
||||
OSMO_ASSERT(dl_tbf->state_is(GPRS_RLCMAC_FLOW));
|
||||
|
||||
|
|
Loading…
Reference in New Issue