blob: 3c4bc6f486d17154867522a3a1c46cd7379a8965 [file] [log] [blame]
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +01001module HNBGW_ConnectionHandler {
2
3/* HNBGW Connection Handler of HNB_Tests in TTCN-3
4 * (C) 2021 by sysmocom - s.m.f.c. GmbH <info@sysmocom.de>
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
13import from Misc_Helpers all;
14import from General_Types all;
15import from Osmocom_Types all;
16import from IPL4asp_Types all;
17import from Native_Functions all;
18
19import from SDP_Types all;
20
21import from StatsD_Checker all;
22
23import from TELNETasp_PortType all;
24import from Osmocom_VTY_Functions all;
25
26import from HNBAP_Templates all;
27
28import from Iuh_Emulation all;
29
Pau Espin Pedrol32fb54e2021-11-29 16:21:26 +010030import from RTP_Types all;
31import from RTP_Emulation all;
32
Pau Espin Pedrola6bbb8c2021-11-24 17:00:03 +010033import from HNBLLIF_CodecPort all;
34import from HNBLLIF_Types all;
35import from HNBLLIF_Templates all;
36
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +010037/* this component represents a single Iuh connection at the HNBGW. */
38type component HNBGW_ConnHdlr extends StatsD_ConnHdlr {
39 port TELNETasp_PT HNBVTY;
40 port HNBAP_PT HNBAP;
41 port RUA_PT RUA;
Pau Espin Pedrola6bbb8c2021-11-24 17:00:03 +010042 /* HNBLLIF Interface of HNodeB */
43 port HNBLLIF_CODEC_PT LLSK;
44 var integer g_llsk_conn_id;
45
Pau Espin Pedrol32fb54e2021-11-29 16:21:26 +010046 var RTP_Emulation_CT vc_RTPEM;
47 port RTPEM_CTRL_PT RTPEM_CTRL;
48 port RTPEM_DATA_PT RTPEM_DATA;
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +010049 var TestHdlrParams g_pars;
50
51 var boolean g_vty_initialized := false;
52}
53
54function f_HNBGW_ConnHdlr_init_vty() runs on HNBGW_ConnHdlr {
55 if (not g_vty_initialized) {
56 map(self:HNBVTY, system:HNBVTY);
57 f_vty_set_prompts(HNBVTY);
58 f_vty_transceive(HNBVTY, "enable");
59 g_vty_initialized := true;
60 }
61}
62
63/* initialize all parameters */
Pau Espin Pedrola6bbb8c2021-11-24 17:00:03 +010064function f_HNBGW_ConnHdlr_init(charstring id, TestHdlrParams pars) runs on HNBGW_ConnHdlr {
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +010065 var Iuh_Emulation_CT vc_Iuh;
66
67 g_pars := valueof(pars);
Pau Espin Pedrola6bbb8c2021-11-24 17:00:03 +010068 vc_Iuh := Iuh_Emulation_CT.create(id & "-HNBGW");
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +010069 connect(self:HNBAP, vc_Iuh:HNBAP);
70 connect(self:RUA, vc_Iuh:RUA);
71
72 var Iuh_conn_parameters iuh_pars;
73 iuh_pars.remote_ip := g_pars.hnodeb_addr;
74 iuh_pars.remote_sctp_port := -1;
75 iuh_pars.local_ip := g_pars.hnbgw_addr;
76 iuh_pars.local_sctp_port := g_pars.hnbgw_port;
Pau Espin Pedrola6bbb8c2021-11-24 17:00:03 +010077 vc_Iuh.start(Iuh_Emulation.main(iuh_pars, id & "-Iuh"));
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +010078
79 f_HNBGW_ConnHdlr_init_vty();
Pau Espin Pedrola6bbb8c2021-11-24 17:00:03 +010080
81 /* Connect to HNB on LLSK and do HELLO ping-pong */
82 f_start_hnbllif(LLSK, id & "-LLSK", g_pars.hnbllif_sk_path, g_llsk_conn_id);
83}
84
85
86function f_start_hnbllif(HNBLLIF_CODEC_PT pt, charstring id, charstring hnbllif_sk_path, out integer hnbllif_conn_id) {
87 timer T := 2.0;
88 var HNBLLIF_send_data sd;
89 var HNBLLIF_Message last_hello_cnf;
90 if (hnbllif_sk_path == "") {
91 hnbllif_conn_id := -1;
92 return;
93 }
94 hnbllif_conn_id := f_hnbllif_connect(pt, hnbllif_sk_path);
95
96 T.start;
97 pt.send(t_SD_HNBLLIF(hnbllif_conn_id, ts_HNBLLIF_CTL_HELLO_REQ(HNBLL_IF_SAPI_CTL, HNBLLIF_Types.mp_hnbllif_version)));
98 alt {
99 [] as_hnbllif_hello_cnf(pt, hnbllif_conn_id, last_hello_cnf, HNBLL_IF_SAPI_CTL, HNBLLIF_Types.mp_hnbllif_version);
100 [] T.timeout {
101 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Timeout waiting for HNBLLIF HELLO.REQ SAPI=CTL");
102 }
103 }
104 pt.send(t_SD_HNBLLIF(hnbllif_conn_id, ts_HNBLLIF_CTL_HELLO_REQ(HNBLL_IF_SAPI_IUH, 0)));
105 alt {
106 [] as_hnbllif_hello_cnf(pt, hnbllif_conn_id, last_hello_cnf, HNBLL_IF_SAPI_IUH, 0);
107 [] T.timeout {
108 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Timeout waiting for HNBLLIF HELLO.REQ SAPI=IUH");
109 }
110 }
Pau Espin Pedrol32fb54e2021-11-29 16:21:26 +0100111 pt.send(t_SD_HNBLLIF(hnbllif_conn_id, ts_HNBLLIF_CTL_HELLO_REQ(HNBLL_IF_SAPI_AUDIO, 0)));
112 alt {
113 [] as_hnbllif_hello_cnf(pt, hnbllif_conn_id, last_hello_cnf, HNBLL_IF_SAPI_AUDIO, 0);
114 [] T.timeout {
115 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Timeout waiting for HNBLLIF HELLO.REQ SAPI=AUDIO");
116 }
117 }
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +0100118}
119
120type record TestHdlrParams {
Pau Espin Pedrola6bbb8c2021-11-24 17:00:03 +0100121 charstring hnbllif_sk_path, /* "" means don't connect */
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +0100122 charstring hnbgw_addr,
123 charstring hnodeb_addr,
124 integer hnbgw_port,
Pau Espin Pedrol32fb54e2021-11-29 16:21:26 +0100125 integer hnbgw_rtp_port,
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +0100126 uint16_t rnc_id,
127 charstring hNB_Identity_Info,
Pau Espin Pedrola6bbb8c2021-11-24 17:00:03 +0100128 uint16_t mcc,
129 uint16_t mnc,
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +0100130 uint32_t cell_identity,
131 uint16_t lac,
132 uint8_t rac,
133 uint8_t sac
134};
135
136/* Note: Do not use valueof() to get a value of this template, use
137 * f_gen_test_hdlr_pars() instead in order to get a configuration. */
138template (value) TestHdlrParams t_def_TestHdlrPars := {
Pau Espin Pedrola6bbb8c2021-11-24 17:00:03 +0100139 hnbllif_sk_path := HNBLL_SOCK_DEFAULT,
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +0100140 hnbgw_addr := "127.0.0.1",
141 hnodeb_addr := "127.0.0.1",
142 hnbgw_port := 29169,
Pau Espin Pedrol32fb54e2021-11-29 16:21:26 +0100143 hnbgw_rtp_port := 9000,
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +0100144 rnc_id := 23,
145 hNB_Identity_Info := "OsmoHNodeB",
Pau Espin Pedrola6bbb8c2021-11-24 17:00:03 +0100146 mcc := 1,
147 mnc := 1,
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +0100148 cell_identity := 1,
149 lac := 2,
150 rac := 3,
151 sac := 4
152}
153
Pau Espin Pedrola6bbb8c2021-11-24 17:00:03 +0100154/* HNBLLIF socket may at any time receive a new INFO.ind */
155altstep as_hnbllif_hello_cnf(HNBLLIF_CODEC_PT pt, integer hnbllif_conn_id,
156 out HNBLLIF_Message last_hello_cnf,
157 template (present) HNBLLIF_Sapi exp_sapi := ?,
158 template (present) uint16_t exp_version := ?) {
159 var HNBLLIF_send_data sd;
160 [] pt.receive(t_SD_HNBLLIF(hnbllif_conn_id, tr_HNBLLIF_CTL_HELLO_CNF(exp_sapi, exp_version))) -> value sd {
161 last_hello_cnf := sd.data;
162 }
163 [] pt.receive(t_SD_HNBLLIF(hnbllif_conn_id, tr_HNBLLIF_CTL_HELLO_CNF(?))) -> value sd {
164 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Invalid API_VERSION received");
165 }
166}
167
168function f_llsk_rx(template (present) HNBLLIF_Message exp_tmpl) runs on HNBGW_ConnHdlr
169return template (present) HNBLLIF_send_data {
170 return t_SD_HNBLLIF(g_llsk_conn_id, exp_tmpl);
171}
172
173function f_llsk_tx(template (value) HNBLLIF_Message tx_msg) runs on HNBGW_ConnHdlr
174return template (value) HNBLLIF_send_data {
175 return ts_SD_HNBLLIF(g_llsk_conn_id, tx_msg);
176}
177
178function f_enc_mcc_mnc(uint16_t mcc_uint, uint16_t mnc_uint) return OCT3 {
179 var hexstring mnc;
180 var hexstring mcc := int2hex(mcc_uint, 3);
181
182 if (mnc_uint < 100) {
183 mnc := int2hex(mnc_uint, 2);
184 return hex2oct(mcc[1] & mcc[0] & 'F'H & mcc[2] & mnc[1] & mnc[0]);
185 } else {
186 mnc := int2hex(mnc_uint, 3);
187 return hex2oct(mcc[1] & mcc[0] & mnc[2] & mcc[2] & mnc[1] & mnc[0]);
188 }
189}
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +0100190
191function f_handle_hnbap_hnb_register_req()
192runs on HNBGW_ConnHdlr {
193 HNBAP.receive(tr_HNBAP_HNBRegisterRequest(char2oct(g_pars.hNB_Identity_Info),
Pau Espin Pedrola6bbb8c2021-11-24 17:00:03 +0100194 f_enc_mcc_mnc(g_pars.mcc, g_pars.mnc),
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +0100195 int2bit(g_pars.cell_identity, 28),
196 int2oct(g_pars.lac, 2),
197 int2oct(g_pars.rac, 1),
198 int2oct(g_pars.sac, 2)
199 ));
200 HNBAP.send(ts_HNBAP_HNBRegisterAccept(g_pars.rnc_id));
201}
202
Pau Espin Pedrol32fb54e2021-11-29 16:21:26 +0100203/* Initialize and start the RTP emulation component for a ConnHdlr */
204function f_HNBGW_rtpem_activate(inout octetstring payload,
205 HostName remote_host,
206 PortNumber remote_port,
207 RtpemConfig cfg := c_RtpemDefaultCfg,
208 RtpemMode mode := RTPEM_MODE_BIDIR)
209runs on HNBGW_ConnHdlr {
210 /* Step 0: initialize, connect and start the emulation component */
211 vc_RTPEM := RTP_Emulation_CT.create(testcasename() & "-RTPEM");
212 map(vc_RTPEM:RTP, system:RTP);
213 map(vc_RTPEM:RTCP, system:RTCP);
214 connect(vc_RTPEM:CTRL, self:RTPEM_CTRL);
215 connect(vc_RTPEM:DATA, self:RTPEM_DATA);
216 vc_RTPEM.start(RTP_Emulation.f_main());
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +0100217
Pau Espin Pedrol32fb54e2021-11-29 16:21:26 +0100218 /* Configure the RTP parameters (TCH/FS). TODO: IuUP */
219 var integer payload_len := 33;
220 var octetstring hdr := 'D0'O;
221
222 /* Pad the payload to conform the expected length */
223 payload := f_pad_oct(hdr & payload, payload_len, '00'O);
224 cfg.tx_fixed_payload := payload;
225 f_rtpem_configure(RTPEM_CTRL, cfg);
226
227 /* Bind the RTP emulation to the configured address */
228 f_rtpem_bind(RTPEM_CTRL, g_pars.hnbgw_addr, g_pars.hnbgw_rtp_port);
229
230 /* Connect to the IUT's address/port parsed from CRCX ACK */
231 f_rtpem_connect(RTPEM_CTRL, remote_host, remote_port);
232
233 /* Set the given RTP emulation mode */
234 f_rtpem_mode(RTPEM_CTRL, mode);
235}
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +0100236
237}