tbf: Keep the old MS object alive in extract_tlli

Currently when a second MS object has been created for an MS, because
the TLLI was not known yet, the will be detected in
gprs_rlcmac_tbf::extract_tlli and the two objects will be merged by
update_ms. But when the dl_tbf is moved from the old to the new
(second) MS object, the old MS object can get idle and be removed
before the object are merged. This can cause LLC frame loss when the
MS object is deleted immediately after getting idle (no timeout
configured).

This commit adds a guard to keep the MS object until extract_tlli has
been executed.

Sponsored-by: On-Waves ehf
This commit is contained in:
Jacob Erlbeck 2015-09-01 11:06:14 +02:00
parent cf6ae9d12f
commit 9659d59307
2 changed files with 5 additions and 3 deletions

View File

@ -986,6 +986,8 @@ int gprs_rlcmac_tbf::extract_tlli(const uint8_t *data, const size_t len)
}
old_ms = bts->ms_by_tlli(new_tlli);
/* Keep the old MS object for the update_ms() */
GprsMs::Guard guard(old_ms);
if (old_ms) {
/* Get them before calling set_ms() */
dl_tbf = old_ms->dl_tbf();
@ -996,7 +998,7 @@ int gprs_rlcmac_tbf::extract_tlli(const uint8_t *data, const size_t len)
/* there might be an active and valid downlink TBF */
if (!ms()->dl_tbf() && dl_tbf)
/* Move it to the current MS */
/* Move it to the current MS (see the guard above) */
dl_tbf->set_ms(ms());
}

View File

@ -900,7 +900,7 @@ static void test_tbf_dl_flow_and_rach_two_phase()
/* OSMO_ASSERT(ms->dl_tbf() == dl_tbf); */
/* No queued packets should be lost */
/* OSMO_ASSERT(ms->llc_queue()->size() == 2); */
OSMO_ASSERT(ms->llc_queue()->size() == 2);
printf("=== end %s ===\n", __func__);
}
@ -961,7 +961,7 @@ static void test_tbf_dl_flow_and_rach_single_phase()
OSMO_ASSERT(ms->dl_tbf() == dl_tbf);
/* No queued packets should be lost */
/* OSMO_ASSERT(ms->llc_queue()->size() == 2); */
OSMO_ASSERT(ms->llc_queue()->size() == 2);
printf("=== end %s ===\n", __func__);
}