module Osmocom_Types {
	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 record Arfcn {
		boolean		pcs,
		uint15_t	arfcn
	} with { variant "" };

	/* return random integer between 0 and max */
	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 := 15) 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(255), 1);
		}
		return ret;
	}

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

	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;
	}

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