TLLI problems and proposed solution

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/OpenBSC@lists.osmocom.org/.

Holger Hans Peter Freyther holger at freyther.de
Sun Jul 28 20:54:08 UTC 2013


On Sun, Jul 28, 2013 at 10:01:04PM +0200, Holger Hans Peter Freyther wrote:

>         /* Even if there is no P-TMSI allocated, the MS will switch from
>          * foreign TLLI to local TLLI */
>         ctx->tlli_new = gprs_tmsi2tlli(ctx->p_tmsi, TLLI_LOCAL);
> 
>         /* Inform LLC layer about new TLLI but keep old active */
>         gprs_llgmm_assign(ctx->llme, ctx->tlli, ctx->tlli_new,
>                           GPRS_ALGO_GEA0, NULL);
> 
> 
> So this tlli_new does not appear to be used at all and I don't see how/where
> we would use/create the OLD_TLLI IE? Is it implemented?


Okay, this appears to be incomplete. We would need to put dup.tlli in the
gprs_llc.c code if we want to send a TLLI (but then the PCU doesn't appear
to be bale to look-up the old tbf based on the IE_TLLI).

We do have:

  struct sgsn_mm_ctx {
	tlli;
	tlli_new;
	
	struct gprs_llc_llme {
		tlli;
		old_tlli;
	}
  }


1.) During the attach msgb_tlli(msg) will be the foriegn tlli
2.) We will generate a tlli_new based on the reported tmsi...
3.) We will llgm_assign the tlli_new and tlli. 
4.) msgb_tlli(msg) will still point to the foreign tlli
5.) We send a Identity Request
6.) gprs_llc will not provide a dup.tlli
7.) bssgp_tx_dl_ud will use msgb_tlli(msg) and not put a IE_TLLI


Do you have some documentation/brain-dump on how tlli/tlli_new, tlli
and old_tlli interact with each other? E.g. at which point should the
tlli_new be used?

In terms of a patch (which is likely to break the PCU as it does
not support the old tlli):

1.) Use tlli_foreign2local in the look-up.
2.) Sent the tlli_old if it is not UNASSIGNED and if it is
    different to the msgb_tlli(msg). I would also like to assert
    that msgb_tlli(msg) is not equal to mmctx->llme->tlli/old_tlli.
3.) Use the newly assigned tlli as the default.

I would like to apply the last hunk first as it is solving creating
a LLME on the fly on the TX path and instead re-uses the one created
when receiving the first message.


diff --git a/openbsc/src/gprs/gprs_gmm.c b/openbsc/src/gprs/gprs_gmm.c
index f7a5cde..eaf9ecd 100644
--- a/openbsc/src/gprs/gprs_gmm.c
+++ b/openbsc/src/gprs/gprs_gmm.c
@@ -760,6 +760,7 @@ static int gsm48_rx_gmm_att_req(struct sgsn_mm_ctx *ctx, struct msgb *msg,
 	/* Inform LLC layer about new TLLI but keep old active */
 	gprs_llgmm_assign(ctx->llme, ctx->tlli, ctx->tlli_new,
 			  GPRS_ALGO_GEA0, NULL);
+	ctx->tlli = ctx->llme->tlli;
 
 	DEBUGPC(DMM, "\n");
 	return gsm48_gmm_authorize(ctx, GMM_T3350_MODE_ATT);
@@ -989,6 +990,7 @@ static int gsm48_rx_gmm_ra_upd_req(struct sgsn_mm_ctx *mmctx, struct msgb *msg,
 	/* Inform LLC layer about new TLLI but keep old active */
 	gprs_llgmm_assign(mmctx->llme, mmctx->tlli, mmctx->tlli_new,
 			  GPRS_ALGO_GEA0, NULL);
+	mmctx->tlli = mmctx->llme->tlli;
 
 	/* Look at PDP Context Status IE and see if MS's view of
 	 * activated/deactivated NSAPIs agrees with our view */
diff --git a/openbsc/src/gprs/gprs_llc.c b/openbsc/src/gprs/gprs_llc.c
index 8af5367..ee99d16 100644
--- a/openbsc/src/gprs/gprs_llc.c
+++ b/openbsc/src/gprs/gprs_llc.c
@@ -48,6 +48,9 @@ static int _bssgp_tx_dl_ud(struct msgb *msg, struct sgsn_mm_ctx *mmctx)
 	 * not yet have a MMC context (e.g. XID negotiation of primarly
 	 * LLC connection fro GMM sapi). */
 	if (mmctx) {
+		if (msgb_tlli(msg) != mmctx->llme->old_tlli
+			&& mmctx->llme->old_tlli != 0xffffffff)
+			dup.tlli = &mmctx->llme->old_tlli;
 		dup.imsi = mmctx->imsi;
 		dup.drx_parms = mmctx->drx_parms;
 		dup.ms_ra_cap.len = mmctx->ms_radio_access_capa.len;
@@ -154,7 +157,7 @@ static struct gprs_llc_lle *lle_by_tlli_sapi(uint32_t tlli, uint8_t sapi)
 	tlli = tlli_foreign2local(tlli);
 
 	llist_for_each_entry(llme, &gprs_llc_llmes, list) {
-		if (llme->tlli == tlli || llme->old_tlli == tlli)
+		if (llme->tlli == tlli || tlli_foreign2local(llme->old_tlli) == tlli)
 			return &llme->lle[sapi];
 	}
 	return NULL;




More information about the OpenBSC mailing list