blob: 635629fb8117ae266cc92156580780f9e740e87b [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 Weltefaa42922019-03-04 18:31:11 +010049}
50
51
52function f_rspro_srv_exp_connect(integer i)
53runs on rspro_server_CT
54{
55 timer T := 20.0;
56 T.start;
57 alt {
Vadim Yanitskiya2afacc2020-05-18 21:16:19 +070058 [] RSPRO_SRV[i].receive(tr_ASP_IPA_EV(ASP_IPA_EVENT_UP)) { }
Harald Weltefaa42922019-03-04 18:31:11 +010059 [] T.timeout {
60 setverdict(fail, "Timeout waiting for ASP_IPA_EVENT_UP");
61 mtc.stop;
62 }
63 }
64}
65
66function f_rspro_srv_init(integer i, charstring bind_host, integer bind_port,
67 ComponentIdentity rspro_id, boolean exp_connect := true)
68runs on rspro_server_CT
69{
70 g_rspro_srv[i].id := "RSPRO_SRV" & int2str(i);
71 g_rspro_srv[i].vc_IPA := IPA_Emulation_CT.create(g_rspro_srv[i].id);
72 g_rspro_srv[i].ccm_pars := c_IPA_default_ccm_pars;
73 g_rspro_srv[i].ccm_pars.name := "Osmocom TTCN-3 RSPRO server simulator";
74 g_rspro_srv[i].rspro_id := rspro_id;
75
Harald Welte15be5d62020-02-19 20:09:02 +010076 activate(as_rspro_srv_Tguard());
77 g_rspro_srv_Tguard.start;
78
Harald Weltefaa42922019-03-04 18:31:11 +010079 map(g_rspro_srv[i].vc_IPA:IPA_PORT, system:IPA_CODEC_PT);
80 connect(g_rspro_srv[i].vc_IPA:IPA_RSPRO_PORT, self:RSPRO_SRV[i]);
81
82 g_rspro_srv[i].vc_IPA.start(IPA_Emulation.main_server(bind_host, bind_port));
83
84 activate(as_ignore_id_ack(i));
85
86 if (exp_connect) {
87 f_rspro_srv_exp_connect(i);
88 }
89}
90
91function f_rspro_srv_fini(integer i)
92runs on rspro_server_CT
93{
94 g_rspro_srv[i].vc_IPA.stop;
95 disconnect(g_rspro_srv[i].vc_IPA:IPA_RSPRO_PORT, self:RSPRO_SRV[i]);
96 unmap(g_rspro_srv[i].vc_IPA:IPA_PORT, system:IPA_CODEC_PT);
97}
98
99
100function f_rspro_srv_restart(integer i, charstring bind_host, integer bind_port)
101runs on rspro_server_CT
102{
103 g_rspro_srv[i].vc_IPA.stop;
104 g_rspro_srv[i].vc_IPA.start(IPA_Emulation.main_server(bind_host, bind_port));
105}
106
107
108function f_rspro_srv_exp(template RsproPDU exp, integer i := 0, float tout := 10.0)
109runs on rspro_server_CT return RsproPDU
110{
111 var RsproPDU pdu;
112
113 timer T := tout;
114 T.start;
115 alt {
116 [] RSPRO_SRV[i].receive(exp) -> value pdu {
117 setverdict(pass);
118 }
119 [] RSPRO_SRV[i].receive(RsproPDU:?) -> value pdu {
120 setverdict(fail, "Received unexpected RPSRO", pdu, " instead of ", exp);
121 mtc.stop;
122 }
123 [] as_ignore_id_ack(i) { repeat; }
124 [] RSPRO_SRV[i].receive {
125 setverdict(fail, "Received unexpected != RPSRO");
126 mtc.stop;
127 }
128 [] T.timeout {
129 setverdict(fail, "Timeout waiting for ", exp);
130 mtc.stop;
131 }
132 }
133 return pdu;
134}
135
136function f_rspro_srv_create_slotmap(ClientSlot cslot, BankSlot bslot,
137 template ResultCode exp_res := ok, integer i := 0)
138runs on rspro_server_CT
139{
140 RSPRO_SRV[i].send(ts_RSPRO_CreateMappingReq(cslot, bslot));
141 f_rspro_srv_exp(tr_RSPRO_CreateMappingRes(exp_res), i);
142}
143
144function f_rspro_srv_remove_slotmap(ClientSlot cslot, BankSlot bslot,
145 template ResultCode exp_res := ok, integer i := 0)
146runs on rspro_server_CT
147{
148 RSPRO_SRV[i].send(ts_RSPRO_RemoveMappingReq(cslot, bslot));
149 f_rspro_srv_exp(tr_RSPRO_RemoveMappingRes(exp_res), i);
150}
151
152function f_rspro_config_client_bank(template (value) BankSlot bank_slot,
153 template (value) IpPort bank_iport,
154 template ResultCode exp_res := ok, integer i := 0)
155runs on rspro_server_CT {
156 RSPRO_SRV[i].send(ts_RSPRO_ConfigClientBankReq(bank_slot, bank_iport));
157 f_rspro_srv_exp(tr_RSPRO_ConfigClientBankRes(exp_res));
158}
159
Harald Welteeb172b32019-12-04 20:54:15 +0100160function f_rspro_srv_reset_state(template ResultCode exp_res := ok, integer i := 0)
161runs on rspro_server_CT
162{
163 RSPRO_SRV[i].send(ts_RSPRO_ResetStateReq);
164 f_rspro_srv_exp(tr_RSPRO_ResetStateRes(exp_res));
165}
Harald Weltefaa42922019-03-04 18:31:11 +0100166
167altstep as_connectBankReq(template ComponentIdentity comp_id := tr_CompId(remsimBankd, ?,
168 "remsim-bankd", ?),
169 template BankId bid := ?,
170 template SlotNumber nslots := ?,
171 ResultCode res := ok, integer i := 0)
172runs on rspro_server_CT {
173 [] RSPRO_SRV[i].receive(tr_RSPRO_ConnectBankReq(comp_id, bid, nslots)) {
174 RSPRO_SRV[i].send(ts_RSPRO_ConnectBankRes(g_rspro_srv[i].rspro_id, res));
175 }
176}
177
178altstep as_connectClientReq(template ComponentIdentity comp_id := tr_CompId(remsimClient, ?,
179 "remsim-client", ?),
180 template ClientSlot cslot := *,
181 ResultCode res := ok, integer i := 0)
182runs on rspro_server_CT {
183 [] RSPRO_SRV[i].receive(tr_RSPRO_ConnectClientReq(comp_id, cslot)) {
184 RSPRO_SRV[i].send(ts_RSPRO_ConnectClientRes(g_rspro_srv[i].rspro_id, res));
185 }
186}
187
188
189
190}