sgsn: Implement TLLI assignment/modification/unassignment

It's important that we implement the proper TLLI handling whenever our
P-TMSI changes.

Change-Id: I5b95b9e49f0a1db9659714c4d01f340fd44fafe8
This commit is contained in:
Harald Welte 2018-02-17 10:11:19 +01:00
parent 311ec27f42
commit f70997db90
2 changed files with 46 additions and 6 deletions

View File

@ -63,9 +63,10 @@ type port BSSGP_PT message {
signature BSSGP_register_client(hexstring imsi, OCT4 tlli, BssgpCellId cell_id);
signature BSSGP_unregister_client(hexstring imsi);
signature BSSGP_llgmm_assign(OCT4 tlli_old, OCT4 tlli);
type port BSSGP_PROC_PT procedure {
inout BSSGP_register_client, BSSGP_unregister_client;
inout BSSGP_register_client, BSSGP_unregister_client, BSSGP_llgmm_assign;
} with { extension "internal" };
@ -303,6 +304,25 @@ private function f_tbl_client_del(hexstring imsi, BSSGP_Client_CT vc_conn) runs
self.stop;
}
/* TS 44.064 7.2.1.1 LLGMM-ASSIGN */
private function f_tbl_client_llgmm_assign(OCT4 tlli_old, OCT4 tlli_new, BSSGP_Client_CT vc_conn)
runs on BSSGP_CT {
var integer i := f_tbl_idx_by_comp(vc_conn);
if (tlli_old == 'FFFFFFFF'O and tlli_new != 'FFFFFFFF'O) {
/* TLLI assignment */
ClientTable[i].tlli := tlli_new;
ClientTable[i].tlli_old := omit;
} else if (tlli_old != 'FFFFFFFF'O and tlli_new != 'FFFFFFFF'O) {
/* TLLI change: both active */
ClientTable[i].tlli := tlli_new;
ClientTable[i].tlli_old := tlli_old;
} else if (tlli_old != 'FFFFFFFF'O and tlli_new == 'FFFFFFFF'O) {
/* TLLI unassignment: old shall be unassigned; new stays */
ClientTable[i].tlli_old := omit;
}
}
private function f_tbl_comp_by_imsi(hexstring imsi) runs on BSSGP_CT return BSSGP_Client_CT {
var integer i;
for (i := 0; i < sizeof(ClientTable); i := i+1) {
@ -357,7 +377,7 @@ altstep as_allstate() runs on BSSGP_CT {
var NsStatusIndication nsi;
var ASP_Event evt;
var hexstring imsi;
var OCT4 tlli;
var OCT4 tlli, tlli_old;
var BssgpCellId cell_id;
/* Respond to BLOCK for wrong NSVCI */
@ -421,6 +441,11 @@ altstep as_allstate() runs on BSSGP_CT {
f_tbl_client_del(imsi, vc_conn);
BSSGP_PROC.reply(BSSGP_unregister_client:{imsi});
}
[] BSSGP_PROC.getcall(BSSGP_llgmm_assign:{?,?}) -> param(tlli_old, tlli) sender vc_conn {
f_tbl_client_llgmm_assign(tlli_old, tlli, vc_conn);
BSSGP_PROC.reply(BSSGP_llgmm_assign:{tlli_old, tlli});
}
}
altstep as_blocked() runs on BSSGP_CT {
@ -620,6 +645,14 @@ runs on BSSGP_Client_CT {
}
}
/* TS 44.064 7.2.1.1 LLGMM-ASSIGN */
function f_bssgp_client_llgmm_assign(OCT4 tlli_old, OCT4 tlli_new, BSSGP_PROC_PT PT := BSSGP_PROC)
runs on BSSGP_Client_CT {
PT.call(BSSGP_llgmm_assign:{tlli_old, tlli_new}) {
[] PT.getreply(BSSGP_llgmm_assign:{tlli_old, tlli_new}) {};
}
}
template BssgpDecoded tr_BD_BSSGP(template PDU_BSSGP bg) := {
bssgp := bg,
llc := *,
@ -627,7 +660,6 @@ template BssgpDecoded tr_BD_BSSGP(template PDU_BSSGP bg) := {
l3_mt := *
}
template BssgpDecoded tr_BD_L3_MT(template PDU_L3_SGSN_MS mt) := {
bssgp := ?,
llc := ?,
@ -644,5 +676,4 @@ template BssgpDecoded tr_BD_L3_MO(template PDU_L3_MS_SGSN mo) := {
}

View File

@ -69,6 +69,7 @@ type record BSSGP_ConnHdlrPars {
OCT3 p_tmsi_sig optional,
/* TLLI of the simulated MS */
OCT4 tlli,
OCT4 tlli_old optional,
RoutingAreaIdentificationV ra optional,
BssgpCellId bssgp_cell_id,
AuthVector vec optional,
@ -168,6 +169,7 @@ runs on test_CT return BSSGP_ConnHdlr {
p_tmsi := omit,
p_tmsi_sig := omit,
tlli := f_gprs_tlli_random(),
tlli_old := omit,
ra := omit,
bssgp_cell_id := gb.cfg.cell_id,
vec := omit,
@ -278,6 +280,14 @@ function f_gmm_auth () runs on BSSGP_ConnHdlr {
deactivate(di);
}
function f_upd_ptmsi_and_tlli(OCT4 p_tmsi) runs on BSSGP_ConnHdlr {
g_pars.p_tmsi := p_tmsi;
/* update TLLI */
g_pars.tlli_old := g_pars.tlli;
g_pars.tlli := g_pars.p_tmsi or4b 'c0000000'O;
f_bssgp_client_llgmm_assign(g_pars.tlli_old, g_pars.tlli);
}
function f_process_attach_accept(PDU_GMM_AttachAccept aa) runs on BSSGP_ConnHdlr {
/* mandatory IE */
g_pars.ra := aa.routingAreaIdentification;
@ -286,8 +296,7 @@ function f_process_attach_accept(PDU_GMM_AttachAccept aa) runs on BSSGP_ConnHdlr
setverdict(fail, "unexpected P-TMSI allocation");
self.stop;
}
g_pars.p_tmsi := aa.allocatedPTMSI.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi.octets;
/* update TLLI? */
f_upd_ptmsi_and_tlli(aa.allocatedPTMSI.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi.octets);
}
if (ispresent(aa.msIdentity)) {
setverdict(fail, "unexpected TMSI allocation in non-combined attach");