blob: e256963a9b16829a224f8709b1ac491b654057a8 [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
Vadim Yanitskiy47b32462023-05-18 18:58:40 +07004 * (C) 2021 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +01005 * 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 Pedrol9e183722021-12-02 20:12:25 +010037import from GTP_Emulation all;
Pau Espin Pedrol4b090c92024-02-29 19:47:07 +010038import from GTPv1U_Templates all;
39import from GTPv1U_CodecPort all;
Pau Espin Pedrol9e183722021-12-02 20:12:25 +010040import from GTPU_Types all;
41
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +010042/* this component represents a single Iuh connection at the HNBGW. */
Harald Weltecb3e2d72022-01-10 19:14:28 +010043type component HNBGW_ConnHdlr extends Iuh_ConnHdlr, GTP_ConnHdlr, StatsD_ConnHdlr {
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +010044 port TELNETasp_PT HNBVTY;
Pau Espin Pedrola6bbb8c2021-11-24 17:00:03 +010045 /* HNBLLIF Interface of HNodeB */
46 port HNBLLIF_CODEC_PT LLSK;
47 var integer g_llsk_conn_id;
48
Pau Espin Pedrol32fb54e2021-11-29 16:21:26 +010049 var RTP_Emulation_CT vc_RTPEM;
50 port RTPEM_CTRL_PT RTPEM_CTRL;
51 port RTPEM_DATA_PT RTPEM_DATA;
Pau Espin Pedrol9e183722021-12-02 20:12:25 +010052
53 var GTP_Emulation_CT vc_GTP;
54
55
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +010056 var TestHdlrParams g_pars;
57
58 var boolean g_vty_initialized := false;
59}
60
61function f_HNBGW_ConnHdlr_init_vty() runs on HNBGW_ConnHdlr {
62 if (not g_vty_initialized) {
63 map(self:HNBVTY, system:HNBVTY);
64 f_vty_set_prompts(HNBVTY);
65 f_vty_transceive(HNBVTY, "enable");
66 g_vty_initialized := true;
67 }
68}
69
Pau Espin Pedrol9e183722021-12-02 20:12:25 +010070private function f_HNBGW_ConnHdlr_init_iuh(charstring id) runs on HNBGW_ConnHdlr {
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +010071 var Iuh_Emulation_CT vc_Iuh;
Pau Espin Pedrol637beab2021-12-20 12:45:09 +010072 vc_Iuh := Iuh_Emulation_CT.create(id & "-HNBGW") alive;
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +010073 connect(self:HNBAP, vc_Iuh:HNBAP);
74 connect(self:RUA, vc_Iuh:RUA);
75
76 var Iuh_conn_parameters iuh_pars;
77 iuh_pars.remote_ip := g_pars.hnodeb_addr;
78 iuh_pars.remote_sctp_port := -1;
79 iuh_pars.local_ip := g_pars.hnbgw_addr;
80 iuh_pars.local_sctp_port := g_pars.hnbgw_port;
Pau Espin Pedrola6bbb8c2021-11-24 17:00:03 +010081 vc_Iuh.start(Iuh_Emulation.main(iuh_pars, id & "-Iuh"));
Pau Espin Pedrol9e183722021-12-02 20:12:25 +010082}
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +010083
Pau Espin Pedrol9e183722021-12-02 20:12:25 +010084private function f_HNBGW_ConnHdlr_init_gtp(charstring id) runs on HNBGW_ConnHdlr {
85 id := id & "-GTP";
86
87 var GtpEmulationCfg gtp_cfg := {
88 gtpc_bind_ip := g_pars.hnbgw_addr,
89 gtpc_bind_port := GTP1C_PORT,
90 gtpu_bind_ip := g_pars.hnbgw_addr,
91 gtpu_bind_port := GTP1U_PORT,
92 sgsn_role := false
93 };
94
Pau Espin Pedrol637beab2021-12-20 12:45:09 +010095 vc_GTP := GTP_Emulation_CT.create(id) alive;
Pau Espin Pedrol9e183722021-12-02 20:12:25 +010096 connect(self:GTP, vc_GTP:CLIENT);
97 connect(self:GTP_PROC, vc_GTP:CLIENT_PROC);
98 vc_GTP.start(GTP_Emulation.main(gtp_cfg));
99}
100
101/* initialize all parameters */
102function f_HNBGW_ConnHdlr_init(charstring id, TestHdlrParams pars) runs on HNBGW_ConnHdlr {
103 g_pars := valueof(pars);
104 f_HNBGW_ConnHdlr_init_iuh(id);
105 f_HNBGW_ConnHdlr_init_gtp(id);
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +0100106 f_HNBGW_ConnHdlr_init_vty();
Pau Espin Pedrola6bbb8c2021-11-24 17:00:03 +0100107
108 /* Connect to HNB on LLSK and do HELLO ping-pong */
Pau Espin Pedrol85e18532022-06-09 11:49:33 +0200109 f_start_hnbllif(LLSK, id & "-LLSK", g_pars, g_llsk_conn_id);
Pau Espin Pedrola6bbb8c2021-11-24 17:00:03 +0100110}
111
112
Pau Espin Pedrol85e18532022-06-09 11:49:33 +0200113function f_start_hnbllif(HNBLLIF_CODEC_PT pt, charstring id, TestHdlrParams pars,
114 out integer hnbllif_conn_id) {
Pau Espin Pedrola6bbb8c2021-11-24 17:00:03 +0100115 timer T := 2.0;
116 var HNBLLIF_send_data sd;
117 var HNBLLIF_Message last_hello_cnf;
Pau Espin Pedrol85e18532022-06-09 11:49:33 +0200118 if (pars.hnbllif_sk_path == "") {
Pau Espin Pedrola6bbb8c2021-11-24 17:00:03 +0100119 hnbllif_conn_id := -1;
120 return;
121 }
Pau Espin Pedrol85e18532022-06-09 11:49:33 +0200122 hnbllif_conn_id := f_hnbllif_connect(pt, pars.hnbllif_sk_path);
Pau Espin Pedrola6bbb8c2021-11-24 17:00:03 +0100123
124 T.start;
125 pt.send(t_SD_HNBLLIF(hnbllif_conn_id, ts_HNBLLIF_CTL_HELLO_REQ(HNBLL_IF_SAPI_CTL, HNBLLIF_Types.mp_hnbllif_version)));
126 alt {
127 [] as_hnbllif_hello_cnf(pt, hnbllif_conn_id, last_hello_cnf, HNBLL_IF_SAPI_CTL, HNBLLIF_Types.mp_hnbllif_version);
128 [] T.timeout {
129 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Timeout waiting for HNBLLIF HELLO.REQ SAPI=CTL");
130 }
131 }
Pau Espin Pedrol85e18532022-06-09 11:49:33 +0200132 pt.send(t_SD_HNBLLIF(hnbllif_conn_id, ts_HNBLLIF_CTL_HELLO_REQ(HNBLL_IF_SAPI_IUH, pars.hnbllif_sapi_iuh_version)));
Pau Espin Pedrola6bbb8c2021-11-24 17:00:03 +0100133 alt {
Pau Espin Pedrol85e18532022-06-09 11:49:33 +0200134 [] as_hnbllif_hello_cnf(pt, hnbllif_conn_id, last_hello_cnf, HNBLL_IF_SAPI_IUH, pars.hnbllif_sapi_iuh_version);
Pau Espin Pedrola6bbb8c2021-11-24 17:00:03 +0100135 [] T.timeout {
136 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Timeout waiting for HNBLLIF HELLO.REQ SAPI=IUH");
137 }
138 }
Pau Espin Pedrol85e18532022-06-09 11:49:33 +0200139 pt.send(t_SD_HNBLLIF(hnbllif_conn_id, ts_HNBLLIF_CTL_HELLO_REQ(HNBLL_IF_SAPI_AUDIO, pars.hnbllif_sapi_audio_version)));
Pau Espin Pedrol32fb54e2021-11-29 16:21:26 +0100140 alt {
Pau Espin Pedrol85e18532022-06-09 11:49:33 +0200141 [] as_hnbllif_hello_cnf(pt, hnbllif_conn_id, last_hello_cnf, HNBLL_IF_SAPI_AUDIO, pars.hnbllif_sapi_audio_version);
Pau Espin Pedrol32fb54e2021-11-29 16:21:26 +0100142 [] T.timeout {
143 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Timeout waiting for HNBLLIF HELLO.REQ SAPI=AUDIO");
144 }
145 }
Pau Espin Pedrol85e18532022-06-09 11:49:33 +0200146 pt.send(t_SD_HNBLLIF(hnbllif_conn_id, ts_HNBLLIF_CTL_HELLO_REQ(HNBLL_IF_SAPI_GTP, pars.hnbllif_sapi_gtp_version)));
Pau Espin Pedrol9e183722021-12-02 20:12:25 +0100147 alt {
Pau Espin Pedrol85e18532022-06-09 11:49:33 +0200148 [] as_hnbllif_hello_cnf(pt, hnbllif_conn_id, last_hello_cnf, HNBLL_IF_SAPI_GTP, pars.hnbllif_sapi_gtp_version);
Pau Espin Pedrol9e183722021-12-02 20:12:25 +0100149 [] T.timeout {
150 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Timeout waiting for HNBLLIF HELLO.REQ SAPI=GTP");
151 }
152 }
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +0100153}
154
155type record TestHdlrParams {
Pau Espin Pedrola6bbb8c2021-11-24 17:00:03 +0100156 charstring hnbllif_sk_path, /* "" means don't connect */
Pau Espin Pedrol85e18532022-06-09 11:49:33 +0200157 uint16_t hnbllif_sapi_iuh_version,
158 uint16_t hnbllif_sapi_gtp_version,
159 uint16_t hnbllif_sapi_audio_version,
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +0100160 charstring hnbgw_addr,
161 charstring hnodeb_addr,
162 integer hnbgw_port,
Pau Espin Pedrol32fb54e2021-11-29 16:21:26 +0100163 integer hnbgw_rtp_port,
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +0100164 uint16_t rnc_id,
165 charstring hNB_Identity_Info,
Pau Espin Pedrola6bbb8c2021-11-24 17:00:03 +0100166 uint16_t mcc,
167 uint16_t mnc,
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +0100168 uint32_t cell_identity,
169 uint16_t lac,
170 uint8_t rac,
171 uint8_t sac
172};
173
174/* Note: Do not use valueof() to get a value of this template, use
175 * f_gen_test_hdlr_pars() instead in order to get a configuration. */
176template (value) TestHdlrParams t_def_TestHdlrPars := {
Pau Espin Pedrola6bbb8c2021-11-24 17:00:03 +0100177 hnbllif_sk_path := HNBLL_SOCK_DEFAULT,
Pau Espin Pedrol85e18532022-06-09 11:49:33 +0200178 hnbllif_sapi_iuh_version := 0,
179 hnbllif_sapi_gtp_version := 0,
Pau Espin Pedrol47590742022-06-09 11:52:21 +0200180 hnbllif_sapi_audio_version := 1,
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +0100181 hnbgw_addr := "127.0.0.1",
182 hnodeb_addr := "127.0.0.1",
183 hnbgw_port := 29169,
Pau Espin Pedrol32fb54e2021-11-29 16:21:26 +0100184 hnbgw_rtp_port := 9000,
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +0100185 rnc_id := 23,
186 hNB_Identity_Info := "OsmoHNodeB",
Pau Espin Pedrola6bbb8c2021-11-24 17:00:03 +0100187 mcc := 1,
188 mnc := 1,
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +0100189 cell_identity := 1,
190 lac := 2,
191 rac := 3,
192 sac := 4
193}
194
Pau Espin Pedrol4b090c92024-02-29 19:47:07 +0100195template (value) Gtp1uPeer ts_GtpPeerU(charstring ip) := {
Pau Espin Pedrol9e183722021-12-02 20:12:25 +0100196 connId := 1,
197 remName := ip,
198 remPort := GTP1U_PORT
199}
200
201function f_gtpu_send(uint32_t tei, octetstring payload) runs on HNBGW_ConnHdlr {
Pau Espin Pedrol4b090c92024-02-29 19:47:07 +0100202 var Gtp1uPeer peer := valueof(ts_GtpPeerU(g_pars.hnodeb_addr));
Pau Espin Pedrol9e183722021-12-02 20:12:25 +0100203 GTP.send(ts_GTP1U_GPDU(peer, 0 /*seq*/, int2oct(tei, 4), payload));
204}
205
Pau Espin Pedrola6bbb8c2021-11-24 17:00:03 +0100206/* HNBLLIF socket may at any time receive a new INFO.ind */
207altstep as_hnbllif_hello_cnf(HNBLLIF_CODEC_PT pt, integer hnbllif_conn_id,
208 out HNBLLIF_Message last_hello_cnf,
209 template (present) HNBLLIF_Sapi exp_sapi := ?,
210 template (present) uint16_t exp_version := ?) {
211 var HNBLLIF_send_data sd;
212 [] pt.receive(t_SD_HNBLLIF(hnbllif_conn_id, tr_HNBLLIF_CTL_HELLO_CNF(exp_sapi, exp_version))) -> value sd {
213 last_hello_cnf := sd.data;
214 }
215 [] pt.receive(t_SD_HNBLLIF(hnbllif_conn_id, tr_HNBLLIF_CTL_HELLO_CNF(?))) -> value sd {
216 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Invalid API_VERSION received");
217 }
218}
219
220function f_llsk_rx(template (present) HNBLLIF_Message exp_tmpl) runs on HNBGW_ConnHdlr
221return template (present) HNBLLIF_send_data {
222 return t_SD_HNBLLIF(g_llsk_conn_id, exp_tmpl);
223}
224
225function f_llsk_tx(template (value) HNBLLIF_Message tx_msg) runs on HNBGW_ConnHdlr
226return template (value) HNBLLIF_send_data {
227 return ts_SD_HNBLLIF(g_llsk_conn_id, tx_msg);
228}
229
230function f_enc_mcc_mnc(uint16_t mcc_uint, uint16_t mnc_uint) return OCT3 {
231 var hexstring mnc;
232 var hexstring mcc := int2hex(mcc_uint, 3);
233
234 if (mnc_uint < 100) {
235 mnc := int2hex(mnc_uint, 2);
236 return hex2oct(mcc[1] & mcc[0] & 'F'H & mcc[2] & mnc[1] & mnc[0]);
237 } else {
238 mnc := int2hex(mnc_uint, 3);
239 return hex2oct(mcc[1] & mcc[0] & mnc[2] & mcc[2] & mnc[1] & mnc[0]);
240 }
241}
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +0100242
243function f_handle_hnbap_hnb_register_req()
244runs on HNBGW_ConnHdlr {
245 HNBAP.receive(tr_HNBAP_HNBRegisterRequest(char2oct(g_pars.hNB_Identity_Info),
Pau Espin Pedrola6bbb8c2021-11-24 17:00:03 +0100246 f_enc_mcc_mnc(g_pars.mcc, g_pars.mnc),
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +0100247 int2bit(g_pars.cell_identity, 28),
248 int2oct(g_pars.lac, 2),
249 int2oct(g_pars.rac, 1),
250 int2oct(g_pars.sac, 2)
251 ));
252 HNBAP.send(ts_HNBAP_HNBRegisterAccept(g_pars.rnc_id));
253}
254
Pau Espin Pedrol32fb54e2021-11-29 16:21:26 +0100255/* Initialize and start the RTP emulation component for a ConnHdlr */
Pau Espin Pedrol58a69df2021-12-21 14:48:23 +0100256function f_HNBGW_rtpem_activate(inout octetstring payload)
Pau Espin Pedrol32fb54e2021-11-29 16:21:26 +0100257runs on HNBGW_ConnHdlr {
Pau Espin Pedrol58a69df2021-12-21 14:48:23 +0100258 /* Initialize, connect and start the emulation component */
259 var RtpemConfig cfg := c_RtpemDefaultCfg;
260 cfg.iuup_mode := true;
Pau Espin Pedrol6ed76302022-05-25 18:09:37 +0200261 cfg.iuup_cfg.active_init := false;
Philipp Maierbbe454d2023-03-28 15:31:57 +0200262 cfg.tx_payloads[0].payload_type := 96;
263 cfg.rx_payloads[0].payload_type := 96;
Pau Espin Pedrol58a69df2021-12-21 14:48:23 +0100264
Pau Espin Pedrol637beab2021-12-20 12:45:09 +0100265 vc_RTPEM := RTP_Emulation_CT.create(testcasename() & "-RTPEM") alive;
Pau Espin Pedrol32fb54e2021-11-29 16:21:26 +0100266 map(vc_RTPEM:RTP, system:RTP);
267 map(vc_RTPEM:RTCP, system:RTCP);
268 connect(vc_RTPEM:CTRL, self:RTPEM_CTRL);
269 connect(vc_RTPEM:DATA, self:RTPEM_DATA);
270 vc_RTPEM.start(RTP_Emulation.f_main());
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +0100271
Pau Espin Pedrol32fb54e2021-11-29 16:21:26 +0100272 /* Configure the RTP parameters (TCH/FS). TODO: IuUP */
273 var integer payload_len := 33;
274 var octetstring hdr := 'D0'O;
275
276 /* Pad the payload to conform the expected length */
277 payload := f_pad_oct(hdr & payload, payload_len, '00'O);
Philipp Maierbbe454d2023-03-28 15:31:57 +0200278 cfg.tx_payloads[0].fixed_payload := payload;
Pau Espin Pedrol32fb54e2021-11-29 16:21:26 +0100279 f_rtpem_configure(RTPEM_CTRL, cfg);
280
281 /* Bind the RTP emulation to the configured address */
282 f_rtpem_bind(RTPEM_CTRL, g_pars.hnbgw_addr, g_pars.hnbgw_rtp_port);
283
Pau Espin Pedrol32fb54e2021-11-29 16:21:26 +0100284 /* Set the given RTP emulation mode */
Pau Espin Pedrol58a69df2021-12-21 14:48:23 +0100285 f_rtpem_mode(RTPEM_CTRL, RTPEM_MODE_RXONLY);
286}
287
288function f_HNBGW_rtpem_connect(HostName remote_host, PortNumber remote_port)
289runs on HNBGW_ConnHdlr {
290 f_rtpem_connect(RTPEM_CTRL, remote_host, remote_port);
291 /* Set the given RTP emulation mode */
292 f_rtpem_mode(RTPEM_CTRL, RTPEM_MODE_BIDIR);
Pau Espin Pedrol32fb54e2021-11-29 16:21:26 +0100293}
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +0100294
295}