Harald Welte | 0db4413 | 2019-10-17 11:09:05 +0200 | [diff] [blame] | 1 | module STP_Tests { |
| 2 | |
| 3 | /* Osmocom STP test suite in in TTCN-3 |
| 4 | * (C) 2019 Harald Welte <laforge@gnumonks.org> |
| 5 | * All rights reserved. |
| 6 | * |
| 7 | * Released under the terms of GNU General Public License, Version 2 or |
| 8 | * (at your option) any later version. |
| 9 | * |
| 10 | * SPDX-License-Identifier: GPL-2.0-or-later |
| 11 | */ |
| 12 | |
| 13 | import from General_Types all; |
| 14 | import from Osmocom_Types all; |
| 15 | import from IPL4asp_Types all; |
| 16 | |
| 17 | import from Osmocom_VTY_Functions all; |
| 18 | |
| 19 | import from M3UA_Types all; |
| 20 | import from M3UA_Templates all; |
| 21 | import from M3UA_CodecPort all; |
| 22 | import from M3UA_CodecPort_CtrlFunct all; |
| 23 | |
| 24 | import from M3UA_Emulation all; |
| 25 | import from MTP3asp_Types all; |
| 26 | import from MTP3asp_PortType all; |
| 27 | |
| 28 | import from SCCP_Types all; |
| 29 | import from SCCP_Templates all; |
| 30 | import from SCCPasp_Types all; |
| 31 | import from SCCP_Emulation all; |
| 32 | |
| 33 | import from IPA_Emulation all; |
| 34 | |
| 35 | import from STP_Tests_Common all; |
| 36 | import from STP_Tests_IPA all; |
| 37 | import from STP_Tests_M3UA all; |
| 38 | |
| 39 | |
| 40 | type component IPA_M3UA_CT extends RAW_M3UA_CT, IPA_CT { |
| 41 | }; |
| 42 | |
| 43 | const OCT1 c_M3UA_SI_SCCP := '03'O; |
| 44 | |
| 45 | |
| 46 | /* copy+pasted from SCCP_Emulation.ttcn, where for some reason it is marked as "runs on SCCP_CT" |
| 47 | * without depending on anything of that component */ |
| 48 | function ConvertASPAddressToEncodedAddress_itu( in SCCP_PAR_Address pl_ASPAddress) |
| 49 | return SCCP_param_CPartyAddressEnc |
| 50 | { |
| 51 | |
| 52 | var SCCP_param_CPartyAddress_itu vl_PDUAddress; //structured fit to encoding |
| 53 | var SCCP_param_CPartyAddressEnc vl_PDUAddressEncoded; |
| 54 | |
| 55 | vl_PDUAddress.addressIndicator.pointCodeIndic:= |
| 56 | pl_ASPAddress.addressIndicator.pointCodeIndic; |
| 57 | |
| 58 | vl_PDUAddress.addressIndicator.ssnIndicator:= |
| 59 | pl_ASPAddress.addressIndicator.ssnIndicator; |
| 60 | |
| 61 | vl_PDUAddress.addressIndicator.globalTitleIndic:= |
| 62 | pl_ASPAddress.addressIndicator.globalTitleIndic; |
| 63 | |
| 64 | vl_PDUAddress.addressIndicator.routingIndicator:= |
| 65 | pl_ASPAddress.addressIndicator.routingIndicator; |
| 66 | |
| 67 | vl_PDUAddress.addressIndicator.reserved:='0'B; |
| 68 | // if (ischosen(pl_ASPAddress.signPointCode) ) not used because it is mandatory field (???) |
| 69 | |
| 70 | //----signPointCode handling |
| 71 | if ( ispresent( pl_ASPAddress.signPointCode )) { |
| 72 | vl_PDUAddress.signPointCode := |
| 73 | '00'B&pl_ASPAddress.signPointCode; |
| 74 | } else { |
| 75 | vl_PDUAddress.signPointCode := omit; |
| 76 | }; |
| 77 | |
| 78 | //----subsystemNumber handling |
| 79 | if ( ispresent( pl_ASPAddress.subsystemNumber ) ){ |
| 80 | vl_PDUAddress.subsystemNumber := pl_ASPAddress.subsystemNumber; |
| 81 | } else { |
| 82 | vl_PDUAddress.subsystemNumber :=omit; |
| 83 | }; |
| 84 | |
| 85 | // --- globalTitle handling-- |
| 86 | if ( ispresent(pl_ASPAddress.globalTitle)) |
| 87 | {//startif1 |
| 88 | |
| 89 | var SCCP_ASPfield_GlobalTitle tmpGT ; |
| 90 | tmpGT := pl_ASPAddress.globalTitle; |
| 91 | |
| 92 | if (ischosen(tmpGT.gti0001)) |
| 93 | { |
| 94 | vl_PDUAddress.globalTitle.gti0001.natureOfAddress:=tmpGT.gti0001.natureOfAddress; |
| 95 | vl_PDUAddress.globalTitle.gti0001.oddeven:=tmpGT.gti0001.oddeven; |
| 96 | vl_PDUAddress.globalTitle.gti0001.globalTitleAddress:=tmpGT.gti0001.globalTitleAddress; |
| 97 | } |
| 98 | else if (ischosen(tmpGT.gti0010)) |
| 99 | { |
| 100 | vl_PDUAddress.globalTitle.gti0010.translationType:=tmpGT.gti0010.translationType; |
| 101 | vl_PDUAddress.globalTitle.gti0010.globalTitleAddress:=tmpGT.gti0010.globalTitleAddress; |
| 102 | } |
| 103 | else if (ischosen(tmpGT.gti0011)) |
| 104 | { |
| 105 | vl_PDUAddress.globalTitle.gti0011.translationType:=tmpGT.gti0011.translationType; |
| 106 | vl_PDUAddress.globalTitle.gti0011.encodingScheme:=tmpGT.gti0011.encodingScheme; |
| 107 | vl_PDUAddress.globalTitle.gti0011.numberingPlan:=tmpGT.gti0011.numberingPlan; |
| 108 | vl_PDUAddress.globalTitle.gti0011.globalTitleAddress:=tmpGT.gti0011.globalTitleAddress; |
| 109 | } |
| 110 | else if (ischosen(tmpGT.gti0100)) |
| 111 | { |
| 112 | vl_PDUAddress.globalTitle.gti0100.translationType:=tmpGT.gti0100.translationType; |
| 113 | vl_PDUAddress.globalTitle.gti0100.encodingScheme:=tmpGT.gti0100.encodingScheme; |
| 114 | vl_PDUAddress.globalTitle.gti0100.numberingPlan:=tmpGT.gti0100.numberingPlan; |
| 115 | vl_PDUAddress.globalTitle.gti0100.natureOfAddress:=tmpGT.gti0100.natureOfAddress; |
| 116 | vl_PDUAddress.globalTitle.gti0100.reserved:='0'B; |
| 117 | vl_PDUAddress.globalTitle.gti0100.globalTitleAddress:=tmpGT.gti0100.globalTitleAddress; |
| 118 | } |
| 119 | } |
| 120 | else |
| 121 | { |
| 122 | vl_PDUAddress.globalTitle := omit; |
| 123 | }; |
| 124 | |
| 125 | vl_PDUAddressEncoded.addr:= enc_PDU_SCCP_Address_itu( vl_PDUAddress); |
| 126 | vl_PDUAddressEncoded.paramLength:= lengthof(vl_PDUAddressEncoded.addr); |
| 127 | |
| 128 | return vl_PDUAddressEncoded; |
| 129 | |
| 130 | } //ConvertASPAddressToEncodedAddress_itu |
| 131 | |
| 132 | template (value) PDU_SCCP ts_SCCP_UDT(SCCP_PAR_Address called, SCCP_PAR_Address calling, |
| 133 | template (value) octetstring data, |
| 134 | template (value) BIT4 msg_hdl := '0000'B) := { |
| 135 | unitdata := { |
| 136 | messageType := udt, |
| 137 | protClass := {'0000'B, msg_hdl}, |
| 138 | pointer1 := 0, |
| 139 | pointer2 := 0, |
| 140 | pointer3 := 0, |
| 141 | calledPAddress := ConvertASPAddressToEncodedAddress_itu(called), |
| 142 | callingPAddress := ConvertASPAddressToEncodedAddress_itu(calling), |
| 143 | data := { |
| 144 | paramLength := 0, |
| 145 | data := data |
| 146 | } |
| 147 | } |
| 148 | } |
| 149 | |
| 150 | /* Test routing of SCCP between an M3UA and an IPA ASP */ |
| 151 | testcase TC_m3ua_to_ipa() runs on IPA_M3UA_CT { |
| 152 | var OCT4 rctx_sender := int2oct(1023, 4); |
| 153 | var OCT4 pc_sender := int2oct(23, 4); |
| 154 | var OCT4 pc_receiver := int2oct(5, 4); |
| 155 | |
| 156 | f_init_m3ua(); |
| 157 | f_init_ipa(); |
| 158 | |
Pau Espin Pedrol | 01ec0bf | 2019-11-07 14:50:07 +0100 | [diff] [blame] | 159 | f_connect_ipa(3); |
Harald Welte | 0db4413 | 2019-10-17 11:09:05 +0200 | [diff] [blame] | 160 | f_M3UA_asp_up_act(0, omit, omit); // TODO: rctx |
| 161 | |
| 162 | /* send a well-formed, encoded SCCP message via M3UA */ |
| 163 | var octetstring data := f_rnd_octstring(f_rnd_int(100)); |
| 164 | var SCCP_PAR_Address called := valueof(ts_SccpAddr_GT('1234'H)); |
| 165 | var SCCP_PAR_Address calling := valueof(ts_SccpAddr_GT('5678'H)); |
| 166 | var PDU_SCCP sccp := valueof(ts_SCCP_UDT(called, calling, data)); |
| 167 | var octetstring sccp_enc := enc_PDU_SCCP(sccp); |
| 168 | var template (value) M3UA_Protocol_Data tx_pd; |
| 169 | tx_pd := ts_M3UA_protocol_data(pc_sender, pc_receiver, c_M3UA_SI_SCCP, '00'O, '00'O, '00'O, sccp_enc); |
| 170 | f_M3UA_send(0, ts_M3UA_DATA(rctx_sender, tx_pd), 1); |
| 171 | |
| 172 | /* expect to receive it via IPA */ |
Pau Espin Pedrol | 01ec0bf | 2019-11-07 14:50:07 +0100 | [diff] [blame] | 173 | f_IPA_exp(3, sccp_enc); |
Pau Espin Pedrol | 05726dd | 2019-11-06 15:55:57 +0100 | [diff] [blame] | 174 | |
| 175 | f_clear_m3ua(); |
Harald Welte | 0db4413 | 2019-10-17 11:09:05 +0200 | [diff] [blame] | 176 | } |
| 177 | |
| 178 | /* test routing an SCCP message from IPA ASP to M3UA ASP */ |
| 179 | testcase TC_ipa_to_m3ua() runs on IPA_M3UA_CT { |
| 180 | var OCT4 pc_sender := int2oct(5, 4); |
| 181 | var OCT4 rctx_receiver := int2oct(1023, 4); |
| 182 | var OCT4 pc_receiver := int2oct(23, 4); |
| 183 | |
| 184 | f_init_common(); |
Pau Espin Pedrol | 01ec0bf | 2019-11-07 14:50:07 +0100 | [diff] [blame] | 185 | f_vty_config2(VTY, {"cs7 instance 0", "as ipa-as-dynamic-asp ipa"}, |
Harald Welte | 0db4413 | 2019-10-17 11:09:05 +0200 | [diff] [blame] | 186 | "point-code override patch-sccp disabled"); |
| 187 | |
| 188 | f_init_m3ua(); |
| 189 | f_init_ipa(); |
| 190 | |
Pau Espin Pedrol | 01ec0bf | 2019-11-07 14:50:07 +0100 | [diff] [blame] | 191 | f_connect_ipa(3); |
Harald Welte | 0db4413 | 2019-10-17 11:09:05 +0200 | [diff] [blame] | 192 | f_M3UA_asp_up_act(0, omit, omit); // TODO: rctx |
| 193 | |
| 194 | /* send a well-formed, encoded SCCP message via IPA */ |
| 195 | var octetstring data := f_rnd_octstring(f_rnd_int(100)); |
| 196 | var SCCP_PAR_Address called := valueof(ts_SccpAddr_GT('1234'H)); |
| 197 | var SCCP_PAR_Address calling := valueof(ts_SccpAddr_GT('5678'H)); |
| 198 | var PDU_SCCP sccp := valueof(ts_SCCP_UDT(called, calling, data)); |
| 199 | var octetstring sccp_enc := enc_PDU_SCCP(sccp); |
Pau Espin Pedrol | 01ec0bf | 2019-11-07 14:50:07 +0100 | [diff] [blame] | 200 | f_IPA_send(3, sccp_enc); |
Harald Welte | 0db4413 | 2019-10-17 11:09:05 +0200 | [diff] [blame] | 201 | |
| 202 | /* expect to receive it via M3UA */ |
| 203 | var template (present) M3UA_Protocol_Data rx_pd; |
| 204 | rx_pd := tr_M3UA_protocol_data(pc_sender, pc_receiver, c_M3UA_SI_SCCP, '00'O, '00'O, '00'O, sccp_enc); |
| 205 | f_M3UA_exp(0, tr_M3UA_DATA(rctx_receiver, rx_pd)); |
Pau Espin Pedrol | 05726dd | 2019-11-06 15:55:57 +0100 | [diff] [blame] | 206 | |
| 207 | f_clear_m3ua(); |
Harald Welte | 0db4413 | 2019-10-17 11:09:05 +0200 | [diff] [blame] | 208 | } |
| 209 | |
| 210 | /* test routing an SCCP message from IPA ASP to M3UA ASP while patching PC into SCCP addresses */ |
| 211 | testcase TC_ipa_to_m3ua_patch_sccp() runs on IPA_M3UA_CT { |
| 212 | var OCT4 pc_sender := int2oct(5, 4); |
| 213 | var OCT4 rctx_receiver := int2oct(1023, 4); |
| 214 | var OCT4 pc_receiver := int2oct(23, 4); |
| 215 | |
| 216 | f_init_common(); |
Pau Espin Pedrol | 01ec0bf | 2019-11-07 14:50:07 +0100 | [diff] [blame] | 217 | f_vty_config2(VTY, {"cs7 instance 0", "as ipa-as-dynamic-asp ipa"}, |
Harald Welte | 0db4413 | 2019-10-17 11:09:05 +0200 | [diff] [blame] | 218 | "point-code override patch-sccp both"); |
| 219 | |
| 220 | f_init_m3ua(); |
| 221 | f_init_ipa(); |
| 222 | |
Pau Espin Pedrol | 01ec0bf | 2019-11-07 14:50:07 +0100 | [diff] [blame] | 223 | f_connect_ipa(3); |
Harald Welte | 0db4413 | 2019-10-17 11:09:05 +0200 | [diff] [blame] | 224 | f_M3UA_asp_up_act(0, omit, omit); // TODO: rctx |
| 225 | |
| 226 | /* send a well-formed, encoded SCCP message via IPA */ |
| 227 | var octetstring data := f_rnd_octstring(f_rnd_int(100)); |
| 228 | var SCCP_PAR_Address called := valueof(ts_SccpAddr_GT('1234'H)); |
| 229 | var SCCP_PAR_Address calling := valueof(ts_SccpAddr_GT('5678'H)); |
| 230 | var PDU_SCCP sccp := valueof(ts_SCCP_UDT(called, calling, data)); |
Pau Espin Pedrol | 01ec0bf | 2019-11-07 14:50:07 +0100 | [diff] [blame] | 231 | f_IPA_send(3, enc_PDU_SCCP(sccp)); |
Harald Welte | 0db4413 | 2019-10-17 11:09:05 +0200 | [diff] [blame] | 232 | |
| 233 | /* patch point codes into addresses */ |
| 234 | called := valueof(ts_SccpAddr_PC_GT(oct2int(pc_receiver), '83'O, "mtp3_itu", '1234'H)); |
| 235 | calling := valueof(ts_SccpAddr_PC_GT(oct2int(pc_sender), '83'O, "mtp3_itu", '5678'H)); |
| 236 | var PDU_SCCP sccp_exp := valueof(ts_SCCP_UDT(called, calling, data)); |
| 237 | |
| 238 | /* expect to receive it via M3UA */ |
| 239 | var template (present) M3UA_Protocol_Data rx_pd; |
| 240 | rx_pd := tr_M3UA_protocol_data(pc_sender, pc_receiver, c_M3UA_SI_SCCP, '00'O, '00'O, '00'O, |
| 241 | enc_PDU_SCCP(sccp_exp)); |
| 242 | f_M3UA_exp(0, tr_M3UA_DATA(rctx_receiver, rx_pd)); |
Pau Espin Pedrol | 05726dd | 2019-11-06 15:55:57 +0100 | [diff] [blame] | 243 | |
| 244 | f_clear_m3ua(); |
Harald Welte | 0db4413 | 2019-10-17 11:09:05 +0200 | [diff] [blame] | 245 | } |
| 246 | |
| 247 | |
| 248 | |
| 249 | control { |
| 250 | /* M3UA <-> IPA Tests */ |
| 251 | execute( TC_m3ua_to_ipa() ); |
| 252 | execute( TC_ipa_to_m3ua() ); |
| 253 | execute( TC_ipa_to_m3ua_patch_sccp() ); |
| 254 | } |
| 255 | |
| 256 | |
| 257 | |
| 258 | } |