sgsn: Unassign the LLME after GMM Status without mmctx

Currently the LLME is not deleted when a GMM Status message is
received for which a mmctx cannot be found. This can fill the LLME
list with unneeded entries.

This patch adds code to unassign the LLME in that case.

Ticket: OW#1324
Sponsored-by: On-Waves ehf
This commit is contained in:
Jacob Erlbeck 2014-10-28 09:47:03 +01:00 committed by Holger Hans Peter Freyther
parent 7067142100
commit 14ae582064
3 changed files with 45 additions and 1 deletions

View File

@ -1111,8 +1111,12 @@ static int gsm0408_rcv_gmm(struct sgsn_mm_ctx *mmctx, struct msgb *msg,
gh->msg_type != GSM48_MT_GMM_RA_UPD_REQ) { gh->msg_type != GSM48_MT_GMM_RA_UPD_REQ) {
LOGP(DMM, LOGL_NOTICE, "Cannot handle GMM for unknown MM CTX\n"); LOGP(DMM, LOGL_NOTICE, "Cannot handle GMM for unknown MM CTX\n");
/* 4.7.10 */ /* 4.7.10 */
if (gh->msg_type == GSM48_MT_GMM_STATUS) if (gh->msg_type == GSM48_MT_GMM_STATUS) {
/* TLLI unassignment */
gprs_llgmm_assign(llme, llme->tlli, 0xffffffff,
GPRS_ALGO_GEA0, NULL);
return 0; return 0;
}
gprs_llgmm_reset(llme); gprs_llgmm_reset(llme);

View File

@ -256,6 +256,44 @@ static void test_gmm_detach_no_mmctx(void)
OSMO_ASSERT(count(gprs_llme_list()) == 0); OSMO_ASSERT(count(gprs_llme_list()) == 0);
} }
/*
* Test that a GMM Status will remove the associated LLME if there is no MMCTX.
*/
static void test_gmm_status_no_mmctx(void)
{
struct gprs_llc_lle *lle;
uint32_t local_tlli;
struct msgb *msg;
int sgsn_tx_counter_old;
printf("Testing GMM Status (no MMCTX)\n");
/* DTAP - GMM Status, protocol error */
static const unsigned char gmm_status[] = {
0x08, 0x20, 0x6f
};
/* Create an LLME */
OSMO_ASSERT(count(gprs_llme_list()) == 0);
local_tlli = gprs_tmsi2tlli(0x23, TLLI_LOCAL);
lle = gprs_lle_get_or_create(local_tlli, 3);
OSMO_ASSERT(count(gprs_llme_list()) == 1);
/* inject the detach */
sgsn_tx_counter_old = sgsn_tx_counter;
msg = create_msg(gmm_status, ARRAY_SIZE(gmm_status));
msgb_tlli(msg) = local_tlli;
gsm0408_gprs_rcvmsg(msg, lle->llme);
msgb_free(msg);
/* verify that no message has been sent by the SGSN */
OSMO_ASSERT(sgsn_tx_counter_old == sgsn_tx_counter);
/* verify that the LLME is gone */
OSMO_ASSERT(count(gprs_llme_list()) == 0);
}
static struct log_info_cat gprs_categories[] = { static struct log_info_cat gprs_categories[] = {
[DMM] = { [DMM] = {
.name = "DMM", .name = "DMM",
@ -321,6 +359,7 @@ int main(int argc, char **argv)
test_gmm_detach(); test_gmm_detach();
test_gmm_detach_power_off(); test_gmm_detach_power_off();
test_gmm_detach_no_mmctx(); test_gmm_detach_no_mmctx();
test_gmm_status_no_mmctx();
printf("Done\n"); printf("Done\n");
return 0; return 0;
} }

View File

@ -2,4 +2,5 @@ Testing LLME allocations
Testing GMM detach Testing GMM detach
Testing GMM detach (power off) Testing GMM detach (power off)
Testing GMM detach (no MMCTX) Testing GMM detach (no MMCTX)
Testing GMM Status (no MMCTX)
Done Done