aboutsummaryrefslogtreecommitdiffstats
path: root/stp/STP_Tests.ttcn
blob: 032a900a44983170b5c0aafbd0861809f501bd48 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
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() );
}



}