hnb: Introduce HNB_Tests testsuite

A new Iuh CodecPort + Emulation is introduced to (de)mux RANAP and RUA
in the same SCTP socket.
The Iuh_CodecPort.ttcn file has currently a hack to be able to test
HNBAP, since titan seem to be reporting sinfo_ppid=0 when in fact it
received sinfo_ppid=20 (HNBAP).

A couple tests are added to validate HNBAP HNBRegister Request  + Accept
or Reject. In current osmo-hnodeb state, both tests pass if run
separately, but fail if run sequentially since osmo-hnodeb still doesn't
re-connect properly after first test finishes and connection is dropped.

Related: SYS#5516
Change-Id: I7227917148e98a2c777f4b05d8d2eca6e9c121b7
diff --git a/hnodeb/HNBGW_ConnectionHandler.ttcn b/hnodeb/HNBGW_ConnectionHandler.ttcn
new file mode 100644
index 0000000..071e3e8
--- /dev/null
+++ b/hnodeb/HNBGW_ConnectionHandler.ttcn
@@ -0,0 +1,112 @@
+module HNBGW_ConnectionHandler {
+
+/* HNBGW Connection Handler of HNB_Tests in TTCN-3
+ * (C) 2021 by sysmocom - s.m.f.c. GmbH <info@sysmocom.de>
+ * All rights reserved.
+ *
+ * Released under the terms of GNU General Public License, Version 2 or
+ * (at your option) any later version.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+import from Misc_Helpers all;
+import from General_Types all;
+import from Osmocom_Types all;
+import from IPL4asp_Types all;
+import from Native_Functions all;
+
+import from SDP_Types all;
+
+import from StatsD_Checker all;
+
+import from TELNETasp_PortType all;
+import from Osmocom_VTY_Functions all;
+
+import from HNBAP_Templates all;
+
+import from Iuh_Emulation all;
+
+/* this component represents a single Iuh connection at the HNBGW. */
+type component HNBGW_ConnHdlr extends StatsD_ConnHdlr {
+	port TELNETasp_PT HNBVTY;
+	port HNBAP_PT HNBAP;
+	port RUA_PT RUA;
+	var TestHdlrParams g_pars;
+
+	var boolean g_vty_initialized := false;
+}
+
+function f_HNBGW_ConnHdlr_init_vty() runs on HNBGW_ConnHdlr {
+	if (not g_vty_initialized) {
+		map(self:HNBVTY, system:HNBVTY);
+		f_vty_set_prompts(HNBVTY);
+		f_vty_transceive(HNBVTY, "enable");
+		g_vty_initialized := true;
+	}
+}
+
+/* initialize all parameters */
+function f_HNBGW_ConnHdlr_init(TestHdlrParams pars) runs on HNBGW_ConnHdlr {
+	var integer i := 0;
+	var Iuh_Emulation_CT vc_Iuh;
+
+	g_pars := valueof(pars);
+	vc_Iuh := Iuh_Emulation_CT.create("HNBGW" & int2str(i));
+	connect(self:HNBAP, vc_Iuh:HNBAP);
+	connect(self:RUA, vc_Iuh:RUA);
+
+	var Iuh_conn_parameters iuh_pars;
+	iuh_pars.remote_ip := g_pars.hnodeb_addr;
+	iuh_pars.remote_sctp_port := -1;
+	iuh_pars.local_ip := g_pars.hnbgw_addr;
+	iuh_pars.local_sctp_port  := g_pars.hnbgw_port;
+	vc_Iuh.start(Iuh_Emulation.main(iuh_pars, "Iuh" & int2str(i)));
+
+	f_HNBGW_ConnHdlr_init_vty();
+}
+
+type record TestHdlrParams {
+	charstring hnbgw_addr,
+	charstring hnodeb_addr,
+	integer hnbgw_port,
+	uint16_t rnc_id,
+	charstring hNB_Identity_Info,
+	OCT3 plmnid,
+	uint32_t cell_identity,
+	uint16_t lac,
+	uint8_t rac,
+	uint8_t sac
+};
+
+/* Note: Do not use valueof() to get a value of this template, use
+ * f_gen_test_hdlr_pars() instead in order to get a configuration. */
+template (value) TestHdlrParams t_def_TestHdlrPars := {
+	hnbgw_addr := "127.0.0.1",
+	hnodeb_addr := "127.0.0.1",
+	hnbgw_port := 29169,
+	rnc_id := 23,
+	hNB_Identity_Info := "OsmoHNodeB",
+	plmnid := '00F110'O,
+	cell_identity := 1,
+	lac := 2,
+	rac := 3,
+	sac := 4
+}
+
+
+function f_handle_hnbap_hnb_register_req()
+runs on HNBGW_ConnHdlr {
+	HNBAP.receive(tr_HNBAP_HNBRegisterRequest(char2oct(g_pars.hNB_Identity_Info),
+						  g_pars.plmnid,
+						  int2bit(g_pars.cell_identity, 28),
+						  int2oct(g_pars.lac, 2),
+						  int2oct(g_pars.rac, 1),
+						  int2oct(g_pars.sac, 2)
+						 ));
+	HNBAP.send(ts_HNBAP_HNBRegisterAccept(g_pars.rnc_id));
+}
+
+
+
+}