| module STP_Tests { |
| |
| /* Osmocom STP test suite in in TTCN-3 |
| * (C) 2019 Harald Welte <laforge@gnumonks.org> |
| * All rights reserved. |
| * |
| * Released under the terms of GNU General Public License, Version 2 or |
| * (at your option) any later version. |
| * |
| * SPDX-License-Identifier: GPL-2.0-or-later |
| */ |
| |
| import from General_Types all; |
| import from Osmocom_Types all; |
| import from IPL4asp_Types all; |
| |
| import from Osmocom_VTY_Functions all; |
| |
| import from M3UA_Types all; |
| import from M3UA_Templates all; |
| import from M3UA_CodecPort all; |
| import from M3UA_CodecPort_CtrlFunct all; |
| |
| import from M3UA_Emulation all; |
| import from MTP3asp_Types all; |
| import from MTP3asp_PortType all; |
| |
| import from SCCP_Types all; |
| import from SCCP_Templates all; |
| import from SCCPasp_Types all; |
| import from SCCP_Emulation all; |
| |
| import from IPA_Emulation all; |
| |
| import from STP_Tests_Common all; |
| import from STP_Tests_IPA all; |
| import from STP_Tests_M3UA all; |
| |
| |
| type component IPA_M3UA_CT extends RAW_M3UA_CT, IPA_CT { |
| }; |
| |
| const OCT1 c_M3UA_SI_SCCP := '03'O; |
| |
| |
| /* copy+pasted from SCCP_Emulation.ttcn, where for some reason it is marked as "runs on SCCP_CT" |
| * without depending on anything of that component */ |
| function ConvertASPAddressToEncodedAddress_itu( in SCCP_PAR_Address pl_ASPAddress) |
| return SCCP_param_CPartyAddressEnc |
| { |
| |
| var SCCP_param_CPartyAddress_itu vl_PDUAddress; //structured fit to encoding |
| var SCCP_param_CPartyAddressEnc vl_PDUAddressEncoded; |
| |
| vl_PDUAddress.addressIndicator.pointCodeIndic:= |
| pl_ASPAddress.addressIndicator.pointCodeIndic; |
| |
| vl_PDUAddress.addressIndicator.ssnIndicator:= |
| pl_ASPAddress.addressIndicator.ssnIndicator; |
| |
| vl_PDUAddress.addressIndicator.globalTitleIndic:= |
| pl_ASPAddress.addressIndicator.globalTitleIndic; |
| |
| vl_PDUAddress.addressIndicator.routingIndicator:= |
| pl_ASPAddress.addressIndicator.routingIndicator; |
| |
| vl_PDUAddress.addressIndicator.reserved:='0'B; |
| // if (ischosen(pl_ASPAddress.signPointCode) ) not used because it is mandatory field (???) |
| |
| //----signPointCode handling |
| if ( ispresent( pl_ASPAddress.signPointCode )) { |
| vl_PDUAddress.signPointCode := |
| '00'B&pl_ASPAddress.signPointCode; |
| } else { |
| vl_PDUAddress.signPointCode := omit; |
| }; |
| |
| //----subsystemNumber handling |
| if ( ispresent( pl_ASPAddress.subsystemNumber ) ){ |
| vl_PDUAddress.subsystemNumber := pl_ASPAddress.subsystemNumber; |
| } else { |
| vl_PDUAddress.subsystemNumber :=omit; |
| }; |
| |
| // --- globalTitle handling-- |
| if ( ispresent(pl_ASPAddress.globalTitle)) |
| {//startif1 |
| |
| var SCCP_ASPfield_GlobalTitle tmpGT ; |
| tmpGT := pl_ASPAddress.globalTitle; |
| |
| if (ischosen(tmpGT.gti0001)) |
| { |
| vl_PDUAddress.globalTitle.gti0001.natureOfAddress:=tmpGT.gti0001.natureOfAddress; |
| vl_PDUAddress.globalTitle.gti0001.oddeven:=tmpGT.gti0001.oddeven; |
| vl_PDUAddress.globalTitle.gti0001.globalTitleAddress:=tmpGT.gti0001.globalTitleAddress; |
| } |
| else if (ischosen(tmpGT.gti0010)) |
| { |
| vl_PDUAddress.globalTitle.gti0010.translationType:=tmpGT.gti0010.translationType; |
| vl_PDUAddress.globalTitle.gti0010.globalTitleAddress:=tmpGT.gti0010.globalTitleAddress; |
| } |
| else if (ischosen(tmpGT.gti0011)) |
| { |
| vl_PDUAddress.globalTitle.gti0011.translationType:=tmpGT.gti0011.translationType; |
| vl_PDUAddress.globalTitle.gti0011.encodingScheme:=tmpGT.gti0011.encodingScheme; |
| vl_PDUAddress.globalTitle.gti0011.numberingPlan:=tmpGT.gti0011.numberingPlan; |
| vl_PDUAddress.globalTitle.gti0011.globalTitleAddress:=tmpGT.gti0011.globalTitleAddress; |
| } |
| else if (ischosen(tmpGT.gti0100)) |
| { |
| vl_PDUAddress.globalTitle.gti0100.translationType:=tmpGT.gti0100.translationType; |
| vl_PDUAddress.globalTitle.gti0100.encodingScheme:=tmpGT.gti0100.encodingScheme; |
| vl_PDUAddress.globalTitle.gti0100.numberingPlan:=tmpGT.gti0100.numberingPlan; |
| vl_PDUAddress.globalTitle.gti0100.natureOfAddress:=tmpGT.gti0100.natureOfAddress; |
| vl_PDUAddress.globalTitle.gti0100.reserved:='0'B; |
| vl_PDUAddress.globalTitle.gti0100.globalTitleAddress:=tmpGT.gti0100.globalTitleAddress; |
| } |
| } |
| else |
| { |
| vl_PDUAddress.globalTitle := omit; |
| }; |
| |
| vl_PDUAddressEncoded.addr:= enc_PDU_SCCP_Address_itu( vl_PDUAddress); |
| vl_PDUAddressEncoded.paramLength:= lengthof(vl_PDUAddressEncoded.addr); |
| |
| return vl_PDUAddressEncoded; |
| |
| } //ConvertASPAddressToEncodedAddress_itu |
| |
| template (value) PDU_SCCP ts_SCCP_UDT(SCCP_PAR_Address called, SCCP_PAR_Address calling, |
| template (value) octetstring data, |
| template (value) BIT4 msg_hdl := '0000'B) := { |
| unitdata := { |
| messageType := udt, |
| protClass := {'0000'B, msg_hdl}, |
| pointer1 := 0, |
| pointer2 := 0, |
| pointer3 := 0, |
| calledPAddress := ConvertASPAddressToEncodedAddress_itu(called), |
| callingPAddress := ConvertASPAddressToEncodedAddress_itu(calling), |
| data := { |
| paramLength := 0, |
| data := data |
| } |
| } |
| } |
| |
| /* Test routing of SCCP between an M3UA and an IPA ASP */ |
| testcase TC_m3ua_to_ipa() runs on IPA_M3UA_CT { |
| var OCT4 rctx_sender := int2oct(1023, 4); |
| var OCT4 pc_sender := int2oct(23, 4); |
| var OCT4 pc_receiver := int2oct(5, 4); |
| |
| f_init_m3ua(); |
| f_init_ipa(); |
| |
| f_connect_ipa(3); |
| f_M3UA_asp_up_act(0, omit, omit); // TODO: rctx |
| |
| /* send a well-formed, encoded SCCP message via M3UA */ |
| var octetstring data := f_rnd_octstring(f_rnd_int(100)); |
| var SCCP_PAR_Address called := valueof(ts_SccpAddr_GT('1234'H)); |
| var SCCP_PAR_Address calling := valueof(ts_SccpAddr_GT('5678'H)); |
| var PDU_SCCP sccp := valueof(ts_SCCP_UDT(called, calling, data)); |
| var octetstring sccp_enc := enc_PDU_SCCP(sccp); |
| var template (value) M3UA_Protocol_Data tx_pd; |
| tx_pd := ts_M3UA_protocol_data(pc_sender, pc_receiver, c_M3UA_SI_SCCP, '00'O, '00'O, '00'O, sccp_enc); |
| f_M3UA_send(0, ts_M3UA_DATA(rctx_sender, tx_pd), 1); |
| |
| /* expect to receive it via IPA */ |
| f_IPA_exp(3, sccp_enc); |
| |
| f_clear_m3ua(); |
| } |
| |
| /* test routing an SCCP message from IPA ASP to M3UA ASP */ |
| testcase TC_ipa_to_m3ua() runs on IPA_M3UA_CT { |
| var OCT4 pc_sender := int2oct(5, 4); |
| var OCT4 rctx_receiver := int2oct(1023, 4); |
| var OCT4 pc_receiver := int2oct(23, 4); |
| |
| f_init_common(); |
| f_vty_config2(VTY, {"cs7 instance 0", "as ipa-as-dynamic-asp ipa"}, |
| "point-code override patch-sccp disabled"); |
| |
| f_init_m3ua(); |
| f_init_ipa(); |
| |
| f_connect_ipa(3); |
| f_M3UA_asp_up_act(0, omit, omit); // TODO: rctx |
| |
| /* send a well-formed, encoded SCCP message via IPA */ |
| var octetstring data := f_rnd_octstring(f_rnd_int(100)); |
| var SCCP_PAR_Address called := valueof(ts_SccpAddr_GT('1234'H)); |
| var SCCP_PAR_Address calling := valueof(ts_SccpAddr_GT('5678'H)); |
| var PDU_SCCP sccp := valueof(ts_SCCP_UDT(called, calling, data)); |
| var octetstring sccp_enc := enc_PDU_SCCP(sccp); |
| f_IPA_send(3, sccp_enc); |
| |
| /* expect to receive it via M3UA */ |
| var template (present) M3UA_Protocol_Data rx_pd; |
| rx_pd := tr_M3UA_protocol_data(pc_sender, pc_receiver, c_M3UA_SI_SCCP, '00'O, '00'O, '00'O, sccp_enc); |
| f_M3UA_exp(0, tr_M3UA_DATA(rctx_receiver, rx_pd)); |
| |
| f_clear_m3ua(); |
| } |
| |
| /* test routing an SCCP message from IPA ASP to M3UA ASP while patching PC into SCCP addresses */ |
| testcase TC_ipa_to_m3ua_patch_sccp() runs on IPA_M3UA_CT { |
| var OCT4 pc_sender := int2oct(5, 4); |
| var OCT4 rctx_receiver := int2oct(1023, 4); |
| var OCT4 pc_receiver := int2oct(23, 4); |
| |
| f_init_common(); |
| f_vty_config2(VTY, {"cs7 instance 0", "as ipa-as-dynamic-asp ipa"}, |
| "point-code override patch-sccp both"); |
| |
| f_init_m3ua(); |
| f_init_ipa(); |
| |
| f_connect_ipa(3); |
| f_M3UA_asp_up_act(0, omit, omit); // TODO: rctx |
| |
| /* send a well-formed, encoded SCCP message via IPA */ |
| var octetstring data := f_rnd_octstring(f_rnd_int(100)); |
| var SCCP_PAR_Address called := valueof(ts_SccpAddr_GT('1234'H)); |
| var SCCP_PAR_Address calling := valueof(ts_SccpAddr_GT('5678'H)); |
| var PDU_SCCP sccp := valueof(ts_SCCP_UDT(called, calling, data)); |
| f_IPA_send(3, enc_PDU_SCCP(sccp)); |
| |
| /* patch point codes into addresses */ |
| called := valueof(ts_SccpAddr_PC_GT(oct2int(pc_receiver), '83'O, "mtp3_itu", '1234'H)); |
| calling := valueof(ts_SccpAddr_PC_GT(oct2int(pc_sender), '83'O, "mtp3_itu", '5678'H)); |
| var PDU_SCCP sccp_exp := valueof(ts_SCCP_UDT(called, calling, data)); |
| |
| /* expect to receive it via M3UA */ |
| var template (present) M3UA_Protocol_Data rx_pd; |
| rx_pd := tr_M3UA_protocol_data(pc_sender, pc_receiver, c_M3UA_SI_SCCP, '00'O, '00'O, '00'O, |
| enc_PDU_SCCP(sccp_exp)); |
| f_M3UA_exp(0, tr_M3UA_DATA(rctx_receiver, rx_pd)); |
| |
| f_clear_m3ua(); |
| } |
| |
| |
| |
| control { |
| /* M3UA <-> IPA Tests */ |
| execute( TC_m3ua_to_ipa() ); |
| execute( TC_ipa_to_m3ua() ); |
| execute( TC_ipa_to_m3ua_patch_sccp() ); |
| } |
| |
| |
| |
| } |