sgsn: Change handling of missing mmctx in gsm48_rx_gmm_ra_upd_req

Currently the MM context is just overwritten by a call to
sgsn_mm_ctx_by_tlli(msgb_tlli(msg), &old_ra_id) even if it
has already been found by using the BSSGP info. With the changes
made to sgsn_mm_ctx_by_tlli this will never find a MM context if
the routing area has changed. If the routing area has not changed,
the mmctx has already been found if it exists.

This commit splits searching for an MM context (if it hasn't been
found already) from checking, whether a found one can really be
used. The actual search is removed, so that the MS will be forced to
restart the attach procedure, which is less efficient but safe.

Sponsored-by: On-Waves ehf
This commit is contained in:
Jacob Erlbeck 2016-01-04 18:43:36 +01:00 committed by Holger Hans Peter Freyther
parent d58c033305
commit d35957a7d9
1 changed files with 15 additions and 3 deletions

View File

@ -1164,9 +1164,21 @@ static int gsm48_rx_gmm_ra_upd_req(struct sgsn_mm_ctx *mmctx, struct msgb *msg,
break;
}
/* Look-up the MM context based on old RA-ID and TLLI */
mmctx = sgsn_mm_ctx_by_tlli(msgb_tlli(msg), &old_ra_id);
if (!mmctx || mmctx->mm_state == GMM_DEREGISTERED) {
if (!mmctx) {
/* BSSGP doesn't give us an mmctx */
/* TODO: Check if there is an MM CTX with old_ra_id and
* the P-TMSI (if given, reguired for UMTS) or as last resort
* if the TLLI matches foreign_tlli (P-TMSI). Note that this
* is an optimization to avoid the RA reject (impl detached)
* below, which will cause a new attach cycle. */
}
if (!mmctx || !gprs_ra_id_equals(&mmctx->ra, &old_ra_id) ||
mmctx->mm_state == GMM_DEREGISTERED)
{
/* We cannot use the mmctx */
/* send a XID reset to re-set all LLC sequence numbers
* in the MS */
LOGMMCTXP(LOGL_NOTICE, mmctx, "LLC XID RESET\n");