module SGSN_Components {
/*
 * Osmocom PCU test suite in TTCN-3, components for BSSGP handlng
 * (C) 2018-2019 Harald Welte <laforge@gnumonks.org>
 * (C) 2020 by 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 BSSGP_Types all;
import from BSSGP_Emulation all;
import from NS_Types all;
import from NS_Emulation all;
import from GPRS_Context all;

modulepar {
	BssgpConfig mp_gb_cfg := {
		nsei := 1234,
		sgsn_role := true,
		bvc := {
			{
				bvci := 1234,
				cell_id := {
					ra_id := {
						lai := {
							mcc_mnc := '262F42'H, lac := 13135
						},
						rac := 0
					},
					cell_id := 20960
				},
				depth := BSSGP_DECODE_DEPTH_BSSGP,
				create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
			}
		}
	};

	NSConfiguration mp_nsconfig := {
		nsei := 2342,
		role_sgsn := true,
		handle_sns := true,
		nsvc := {
			{
				provider := {
					ip := {
						address_family := AF_INET,
						local_udp_port := 23000,
						local_ip := "127.0.0.1",
						remote_udp_port := 21000,
						remote_ip := "127.0.0.1"
					}
				},
				nsvci := 0
			},
			{
				provider := {
					ip := {
						address_family := AF_INET,
						local_udp_port := 23001,
						local_ip := "127.0.0.1",
						remote_udp_port := 21000,
						remote_ip := "127.0.0.1"
					}
				},
				nsvci := 0
			},
			{
				provider := {
					ip := {
						address_family := AF_INET,
						local_udp_port := 23002,
						local_ip := "127.0.0.1",
						remote_udp_port := 21000,
						remote_ip := "127.0.0.1"
					}
				},
				nsvci := 0
			}
		}
	};
}

/* FIXME: merge this into BSSGP_Client_CT ? */
type component bssgp_CT extends BSSGP_Client_CT {
	var NS_CT ns_component;
	var BSSGP_CT bssgp_component;
	port BSSGP_CT_PROC_PT PROC;
	port BSSGP_PT RIM;
	var boolean g_initialized := false;
}

/* FIXME: merge this into BSSGP_Client_CT ? */
function f_init_bssgp() runs on bssgp_CT {
	var MmContext mmctx := {
		imsi := '262420000000001'H,
		tlli := 'FFFFFFFF'O,
		n_u := 0
	};


	if (g_initialized == true) {
		return;
	}
	g_initialized := true;

	/* create a new NS component */
	ns_component := NS_CT.create alive;
	bssgp_component := BSSGP_CT.create alive;
	/* connect lower-end of BSSGP with BSSGP_CODEC_PORT (maps to NS_PT*/
	connect(bssgp_component:BSCP, ns_component:NS_SP);
	connect(self:PROC, bssgp_component:PROC);
	ns_component.start(NSStart(mp_nsconfig));
	bssgp_component.start(BssgpStart(mp_gb_cfg, testcasename()));

	for (var integer i := 0; i < lengthof(mp_gb_cfg.bvc); i := i+1) {
		var BSSGP_BVC_CT vc_BVC;
		/* obtain reference for BVC component (created by BssgpStart) */
		vc_BVC := f_bssgp_get_bvci_ct(mp_gb_cfg.bvc[i].bvci, PROC);
		/* connect our BSSGP port to the BSSGP Emulation */
		connect(self:BSSGP[i], vc_BVC:BSSGP_SP);
		connect(self:BSSGP_SIG[i], vc_BVC:BSSGP_SP_SIG);
		connect(self:BSSGP_PROC[i], vc_BVC:BSSGP_PROC);
		f_bssgp_client_register(mmctx.imsi, mmctx.tlli);
	}
	/* connect RIM related port */
	connect(self:RIM, bssgp_component:RIM);
	connect(self:BSSGP_GLOBAL[0], bssgp_component:GLOBAL);
}

/* Establish BSSGP connection to PCU */
function f_bssgp_establish() runs on BSSGP_Client_CT {
	timer T:= 10.0;

	T.start
	alt {
	[] BSSGP[0].receive(tr_BssgpStsInd(*, ?, BVC_S_UNBLOCKED)) { }
	[] BSSGP[0].receive { repeat; }
	[] T.timeout {
		setverdict(fail, "Timeout establishing BSSGP connection");
		mtc.stop;
		}
	}
	T.stop
	log("BSSGP successfully initialized");
}

}
