blob: 977e7c688be34b67e63c1b68079c77cca97d40ca [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];
37};
38
39
40altstep as_ignore_id_ack(integer i) runs on rspro_server_CT {
41 [] RSPRO_SRV[i].receive(ASP_IPA_Event:{up_down := ASP_IPA_EVENT_ID_ACK}) { repeat; }
42}
43
44
45function f_rspro_srv_exp_connect(integer i)
46runs on rspro_server_CT
47{
48 timer T := 20.0;
49 T.start;
50 alt {
51 [] RSPRO_SRV[i].receive(ASP_IPA_Event:{up_down := ASP_IPA_EVENT_UP}) { }
52 [] T.timeout {
53 setverdict(fail, "Timeout waiting for ASP_IPA_EVENT_UP");
54 mtc.stop;
55 }
56 }
57}
58
59function f_rspro_srv_init(integer i, charstring bind_host, integer bind_port,
60 ComponentIdentity rspro_id, boolean exp_connect := true)
61runs on rspro_server_CT
62{
63 g_rspro_srv[i].id := "RSPRO_SRV" & int2str(i);
64 g_rspro_srv[i].vc_IPA := IPA_Emulation_CT.create(g_rspro_srv[i].id);
65 g_rspro_srv[i].ccm_pars := c_IPA_default_ccm_pars;
66 g_rspro_srv[i].ccm_pars.name := "Osmocom TTCN-3 RSPRO server simulator";
67 g_rspro_srv[i].rspro_id := rspro_id;
68
69 map(g_rspro_srv[i].vc_IPA:IPA_PORT, system:IPA_CODEC_PT);
70 connect(g_rspro_srv[i].vc_IPA:IPA_RSPRO_PORT, self:RSPRO_SRV[i]);
71
72 g_rspro_srv[i].vc_IPA.start(IPA_Emulation.main_server(bind_host, bind_port));
73
74 activate(as_ignore_id_ack(i));
75
76 if (exp_connect) {
77 f_rspro_srv_exp_connect(i);
78 }
79}
80
81function f_rspro_srv_fini(integer i)
82runs on rspro_server_CT
83{
84 g_rspro_srv[i].vc_IPA.stop;
85 disconnect(g_rspro_srv[i].vc_IPA:IPA_RSPRO_PORT, self:RSPRO_SRV[i]);
86 unmap(g_rspro_srv[i].vc_IPA:IPA_PORT, system:IPA_CODEC_PT);
87}
88
89
90function f_rspro_srv_restart(integer i, charstring bind_host, integer bind_port)
91runs on rspro_server_CT
92{
93 g_rspro_srv[i].vc_IPA.stop;
94 g_rspro_srv[i].vc_IPA.start(IPA_Emulation.main_server(bind_host, bind_port));
95}
96
97
98function f_rspro_srv_exp(template RsproPDU exp, integer i := 0, float tout := 10.0)
99runs on rspro_server_CT return RsproPDU
100{
101 var RsproPDU pdu;
102
103 timer T := tout;
104 T.start;
105 alt {
106 [] RSPRO_SRV[i].receive(exp) -> value pdu {
107 setverdict(pass);
108 }
109 [] RSPRO_SRV[i].receive(RsproPDU:?) -> value pdu {
110 setverdict(fail, "Received unexpected RPSRO", pdu, " instead of ", exp);
111 mtc.stop;
112 }
113 [] as_ignore_id_ack(i) { repeat; }
114 [] RSPRO_SRV[i].receive {
115 setverdict(fail, "Received unexpected != RPSRO");
116 mtc.stop;
117 }
118 [] T.timeout {
119 setverdict(fail, "Timeout waiting for ", exp);
120 mtc.stop;
121 }
122 }
123 return pdu;
124}
125
126function f_rspro_srv_create_slotmap(ClientSlot cslot, BankSlot bslot,
127 template ResultCode exp_res := ok, integer i := 0)
128runs on rspro_server_CT
129{
130 RSPRO_SRV[i].send(ts_RSPRO_CreateMappingReq(cslot, bslot));
131 f_rspro_srv_exp(tr_RSPRO_CreateMappingRes(exp_res), i);
132}
133
134function f_rspro_srv_remove_slotmap(ClientSlot cslot, BankSlot bslot,
135 template ResultCode exp_res := ok, integer i := 0)
136runs on rspro_server_CT
137{
138 RSPRO_SRV[i].send(ts_RSPRO_RemoveMappingReq(cslot, bslot));
139 f_rspro_srv_exp(tr_RSPRO_RemoveMappingRes(exp_res), i);
140}
141
142function f_rspro_config_client_bank(template (value) BankSlot bank_slot,
143 template (value) IpPort bank_iport,
144 template ResultCode exp_res := ok, integer i := 0)
145runs on rspro_server_CT {
146 RSPRO_SRV[i].send(ts_RSPRO_ConfigClientBankReq(bank_slot, bank_iport));
147 f_rspro_srv_exp(tr_RSPRO_ConfigClientBankRes(exp_res));
148}
149
150
151altstep as_connectBankReq(template ComponentIdentity comp_id := tr_CompId(remsimBankd, ?,
152 "remsim-bankd", ?),
153 template BankId bid := ?,
154 template SlotNumber nslots := ?,
155 ResultCode res := ok, integer i := 0)
156runs on rspro_server_CT {
157 [] RSPRO_SRV[i].receive(tr_RSPRO_ConnectBankReq(comp_id, bid, nslots)) {
158 RSPRO_SRV[i].send(ts_RSPRO_ConnectBankRes(g_rspro_srv[i].rspro_id, res));
159 }
160}
161
162altstep as_connectClientReq(template ComponentIdentity comp_id := tr_CompId(remsimClient, ?,
163 "remsim-client", ?),
164 template ClientSlot cslot := *,
165 ResultCode res := ok, integer i := 0)
166runs on rspro_server_CT {
167 [] RSPRO_SRV[i].receive(tr_RSPRO_ConnectClientReq(comp_id, cslot)) {
168 RSPRO_SRV[i].send(ts_RSPRO_ConnectClientRes(g_rspro_srv[i].rspro_id, res));
169 }
170}
171
172
173
174}