module BSC_ConnectionHandler {

/* BSC Connection Handler of SMLC Tests in TTCN-3
 * (C) 2020 sysmocom - s.f.m.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 SCCPasp_Types all;
import from BSSAP_Types all;
import from BSSAP_CodecPort all;
import from RAN_Emulation all;
import from BSSMAP_Templates all;
import from BSSAP_LE_Emulation all;
import from BSSAP_LE_Types all;
import from BSSMAP_LE_Templates all;

import from TELNETasp_PortType all;
import from Osmocom_VTY_Functions all;

/* this component represents a single subscriber connection at the SMLC. */
type component BSC_ConnHdlr extends BSSAP_LE_ConnHdlr {
	/* SCCP Connecction Identifier for the underlying SCCP connection */
	var integer g_sccp_conn_id;

	port TELNETasp_PT SMLCVTY;

	var TestHdlrParams g_pars;

	var charstring host_bsc := "127.0.0.4";

	var boolean g_vty_initialized := false;
}

function f_BscConnHdlr_init_vty() runs on BSC_ConnHdlr {
	if (not g_vty_initialized) {
		map(self:SMLCVTY, system:SMLCVTY);
		f_vty_set_prompts(SMLCVTY);
		f_vty_transceive(SMLCVTY, "enable");
		g_vty_initialized := true;
	}
}

/* initialize all parameters */
function f_BscConnHdlr_init() runs on BSC_ConnHdlr {
	f_BscConnHdlr_init_vty();
}

/* Callback function from general BSSAP_LE_Emulation whenever a connectionless
 * BSSAP_LE message arrives.  Can return a PDU_BSSAP_LE that should be sent in return */
private function BSSAP_LE_UnitdataCallback(PDU_BSSAP_LE bssap)
runs on BSSAP_LE_Emulation_CT return template PDU_BSSAP_LE {
	var template PDU_BSSAP_LE resp := omit;

	/* answer all RESET with a RESET ACK */
	if (match(bssap, tr_BSSMAP_LE_Reset)) {
		resp := ts_BSSMAP_LE_ResetAck;
	}

	return resp;
}

const BssapLeOps BSC_BssapLeOps := {
	create_cb := refers(BSSAP_LE_Emulation.ExpectedCreateCallback),
	unitdata_cb := refers(BSSAP_LE_UnitdataCallback),
	decode_dtap := false,
	role_ms := false,
	sccp_addr_local := omit,
	sccp_addr_peer := omit
}
type record TestHdlrParams {
	hexstring imsi,
	integer bssap_le_idx,
	SCCP_PAR_Address sccp_addr_bsc optional,
	SCCP_PAR_Address sccp_addr_smlc optional
};

/* 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 that is
 * matched to the current test situation (aoip vs. sccplite) */
template (value) TestHdlrParams t_def_TestHdlrPars := {
	imsi := '001019876543210'H,
	bssap_le_idx := 0,
	sccp_addr_bsc := omit,
	sccp_addr_smlc := omit
}

}