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:
Pau Espin 2020-10-28 19:58:17 +01:00
parent 16705a4db1
commit 758ace867b
3 changed files with 20 additions and 33 deletions

View File

@ -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;
}

View File

@ -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);

View File

@ -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));