blob: bb11689de8055636194279f7bda19a4f494c7062 [file] [log] [blame]
Harald Weltefaa42922019-03-04 18:31:11 +01001module RSPRO_Server {
2
3/* Utility functions implementing an RSRPO server.
4 * (C) 2019 by 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
14import from IPL4asp_Types all;
15import from RSPRO all;
16import from RSPRO_Types all;
17import from IPA_Types all;
18import from IPA_Emulation all;
19
20
21type record RSPRO_Server {
22 IPA_Emulation_CT vc_IPA,
23 IPA_CCM_Parameters ccm_pars,
24 charstring id,
25 ComponentIdentity rspro_id//,
26
27 //ClientSlot rspro_client_slot optional,
28 //BankId rspro_bank_id optional,
29 //SlotNumber rspro_bank_nslots optional
30};
31
32const integer NUM_SERVER := 2;
33
34type component rspro_server_CT {
35 var RSPRO_Server g_rspro_srv[NUM_SERVER];
36 port IPA_RSPRO_PT RSPRO_SRV[NUM_SERVER];
Harald Welte15be5d62020-02-19 20:09:02 +010037 timer g_rspro_srv_Tguard := 30.0;
Harald Weltefaa42922019-03-04 18:31:11 +010038};
39
Harald Welte15be5d62020-02-19 20:09:02 +010040private altstep as_rspro_srv_Tguard() runs on rspro_server_CT {
41[] g_rspro_srv_Tguard.timeout {
42 setverdict(fail, "RSPRO Server global guard timer timeout");
43 mtc.stop;
44 }
45}
Harald Weltefaa42922019-03-04 18:31:11 +010046
47altstep as_ignore_id_ack(integer i) runs on rspro_server_CT {
Vadim Yanitskiya2afacc2020-05-18 21:16:19 +070048 [] RSPRO_SRV[i].receive(tr_ASP_IPA_EV(ASP_IPA_EVENT_ID_ACK)) { repeat; }
Harald Welte06f09492020-10-21 00:06:29 +020049 [] RSPRO_SRV[i].receive(tr_ASP_IPA_EV(ASP_IPA_EVENT_ID_RESP)) { repeat; }
Harald Weltefaa42922019-03-04 18:31:11 +010050}
51
52
53function f_rspro_srv_exp_connect(integer i)
54runs on rspro_server_CT
55{
56 timer T := 20.0;
57 T.start;
58 alt {
Vadim Yanitskiya2afacc2020-05-18 21:16:19 +070059 [] RSPRO_SRV[i].receive(tr_ASP_IPA_EV(ASP_IPA_EVENT_UP)) { }
Harald Weltefaa42922019-03-04 18:31:11 +010060 [] T.timeout {
61 setverdict(fail, "Timeout waiting for ASP_IPA_EVENT_UP");
62 mtc.stop;
63 }
64 }
65}
66
67function f_rspro_srv_init(integer i, charstring bind_host, integer bind_port,
68 ComponentIdentity rspro_id, boolean exp_connect := true)
69runs on rspro_server_CT
70{
71 g_rspro_srv[i].id := "RSPRO_SRV" & int2str(i);
72 g_rspro_srv[i].vc_IPA := IPA_Emulation_CT.create(g_rspro_srv[i].id);
73 g_rspro_srv[i].ccm_pars := c_IPA_default_ccm_pars;
74 g_rspro_srv[i].ccm_pars.name := "Osmocom TTCN-3 RSPRO server simulator";
75 g_rspro_srv[i].rspro_id := rspro_id;
76
Harald Welte15be5d62020-02-19 20:09:02 +010077 activate(as_rspro_srv_Tguard());
78 g_rspro_srv_Tguard.start;
79
Harald Weltefaa42922019-03-04 18:31:11 +010080 map(g_rspro_srv[i].vc_IPA:IPA_PORT, system:IPA_CODEC_PT);
81 connect(g_rspro_srv[i].vc_IPA:IPA_RSPRO_PORT, self:RSPRO_SRV[i]);
82
83 g_rspro_srv[i].vc_IPA.start(IPA_Emulation.main_server(bind_host, bind_port));
84
85 activate(as_ignore_id_ack(i));
86
87 if (exp_connect) {
88 f_rspro_srv_exp_connect(i);
89 }
90}
91
92function f_rspro_srv_fini(integer i)
93runs on rspro_server_CT
94{
95 g_rspro_srv[i].vc_IPA.stop;
96 disconnect(g_rspro_srv[i].vc_IPA:IPA_RSPRO_PORT, self:RSPRO_SRV[i]);
97 unmap(g_rspro_srv[i].vc_IPA:IPA_PORT, system:IPA_CODEC_PT);
98}
99
100
101function f_rspro_srv_restart(integer i, charstring bind_host, integer bind_port)
102runs on rspro_server_CT
103{
104 g_rspro_srv[i].vc_IPA.stop;
105 g_rspro_srv[i].vc_IPA.start(IPA_Emulation.main_server(bind_host, bind_port));
106}
107
108
109function f_rspro_srv_exp(template RsproPDU exp, integer i := 0, float tout := 10.0)
110runs on rspro_server_CT return RsproPDU
111{
112 var RsproPDU pdu;
113
114 timer T := tout;
115 T.start;
116 alt {
117 [] RSPRO_SRV[i].receive(exp) -> value pdu {
118 setverdict(pass);
119 }
120 [] RSPRO_SRV[i].receive(RsproPDU:?) -> value pdu {
121 setverdict(fail, "Received unexpected RPSRO", pdu, " instead of ", exp);
122 mtc.stop;
123 }
124 [] as_ignore_id_ack(i) { repeat; }
125 [] RSPRO_SRV[i].receive {
126 setverdict(fail, "Received unexpected != RPSRO");
127 mtc.stop;
128 }
129 [] T.timeout {
130 setverdict(fail, "Timeout waiting for ", exp);
131 mtc.stop;
132 }
133 }
134 return pdu;
135}
136
137function f_rspro_srv_create_slotmap(ClientSlot cslot, BankSlot bslot,
138 template ResultCode exp_res := ok, integer i := 0)
139runs on rspro_server_CT
140{
141 RSPRO_SRV[i].send(ts_RSPRO_CreateMappingReq(cslot, bslot));
142 f_rspro_srv_exp(tr_RSPRO_CreateMappingRes(exp_res), i);
143}
144
145function f_rspro_srv_remove_slotmap(ClientSlot cslot, BankSlot bslot,
146 template ResultCode exp_res := ok, integer i := 0)
147runs on rspro_server_CT
148{
149 RSPRO_SRV[i].send(ts_RSPRO_RemoveMappingReq(cslot, bslot));
150 f_rspro_srv_exp(tr_RSPRO_RemoveMappingRes(exp_res), i);
151}
152
153function f_rspro_config_client_bank(template (value) BankSlot bank_slot,
154 template (value) IpPort bank_iport,
155 template ResultCode exp_res := ok, integer i := 0)
156runs on rspro_server_CT {
157 RSPRO_SRV[i].send(ts_RSPRO_ConfigClientBankReq(bank_slot, bank_iport));
158 f_rspro_srv_exp(tr_RSPRO_ConfigClientBankRes(exp_res));
159}
160
Harald Welteeb172b32019-12-04 20:54:15 +0100161function f_rspro_srv_reset_state(template ResultCode exp_res := ok, integer i := 0)
162runs on rspro_server_CT
163{
164 RSPRO_SRV[i].send(ts_RSPRO_ResetStateReq);
165 f_rspro_srv_exp(tr_RSPRO_ResetStateRes(exp_res));
166}
Harald Weltefaa42922019-03-04 18:31:11 +0100167
168altstep as_connectBankReq(template ComponentIdentity comp_id := tr_CompId(remsimBankd, ?,
169 "remsim-bankd", ?),
170 template BankId bid := ?,
171 template SlotNumber nslots := ?,
172 ResultCode res := ok, integer i := 0)
173runs on rspro_server_CT {
174 [] RSPRO_SRV[i].receive(tr_RSPRO_ConnectBankReq(comp_id, bid, nslots)) {
175 RSPRO_SRV[i].send(ts_RSPRO_ConnectBankRes(g_rspro_srv[i].rspro_id, res));
176 }
177}
178
179altstep as_connectClientReq(template ComponentIdentity comp_id := tr_CompId(remsimClient, ?,
180 "remsim-client", ?),
181 template ClientSlot cslot := *,
182 ResultCode res := ok, integer i := 0)
183runs on rspro_server_CT {
184 [] RSPRO_SRV[i].receive(tr_RSPRO_ConnectClientReq(comp_id, cslot)) {
185 RSPRO_SRV[i].send(ts_RSPRO_ConnectClientRes(g_rspro_srv[i].rspro_id, res));
186 }
187}
188
189
190
191}