/* Osmocom utility type definitions in TTCN-3
 * (C) 2017-2019 Harald Welte <laforge@gnumonks.org>
 * 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
 */

module Osmocom_Types {

import from General_Types all;

type integer uint8_t (0..255) with { variant "unsigned 8 bit" };
type integer uint16_t (0..65535) with { variant "unsigned 16 bit" };
type integer uint24_t (0..16777215) with { variant "unsigned 24 bit" };
type integer uint32_t (0..4294967295) with { variant "unsigned 32 bit" };

type integer int8_t (-128..127) with { variant "8 bit" };
type integer int16_t (-32768..32767) with { variant "16 bit" };

type integer uint1_t (0..1) with { variant "unsigned 1 bit" };
type integer uint2_t (0..3) with { variant "unsigned 2 bit" };
type integer uint3_t (0..7) with { variant "unsigned 3 bit" };
type integer uint4_t (0..15) with { variant "unsigned 4 bit" };
type integer uint5_t (0..31) with { variant "unsigned 5 bit" };
type integer uint6_t (0..63) with { variant "unsigned 6 bit" };
type integer uint7_t (0..127) with { variant "unsigned 7 bit" };
type integer uint9_t (0..511) with { variant "unsigned 9 bit" };
type integer uint10_t (0..1023) with { variant "unsigned 10 bit" };
type integer uint11_t (0..2047) with { variant "unsigned 11 bit" };
type integer uint12_t (0..4095) with { variant "unsigned 12 bit" };
type integer uint13_t (0..8191) with { variant "unsigned 13 bit" };
type integer uint14_t (0..16383) with { variant "unsigned 14 bit" };
type integer uint15_t (0..32767) with { variant "unsigned 15 bit" };
type integer uint40_t (0..1099511627776) with { variant "unsigned 40 bit" };


const uint16_t c_UINT16_MAX := 65535;
const uint32_t c_UINT32_MAX := 4294967295;

/* CSN.1 L/H placeholders */
const BIT1 CSN1_L := '0'B;
const BIT1 CSN1_H := '1'B;

/* based on Linux */
type enumerated AddressFamily {
	AF_UNSPEC	('00'O),
	AF_INET		('02'O),
	AF_INET6	('0a'O)
}

/* like TTCN-3 int2str() but with padding of leading zeroes */
function f_int2str(integer i, integer total_digits) return charstring {
	var charstring istr := int2str(i);
	var charstring padstr := hex2str(int2hex(0, total_digits - lengthof(istr)));
	return padstr & istr;
}

/* return random integer 0 <= ret < max. According to ETSI ES 201 873 C.6.1, rnd() returns *less* than 1, so
	* the returned int will always be ret < max, or ret <= (max-1). */
function f_rnd_int(integer max) return integer {
	return float2int(rnd()*int2float(max));
}

/* return hexstring composed of random digits */
function f_rnd_hexstring(in integer len, in integer max := 16) return hexstring {
	var integer i;
	var hexstring ret := ''H;
	for (i := 0; i < len; i := i + 1) {
		ret := ret & int2hex(f_rnd_int(max), 1);
	}
	return ret;
}

/* return octetstring composed of random bytes */
function f_rnd_octstring(in integer len) return octetstring {
	var integer i;
	var octetstring ret := ''O;
	for (i := 0; i < len; i := i + 1) {
		ret := ret & int2oct(f_rnd_int(256), 1);
	}
	return ret;
}

/* return bitstring composed of random bits */
function f_rnd_bitstring(in integer len) return bitstring {
	var octetstring oct := f_rnd_octstring(len / 8 + 1);
	return substr(oct2bit(oct), 0, len);
}

function f_rnd_imsi(in hexstring prefix) return hexstring {
	return prefix & f_rnd_hexstring(15 - lengthof(prefix), 10);
}

function f_rnd_msisdn(in octetstring prefix, integer len := 6) return octetstring {
	return prefix & f_rnd_octstring(len - lengthof(prefix));
}

function f_sleep(float seconds) {
	timer T := seconds;
	T.start;
	T.timeout;
}

function bool2bit(boolean inp) return BIT1 {
	if (inp) {
		return '1'B;
	} else {
		return '0'B;
	}
}

function bool2bit_tmpl(template boolean inp) return template BIT1 {
	if (istemplatekind(inp, "omit")) {
		return omit;
	} else if (istemplatekind(inp, "*")) {
		return *;
	} else if (istemplatekind(inp, "?")) {
		return ?;
	} else {
		if (valueof(inp)) {
			return '1'B;
		} else {
			return '0'B;
		}
	}
}

type record of integer IntegerRecord;

function int2bool(integer int) return boolean {
	if (int != 0) {
		return true;
	} else {
		return false;
	}
}

function f_array_contains(IntegerRecord arr, integer key) return boolean {
	for (var integer i:= 0; i< sizeof(arr); i := i + 1) {
		if (arr[i] == key) {
		return true;
			}
	}
	return false;
}

/* re-start given timer in a warning-safe way: Stop (only if running) + start */
function f_timer_safe_restart(timer T) {
	if (T.running) {
		T.stop;
	}
	T.start;
}

/* divide two integers and return rounded-up result */
function f_div_round_up(integer dividend, integer divisor) return integer {
	var integer x := dividend / divisor;
	if (dividend rem divisor != 0) {
		x := x+1;
	}
	return x;
}

function imsi_hex2oct(hexstring imsi) return octetstring {
	var hexstring tmp := ''H;
	var octetstring ret;
	var integer i;

	/* swap nibbles and pad with F if insufficient input nibbles */
	for (i := 0; i < lengthof(imsi); i := i+1) {
		if (i+1 < lengthof(imsi)) {
			tmp := tmp & imsi[i+1];
		} else {
			tmp := tmp & 'F'H;
		}
		tmp := tmp & imsi[i];
		i := i+1;
	}
	ret := hex2oct(tmp);
	return ret;
}

function f_pad_oct(octetstring str, integer len, OCT1 pad) return octetstring {
	var integer strlen := lengthof(str);
	for (var integer i := 0; i < len-strlen; i := i+1) {
		str := str & pad;
	}
	return str;
}

function f_pad_bit(bitstring str, integer len, BIT1 pad) return bitstring {
	var integer strlen := lengthof(str);
	for (var integer i := 0; i < len-strlen; i := i+1) {
		str := str & pad;
	}
	return str;
}

function f_pad_bcd_number(hexstring number) return hexstring {
	if (lengthof(number) mod 2 != 0) {
		return number & 'F'H;
	} else {
		return number;
	}
}

/* like L1SAP_IS_PACKET_RACH */
function ra_is_ps(OCT1 ra) return boolean {
	if ((ra and4b 'F0'O == '70'O) and (ra and4b '0F'O != '0F'O)) {
		return true;
	}
	return false;
}

function ra_is_emerg(OCT1 ra) return boolean {
	/* See also: 3GPP TS 04.08, Table 9.9, ra=101xxxxx */
	return (ra and4b 'E0'O == 'A0'O);
}

/* generate a random RACH for circuit-switched */
function f_rnd_ra_cs() return OCT1 {
	var OCT1 ra;
	do {
		ra := f_rnd_octstring(1);
	} while (ra_is_ps(ra) or ra_is_emerg(ra));
	return ra;
}

/* generate a random RACH for emergency */
function f_rnd_ra_emerg() return OCT1 {
	var OCT1 ra;
	do {
		ra := f_rnd_octstring(1);
	} while (not ra_is_emerg(ra));
	return ra;
}

/* generate a random RACH for packet-switched */
function f_rnd_ra_ps() return OCT1 {
	var OCT1 ra;
	do {
		ra := f_rnd_octstring(1);
	} while (not ra_is_ps(ra));
	return ra;
}

/* generate a random 11-bit RA (packet-switched only) */
function f_rnd_ra11_ps() return BIT11 {
	return f_rnd_bitstring(11);
}


private function f_concat_pad(integer tot_len, hexstring prefix, integer suffix) return hexstring {
	var integer suffix_len := tot_len - lengthof(prefix);
	var charstring suffix_ch := int2str(suffix);
	var integer pad_len := suffix_len - lengthof(suffix_ch);

	return prefix & int2hex(0, pad_len) & str2hex(suffix_ch);
}

function f_gen_imei(integer suffix) return hexstring {
	return f_concat_pad(14, '49999'H, suffix);
}

function f_gen_imsi(integer suffix) return hexstring {
	return f_concat_pad(15, '26242'H, suffix);
}

function f_gen_msisdn(integer suffix) return hexstring {
	return f_concat_pad(12, '49123'H, suffix);
}

function f_gen_tmsi(integer suffix, integer nri_v := 0, integer nri_bitlen := 10,
		    OCT4 base_tmsi := '42000023'O) return OCT4 {
	var integer tmsi_int := oct2int(base_tmsi) + suffix;
	var bitstring base_tmsi_bits := int2bit(tmsi_int, 32);
	var bitstring prefix_bits := substr(base_tmsi_bits, 0, 8);
	var bitstring suffix_bits := substr(base_tmsi_bits, 8 + nri_bitlen, 24 - nri_bitlen);
	var bitstring total_bits := prefix_bits & int2bit(nri_v, nri_bitlen) & suffix_bits;
	var OCT4 tmsi := bit2oct(total_bits);

	log("f_gen_tmsi(suffix:=", suffix, ", nri_v:=", nri_v, ", nri_bitlen:=", nri_bitlen,
	    ", base_tmsi:=", base_tmsi, ") -> prefix:=", prefix_bits, ", suffix:=", suffix_bits,
	    ", total_bits:=", total_bits, " == ", tmsi);

	return tmsi;
}

type record of integer ro_integer;

function ro_integer_contains(ro_integer r, integer x) return boolean {
	for (var integer j := 0; j < lengthof(r); j := j+1) {
		if (r[j] == x) {
			return true;
		}
	}
	return false;
}

function ro_integer_add_unique(inout ro_integer roi, integer new_entry)
{
	if (ro_integer_contains(roi, new_entry)) {
		return;
	}
	roi := roi & {new_entry};
}

function ro_integer_del(inout ro_integer roi, integer del_entry)
{
	var ro_integer tmp := {};
	for (var integer j := 0; j < lengthof(roi); j := j+1) {
		if (roi[j] != del_entry) {
			tmp := tmp & { roi[j] };
		}
	}
	roi := tmp;
}

type record of ro_integer roro_integer;



} with { encode "RAW"; variant "FIELDORDER(msb)" }
