<p>Neels Hofmeyr has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/13617">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">msc: add inter-BSC and inter-MSC Handover tests<br><br>Change-Id: I7d76c982ad4e198534fa488609c41e8892b268ab<br>---<br>M library/BSSMAP_Emulation.ttcn<br>M library/BSSMAP_Templates.ttcn<br>M library/GSUP_Types.ttcn<br>M library/L3_Templates.ttcn<br>M msc/BSC_ConnectionHandler.ttcn<br>M msc/MSC_Tests.ttcn<br>6 files changed, 1,024 insertions(+), 112 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/17/13617/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/library/BSSMAP_Emulation.ttcn b/library/BSSMAP_Emulation.ttcn</span><br><span>index 55ce2fb..2be3b70 100644</span><br><span>--- a/library/BSSMAP_Emulation.ttcn</span><br><span>+++ b/library/BSSMAP_Emulation.ttcn</span><br><span>@@ -121,6 +121,7 @@</span><br><span> MgcpCommand, MgcpResponse;</span><br><span> } with { extension "internal" };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+type uint2_t N_Sd_Array[4];</span><br><span> </span><br><span> /* represents a single BSSAP connection over SCCP */</span><br><span> type record ConnectionData {</span><br><span>@@ -132,7 +133,7 @@</span><br><span> /* CIC that has been used for voice of this channel (BSC side) */</span><br><span> integer cic optional,</span><br><span> /* array of N(SD) values for MO DTAP messages, indexed by discriminator */</span><br><span style="color: hsl(0, 100%, 40%);">- uint2_t n_sd[4]</span><br><span style="color: hsl(120, 100%, 40%);">+ N_Sd_Array n_sd</span><br><span> }</span><br><span> </span><br><span> type record ImsiMapping {</span><br><span>@@ -432,30 +433,53 @@</span><br><span> </span><br><span> template BIT4 t_ML3_DISC_CC_MM_SS := ('0011'B, '0101'B, '1011'B);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* patch N(SD) into enc_l3, according to 24.007 11.2.3.2 */</span><br><span style="color: hsl(0, 100%, 40%);">-function f_ML3_patch_seq(inout ConnectionData cd, in PDU_ML3_MS_NW dtap, inout octetstring enc_l3) {</span><br><span style="color: hsl(120, 100%, 40%);">+function f_next_n_sd(inout N_Sd_Array n_sd, in integer n_sd_idx) return uint2_t {</span><br><span> var uint2_t seq_nr;</span><br><span style="color: hsl(0, 100%, 40%);">- if (ischosen(dtap.msgs.cc) or ischosen(dtap.msgs.mm) or ischosen(dtap.msgs.ss)) {</span><br><span style="color: hsl(0, 100%, 40%);">- seq_nr := cd.n_sd[0];</span><br><span style="color: hsl(0, 100%, 40%);">- cd.n_sd[0] := (cd.n_sd[0] + 1) mod 4;</span><br><span style="color: hsl(0, 100%, 40%);">- } else if (ischosen(dtap.msgs.gcc)) {</span><br><span style="color: hsl(0, 100%, 40%);">- seq_nr := cd.n_sd[1];</span><br><span style="color: hsl(0, 100%, 40%);">- cd.n_sd[1] := (cd.n_sd[1] + 1) mod 2;</span><br><span style="color: hsl(0, 100%, 40%);">- } else if (ischosen(dtap.msgs.bcc)) {</span><br><span style="color: hsl(0, 100%, 40%);">- seq_nr := cd.n_sd[2];</span><br><span style="color: hsl(0, 100%, 40%);">- cd.n_sd[2] := (cd.n_sd[2] + 1) mod 2;</span><br><span style="color: hsl(0, 100%, 40%);">- } else if (ischosen(dtap.msgs.loc)) {</span><br><span style="color: hsl(0, 100%, 40%);">- seq_nr := cd.n_sd[3];</span><br><span style="color: hsl(0, 100%, 40%);">- cd.n_sd[3] := (cd.n_sd[3] + 1) mod 2;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (n_sd_idx == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ seq_nr := n_sd[0];</span><br><span style="color: hsl(120, 100%, 40%);">+ n_sd[0] := (n_sd[0] + 1) mod 4;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (n_sd_idx >= 1 and n_sd_idx <= 3) {</span><br><span style="color: hsl(120, 100%, 40%);">+ seq_nr := n_sd[n_sd_idx];</span><br><span style="color: hsl(120, 100%, 40%);">+ n_sd[n_sd_idx] := (n_sd[n_sd_idx] + 1) mod 2;</span><br><span> } else {</span><br><span> /* no sequence number to patch */</span><br><span style="color: hsl(0, 100%, 40%);">- return;</span><br><span style="color: hsl(120, 100%, 40%);">+ seq_nr := 0;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+ return seq_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* patch N(SD) into enc_l3, according to 24.007 11.2.3.2 */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_ML3_patch_seq_nr(in uint2_t seq_nr, inout octetstring enc_l3) {</span><br><span> log("patching N(SD)=", seq_nr, " into dtap ", enc_l3);</span><br><span> enc_l3[1] := (enc_l3[1] and4b '3f'O) or4b bit2oct(int2bit(seq_nr, 8) << 6);</span><br><span> log("patched enc_l3: ", enc_l3);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+function f_ML3_n_sd_idx(in PDU_ML3_MS_NW dtap) return integer {</span><br><span style="color: hsl(120, 100%, 40%);">+ var uint2_t seq_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ischosen(dtap.msgs.cc) or ischosen(dtap.msgs.mm) or ischosen(dtap.msgs.ss)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (ischosen(dtap.msgs.gcc)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (ischosen(dtap.msgs.bcc)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return 2;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (ischosen(dtap.msgs.loc)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return 3;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ /* no sequence number to patch */</span><br><span style="color: hsl(120, 100%, 40%);">+ return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* patch N(SD) into enc_l3, according to 24.007 11.2.3.2 */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_ML3_patch_seq(inout ConnectionData cd, in PDU_ML3_MS_NW dtap, inout octetstring enc_l3) {</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer n_sd_idx := f_ML3_n_sd_idx(dtap);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (n_sd_idx < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ var uint2_t seq_nr := f_next_n_sd(cd.n_sd, n_sd_idx);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ML3_patch_seq_nr(seq_nr, enc_l3);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> private function f_bssap_l3_is_rr(PDU_BSSAP bssap) return boolean {</span><br><span> var template octetstring l3 := f_bssap_extract_l3(bssap);</span><br><span> if (not isvalue(l3)) {</span><br><span>@@ -551,6 +575,8 @@</span><br><span> var octetstring l3_info;</span><br><span> var hexstring imsi;</span><br><span> var OCT4 tmsi;</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer targetPointCode;</span><br><span style="color: hsl(120, 100%, 40%);">+ var N_Sd_Array last_n_sd;</span><br><span> </span><br><span> alt {</span><br><span> /* SCCP -> Client: UNIT-DATA (connectionless SCCP) from a BSC */</span><br><span>@@ -663,6 +689,18 @@</span><br><span> BSSAP.send(ts_BSSAP_DATA_req(ConnectionTable[idx].sccp_conn_id, bssap));</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ [] PROC.getcall(BSSMAPEM_last_n_sd:{?,-}) -> param(vc_hdlr) {</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer idx := f_idx_by_comp(vc_hdlr);</span><br><span style="color: hsl(120, 100%, 40%);">+ last_n_sd := ConnectionTable[idx].n_sd;</span><br><span style="color: hsl(120, 100%, 40%);">+ PROC.reply(BSSMAPEM_last_n_sd:{vc_hdlr, last_n_sd}) to vc_hdlr;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ [] PROC.getcall(BSSMAPEM_continue_after_n_sd:{?,?}) -> param(last_n_sd, vc_hdlr) {</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer idx := f_idx_by_comp(vc_hdlr);</span><br><span style="color: hsl(120, 100%, 40%);">+ ConnectionTable[idx].n_sd := last_n_sd;</span><br><span style="color: hsl(120, 100%, 40%);">+ PROC.reply(BSSMAPEM_continue_after_n_sd:{last_n_sd, vc_hdlr}) to vc_hdlr;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> [not g_bssmap_ops.role_ms] CLIENT.receive(PDU_DTAP_MT:?) -> value dtap_mt sender vc_conn {</span><br><span> var integer conn_id := f_conn_id_by_comp(vc_conn);</span><br><span> /* convert from decoded DTAP to encoded DTAP */</span><br><span>@@ -717,6 +755,11 @@</span><br><span> PROC.reply(BSSMAPEM_register:{l3_info, vc_hdlr}) to vc_hdlr;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ [] PROC.getcall(BSSMAPEM_register_handoverRequest:{?,?}) -> param(targetPointCode, vc_hdlr) {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_create_expect(omit, vc_hdlr, targetPointCode);</span><br><span style="color: hsl(120, 100%, 40%);">+ PROC.reply(BSSMAPEM_register_handoverRequest:{targetPointCode, vc_hdlr}) to vc_hdlr;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> [] PROC.getcall(BSSMAPEM_register_imsi:{?,?,?}) -> param(imsi, tmsi, vc_hdlr) {</span><br><span> f_create_imsi(imsi, tmsi, vc_hdlr);</span><br><span> PROC.reply(BSSMAPEM_register_imsi:{imsi, tmsi, vc_hdlr}) to vc_hdlr;</span><br><span>@@ -741,18 +784,27 @@</span><br><span> type record ExpectData {</span><br><span> /* L3 payload based on which we can match it */</span><br><span> octetstring l3_payload optional,</span><br><span style="color: hsl(120, 100%, 40%);">+ integer handoverRequestPointCode optional,</span><br><span> /* component reference for this connection */</span><br><span> BSSAP_ConnHdlr vc_conn</span><br><span> }</span><br><span> </span><br><span> /* procedure based port to register for incoming connections */</span><br><span> signature BSSMAPEM_register(in octetstring l3, in BSSAP_ConnHdlr hdlr);</span><br><span style="color: hsl(120, 100%, 40%);">+signature BSSMAPEM_register_handoverRequest(in integer targetPointCode, in BSSAP_ConnHdlr hdlr);</span><br><span> </span><br><span> /* procedure based port to register for incoming IMSI/TMSI */</span><br><span> signature BSSMAPEM_register_imsi(in hexstring imsi, in OCT4 tmsi, in BSSAP_ConnHdlr hdlr);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* If DTAP happens across other channels (e.g. GSUP), provide manual advancing of the n_sd sequence number */</span><br><span style="color: hsl(120, 100%, 40%);">+signature BSSMAPEM_last_n_sd(in BSSAP_ConnHdlr hdlr, out N_Sd_Array last_n_sd);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Update conn's n_sd sequence nr after the connection was taken over from elsewhere */</span><br><span style="color: hsl(120, 100%, 40%);">+signature BSSMAPEM_continue_after_n_sd(N_Sd_Array last_n_sd, in BSSAP_ConnHdlr hdlr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> type port BSSMAPEM_PROC_PT procedure {</span><br><span style="color: hsl(0, 100%, 40%);">- inout BSSMAPEM_register, BSSMAPEM_register_imsi;</span><br><span style="color: hsl(120, 100%, 40%);">+ inout BSSMAPEM_register, BSSMAPEM_register_handoverRequest, BSSMAPEM_register_imsi, BSSMAPEM_last_n_sd,</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSMAPEM_continue_after_n_sd;</span><br><span> } with { extension "internal" };</span><br><span> </span><br><span> /* CreateCallback that can be used as create_cb and will use the expectation table */</span><br><span>@@ -760,16 +812,35 @@</span><br><span> runs on BSSMAP_Emulation_CT return BSSAP_ConnHdlr {</span><br><span> var BSSAP_ConnHdlr ret := null;</span><br><span> var octetstring l3_info;</span><br><span style="color: hsl(120, 100%, 40%);">+ var boolean handoverRequest := false;</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer handoverRequestPointCode;</span><br><span> var integer i;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (not ischosen(conn_ind.userData.pdu.bssmap.completeLayer3Information)) {</span><br><span style="color: hsl(0, 100%, 40%);">- setverdict(fail, "N-CONNECT.ind with L3 != COMPLETE L3");</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ischosen(conn_ind.userData.pdu.bssmap.completeLayer3Information)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ l3_info := conn_ind.userData.pdu.bssmap.completeLayer3Information.layer3Information.layer3info;</span><br><span style="color: hsl(120, 100%, 40%);">+ log("ExpectedCreateCallback completeLayer3Information");</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (ischosen(conn_ind.userData.pdu.bssmap.handoverRequest)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ handoverRequest := true;</span><br><span style="color: hsl(120, 100%, 40%);">+ handoverRequestPointCode := bit2int(conn_ind.calledAddress.signPointCode);</span><br><span style="color: hsl(120, 100%, 40%);">+ log("ExpectedCreateCallback handoverRequest ", handoverRequestPointCode);</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(fail, "N-CONNECT.ind with L3 != COMPLETE L3 nor a Handover Request");</span><br><span> mtc.stop;</span><br><span> return ret;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- l3_info := conn_ind.userData.pdu.bssmap.completeLayer3Information.layer3Information.layer3info;</span><br><span> </span><br><span> for (i := 0; i < sizeof(ExpectTable); i:= i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (handoverRequest) {</span><br><span style="color: hsl(120, 100%, 40%);">+ log("ExpectTable[", i, "].handoverRequestPointCode = ", ExpectTable[i].handoverRequestPointCode,</span><br><span style="color: hsl(120, 100%, 40%);">+ " ==? ", handoverRequestPointCode);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ExpectTable[i].handoverRequestPointCode == handoverRequestPointCode) {</span><br><span style="color: hsl(120, 100%, 40%);">+ ret := ExpectTable[i].vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+ log("Found Expect[", i, "] for handoverRequest handled at ", ret);</span><br><span style="color: hsl(120, 100%, 40%);">+ return ret;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ continue;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> if (not ispresent(ExpectTable[i].l3_payload)) {</span><br><span> continue;</span><br><span> }</span><br><span>@@ -788,14 +859,26 @@</span><br><span> return ret;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-private function f_create_expect(octetstring l3, BSSAP_ConnHdlr hdlr)</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_create_expect(template octetstring l3, BSSAP_ConnHdlr hdlr,</span><br><span style="color: hsl(120, 100%, 40%);">+ template integer handoverRequestPointCode := omit)</span><br><span> runs on BSSMAP_Emulation_CT {</span><br><span> var integer i;</span><br><span style="color: hsl(120, 100%, 40%);">+ log("f_create_expect(l3 := ", l3, ", handoverRequest := ", handoverRequestPointCode);</span><br><span> for (i := 0; i < sizeof(ExpectTable); i := i+1) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (not ispresent(ExpectTable[i].l3_payload)) {</span><br><span style="color: hsl(0, 100%, 40%);">- ExpectTable[i].l3_payload := l3;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (not ispresent(ExpectTable[i].l3_payload)</span><br><span style="color: hsl(120, 100%, 40%);">+ and not ispresent(ExpectTable[i].handoverRequestPointCode)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ispresent(l3)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ ExpectTable[i].l3_payload := valueof(l3);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ispresent(handoverRequestPointCode)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ ExpectTable[i].handoverRequestPointCode := valueof(handoverRequestPointCode);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> ExpectTable[i].vc_conn := hdlr;</span><br><span style="color: hsl(0, 100%, 40%);">- log("Created Expect[", i, "] for ", l3, " to be handled at ", hdlr);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ispresent(handoverRequestPointCode)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ log("Created Expect[", i, "] for handoverRequest to be handled at ", hdlr);</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ log("Created Expect[", i, "] for ", l3, " to be handled at ", hdlr);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> return;</span><br><span> }</span><br><span> }</span><br><span>@@ -821,6 +904,7 @@</span><br><span> runs on BSSMAP_Emulation_CT {</span><br><span> for (var integer i := 0; i < sizeof(ExpectTable); i := i+1) {</span><br><span> ExpectTable[i].l3_payload := omit;</span><br><span style="color: hsl(120, 100%, 40%);">+ ExpectTable[i].handoverRequestPointCode := omit;</span><br><span> }</span><br><span> }</span><br><span> </span><br><span>diff --git a/library/BSSMAP_Templates.ttcn b/library/BSSMAP_Templates.ttcn</span><br><span>index 4df39d4..b7230cd 100644</span><br><span>--- a/library/BSSMAP_Templates.ttcn</span><br><span>+++ b/library/BSSMAP_Templates.ttcn</span><br><span>@@ -307,7 +307,7 @@</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-template BSSMAP_IE_CellIdentifierList ts_BSSMAP_IE_CidList(BSSMAP_FIELD_CellIdentificationList cid_list) := {</span><br><span style="color: hsl(120, 100%, 40%);">+template BSSMAP_IE_CellIdentifierList ts_BSSMAP_IE_CidList(template BSSMAP_FIELD_CellIdentificationList cid_list) := {</span><br><span> elementIdentifier := '1A'O,</span><br><span> lengthIndicator := 0, /* overwritten */</span><br><span> cellIdentifierDiscriminator := '0000'B, /* overwritten */</span><br><span>@@ -315,31 +315,6 @@</span><br><span> cellIdentificationList := cid_list</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-template PDU_BSSAP ts_BSSMAP_HandoReq(BssmapCause cause, BSSMAP_FIELD_CellIdentificationList cid_list)</span><br><span style="color: hsl(0, 100%, 40%);">-modifies ts_BSSAP_BSSMAP := {</span><br><span style="color: hsl(0, 100%, 40%);">- pdu := {</span><br><span style="color: hsl(0, 100%, 40%);">- bssmap := {</span><br><span style="color: hsl(0, 100%, 40%);">- handoverRequired := {</span><br><span style="color: hsl(0, 100%, 40%);">- messageType := '11'O,</span><br><span style="color: hsl(0, 100%, 40%);">- cause := ts_BSSMAP_IE_Cause(cause),</span><br><span style="color: hsl(0, 100%, 40%);">- responseRequest := omit,</span><br><span style="color: hsl(0, 100%, 40%);">- cellIdentifierList := ts_BSSMAP_IE_CidList(cid_list),</span><br><span style="color: hsl(0, 100%, 40%);">- circuitPoolList := omit,</span><br><span style="color: hsl(0, 100%, 40%);">- currentChannelType1 := omit,</span><br><span style="color: hsl(0, 100%, 40%);">- speechVersion := omit,</span><br><span style="color: hsl(0, 100%, 40%);">- queueingIndicator := omit,</span><br><span style="color: hsl(0, 100%, 40%);">- oldToNewBSSInfo := omit,</span><br><span style="color: hsl(0, 100%, 40%);">- sourceToTargetRNCTransparentInfo := omit,</span><br><span style="color: hsl(0, 100%, 40%);">- sourceToTargetRNCTransparentInfoCDMA := omit,</span><br><span style="color: hsl(0, 100%, 40%);">- gERANClassmark := omit,</span><br><span style="color: hsl(0, 100%, 40%);">- talkerPriority := omit,</span><br><span style="color: hsl(0, 100%, 40%);">- speechCodec := omit,</span><br><span style="color: hsl(0, 100%, 40%);">- cSG_Identifier := omit</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> const OCT1 ChRate_ANY := '00'O;</span><br><span> const OCT1 ChRate_TCHF := '08'O;</span><br><span> const OCT1 ChRate_TCHH := '09'O;</span><br><span>@@ -703,6 +678,33 @@</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+template PDU_BSSAP ts_BSSMAP_HandoverRequired(BssmapCause cause,</span><br><span style="color: hsl(120, 100%, 40%);">+ template BSSMAP_FIELD_CellIdentificationList cid_list)</span><br><span style="color: hsl(120, 100%, 40%);">+modifies ts_BSSAP_BSSMAP := {</span><br><span style="color: hsl(120, 100%, 40%);">+ pdu := {</span><br><span style="color: hsl(120, 100%, 40%);">+ bssmap := {</span><br><span style="color: hsl(120, 100%, 40%);">+ handoverRequired := {</span><br><span style="color: hsl(120, 100%, 40%);">+ messageType := '11'O,</span><br><span style="color: hsl(120, 100%, 40%);">+ cause := ts_BSSMAP_IE_Cause(cause),</span><br><span style="color: hsl(120, 100%, 40%);">+ responseRequest := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ cellIdentifierList := ts_BSSMAP_IE_CidList(cid_list),</span><br><span style="color: hsl(120, 100%, 40%);">+ circuitPoolList := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ currentChannelType1 := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ speechVersion := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ queueingIndicator := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ oldToNewBSSInfo := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ sourceToTargetRNCTransparentInfo := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ sourceToTargetRNCTransparentInfoCDMA := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ gERANClassmark := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ talkerPriority := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ speechCodec := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ cSG_Identifier := omit</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> template PDU_BSSAP tr_BSSMAP_HandoverRequired modifies tr_BSSAP_BSSMAP := {</span><br><span> pdu := {</span><br><span> bssmap := {</span><br><span>@@ -713,6 +715,38 @@</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+template PDU_BSSAP tr_BSSMAP_HandoverRequiredReject modifies tr_BSSAP_BSSMAP := {</span><br><span style="color: hsl(120, 100%, 40%);">+ pdu := {</span><br><span style="color: hsl(120, 100%, 40%);">+ bssmap := {</span><br><span style="color: hsl(120, 100%, 40%);">+ handoverRequiredReject := {</span><br><span style="color: hsl(120, 100%, 40%);">+ messageType := '1A'O</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template PDU_BSSAP tr_BSSMAP_HandoverCommand</span><br><span style="color: hsl(120, 100%, 40%);">+modifies tr_BSSAP_BSSMAP := {</span><br><span style="color: hsl(120, 100%, 40%);">+ pdu := {</span><br><span style="color: hsl(120, 100%, 40%);">+ bssmap := {</span><br><span style="color: hsl(120, 100%, 40%);">+ handoverCommand := {</span><br><span style="color: hsl(120, 100%, 40%);">+ messageType := '13'O</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template PDU_BSSAP tr_BSSMAP_HandoverSucceeded</span><br><span style="color: hsl(120, 100%, 40%);">+modifies tr_BSSAP_BSSMAP := {</span><br><span style="color: hsl(120, 100%, 40%);">+ pdu := {</span><br><span style="color: hsl(120, 100%, 40%);">+ bssmap := {</span><br><span style="color: hsl(120, 100%, 40%);">+ handoverSucceeded := {</span><br><span style="color: hsl(120, 100%, 40%);">+ messageType := '15'O</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> template (value) PDU_BSSAP ts_BSSMAP_HandoverCommand(octetstring layer3info)</span><br><span> modifies ts_BSSAP_BSSMAP := {</span><br><span> pdu := {</span><br><span>@@ -751,6 +785,16 @@</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+template PDU_BSSAP tr_BSSMAP_HandoverRequest modifies tr_BSSAP_BSSMAP := {</span><br><span style="color: hsl(120, 100%, 40%);">+ pdu := {</span><br><span style="color: hsl(120, 100%, 40%);">+ bssmap := {</span><br><span style="color: hsl(120, 100%, 40%);">+ handoverRequest := {</span><br><span style="color: hsl(120, 100%, 40%);">+ messageType := '10'O</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> template PDU_BSSAP ts_BSSMAP_HandoverRequest(</span><br><span> template BSSMAP_IE_CircuitIdentityCode cic := omit,</span><br><span> template BSSMAP_IE_AoIP_TransportLayerAddress aoip_tla := omit,</span><br><span>@@ -826,6 +870,41 @@</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+template PDU_BSSAP ts_BSSMAP_HandoverRequestAcknowledge(</span><br><span style="color: hsl(120, 100%, 40%);">+ template octetstring layer3info,</span><br><span style="color: hsl(120, 100%, 40%);">+ template LIN1 layer3infoLength,</span><br><span style="color: hsl(120, 100%, 40%);">+ template BSSMAP_IE_AoIP_TransportLayerAddress aoIPTransportLayer := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ template BSSMAP_IE_SpeechCodec speechCodec := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ template BSSMAP_IE_ChosenChannel chosenChannel := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ template BSSMAP_IE_ChosenEncryptionAlgorithm chosenEncryptionAlgorithm := omit)</span><br><span style="color: hsl(120, 100%, 40%);">+modifies ts_BSSAP_BSSMAP := {</span><br><span style="color: hsl(120, 100%, 40%);">+ pdu := {</span><br><span style="color: hsl(120, 100%, 40%);">+ bssmap := {</span><br><span style="color: hsl(120, 100%, 40%);">+ handoverRequestAck := {</span><br><span style="color: hsl(120, 100%, 40%);">+ messageType := '12'O,</span><br><span style="color: hsl(120, 100%, 40%);">+ layer3Information := {</span><br><span style="color: hsl(120, 100%, 40%);">+ elementIdentifier := '17'O,</span><br><span style="color: hsl(120, 100%, 40%);">+ lengthIndicator := layer3infoLength,</span><br><span style="color: hsl(120, 100%, 40%);">+ layer3info := layer3info</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ chosenChannel := chosenChannel,</span><br><span style="color: hsl(120, 100%, 40%);">+ chosenEncryptionAlgorithm := chosenEncryptionAlgorithm,</span><br><span style="color: hsl(120, 100%, 40%);">+ circuitPool := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ speechVersion := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ circuitIdentityCode := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ lSAIdentifier := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ newBSSToOldBSSInfo := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ interSystemInformation := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ talkerPriority := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ aoIPTransportLayer := aoIPTransportLayer,</span><br><span style="color: hsl(120, 100%, 40%);">+ codecList := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ speechCodec := speechCodec,</span><br><span style="color: hsl(120, 100%, 40%);">+ lCLS_bSS_Status := omit</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> template PDU_BSSAP tr_BSSMAP_HandoverDetect</span><br><span> modifies tr_BSSAP_BSSMAP := {</span><br><span> pdu := {</span><br><span>@@ -838,6 +917,18 @@</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+template PDU_BSSAP ts_BSSMAP_HandoverDetect</span><br><span style="color: hsl(120, 100%, 40%);">+modifies ts_BSSAP_BSSMAP := {</span><br><span style="color: hsl(120, 100%, 40%);">+ pdu := {</span><br><span style="color: hsl(120, 100%, 40%);">+ bssmap := {</span><br><span style="color: hsl(120, 100%, 40%);">+ handoverDetect := {</span><br><span style="color: hsl(120, 100%, 40%);">+ messageType := '1B'O,</span><br><span style="color: hsl(120, 100%, 40%);">+ talkerPriority := omit</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> template PDU_BSSAP tr_BSSMAP_HandoverComplete</span><br><span> modifies tr_BSSAP_BSSMAP := {</span><br><span> pdu := {</span><br><span>@@ -856,6 +947,24 @@</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+template PDU_BSSAP ts_BSSMAP_HandoverComplete</span><br><span style="color: hsl(120, 100%, 40%);">+modifies ts_BSSAP_BSSMAP := {</span><br><span style="color: hsl(120, 100%, 40%);">+ pdu := {</span><br><span style="color: hsl(120, 100%, 40%);">+ bssmap := {</span><br><span style="color: hsl(120, 100%, 40%);">+ handoverComplete := {</span><br><span style="color: hsl(120, 100%, 40%);">+ messageType := '14'O,</span><br><span style="color: hsl(120, 100%, 40%);">+ rR_Cause := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ talkerPriority := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ speechCodec := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ codecList := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ chosenEncryptionAlgorithm := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ chosenChannel := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ lCLS_BSS_Status := omit</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> template PDU_BSSAP tr_BSSMAP_HandoverPerformed</span><br><span> modifies tr_BSSAP_BSSMAP := {</span><br><span> pdu := {</span><br><span>@@ -975,7 +1084,7 @@</span><br><span> messageType := '52'O,</span><br><span> iMSI := ts_BSSMAP_Imsi(imsi_digits),</span><br><span> tMSI := f_tmsi_or_omit(tmsi),</span><br><span style="color: hsl(0, 100%, 40%);">- cellIdentifierList := ts_BSSMAP_IE_CidList(valueof(cid_list)),</span><br><span style="color: hsl(120, 100%, 40%);">+ cellIdentifierList := ts_BSSMAP_IE_CidList(cid_list),</span><br><span> channelNeeded := chneed,</span><br><span> eMLPP_Priority := omit,</span><br><span> pagingInformation := omit /* only VGCS/VBS flag */</span><br><span>diff --git a/library/GSUP_Types.ttcn b/library/GSUP_Types.ttcn</span><br><span>index c024d37..3a0d4e5 100644</span><br><span>--- a/library/GSUP_Types.ttcn</span><br><span>+++ b/library/GSUP_Types.ttcn</span><br><span>@@ -55,7 +55,16 @@</span><br><span> OSMO_GSUP_SM_ALERT_RSN_IE ('46'O),</span><br><span> </span><br><span> OSMO_GSUP_IMEI_IE ('50'O),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_GSUP_IMEI_RESULT_IE ('51'O)</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_IMEI_RESULT_IE ('51'O),</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_KIND_IE ('0a'O),</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_SOURCE_NAME_IE ('60'O),</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_DESTINATION_NAME_IE ('61'O),</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_AN_APDU_IE ('62'O),</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_CAUSE_RR_IE ('63'O),</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_CAUSE_BSSAP_IE ('64'O),</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_CAUSE_SM_IE ('65'O)</span><br><span> } with { variant "FIELDLENGTH(8)" };</span><br><span> </span><br><span> type enumerated GSUP_MessageType {</span><br><span>@@ -103,7 +112,27 @@</span><br><span> </span><br><span> OSMO_GSUP_MSGT_CHECK_IMEI_REQUEST ('00110000'B),</span><br><span> OSMO_GSUP_MSGT_CHECK_IMEI_ERROR ('00110001'B),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_GSUP_MSGT_CHECK_IMEI_RESULT ('00110010'B)</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_MSGT_CHECK_IMEI_RESULT ('00110010'B),</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_REQUEST ('00110100'B),</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_ERROR ('00110101'B),</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_RESULT ('00110110'B),</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_MSGT_E_PREPARE_SUBSEQUENT_HANDOVER_REQUEST ('00111000'B),</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_MSGT_E_PREPARE_SUBSEQUENT_HANDOVER_ERROR ('00111001'B),</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_MSGT_E_PREPARE_SUBSEQUENT_HANDOVER_RESULT ('00111010'B),</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_MSGT_E_SEND_END_SIGNAL_REQUEST ('00111100'B),</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_MSGT_E_SEND_END_SIGNAL_ERROR ('00111101'B),</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_MSGT_E_SEND_END_SIGNAL_RESULT ('00111110'B),</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_MSGT_E_PROCESS_ACCESS_SIGNALLING_REQUEST ('01000000'B),</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_MSGT_E_FORWARD_ACCESS_SIGNALLING_REQUEST ('01000100'B),</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_MSGT_E_CLOSE ('01000111'B),</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_MSGT_E_ABORT ('01001011'B),</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_MSGT_E_ROUTING_ERROR ('01001110'B)</span><br><span> } with { variant "FIELDLENGTH(8)" };</span><br><span> </span><br><span> type enumerated GSUP_CancelType {</span><br><span>@@ -128,6 +157,14 @@</span><br><span> OSMO_GSUP_SESSION_STATE_END (3)</span><br><span> } with { variant "FIELDLENGTH(8)" };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+type enumerated GSUP_Kind {</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_KIND_UNSET (0),</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_KIND_SUBSCRIBER_MANAGEMENT (1),</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_KIND_SMS (2),</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_KIND_USSD (3),</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_KIND_INTER_MSC (4)</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant "FIELDLENGTH(8)" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> type record GSUP_MSISDN {</span><br><span> uint8_t len,</span><br><span> hexstring digits optional</span><br><span>@@ -138,6 +175,16 @@</span><br><span> hexstring digits optional</span><br><span> } with { variant (len) "LENGTHTO(digits)" };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+type enumerated GSUP_AN_PROTO {</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_AN_PROTO_48006 (1),</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_AN_PROTO_25413 (2)</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant "FIELDLENGTH(8)" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type record GSUP_AN_APDU {</span><br><span style="color: hsl(120, 100%, 40%);">+ GSUP_AN_PROTO proto,</span><br><span style="color: hsl(120, 100%, 40%);">+ octetstring pdu</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> type record GSUP_IE {</span><br><span> GSUP_IEI tag,</span><br><span> uint8_t len,</span><br><span>@@ -175,6 +222,13 @@</span><br><span> sm_alert_rsn, tag = OSMO_GSUP_SM_ALERT_RSN_IE;</span><br><span> imei, tag = OSMO_GSUP_IMEI_IE;</span><br><span> imei_result, tag = OSMO_GSUP_IMEI_RESULT_IE;</span><br><span style="color: hsl(120, 100%, 40%);">+ kind, tag = OSMO_GSUP_KIND_IE;</span><br><span style="color: hsl(120, 100%, 40%);">+ source_name, tag = OSMO_GSUP_SOURCE_NAME_IE;</span><br><span style="color: hsl(120, 100%, 40%);">+ destination_name, tag = OSMO_GSUP_DESTINATION_NAME_IE;</span><br><span style="color: hsl(120, 100%, 40%);">+ an_apdu, tag = OSMO_GSUP_AN_APDU_IE;</span><br><span style="color: hsl(120, 100%, 40%);">+ cause_rr, tag = OSMO_GSUP_CAUSE_RR_IE;</span><br><span style="color: hsl(120, 100%, 40%);">+ cause_bssap, tag = OSMO_GSUP_CAUSE_BSSAP_IE;</span><br><span style="color: hsl(120, 100%, 40%);">+ cause_sm, tag = OSMO_GSUP_CAUSE_SM_IE;</span><br><span> )"</span><br><span> };</span><br><span> </span><br><span>@@ -219,7 +273,18 @@</span><br><span> GSUP_SM_ALERT_RSN_Type sm_alert_rsn,</span><br><span> </span><br><span> GSUP_IMEI imei,</span><br><span style="color: hsl(0, 100%, 40%);">- GSUP_IMEIResult imei_result</span><br><span style="color: hsl(120, 100%, 40%);">+ GSUP_IMEIResult imei_result,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ GSUP_Kind kind,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ octetstring source_name,</span><br><span style="color: hsl(120, 100%, 40%);">+ octetstring destination_name,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ GSUP_AN_APDU an_apdu,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ OCT1 cause_rr,</span><br><span style="color: hsl(120, 100%, 40%);">+ OCT1 cause_bssap,</span><br><span style="color: hsl(120, 100%, 40%);">+ OCT1 cause_sm</span><br><span> };</span><br><span> </span><br><span> type record GSUP_PDU {</span><br><span>@@ -930,6 +995,70 @@</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+template GSUP_IE tr_GSUP_IE_Kind(template GSUP_Kind val) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ tag := OSMO_GSUP_KIND_IE,</span><br><span style="color: hsl(120, 100%, 40%);">+ len := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ val := {</span><br><span style="color: hsl(120, 100%, 40%);">+ kind := val</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) GSUP_IE ts_GSUP_IE_Kind(GSUP_Kind val) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ tag := OSMO_GSUP_KIND_IE,</span><br><span style="color: hsl(120, 100%, 40%);">+ len := 0, /* overwritten */</span><br><span style="color: hsl(120, 100%, 40%);">+ val := {</span><br><span style="color: hsl(120, 100%, 40%);">+ kind := val</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template GSUP_IE tr_GSUP_IE_Source_Name(template octetstring name) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ tag := OSMO_GSUP_SOURCE_NAME_IE,</span><br><span style="color: hsl(120, 100%, 40%);">+ len := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ val := {</span><br><span style="color: hsl(120, 100%, 40%);">+ source_name := name</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) GSUP_IE ts_GSUP_IE_Source_Name(octetstring name) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ tag := OSMO_GSUP_SOURCE_NAME_IE,</span><br><span style="color: hsl(120, 100%, 40%);">+ len := 0, /* overwritten */</span><br><span style="color: hsl(120, 100%, 40%);">+ val := {</span><br><span style="color: hsl(120, 100%, 40%);">+ source_name := name</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template GSUP_IE tr_GSUP_IE_Destination_Name(template octetstring name) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ tag := OSMO_GSUP_DESTINATION_NAME_IE,</span><br><span style="color: hsl(120, 100%, 40%);">+ len := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ val := {</span><br><span style="color: hsl(120, 100%, 40%);">+ destination_name := name</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) GSUP_IE ts_GSUP_IE_Destination_Name(octetstring name) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ tag := OSMO_GSUP_DESTINATION_NAME_IE,</span><br><span style="color: hsl(120, 100%, 40%);">+ len := 0, /* overwritten */</span><br><span style="color: hsl(120, 100%, 40%);">+ val := {</span><br><span style="color: hsl(120, 100%, 40%);">+ destination_name := name</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template GSUP_IE tr_GSUP_IE_AN_APDU(template GSUP_AN_APDU an_apdu) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ tag := OSMO_GSUP_AN_APDU_IE,</span><br><span style="color: hsl(120, 100%, 40%);">+ len := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ val := {</span><br><span style="color: hsl(120, 100%, 40%);">+ an_apdu := an_apdu</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) GSUP_IE ts_GSUP_IE_AN_APDU(GSUP_AN_APDU an_apdu) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ tag := OSMO_GSUP_AN_APDU_IE,</span><br><span style="color: hsl(120, 100%, 40%);">+ len := 0, /* overwritten */</span><br><span style="color: hsl(120, 100%, 40%);">+ val := {</span><br><span style="color: hsl(120, 100%, 40%);">+ an_apdu := an_apdu</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> private function f_gen_ts_ss_ies(</span><br><span> hexstring imsi,</span><br><span> OCT4 sid,</span><br><span>@@ -962,14 +1091,20 @@</span><br><span> tr_GSUP_IE_SessionId(sid),</span><br><span> tr_GSUP_IE_SessionState(state)</span><br><span> };</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer last_idx := 3;</span><br><span> </span><br><span> /* Optional SS payload */</span><br><span> if (istemplatekind(ss, "*")) {</span><br><span> ies[3] := *;</span><br><span style="color: hsl(120, 100%, 40%);">+ last_idx := last_idx + 1;</span><br><span> } else if (not istemplatekind(ss, "omit")) {</span><br><span> ies[3] := tr_GSUP_IE_SSInfo(ss);</span><br><span style="color: hsl(120, 100%, 40%);">+ last_idx := last_idx + 1;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ ies[last_idx] := tr_GSUP_IE_Kind(OSMO_GSUP_KIND_USSD);</span><br><span style="color: hsl(120, 100%, 40%);">+ last_idx := last_idx + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> return ies;</span><br><span> }</span><br><span> </span><br><span>@@ -1036,7 +1171,8 @@</span><br><span> tr_GSUP_IE_IMSI(imsi),</span><br><span> tr_GSUP_IE_Cause(cause),</span><br><span> tr_GSUP_IE_SessionId(sid),</span><br><span style="color: hsl(0, 100%, 40%);">- tr_GSUP_IE_SessionState(state)</span><br><span style="color: hsl(120, 100%, 40%);">+ tr_GSUP_IE_SessionState(state),</span><br><span style="color: hsl(120, 100%, 40%);">+ tr_GSUP_IE_Kind(OSMO_GSUP_KIND_SMS)</span><br><span> }</span><br><span> );</span><br><span> </span><br><span>@@ -1069,7 +1205,8 @@</span><br><span> tr_GSUP_IE_SM_RP_MR(sm_rp_mr),</span><br><span> tr_GSUP_IE_SM_RP_DA(sm_rp_da),</span><br><span> tr_GSUP_IE_SM_RP_OA(sm_rp_oa),</span><br><span style="color: hsl(0, 100%, 40%);">- tr_GSUP_IE_SM_RP_UI(sm_rp_ui)</span><br><span style="color: hsl(120, 100%, 40%);">+ tr_GSUP_IE_SM_RP_UI(sm_rp_ui),</span><br><span style="color: hsl(120, 100%, 40%);">+ tr_GSUP_IE_Kind(OSMO_GSUP_KIND_SMS)</span><br><span> }</span><br><span> );</span><br><span> </span><br><span>@@ -1090,7 +1227,8 @@</span><br><span> OSMO_GSUP_MSGT_MO_FORWARD_SM_RESULT,</span><br><span> {</span><br><span> tr_GSUP_IE_IMSI(imsi),</span><br><span style="color: hsl(0, 100%, 40%);">- tr_GSUP_IE_SM_RP_MR(sm_rp_mr)</span><br><span style="color: hsl(120, 100%, 40%);">+ tr_GSUP_IE_SM_RP_MR(sm_rp_mr),</span><br><span style="color: hsl(120, 100%, 40%);">+ tr_GSUP_IE_Kind(OSMO_GSUP_KIND_SMS)</span><br><span> }</span><br><span> );</span><br><span> </span><br><span>@@ -1115,7 +1253,8 @@</span><br><span> {</span><br><span> tr_GSUP_IE_IMSI(imsi),</span><br><span> tr_GSUP_IE_SM_RP_MR(sm_rp_mr),</span><br><span style="color: hsl(0, 100%, 40%);">- tr_GSUP_IE_SM_RP_CAUSE(sm_rp_cause)</span><br><span style="color: hsl(120, 100%, 40%);">+ tr_GSUP_IE_SM_RP_CAUSE(sm_rp_cause),</span><br><span style="color: hsl(120, 100%, 40%);">+ tr_GSUP_IE_Kind(OSMO_GSUP_KIND_SMS)</span><br><span> }</span><br><span> );</span><br><span> </span><br><span>@@ -1162,7 +1301,8 @@</span><br><span> tr_GSUP_IE_SM_RP_DA(sm_rp_da),</span><br><span> tr_GSUP_IE_SM_RP_OA(sm_rp_oa),</span><br><span> tr_GSUP_IE_SM_RP_UI(sm_rp_ui),</span><br><span style="color: hsl(0, 100%, 40%);">- tr_GSUP_IE_SM_RP_MMS(sm_rp_mms)</span><br><span style="color: hsl(120, 100%, 40%);">+ tr_GSUP_IE_SM_RP_MMS(sm_rp_mms),</span><br><span style="color: hsl(120, 100%, 40%);">+ tr_GSUP_IE_Kind(OSMO_GSUP_KIND_SMS)</span><br><span> }</span><br><span> );</span><br><span> </span><br><span>@@ -1183,7 +1323,8 @@</span><br><span> OSMO_GSUP_MSGT_MT_FORWARD_SM_RESULT,</span><br><span> {</span><br><span> tr_GSUP_IE_IMSI(imsi),</span><br><span style="color: hsl(0, 100%, 40%);">- tr_GSUP_IE_SM_RP_MR(sm_rp_mr)</span><br><span style="color: hsl(120, 100%, 40%);">+ tr_GSUP_IE_SM_RP_MR(sm_rp_mr),</span><br><span style="color: hsl(120, 100%, 40%);">+ tr_GSUP_IE_Kind(OSMO_GSUP_KIND_SMS)</span><br><span> }</span><br><span> );</span><br><span> </span><br><span>@@ -1208,7 +1349,8 @@</span><br><span> {</span><br><span> tr_GSUP_IE_IMSI(imsi),</span><br><span> tr_GSUP_IE_SM_RP_MR(sm_rp_mr),</span><br><span style="color: hsl(0, 100%, 40%);">- tr_GSUP_IE_SM_RP_CAUSE(sm_rp_cause)</span><br><span style="color: hsl(120, 100%, 40%);">+ tr_GSUP_IE_SM_RP_CAUSE(sm_rp_cause),</span><br><span style="color: hsl(120, 100%, 40%);">+ tr_GSUP_IE_Kind(OSMO_GSUP_KIND_SMS)</span><br><span> }</span><br><span> );</span><br><span> </span><br><span>@@ -1233,7 +1375,8 @@</span><br><span> {</span><br><span> tr_GSUP_IE_IMSI(imsi),</span><br><span> tr_GSUP_IE_SM_RP_MR(sm_rp_mr),</span><br><span style="color: hsl(0, 100%, 40%);">- tr_GSUP_IE_SM_ALERT_RSN(sm_alert_rsn)</span><br><span style="color: hsl(120, 100%, 40%);">+ tr_GSUP_IE_SM_ALERT_RSN(sm_alert_rsn),</span><br><span style="color: hsl(120, 100%, 40%);">+ tr_GSUP_IE_Kind(OSMO_GSUP_KIND_SMS)</span><br><span> }</span><br><span> );</span><br><span> </span><br><span>@@ -1254,7 +1397,8 @@</span><br><span> OSMO_GSUP_MSGT_READY_FOR_SM_RESULT,</span><br><span> {</span><br><span> tr_GSUP_IE_IMSI(imsi),</span><br><span style="color: hsl(0, 100%, 40%);">- tr_GSUP_IE_SM_RP_MR(sm_rp_mr)</span><br><span style="color: hsl(120, 100%, 40%);">+ tr_GSUP_IE_SM_RP_MR(sm_rp_mr),</span><br><span style="color: hsl(120, 100%, 40%);">+ tr_GSUP_IE_Kind(OSMO_GSUP_KIND_SMS)</span><br><span> }</span><br><span> );</span><br><span> </span><br><span>@@ -1279,7 +1423,8 @@</span><br><span> {</span><br><span> tr_GSUP_IE_IMSI(imsi),</span><br><span> tr_GSUP_IE_SM_RP_MR(sm_rp_mr),</span><br><span style="color: hsl(0, 100%, 40%);">- tr_GSUP_IE_SM_RP_CAUSE(sm_rp_cause)</span><br><span style="color: hsl(120, 100%, 40%);">+ tr_GSUP_IE_SM_RP_CAUSE(sm_rp_cause),</span><br><span style="color: hsl(120, 100%, 40%);">+ tr_GSUP_IE_Kind(OSMO_GSUP_KIND_SMS)</span><br><span> }</span><br><span> );</span><br><span> </span><br><span>@@ -1293,5 +1438,79 @@</span><br><span> return false;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+template GSUP_AN_APDU t_GSUP_AN_APDU(</span><br><span style="color: hsl(120, 100%, 40%);">+ template GSUP_AN_PROTO an_proto := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ template octetstring pdu := ?</span><br><span style="color: hsl(120, 100%, 40%);">+) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ proto := an_proto,</span><br><span style="color: hsl(120, 100%, 40%);">+ pdu := pdu</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template GSUP_PDU tr_GSUP_E_AN_APDU(</span><br><span style="color: hsl(120, 100%, 40%);">+ template GSUP_MessageType msgt,</span><br><span style="color: hsl(120, 100%, 40%);">+ template hexstring imsi := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ template octetstring source_name := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ template octetstring destination_name := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ template GSUP_AN_APDU an_apdu := ?</span><br><span style="color: hsl(120, 100%, 40%);">+) := tr_GSUP(</span><br><span style="color: hsl(120, 100%, 40%);">+ msgt,</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ tr_GSUP_IE_IMSI(imsi),</span><br><span style="color: hsl(120, 100%, 40%);">+ tr_GSUP_IE_Kind(OSMO_GSUP_KIND_INTER_MSC),</span><br><span style="color: hsl(120, 100%, 40%);">+ tr_GSUP_IE_Source_Name(source_name),</span><br><span style="color: hsl(120, 100%, 40%);">+ tr_GSUP_IE_Destination_Name(destination_name),</span><br><span style="color: hsl(120, 100%, 40%);">+ tr_GSUP_IE_AN_APDU(an_apdu)</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template GSUP_PDU tr_GSUP_E_NO_PDU(</span><br><span style="color: hsl(120, 100%, 40%);">+ template GSUP_MessageType msgt,</span><br><span style="color: hsl(120, 100%, 40%);">+ template hexstring imsi := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ template octetstring source_name := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ template octetstring destination_name := ?</span><br><span style="color: hsl(120, 100%, 40%);">+) := tr_GSUP(</span><br><span style="color: hsl(120, 100%, 40%);">+ msgt,</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ tr_GSUP_IE_IMSI(imsi),</span><br><span style="color: hsl(120, 100%, 40%);">+ tr_GSUP_IE_Kind(OSMO_GSUP_KIND_INTER_MSC),</span><br><span style="color: hsl(120, 100%, 40%);">+ tr_GSUP_IE_Source_Name(source_name),</span><br><span style="color: hsl(120, 100%, 40%);">+ tr_GSUP_IE_Destination_Name(destination_name)</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) GSUP_PDU ts_GSUP_E_AN_APDU(</span><br><span style="color: hsl(120, 100%, 40%);">+ GSUP_MessageType msgt,</span><br><span style="color: hsl(120, 100%, 40%);">+ hexstring imsi,</span><br><span style="color: hsl(120, 100%, 40%);">+ octetstring source_name,</span><br><span style="color: hsl(120, 100%, 40%);">+ octetstring destination_name,</span><br><span style="color: hsl(120, 100%, 40%);">+ GSUP_AN_APDU an_apdu</span><br><span style="color: hsl(120, 100%, 40%);">+) := ts_GSUP(</span><br><span style="color: hsl(120, 100%, 40%);">+ msgt,</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ valueof(ts_GSUP_IE_IMSI(imsi)),</span><br><span style="color: hsl(120, 100%, 40%);">+ valueof(ts_GSUP_IE_Kind(OSMO_GSUP_KIND_INTER_MSC)),</span><br><span style="color: hsl(120, 100%, 40%);">+ valueof(ts_GSUP_IE_Source_Name(source_name)),</span><br><span style="color: hsl(120, 100%, 40%);">+ valueof(ts_GSUP_IE_Destination_Name(destination_name)),</span><br><span style="color: hsl(120, 100%, 40%);">+ valueof(ts_GSUP_IE_AN_APDU(an_apdu))</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) GSUP_PDU ts_GSUP_E_PrepareHandoverResult(</span><br><span style="color: hsl(120, 100%, 40%);">+ hexstring imsi,</span><br><span style="color: hsl(120, 100%, 40%);">+ hexstring msisdn,</span><br><span style="color: hsl(120, 100%, 40%);">+ octetstring source_name,</span><br><span style="color: hsl(120, 100%, 40%);">+ octetstring destination_name,</span><br><span style="color: hsl(120, 100%, 40%);">+ GSUP_AN_APDU an_apdu</span><br><span style="color: hsl(120, 100%, 40%);">+) := ts_GSUP(</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_RESULT,</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ valueof(ts_GSUP_IE_IMSI(imsi)),</span><br><span style="color: hsl(120, 100%, 40%);">+ valueof(ts_GSUP_IE_MSISDN(msisdn)),</span><br><span style="color: hsl(120, 100%, 40%);">+ valueof(ts_GSUP_IE_Kind(OSMO_GSUP_KIND_INTER_MSC)),</span><br><span style="color: hsl(120, 100%, 40%);">+ valueof(ts_GSUP_IE_Source_Name(source_name)),</span><br><span style="color: hsl(120, 100%, 40%);">+ valueof(ts_GSUP_IE_Destination_Name(destination_name)),</span><br><span style="color: hsl(120, 100%, 40%);">+ valueof(ts_GSUP_IE_AN_APDU(an_apdu))</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+);</span><br><span> </span><br><span> } with { encode "RAW"; variant "FIELDORDER(msb)" }</span><br><span>diff --git a/library/L3_Templates.ttcn b/library/L3_Templates.ttcn</span><br><span>index 6099303..cf6d64c 100644</span><br><span>--- a/library/L3_Templates.ttcn</span><br><span>+++ b/library/L3_Templates.ttcn</span><br><span>@@ -582,6 +582,59 @@</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+template PDU_ML3_NW_MS tr_RR_HandoverCommand := {</span><br><span style="color: hsl(120, 100%, 40%);">+ discriminator := '0110'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ tiOrSkip := {</span><br><span style="color: hsl(120, 100%, 40%);">+ skipIndicator := '0000'B</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ msgs := {</span><br><span style="color: hsl(120, 100%, 40%);">+ rrm := {</span><br><span style="color: hsl(120, 100%, 40%);">+ handoverCommand := {</span><br><span style="color: hsl(120, 100%, 40%);">+ messageType := '00101011'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ cellDescription := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ channelDescription2 := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ handoverReference := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ powerCommandAndAccesstype := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ synchronizationIndication := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ frequencyShortListAfterTime := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ frequencyListAfterTime := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ cellChannelDescription := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ multislotAllocation := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ modeOfChannelSet1 := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ modeOfChannelSet2 := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ modeOfChannelSet3 := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ modeOfChannelSet4 := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ modeOfChannelSet5 := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ modeOfChannelSet6 := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ modeOfChannelSet7 := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ modeOfChannelSet8 := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ descrOf2ndCh_at := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ modeOf2ndChannel := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ frequencyChannelSequence_at := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ mobileAllocation_at := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ startingTime := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ timeDifference := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ timingAdvance := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ frequencyShortListBeforeTime := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ frequencyListBeforeTime := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ descrOf1stCh_bt := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ descrOf2ndCh_bt := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ frequencyChannelSequence_bt := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ mobileAllocation_bt := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ cipherModeSetting := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ vGCS_TargetModeIndication := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ multiRateConfiguration := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ dynamicARFCN_Mapping := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ vGCS_Ciphering_Parameters := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ dedicatedServiceInformation := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ pLMNIndex := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ extendedTSCSet_afterTime := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ extendedTSCSet_beforeTime := *</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> function ts_CM3_TLV(template (omit) OCTN cm3) return template MobileStationClassmark3_TLV {</span><br><span> if (not isvalue(cm3)) {</span><br><span> return omit;</span><br><span>@@ -1271,12 +1324,12 @@</span><br><span> }</span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-template (value) PDU_ML3_MS_NW ts_ML3_MO_CC_REL_COMPL(integer tid) := {</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) PDU_ML3_MS_NW ts_ML3_MO_CC_REL_COMPL(integer tid, BIT1 tid_remote := '0'B) := {</span><br><span> discriminator := '0011'B,</span><br><span> tiOrSkip := {</span><br><span> transactionId := {</span><br><span> tio := int2bit(tid, 3),</span><br><span style="color: hsl(0, 100%, 40%);">- tiFlag := '0'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ tiFlag := tid_remote,</span><br><span> tIExtension := omit</span><br><span> }</span><br><span> },</span><br><span>diff --git a/msc/BSC_ConnectionHandler.ttcn b/msc/BSC_ConnectionHandler.ttcn</span><br><span>index 833c31f..25444b2 100644</span><br><span>--- a/msc/BSC_ConnectionHandler.ttcn</span><br><span>+++ b/msc/BSC_ConnectionHandler.ttcn</span><br><span>@@ -411,6 +411,8 @@</span><br><span> /* CC related parameters */</span><br><span> hexstring called_party, /* whom are we calling */</span><br><span> integer transaction_id optional, /* which TS 04.08 CC transaction ID to use */</span><br><span style="color: hsl(120, 100%, 40%);">+ boolean mo_call, /* For a MO call, the transaction_id was allocated by the MS,</span><br><span style="color: hsl(120, 100%, 40%);">+ important to set the TI flag properly */</span><br><span> BearerCapability_TLV bearer_cap, /* which bearer capabilities to claim */</span><br><span> boolean emergency, /* is this an emergency call? */</span><br><span> </span><br><span>@@ -441,6 +443,7 @@</span><br><span> template (value) CallParameters t_CallParams(hexstring called, integer tid) := {</span><br><span> called_party := called,</span><br><span> transaction_id := tid,</span><br><span style="color: hsl(120, 100%, 40%);">+ mo_call := false,</span><br><span> bearer_cap := valueof(ts_Bcap_voice),</span><br><span> emergency := false,</span><br><span> mncc_callref := omit,</span><br><span>@@ -455,6 +458,7 @@</span><br><span> mgw_rtp_port_mss := 11000,</span><br><span> rtp_payload_type := 98,</span><br><span> rtp_sdp_format := "AMR/8000",</span><br><span style="color: hsl(120, 100%, 40%);">+ mgw_drop_dlcx := false,</span><br><span> mgcp_call_id := omit,</span><br><span> mgcp_ep := omit,</span><br><span> mgcp_connection_id_bss := '0'H,//</span><br><span>@@ -774,17 +778,24 @@</span><br><span> MNCC.send(ts_MNCC_DISC_req(cpars.mncc_callref, valueof(ts_MNCC_cause(23))));</span><br><span> BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_DISC(cpars.transaction_id)));</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ log("f_call_hangup 1: rx DTAP CC DISC");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> if (release_by_ms) {</span><br><span style="color: hsl(0, 100%, 40%);">- log("f_call_hangup 1a");</span><br><span style="color: hsl(120, 100%, 40%);">+ var BIT1 tid_remote := '1'B;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (cpars.mo_call) {</span><br><span style="color: hsl(120, 100%, 40%);">+ tid_remote := '0'B;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> /* B-side (MS) Release of call */</span><br><span style="color: hsl(0, 100%, 40%);">- BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_RELEASE(cpars.transaction_id, '1'B, '0000000'B)));</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_RELEASE(cpars.transaction_id, tid_remote, '0000000'B)));</span><br><span> MNCC.receive(tr_MNCC_REL_ind(cpars.mncc_callref));</span><br><span style="color: hsl(120, 100%, 40%);">+ log("f_call_hangup 2: rx MNCC REL ind");</span><br><span> BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_REL_COMPL(cpars.transaction_id)));</span><br><span style="color: hsl(120, 100%, 40%);">+ log("f_call_hangup 3: rx DTAP CC REL COMPL");</span><br><span> } else {</span><br><span style="color: hsl(0, 100%, 40%);">- log("f_call_hangup 1b");</span><br><span> /* A-side (PLMN) Release of call */</span><br><span> MNCC.send(ts_MNCC_REL_req(cpars.mncc_callref, valueof(ts_MNCC_cause(42))));</span><br><span> BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_RELEASE(cpars.transaction_id)));</span><br><span style="color: hsl(120, 100%, 40%);">+ log("f_call_hangup 4: rx DTAP CC RELEASE");</span><br><span> BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_REL_COMPL(cpars.transaction_id)));</span><br><span> }</span><br><span> </span><br><span>@@ -795,13 +806,13 @@</span><br><span> /* clearing of radio channel */</span><br><span> interleave {</span><br><span> [] BSSAP.receive(t_clear) {</span><br><span style="color: hsl(0, 100%, 40%);">- log("f_call_hangup 2");</span><br><span style="color: hsl(120, 100%, 40%);">+ log("f_call_hangup 5: rx BSSAP Clear Command");</span><br><span> BSSAP.send(ts_BSSMAP_ClearComplete);</span><br><span> BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);</span><br><span style="color: hsl(0, 100%, 40%);">- log("f_call_hangup 3");</span><br><span style="color: hsl(120, 100%, 40%);">+ log("f_call_hangup 6: rx SCCP DISC");</span><br><span> }</span><br><span> [] MGCP.receive(tr_DLCX(?)) -> value mgcp_cmd {</span><br><span style="color: hsl(0, 100%, 40%);">- log("f_call_hangup 4");</span><br><span style="color: hsl(120, 100%, 40%);">+ log("f_call_hangup 7: rx MGCP DLCX");</span><br><span> if (respond_to_dlcx) {</span><br><span> MGCP.send(ts_DLCX_ACK2(mgcp_cmd.line.trans_id));</span><br><span> }</span><br><span>@@ -813,18 +824,17 @@</span><br><span> * Unless the first DLCX did not contain a CI, in which case it was a wildcard DLCX for both. */</span><br><span> if (dlcx_contained_ci) {</span><br><span> MGCP.receive(tr_DLCX(?)) -> value mgcp_cmd {</span><br><span style="color: hsl(0, 100%, 40%);">- log("f_call_hangup 5");</span><br><span style="color: hsl(0, 100%, 40%);">- if (respond_to_dlcx) {</span><br><span style="color: hsl(0, 100%, 40%);">- MGCP.send(ts_DLCX_ACK2(mgcp_cmd.line.trans_id));</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ log("f_call_hangup 8: rx MGCP DLCX");</span><br><span style="color: hsl(120, 100%, 40%);">+ if (respond_to_dlcx) {</span><br><span style="color: hsl(120, 100%, 40%);">+ MGCP.send(ts_DLCX_ACK2(mgcp_cmd.line.trans_id));</span><br><span> }</span><br><span> }</span><br><span> }</span><br><span> </span><br><span> f_create_mgcp_delete_ep(cpars.mgcp_ep);</span><br><span style="color: hsl(120, 100%, 40%);">+ log("f_call_hangup 9: done");</span><br><span> </span><br><span> deactivate(mdcx);</span><br><span style="color: hsl(0, 100%, 40%);">- log("f_call_hangup DONE");</span><br><span> </span><br><span> setverdict(pass);</span><br><span> }</span><br><span>@@ -943,6 +953,27 @@</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+function f_create_bssmap_exp_handoverRequest(integer targetPointCode) runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP_PROC.call(BSSMAPEM_register_handoverRequest:{targetPointCode, self}) {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BSSAP_PROC.getreply(BSSMAPEM_register_handoverRequest:{?, ?}) {};</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+function f_bssmap_last_n_sd() runs on BSC_ConnHdlr return N_Sd_Array {</span><br><span style="color: hsl(120, 100%, 40%);">+ var N_Sd_Array last_n_sd;</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP_PROC.call(BSSMAPEM_last_n_sd:{self, -}) {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BSSAP_PROC.getreply(BSSMAPEM_last_n_sd:{self, ?}) -> param(last_n_sd) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return last_n_sd;</span><br><span style="color: hsl(120, 100%, 40%);">+ };</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+function f_bssmap_continue_after_n_sd(N_Sd_Array last_n_sd) runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP_PROC.call(BSSMAPEM_continue_after_n_sd:{last_n_sd, self}) {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BSSAP_PROC.getreply(BSSMAPEM_continue_after_n_sd:{last_n_sd, self});</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> type record SmsParametersTp {</span><br><span> OCT1 msg_ref,</span><br><span> TP_DA da,</span><br><span>diff --git a/msc/MSC_Tests.ttcn b/msc/MSC_Tests.ttcn</span><br><span>index bf3c60e..957ea67 100644</span><br><span>--- a/msc/MSC_Tests.ttcn</span><br><span>+++ b/msc/MSC_Tests.ttcn</span><br><span>@@ -154,8 +154,16 @@</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-private altstep as_optional_cc_rel(CallParameters cpars) runs on BSC_ConnHdlr {</span><br><span style="color: hsl(0, 100%, 40%);">- [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_RELEASE(cpars.transaction_id))) { repeat; };</span><br><span style="color: hsl(120, 100%, 40%);">+private altstep as_optional_cc_rel(CallParameters cpars, boolean respond := false) runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_RELEASE(cpars.transaction_id))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (respond) {</span><br><span style="color: hsl(120, 100%, 40%);">+ var BIT1 tid_remote := '1'B;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (cpars.mo_call) {</span><br><span style="color: hsl(120, 100%, 40%);">+ tid_remote := '0'B;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_REL_COMPL(cpars.transaction_id, tid_remote)));</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> </span><br><span> function f_init_smpp(charstring id) runs on MTC_CT {</span><br><span>@@ -457,31 +465,6 @@</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-template PDU_BSSAP ts_BSSMAP_HandoReq(BssmapCause cause, BSSMAP_IE_CellIdentifierList cid_list)</span><br><span style="color: hsl(0, 100%, 40%);">-modifies ts_BSSAP_BSSMAP := {</span><br><span style="color: hsl(0, 100%, 40%);">- pdu := {</span><br><span style="color: hsl(0, 100%, 40%);">- bssmap := {</span><br><span style="color: hsl(0, 100%, 40%);">- handoverRequired := {</span><br><span style="color: hsl(0, 100%, 40%);">- messageType := '11'O,</span><br><span style="color: hsl(0, 100%, 40%);">- cause := ts_BSSMAP_IE_Cause(cause),</span><br><span style="color: hsl(0, 100%, 40%);">- responseRequest := omit,</span><br><span style="color: hsl(0, 100%, 40%);">- cellIdentifierList := cid_list,</span><br><span style="color: hsl(0, 100%, 40%);">- circuitPoolList := omit,</span><br><span style="color: hsl(0, 100%, 40%);">- currentChannelType1 := omit,</span><br><span style="color: hsl(0, 100%, 40%);">- speechVersion := omit,</span><br><span style="color: hsl(0, 100%, 40%);">- queueingIndicator := omit,</span><br><span style="color: hsl(0, 100%, 40%);">- oldToNewBSSInfo := omit,</span><br><span style="color: hsl(0, 100%, 40%);">- sourceToTargetRNCTransparentInfo := omit,</span><br><span style="color: hsl(0, 100%, 40%);">- sourceToTargetRNCTransparentInfoCDMA := omit,</span><br><span style="color: hsl(0, 100%, 40%);">- gERANClassmark := omit,</span><br><span style="color: hsl(0, 100%, 40%);">- talkerPriority := omit,</span><br><span style="color: hsl(0, 100%, 40%);">- speechCodec := omit,</span><br><span style="color: hsl(0, 100%, 40%);">- cSG_Identifier := omit</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> type function void_fn(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr;</span><br><span> </span><br><span> /* FIXME: move into BSC_ConnectionHandler? */</span><br><span>@@ -516,14 +499,14 @@</span><br><span> return pars;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-function f_start_handler_with_pars(void_fn fn, BSC_ConnHdlrPars pars) runs on MTC_CT return BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+function f_start_handler_with_pars(void_fn fn, BSC_ConnHdlrPars pars, integer bssap_idx := 0) runs on MTC_CT return BSC_ConnHdlr {</span><br><span> var BSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(0, 100%, 40%);">- var charstring id := testcasename();</span><br><span style="color: hsl(120, 100%, 40%);">+ var charstring id := testcasename() & int2str(bssap_idx);</span><br><span> </span><br><span> vc_conn := BSC_ConnHdlr.create(id);</span><br><span> /* BSSMAP part / A interface */</span><br><span style="color: hsl(0, 100%, 40%);">- connect(vc_conn:BSSAP, g_bssap[0].vc_BSSMAP:CLIENT);</span><br><span style="color: hsl(0, 100%, 40%);">- connect(vc_conn:BSSAP_PROC, g_bssap[0].vc_BSSMAP:PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+ connect(vc_conn:BSSAP, g_bssap[bssap_idx].vc_BSSMAP:CLIENT);</span><br><span style="color: hsl(120, 100%, 40%);">+ connect(vc_conn:BSSAP_PROC, g_bssap[bssap_idx].vc_BSSMAP:PROC);</span><br><span> /* MNCC part */</span><br><span> connect(vc_conn:MNCC, vc_MNCC:MNCC_CLIENT);</span><br><span> connect(vc_conn:MNCC_PROC, vc_MNCC:MNCC_PROC);</span><br><span>@@ -550,8 +533,9 @@</span><br><span> return vc_conn;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-function f_start_handler(void_fn fn, integer imsi_suffix) runs on MTC_CT return BSC_ConnHdlr {</span><br><span style="color: hsl(0, 100%, 40%);">- return f_start_handler_with_pars(fn, f_init_pars(imsi_suffix));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+function f_start_handler(void_fn fn, integer imsi_suffix, integer bssap_idx := 0) runs on MTC_CT return BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ return f_start_handler_with_pars(fn, f_init_pars(imsi_suffix), bssap_idx);</span><br><span> }</span><br><span> </span><br><span> private function f_tc_lu_imsi_noauth_tmsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {</span><br><span>@@ -4655,6 +4639,434 @@</span><br><span> *</span><br><span> */</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_ho_inter_bsc_unknown_cell(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_handler(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+ var CallParameters cpars := valueof(t_CallParams('12345'H, 0));</span><br><span style="color: hsl(120, 100%, 40%);">+ cpars.bss_rtp_port := 1110;</span><br><span style="color: hsl(120, 100%, 40%);">+ cpars.mgcp_connection_id_bss := '22222'H;</span><br><span style="color: hsl(120, 100%, 40%);">+ cpars.mgcp_connection_id_mss := '33333'H;</span><br><span style="color: hsl(120, 100%, 40%);">+ cpars.mgcp_ep := "rtpbridge/1@mgw";</span><br><span style="color: hsl(120, 100%, 40%);">+ cpars.mo_call := true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_lu();</span><br><span style="color: hsl(120, 100%, 40%);">+ f_mo_call_establish(cpars);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var myBSSMAP_Cause cause_val := GSM0808_CAUSE_BETTER_CELL;</span><br><span style="color: hsl(120, 100%, 40%);">+ var BssmapCause cause := enum2int(cause_val);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var template BSSMAP_FIELD_CellIdentificationList cil;</span><br><span style="color: hsl(120, 100%, 40%);">+ cil := { cIl_LAI := { ts_BSSMAP_CI_LAI('023'H, '42'H, 999) } };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ts_BSSMAP_HandoverRequired(cause, cil));</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.receive(tr_BSSMAP_HandoverRequiredReject);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_call_hangup(cpars, true);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_ho_inter_bsc_unknown_cell() runs on MTC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var BSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn := f_start_handler(refers(f_tc_ho_inter_bsc_unknown_cell), 53);</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn.done;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private altstep as_mgcp_ack_all_mdcx(CallParameters cpars) runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ var MgcpCommand mgcp_cmd;</span><br><span style="color: hsl(120, 100%, 40%);">+ [] MGCP.receive(tr_MDCX) -> value mgcp_cmd {</span><br><span style="color: hsl(120, 100%, 40%);">+ var SDP_Message sdp := valueof(ts_SDP(cpars.mgw_rtp_ip_mss, cpars.mgw_rtp_ip_mss,</span><br><span style="color: hsl(120, 100%, 40%);">+ hex2str(cpars.mgcp_call_id), "42",</span><br><span style="color: hsl(120, 100%, 40%);">+ cpars.mgw_rtp_port_mss,</span><br><span style="color: hsl(120, 100%, 40%);">+ { int2str(cpars.rtp_payload_type) },</span><br><span style="color: hsl(120, 100%, 40%);">+ { valueof(ts_SDP_rtpmap(cpars.rtp_payload_type,</span><br><span style="color: hsl(120, 100%, 40%);">+ cpars.rtp_sdp_format)),</span><br><span style="color: hsl(120, 100%, 40%);">+ valueof(ts_SDP_ptime(20)) }));</span><br><span style="color: hsl(120, 100%, 40%);">+ MGCP.send(ts_MDCX_ACK(mgcp_cmd.line.trans_id, cpars.mgcp_connection_id_mss, sdp));</span><br><span style="color: hsl(120, 100%, 40%);">+ repeat;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_ho_inter_bsc0(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ var CallParameters cpars := valueof(t_CallParams('12345'H, 0));</span><br><span style="color: hsl(120, 100%, 40%);">+ cpars.bss_rtp_port := 1110;</span><br><span style="color: hsl(120, 100%, 40%);">+ cpars.mgcp_connection_id_bss := '22222'H;</span><br><span style="color: hsl(120, 100%, 40%);">+ cpars.mgcp_connection_id_mss := '33333'H;</span><br><span style="color: hsl(120, 100%, 40%);">+ cpars.mgcp_ep := "rtpbridge/1@mgw";</span><br><span style="color: hsl(120, 100%, 40%);">+ cpars.mo_call := true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_handler(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_lu();</span><br><span style="color: hsl(120, 100%, 40%);">+ f_mo_call_establish(cpars);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var default ack_mdcx := activate(as_mgcp_ack_all_mdcx(cpars));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var myBSSMAP_Cause cause_val := GSM0808_CAUSE_BETTER_CELL;</span><br><span style="color: hsl(120, 100%, 40%);">+ var BssmapCause cause := enum2int(cause_val);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var template BSSMAP_FIELD_CellIdentificationList cil;</span><br><span style="color: hsl(120, 100%, 40%);">+ cil := { cIl_LAI := { ts_BSSMAP_CI_LAI('023'H, '42'H, 5) } };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* old BSS sends Handover Required */</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ts_BSSMAP_HandoverRequired(cause, cil));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Now the action goes on in f_tc_ho_inter_bsc1() */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* MSC forwards the RR Handover Command to old BSS */</span><br><span style="color: hsl(120, 100%, 40%);">+ var PDU_BSSAP ho_command;</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.receive(tr_BSSMAP_HandoverCommand) -> value ho_command;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ log("GOT HandoverCommand", ho_command);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.receive(tr_BSSMAP_HandoverSucceeded);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* f_tc_ho_inter_bsc1() completes Handover, then expecting a Clear here. */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_expect_clear();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ log("FIRST inter-BSC Handover done");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* ------------------------ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Ok, that went well, now the other BSC is handovering back here --</span><br><span style="color: hsl(120, 100%, 40%);">+ * from now on this here is the new BSS. */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_create_bssmap_exp_handoverRequest(193);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var PDU_BSSAP ho_request;</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.receive(tr_BSSMAP_HandoverRequest) -> value ho_request;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* new BSS composes a RR Handover Command */</span><br><span style="color: hsl(120, 100%, 40%);">+ var PDU_ML3_NW_MS rr_ho_cmd := valueof(ts_RR_HandoverCommand);</span><br><span style="color: hsl(120, 100%, 40%);">+ var octetstring rr_ho_cmd_enc := enc_PDU_ML3_NW_MS(rr_ho_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+ var BSSMAP_IE_AoIP_TransportLayerAddress tla := valueof(ts_BSSMAP_IE_AoIP_TLA4('01020304'O, 2342));</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ts_BSSMAP_HandoverRequestAcknowledge(rr_ho_cmd_enc, lengthof(rr_ho_cmd_enc),</span><br><span style="color: hsl(120, 100%, 40%);">+ tla, ts_BSSMAP_IE_SpeechCodec({ts_CodecFR})));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Now f_tc_ho_inter_bsc1() expects HandoverCommand */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(0.5);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Notify that the MS is now over here */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ts_BSSMAP_HandoverDetect);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(0.1);</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ts_BSSMAP_HandoverComplete);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(3.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ deactivate(ack_mdcx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var default ccrel := activate(as_optional_cc_rel(cpars, true));</span><br><span style="color: hsl(120, 100%, 40%);">+ f_call_hangup(cpars, true);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ deactivate(ccrel);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_ho_inter_bsc1(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_handler(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_create_bssmap_exp_handoverRequest(194);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var PDU_BSSAP ho_request;</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.receive(tr_BSSMAP_HandoverRequest) -> value ho_request;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* new BSS composes a RR Handover Command */</span><br><span style="color: hsl(120, 100%, 40%);">+ var PDU_ML3_NW_MS rr_ho_cmd := valueof(ts_RR_HandoverCommand);</span><br><span style="color: hsl(120, 100%, 40%);">+ var octetstring rr_ho_cmd_enc := enc_PDU_ML3_NW_MS(rr_ho_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+ var BSSMAP_IE_AoIP_TransportLayerAddress tla := valueof(ts_BSSMAP_IE_AoIP_TLA4('01020304'O, 2342));</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ts_BSSMAP_HandoverRequestAcknowledge(rr_ho_cmd_enc, lengthof(rr_ho_cmd_enc),</span><br><span style="color: hsl(120, 100%, 40%);">+ tla, ts_BSSMAP_IE_SpeechCodec({ts_CodecFR})));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Now f_tc_ho_inter_bsc0() expects HandoverCommand */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(0.5);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Notify that the MS is now over here */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ts_BSSMAP_HandoverDetect);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(0.1);</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ts_BSSMAP_HandoverComplete);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(3.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Now I'd like to f_call_hangup() but we don't know any cpars here. So</span><br><span style="color: hsl(120, 100%, 40%);">+ * ... handover back to the first BSC :P */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var myBSSMAP_Cause cause_val := GSM0808_CAUSE_BETTER_CELL;</span><br><span style="color: hsl(120, 100%, 40%);">+ var BssmapCause cause := enum2int(cause_val);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var template BSSMAP_FIELD_CellIdentificationList cil;</span><br><span style="color: hsl(120, 100%, 40%);">+ cil := { cIl_LAI := { ts_BSSMAP_CI_LAI('262'H, '42'H, 23) } };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* old BSS sends Handover Required */</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ts_BSSMAP_HandoverRequired(cause, cil));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Now the action goes on in f_tc_ho_inter_bsc0() */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* MSC forwards the RR Handover Command to old BSS */</span><br><span style="color: hsl(120, 100%, 40%);">+ var PDU_BSSAP ho_command;</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.receive(tr_BSSMAP_HandoverCommand) -> value ho_command;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ log("GOT HandoverCommand", ho_command);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.receive(tr_BSSMAP_HandoverSucceeded);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* f_tc_ho_inter_bsc1() completes Handover, then expecting a Clear here. */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_expect_clear();</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_ho_inter_bsc() runs on MTC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var BSC_ConnHdlr vc_conn0;</span><br><span style="color: hsl(120, 100%, 40%);">+ var BSC_ConnHdlr vc_conn1;</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init(2);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var BSC_ConnHdlrPars pars0 := f_init_pars(53);</span><br><span style="color: hsl(120, 100%, 40%);">+ var BSC_ConnHdlrPars pars1 := f_init_pars(53);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn0 := f_start_handler_with_pars(refers(f_tc_ho_inter_bsc0), pars0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn1 := f_start_handler_with_pars(refers(f_tc_ho_inter_bsc1), pars1, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn0.done;</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn1.done;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+function f_ML3_patch_seq_nr_MS_NW(in uint2_t seq_nr, inout octetstring enc_l3) {</span><br><span style="color: hsl(120, 100%, 40%);">+ log("MS_NW patching N(SD)=", seq_nr, " into dtap ", enc_l3);</span><br><span style="color: hsl(120, 100%, 40%);">+ enc_l3[2] := (enc_l3[2] and4b '3f'O) or4b bit2oct(int2bit(seq_nr, 8) << 6);</span><br><span style="color: hsl(120, 100%, 40%);">+ log("MS_NW patched enc_l3: ", enc_l3);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_ho_inter_msc_out(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ var CallParameters cpars := valueof(t_CallParams('12345'H, 0));</span><br><span style="color: hsl(120, 100%, 40%);">+ cpars.bss_rtp_port := 1110;</span><br><span style="color: hsl(120, 100%, 40%);">+ cpars.mgcp_connection_id_bss := '22222'H;</span><br><span style="color: hsl(120, 100%, 40%);">+ cpars.mgcp_connection_id_mss := '33333'H;</span><br><span style="color: hsl(120, 100%, 40%);">+ cpars.mgcp_ep := "rtpbridge/1@mgw";</span><br><span style="color: hsl(120, 100%, 40%);">+ cpars.mo_call := true;</span><br><span style="color: hsl(120, 100%, 40%);">+ var hexstring ho_number := f_gen_msisdn(99999);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_handler(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_create_mncc_expect(hex2str(ho_number));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_lu();</span><br><span style="color: hsl(120, 100%, 40%);">+ f_mo_call_establish(cpars);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var default ack_mdcx := activate(as_mgcp_ack_all_mdcx(cpars));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var myBSSMAP_Cause cause_val := GSM0808_CAUSE_BETTER_CELL;</span><br><span style="color: hsl(120, 100%, 40%);">+ var BssmapCause cause := enum2int(cause_val);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var template BSSMAP_FIELD_CellIdentificationList cil;</span><br><span style="color: hsl(120, 100%, 40%);">+ cil := { cIl_LAI := { ts_BSSMAP_CI_LAI('017'H, '017'H, 1) } };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* old BSS sends Handover Required */</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ts_BSSMAP_HandoverRequired(cause, cil));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* The target cell 017-017 LAC 1 is configured to be a remote MSC of name "msc-017-017-1".</span><br><span style="color: hsl(120, 100%, 40%);">+ * This MSC tries to reach the other MSC via GSUP. */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var octetstring remote_msc_name := '6D73632D3031372D3031372D31'O; /* "msc-017-017-1" as octetstring */</span><br><span style="color: hsl(120, 100%, 40%);">+ var GSUP_PDU prep_ho_req;</span><br><span style="color: hsl(120, 100%, 40%);">+ GSUP.receive(tr_GSUP_E_AN_APDU(OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_REQUEST,</span><br><span style="color: hsl(120, 100%, 40%);">+ pars.imsi, destination_name := remote_msc_name)) -> value prep_ho_req;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var GSUP_IeValue source_name_ie;</span><br><span style="color: hsl(120, 100%, 40%);">+ f_gsup_find_ie(prep_ho_req, OSMO_GSUP_SOURCE_NAME_IE, source_name_ie);</span><br><span style="color: hsl(120, 100%, 40%);">+ var octetstring local_msc_name := source_name_ie.source_name;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Remote MSC has figured out its BSC and signals success */</span><br><span style="color: hsl(120, 100%, 40%);">+ var PDU_ML3_NW_MS rr_ho_cmd := valueof(ts_RR_HandoverCommand);</span><br><span style="color: hsl(120, 100%, 40%);">+ var octetstring rr_ho_cmd_enc := enc_PDU_ML3_NW_MS(rr_ho_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+ var PDU_BSSAP ho_req_ack := valueof(ts_BSSMAP_HandoverRequestAcknowledge(rr_ho_cmd_enc, lengthof(rr_ho_cmd_enc),</span><br><span style="color: hsl(120, 100%, 40%);">+ aoIPTransportLayer := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ speechCodec := ts_BSSMAP_IE_SpeechCodec({ts_CodecFR})));</span><br><span style="color: hsl(120, 100%, 40%);">+ GSUP.send(ts_GSUP_E_PrepareHandoverResult(</span><br><span style="color: hsl(120, 100%, 40%);">+ pars.imsi,</span><br><span style="color: hsl(120, 100%, 40%);">+ ho_number,</span><br><span style="color: hsl(120, 100%, 40%);">+ remote_msc_name, local_msc_name,</span><br><span style="color: hsl(120, 100%, 40%);">+ valueof(t_GSUP_AN_APDU(OSMO_GSUP_AN_PROTO_48006, enc_PDU_BSSAP(ho_req_ack)))));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* MSC forwards the RR Handover Command to old BSS */</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.receive(tr_BSSMAP_HandoverCommand);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* The MS shows up at remote new BSS */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ GSUP.send(ts_GSUP_E_AN_APDU(OSMO_GSUP_MSGT_E_PROCESS_ACCESS_SIGNALLING_REQUEST,</span><br><span style="color: hsl(120, 100%, 40%);">+ pars.imsi, remote_msc_name, local_msc_name,</span><br><span style="color: hsl(120, 100%, 40%);">+ valueof(t_GSUP_AN_APDU(OSMO_GSUP_AN_PROTO_48006,</span><br><span style="color: hsl(120, 100%, 40%);">+ enc_PDU_BSSAP(valueof(ts_BSSMAP_HandoverDetect))))));</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.receive(tr_BSSMAP_HandoverSucceeded);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(0.1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Save the MS sequence counters for use on the other connection */</span><br><span style="color: hsl(120, 100%, 40%);">+ var N_Sd_Array last_n_sd := f_bssmap_last_n_sd();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ GSUP.send(ts_GSUP_E_AN_APDU(OSMO_GSUP_MSGT_E_SEND_END_SIGNAL_REQUEST,</span><br><span style="color: hsl(120, 100%, 40%);">+ pars.imsi, remote_msc_name, local_msc_name,</span><br><span style="color: hsl(120, 100%, 40%);">+ valueof(t_GSUP_AN_APDU(OSMO_GSUP_AN_PROTO_48006,</span><br><span style="color: hsl(120, 100%, 40%);">+ enc_PDU_BSSAP(valueof(ts_BSSMAP_HandoverComplete))))));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* The local BSS conn clears, all communication goes via remote MSC now */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_expect_clear();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /**********************************/</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Play through some signalling across the inter-MSC link.</span><br><span style="color: hsl(120, 100%, 40%);">+ * This is a copy of f_tc_lu_and_mo_ussd_single_request() translated into GSUP AN-APDUs. */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var template OCTN facility_req := f_USSD_FACILITY_IE_INVOKE(</span><br><span style="color: hsl(120, 100%, 40%);">+ invoke_id := 5, /* Phone may not start from 0 or 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ op_code := SS_OP_CODE_PROCESS_USS_REQ,</span><br><span style="color: hsl(120, 100%, 40%);">+ ussd_string := "*#100#"</span><br><span style="color: hsl(120, 100%, 40%);">+ );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var template OCTN facility_rsp := f_USSD_FACILITY_IE_RETURN_RESULT(</span><br><span style="color: hsl(120, 100%, 40%);">+ invoke_id := 5, /* InvokeID shall be the same for both REQ and RSP */</span><br><span style="color: hsl(120, 100%, 40%);">+ op_code := SS_OP_CODE_PROCESS_USS_REQ,</span><br><span style="color: hsl(120, 100%, 40%);">+ ussd_string := "Your extension is " & hex2str(g_pars.msisdn) & "\r"</span><br><span style="color: hsl(120, 100%, 40%);">+ )</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Compose a new SS/REGISTER message with request */</span><br><span style="color: hsl(120, 100%, 40%);">+ var template (value) PDU_ML3_MS_NW ussd_req := ts_ML3_MO_SS_REGISTER(</span><br><span style="color: hsl(120, 100%, 40%);">+ tid := 1, /* We just need a single transaction */</span><br><span style="color: hsl(120, 100%, 40%);">+ ti_flag := c_TIF_ORIG, /* Sent from the side that originates the TI */</span><br><span style="color: hsl(120, 100%, 40%);">+ facility := valueof(facility_req)</span><br><span style="color: hsl(120, 100%, 40%);">+ );</span><br><span style="color: hsl(120, 100%, 40%);">+ var PDU_ML3_MS_NW ussd_req_v := valueof(ussd_req);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Compose SS/RELEASE_COMPLETE template with expected response */</span><br><span style="color: hsl(120, 100%, 40%);">+ var template PDU_ML3_NW_MS ussd_rsp := tr_ML3_MT_SS_RELEASE_COMPLETE(</span><br><span style="color: hsl(120, 100%, 40%);">+ tid := 1, /* Response should arrive within the same transaction */</span><br><span style="color: hsl(120, 100%, 40%);">+ ti_flag := c_TIF_REPL, /* Sent to the side that originates the TI */</span><br><span style="color: hsl(120, 100%, 40%);">+ facility := valueof(facility_rsp)</span><br><span style="color: hsl(120, 100%, 40%);">+ );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Compose expected MSC -> HLR message */</span><br><span style="color: hsl(120, 100%, 40%);">+ var template GSUP_PDU gsup_req := tr_GSUP_PROC_SS_REQ(</span><br><span style="color: hsl(120, 100%, 40%);">+ imsi := g_pars.imsi,</span><br><span style="color: hsl(120, 100%, 40%);">+ state := OSMO_GSUP_SESSION_STATE_BEGIN,</span><br><span style="color: hsl(120, 100%, 40%);">+ ss := valueof(facility_req)</span><br><span style="color: hsl(120, 100%, 40%);">+ );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* To be used for sending response with correct session ID */</span><br><span style="color: hsl(120, 100%, 40%);">+ var GSUP_PDU gsup_req_complete;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Request own number */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* From remote MSC instead of BSSAP directly */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Patch the correct N_SD value into the message. */</span><br><span style="color: hsl(120, 100%, 40%);">+ var octetstring l3_enc := enc_PDU_ML3_MS_NW(ussd_req_v);</span><br><span style="color: hsl(120, 100%, 40%);">+ var BSSMAP_Emulation.ConnectionData cd;</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ML3_patch_seq_nr_MS_NW(f_next_n_sd(last_n_sd, f_ML3_n_sd_idx(ussd_req_v)), l3_enc);</span><br><span style="color: hsl(120, 100%, 40%);">+ GSUP.send(ts_GSUP_E_AN_APDU(OSMO_GSUP_MSGT_E_PROCESS_ACCESS_SIGNALLING_REQUEST,</span><br><span style="color: hsl(120, 100%, 40%);">+ pars.imsi, remote_msc_name, local_msc_name,</span><br><span style="color: hsl(120, 100%, 40%);">+ valueof(t_GSUP_AN_APDU(OSMO_GSUP_AN_PROTO_48006,</span><br><span style="color: hsl(120, 100%, 40%);">+ enc_PDU_BSSAP(valueof(ts_BSSAP_DTAP(l3_enc)))</span><br><span style="color: hsl(120, 100%, 40%);">+ ))</span><br><span style="color: hsl(120, 100%, 40%);">+ ));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Expect GSUP message containing the SS payload */</span><br><span style="color: hsl(120, 100%, 40%);">+ gsup_req_complete := f_expect_gsup_msg(gsup_req);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Compose the response from HLR using received session ID */</span><br><span style="color: hsl(120, 100%, 40%);">+ var template GSUP_PDU gsup_rsp := ts_GSUP_PROC_SS_REQ(</span><br><span style="color: hsl(120, 100%, 40%);">+ imsi := g_pars.imsi,</span><br><span style="color: hsl(120, 100%, 40%);">+ sid := gsup_req_complete.ies[1].val.session_id,</span><br><span style="color: hsl(120, 100%, 40%);">+ state := OSMO_GSUP_SESSION_STATE_END,</span><br><span style="color: hsl(120, 100%, 40%);">+ ss := valueof(facility_rsp)</span><br><span style="color: hsl(120, 100%, 40%);">+ );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Finally, HLR terminates the session */</span><br><span style="color: hsl(120, 100%, 40%);">+ GSUP.send(gsup_rsp);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* The USSD response goes out to remote MSC, on GSUP E instead of BSSAP */</span><br><span style="color: hsl(120, 100%, 40%);">+ var GSUP_PDU gsup_ussd_rsp;</span><br><span style="color: hsl(120, 100%, 40%);">+ GSUP.receive(tr_GSUP_E_AN_APDU(OSMO_GSUP_MSGT_E_FORWARD_ACCESS_SIGNALLING_REQUEST,</span><br><span style="color: hsl(120, 100%, 40%);">+ pars.imsi, destination_name := remote_msc_name)) -> value gsup_ussd_rsp;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var GSUP_IeValue an_apdu;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (not f_gsup_find_ie(gsup_ussd_rsp, OSMO_GSUP_AN_APDU_IE, an_apdu)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(fail, "No AN-APDU in received GSUP message. Expected USSD response in DTAP, got", gsup_ussd_rsp);</span><br><span style="color: hsl(120, 100%, 40%);">+ mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ var PDU_BSSAP bssap_dtap_mt := dec_PDU_BSSAP(an_apdu.an_apdu.pdu);</span><br><span style="color: hsl(120, 100%, 40%);">+ var PDU_ML3_NW_MS dtap_mt := dec_PDU_ML3_NW_MS(bssap_dtap_mt.pdu.dtap);</span><br><span style="color: hsl(120, 100%, 40%);">+ log("Expecting", ussd_rsp);</span><br><span style="color: hsl(120, 100%, 40%);">+ log("Got", dtap_mt);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (not match(dtap_mt, ussd_rsp)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(fail, "Unexpected GSUP message. Expected USSD response in DTAP, got", gsup_ussd_rsp);</span><br><span style="color: hsl(120, 100%, 40%);">+ mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ /**********************************/</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* inter-MSC handover back to the first MSC */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_create_bssmap_exp_handoverRequest(193);</span><br><span style="color: hsl(120, 100%, 40%);">+ cil := { cIl_CGI := { ts_BSSMAP_CI_CGI('262'H, '42'H, 23, 42) } };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* old BSS sends Handover Required, via inter-MSC E link: like</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSSAP.send(ts_BSSMAP_HandoverRequired(cause, cil));</span><br><span style="color: hsl(120, 100%, 40%);">+ * but via GSUP */</span><br><span style="color: hsl(120, 100%, 40%);">+ GSUP.send(ts_GSUP_E_AN_APDU(OSMO_GSUP_MSGT_E_PREPARE_SUBSEQUENT_HANDOVER_REQUEST,</span><br><span style="color: hsl(120, 100%, 40%);">+ pars.imsi, remote_msc_name, local_msc_name,</span><br><span style="color: hsl(120, 100%, 40%);">+ valueof(t_GSUP_AN_APDU(OSMO_GSUP_AN_PROTO_48006,</span><br><span style="color: hsl(120, 100%, 40%);">+ enc_PDU_BSSAP(valueof(ts_BSSMAP_HandoverRequired(cause, cil)))</span><br><span style="color: hsl(120, 100%, 40%);">+ ))</span><br><span style="color: hsl(120, 100%, 40%);">+ ));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* MSC asks local BSS to prepare Handover to it */</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.receive(tr_BSSMAP_HandoverRequest);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Make sure the new BSSAP conn continues with the correct N_SD sequence numbers */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_bssmap_continue_after_n_sd(last_n_sd);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* new BSS composes a RR Handover Command */</span><br><span style="color: hsl(120, 100%, 40%);">+ rr_ho_cmd := valueof(ts_RR_HandoverCommand);</span><br><span style="color: hsl(120, 100%, 40%);">+ rr_ho_cmd_enc := enc_PDU_ML3_NW_MS(rr_ho_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+ var BSSMAP_IE_AoIP_TransportLayerAddress tla := valueof(ts_BSSMAP_IE_AoIP_TLA4('01020304'O, 2342));</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ts_BSSMAP_HandoverRequestAcknowledge(rr_ho_cmd_enc, lengthof(rr_ho_cmd_enc),</span><br><span style="color: hsl(120, 100%, 40%);">+ tla, ts_BSSMAP_IE_SpeechCodec({ts_CodecFR})));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* HandoverCommand goes out via remote MSC-I */</span><br><span style="color: hsl(120, 100%, 40%);">+ var GSUP_PDU prep_subsq_ho_res;</span><br><span style="color: hsl(120, 100%, 40%);">+ GSUP.receive(tr_GSUP_E_AN_APDU(OSMO_GSUP_MSGT_E_PREPARE_SUBSEQUENT_HANDOVER_RESULT,</span><br><span style="color: hsl(120, 100%, 40%);">+ pars.imsi, destination_name := remote_msc_name)) -> value prep_subsq_ho_res;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* MS shows up at the local BSS */</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ts_BSSMAP_HandoverDetect);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(0.1);</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ts_BSSMAP_HandoverComplete);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* MS has handovered to here, Clear Command goes out via remote MSC-I -- in form of a GSUP Close. */</span><br><span style="color: hsl(120, 100%, 40%);">+ GSUP.receive(tr_GSUP_E_NO_PDU(OSMO_GSUP_MSGT_E_CLOSE,</span><br><span style="color: hsl(120, 100%, 40%);">+ pars.imsi, destination_name := remote_msc_name));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Handover ends successfully. Call goes on for a little longer and then we hang up. */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ deactivate(ack_mdcx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var default ccrel := activate(as_optional_cc_rel(cpars, true));</span><br><span style="color: hsl(120, 100%, 40%);">+ f_call_hangup(cpars, true);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ deactivate(ccrel);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_ho_inter_msc_out() runs on MTC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var BSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init(1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var BSC_ConnHdlrPars pars := f_init_pars(54);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn := f_start_handler_with_pars(refers(f_tc_ho_inter_msc_out), pars, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn.done;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> control {</span><br><span> execute( TC_cr_before_reset() );</span><br><span> execute( TC_lu_imsi_noauth_tmsi() );</span><br><span>@@ -4722,7 +5134,6 @@</span><br><span> execute( TC_lu_and_mt_ussd_during_mt_call() );</span><br><span> execute( TC_lu_and_mo_ussd_mo_release() );</span><br><span> execute( TC_lu_and_ss_session_timeout() );</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> execute( TC_cipher_complete_with_invalid_cipher() );</span><br><span> </span><br><span> execute( TC_sgsap_reset() );</span><br><span>@@ -4748,7 +5159,12 @@</span><br><span> execute( TC_sgsap_lu_and_mt_call() );</span><br><span> execute( TC_sgsap_vlr_failure() );</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Run this last: at the time of writing this test crashes the MSC */</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_ho_inter_bsc_unknown_cell() );</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_ho_inter_bsc() );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_ho_inter_msc_out() );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ // Run this last: at the time of writing this test crashes the MSC</span><br><span> execute( TC_lu_imsi_auth_tmsi_encr_3_1_log_msc_debug() );</span><br><span> execute( TC_gsup_mt_multi_part_sms() );</span><br><span> execute( TC_mo_cc_bssmap_clear() );</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/13617">change 13617</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/13617"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: osmo-ttcn3-hacks </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I7d76c982ad4e198534fa488609c41e8892b268ab </div>
<div style="display:none"> Gerrit-Change-Number: 13617 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>