aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2021-04-28 17:29:54 +0200
committerPau Espin Pedrol <pespin@sysmocom.de>2021-05-11 16:15:31 +0200
commite979c40e4bdc438295dd7f464d78d03dcc310022 (patch)
tree20ce228bc653551e774a4e30555a711f2cf6e0c6
parent40778e8cd8beb20c9871d2c3a9cfd07e123d012e (diff)
msc: Verify CommonID contains LastUsedEutranPLMNId when in CSFB
Validate in test that MSC sends Last Used E-UTRAN PLLMN Id IE when call is started by SGs (CSFB). Related: SYS#5337 Change-Id: I161529fd9c8cacb7d17ea18660998df06bb0b575
-rw-r--r--library/BSSMAP_Templates.ttcn35
-rw-r--r--msc/BSC_ConnectionHandler.ttcn6
-rw-r--r--msc/MSC_Tests.ttcn29
3 files changed, 61 insertions, 9 deletions
diff --git a/library/BSSMAP_Templates.ttcn b/library/BSSMAP_Templates.ttcn
index 2b99a5b5..1949fd67 100644
--- a/library/BSSMAP_Templates.ttcn
+++ b/library/BSSMAP_Templates.ttcn
@@ -1163,7 +1163,10 @@ template (value) BSSAMAP_IE_LastUsedEUTRANPLMNId ts_BSSMAP_LastUsedEUTRANPLMNId(
elementIdentifier := '95'O,
mcc_mnc := mcc_mnc
}
-
+template BSSAMAP_IE_LastUsedEUTRANPLMNId tr_BSSMAP_LastUsedEUTRANPLMNId(template OCT3 mcc_mnc) := {
+ elementIdentifier := '95'O,
+ mcc_mnc := mcc_mnc
+}
function f_ts_BSSMAP_LastUsedEUTRANPLMNId(template (omit) OCT3 mcc_mnc)
return template (omit) BSSAMAP_IE_LastUsedEUTRANPLMNId {
if (not istemplatekind(mcc_mnc, "omit")) {
@@ -1172,6 +1175,18 @@ function f_ts_BSSMAP_LastUsedEUTRANPLMNId(template (omit) OCT3 mcc_mnc)
return omit;
}
}
+function f_tr_BSSMAP_LastUsedEUTRANPLMNId(template OCT3 mcc_mnc)
+return template BSSAMAP_IE_LastUsedEUTRANPLMNId {
+ if (istemplatekind(mcc_mnc, "*")) {
+ return *;
+ } else if (istemplatekind(mcc_mnc, "?")) {
+ return ?;
+ } else if (istemplatekind(mcc_mnc, "omit")) {
+ return omit;
+ } else {
+ return ts_BSSMAP_LastUsedEUTRANPLMNId(valueof(mcc_mnc));
+ }
+}
template BSSMAP_FIELD_CellIdentificationList ts_BSSMAP_CIL_noCell := {
cIl_noCell := ''O
@@ -1227,7 +1242,7 @@ template BSSMAP_FIELD_CellIdentificationList tr_BSSMAP_CIL_LAC(template RecordOf
}
-private function f_enc_mcc_mnc(GsmMcc mcc, GsmMnc mnc) return OCT3 {
+function f_enc_mcc_mnc(GsmMcc mcc, GsmMnc mnc) return OCT3 {
if (lengthof(mnc) == 2) {
return hex2oct(mcc[1] & mcc[0] & 'F'H & mcc[2] & mnc[1] & mnc[0]);
} else {
@@ -1235,6 +1250,15 @@ private function f_enc_mcc_mnc(GsmMcc mcc, GsmMnc mnc) return OCT3 {
}
}
+function f_dec_mcc_mnc(in OCT3 mcc_mnc, out GsmMcc mcc, out GsmMnc mnc) {
+ var hexstring hs := oct2hex(mcc_mnc);
+ mcc := hs[1] & hs[0] & hs[3];
+ mnc := hs[5] & hs[4];
+ if (hs[2] == 'F'H) {
+ mnc := mnc & hs[2];
+ }
+}
+
template (value) BSSMAP_FIELD_CellIdentification_CGI ts_BSSMAP_CI_CGI(GsmMcc mcc, GsmMnc mnc, GsmLac lac, GsmCellId ci) := {
mcc_mnc := f_enc_mcc_mnc(mcc, mnc),
lac := int2oct(lac, 2),
@@ -1737,14 +1761,17 @@ modifies ts_BSSAP_BSSMAP := {
}
}
-template PDU_BSSAP tr_BSSMAP_CommonId(template hexstring imsi_digits)
+template PDU_BSSAP tr_BSSMAP_CommonId(template hexstring imsi_digits,
+ template BSSAMAP_IE_LastUsedEUTRANPLMNId lastUsedEUTRANPLMNId := *)
modifies tr_BSSAP_BSSMAP := {
pdu := {
bssmap := {
commonID := {
messageType := '2F'O,
iMSI := tr_BSSMAP_Imsi(imsi_digits),
- sNAAccessInformation := *
+ sNAAccessInformation := *,
+ selectedPLMNId := *,
+ lastUsedEUTRANPLMNId := lastUsedEUTRANPLMNId
}
}
}
diff --git a/msc/BSC_ConnectionHandler.ttcn b/msc/BSC_ConnectionHandler.ttcn
index 30adb03f..8ca8264c 100644
--- a/msc/BSC_ConnectionHandler.ttcn
+++ b/msc/BSC_ConnectionHandler.ttcn
@@ -106,7 +106,8 @@ type record BSC_ConnHdlrPars {
boolean ran_is_geran,
boolean use_osmux,
boolean use_ipv6,
- boolean verify_cell_id
+ boolean verify_cell_id,
+ OCT3 common_id_last_eutran_plmn optional
};
/* get a one-octet bitmaks of supported algorithms based on Classmark information */
@@ -524,7 +525,8 @@ function f_mm_imei_early() runs on BSC_ConnHdlr
function f_expect_common_id() runs on BSC_ConnHdlr
{
if (g_pars.ran_is_geran) {
- BSSAP.receive(tr_BSSMAP_CommonId(g_pars.imsi));
+ BSSAP.receive(tr_BSSMAP_CommonId(g_pars.imsi,
+ f_tr_BSSMAP_LastUsedEUTRANPLMNId(g_pars.common_id_last_eutran_plmn)));
} else {
BSSAP.receive(tr_RANAP_CommonId(imsi_hex2oct(g_pars.imsi)));
}
diff --git a/msc/MSC_Tests.ttcn b/msc/MSC_Tests.ttcn
index 83256259..0fdc3761 100644
--- a/msc/MSC_Tests.ttcn
+++ b/msc/MSC_Tests.ttcn
@@ -16,6 +16,7 @@ friend module MSC_Tests_Iu;
import from General_Types all;
import from Osmocom_Types all;
+import from GSM_Types all;
import from M3UA_Types all;
import from M3UA_Emulation all;
@@ -400,7 +401,8 @@ runs on MTC_CT return BSC_ConnHdlrPars {
ran_is_geran := ran_is_geran,
use_osmux := use_osmux,
use_ipv6 := false,
- verify_cell_id := verify_cell_id
+ verify_cell_id := verify_cell_id,
+ common_id_last_eutran_plmn := omit
};
if (not ran_is_geran) {
pars.use_umts_aka := true;
@@ -4536,13 +4538,19 @@ function f_sgs_perform_lu() runs on BSC_ConnHdlr {
var PDU_SGsAP lua;
var PDU_SGsAP mm_info;
var octetstring mm_info_dtap;
+ var GsmMcc mcc;
+ var GsmMnc mnc;
+ var template (omit) TrackingAreaIdentityValue tai := omit;
/* tell GSUP dispatcher to send this IMSI to us */
f_create_gsup_expect(hex2str(g_pars.imsi));
-
+ if (g_pars.common_id_last_eutran_plmn != omit) {
+ f_dec_mcc_mnc(g_pars.common_id_last_eutran_plmn, mcc, mnc);
+ tai := ts_SGsAP_TAI(mcc, mnc, 555);
+ }
lur := valueof(ts_SGsAP_LU_REQ(g_pars.imsi, mme_name, IMSI_attach,
ts_SGsAP_LAI('901'H, '70'H, 2342),
- ts_SGsAP_TAI('901'H, '70'H, 555)));
+ tai));
/* Old LAI, if MS sends it */
/* TMSI status, if MS has no valid TMSI */
/* IMEISV, if it supports "automatic device detection" */
@@ -4602,6 +4610,7 @@ testcase TC_sgsap_lu() runs on MTC_CT {
var BSC_ConnHdlr vc_conn;
f_init(1, true);
pars := f_init_pars(11811, true);
+ pars.common_id_last_eutran_plmn := f_enc_mcc_mnc('901'H, '70'H);
vc_conn := f_start_handler_with_pars(refers(f_tc_sgsap_lu), pars);
vc_conn.done;
}
@@ -4729,6 +4738,7 @@ testcase TC_sgsap_expl_imsi_det_eps() runs on MTC_CT {
var BSC_ConnHdlr vc_conn;
f_init(1, true);
pars := f_init_pars(11814, true);
+ pars.common_id_last_eutran_plmn := f_enc_mcc_mnc('901'H, '70'H);
vc_conn := f_start_handler_with_pars(refers(f_tc_sgsap_expl_imsi_det_eps), pars);
vc_conn.done;
}
@@ -4753,6 +4763,7 @@ testcase TC_sgsap_impl_imsi_det_eps() runs on MTC_CT {
var BSC_ConnHdlr vc_conn;
f_init(1, true);
pars := f_init_pars(11814, true);
+ pars.common_id_last_eutran_plmn := f_enc_mcc_mnc('901'H, '70'H);
vc_conn := f_start_handler_with_pars(refers(f_tc_sgsap_impl_imsi_det_eps), pars);
vc_conn.done;
}
@@ -4780,6 +4791,7 @@ testcase TC_sgsap_expl_imsi_det_noneps() runs on MTC_CT {
var BSC_ConnHdlr vc_conn;
f_init(1, true);
pars := f_init_pars(11815, true);
+ pars.common_id_last_eutran_plmn := f_enc_mcc_mnc('901'H, '70'H);
vc_conn := f_start_handler_with_pars(refers(f_tc_sgsap_expl_imsi_det_noneps), pars);
vc_conn.done;
}
@@ -4807,6 +4819,7 @@ testcase TC_sgsap_impl_imsi_det_noneps() runs on MTC_CT {
var BSC_ConnHdlr vc_conn;
f_init(1, true);
pars := f_init_pars(11815, true);
+ pars.common_id_last_eutran_plmn := f_enc_mcc_mnc('901'H, '70'H);
vc_conn := f_start_handler_with_pars(refers(f_tc_sgsap_impl_imsi_det_noneps), pars);
vc_conn.done;
}
@@ -4858,6 +4871,7 @@ testcase TC_sgsap_paging_rej() runs on MTC_CT {
var BSC_ConnHdlr vc_conn;
f_init(1, true);
pars := f_init_pars(11816, true);
+ pars.common_id_last_eutran_plmn := f_enc_mcc_mnc('901'H, '70'H);
vc_conn := f_start_handler_with_pars(refers(f_tc_sgsap_paging_rej), pars);
vc_conn.done;
}
@@ -4907,6 +4921,7 @@ testcase TC_sgsap_paging_subscr_rej() runs on MTC_CT {
var BSC_ConnHdlr vc_conn;
f_init(1, true);
pars := f_init_pars(11817, true);
+ pars.common_id_last_eutran_plmn := f_enc_mcc_mnc('901'H, '70'H);
vc_conn := f_start_handler_with_pars(refers(f_tc_sgsap_paging_subscr_rej), pars);
vc_conn.done;
}
@@ -4951,6 +4966,7 @@ testcase TC_sgsap_paging_ue_unr() runs on MTC_CT {
var BSC_ConnHdlr vc_conn;
f_init(1, true);
pars := f_init_pars(11818, true);
+ pars.common_id_last_eutran_plmn := f_enc_mcc_mnc('901'H, '70'H);
vc_conn := f_start_handler_with_pars(refers(f_tc_sgsap_paging_ue_unr), pars);
vc_conn.done;
}
@@ -5010,6 +5026,7 @@ testcase TC_sgsap_paging_and_nothing() runs on MTC_CT {
var BSC_ConnHdlr vc_conn;
f_init(1, true);
pars := f_init_pars(11819, true);
+ pars.common_id_last_eutran_plmn := f_enc_mcc_mnc('901'H, '70'H);
vc_conn := f_start_handler_with_pars(refers(f_tc_sgsap_paging_and_nothing), pars);
vc_conn.done;
}
@@ -5068,6 +5085,7 @@ testcase TC_sgsap_paging_and_lu() runs on MTC_CT {
var BSC_ConnHdlr vc_conn;
f_init(1, true);
pars := f_init_pars(11820, true);
+ pars.common_id_last_eutran_plmn := f_enc_mcc_mnc('901'H, '70'H);
vc_conn := f_start_handler_with_pars(refers(f_tc_sgsap_paging_and_lu), pars);
vc_conn.done;
}
@@ -5276,6 +5294,7 @@ testcase TC_sgsap_mt_sms() runs on MTC_CT {
var BSC_ConnHdlr vc_conn;
f_init(1, true);
pars := f_init_pars(11823, true);
+ pars.common_id_last_eutran_plmn := f_enc_mcc_mnc('901'H, '70'H);
vc_conn := f_start_handler_with_pars(refers(f_tc_sgsap_mt_sms), pars);
vc_conn.done;
}
@@ -5306,6 +5325,7 @@ testcase TC_sgsap_mo_sms() runs on MTC_CT {
var BSC_ConnHdlr vc_conn;
f_init(1, true);
pars := f_init_pars(11824, true);
+ pars.common_id_last_eutran_plmn := f_enc_mcc_mnc('901'H, '70'H);
vc_conn := f_start_handler_with_pars(refers(f_tc_sgsap_mo_sms), pars);
vc_conn.done;
}
@@ -5369,6 +5389,7 @@ testcase TC_sgsap_mt_sms_and_nothing() runs on MTC_CT {
var BSC_ConnHdlr vc_conn;
f_init(1, true);
pars := f_init_pars(11825, true);
+ pars.common_id_last_eutran_plmn := f_enc_mcc_mnc('901'H, '70'H);
vc_conn := f_start_handler_with_pars(refers(f_tc_sgsap_mt_sms_and_nothing), pars);
vc_conn.done;
}
@@ -5429,6 +5450,7 @@ testcase TC_sgsap_mt_sms_and_reject() runs on MTC_CT {
var BSC_ConnHdlr vc_conn;
f_init(1, true);
pars := f_init_pars(11826, true);
+ pars.common_id_last_eutran_plmn := f_enc_mcc_mnc('901'H, '70'H);
vc_conn := f_start_handler_with_pars(refers(f_tc_sgsap_mt_sms_and_reject), pars);
vc_conn.done;
}
@@ -5445,6 +5467,7 @@ private function f_mt_lu_and_csfb_call(charstring id, BSC_ConnHdlrPars pars, boo
if (bssmap_lu) {
f_perform_lu();
}
+ pars.common_id_last_eutran_plmn := f_enc_mcc_mnc('901'H, '70'H);
f_sgs_perform_lu();
f_sleep(1.0);