module GSUP_Types {

/* GSUP_Types, defining abstract TTCN-3 data types for the GSUP protocol.
 *
 * GSUP is a non-standard protocol used between OsmoMSC/OsmoSGSN and OsmoHLR
 * in order to replace the complex TCAP/MAP protocol.
 *
 * (C) 2017-2019 by Harald Welte <laforge@gnumonks.org>
 * contributions by sysmocom - s.f.m.c. GmbH
 * 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 General_Types all;
import from Osmocom_Types all;

type enumerated GSUP_IEI {
	OSMO_GSUP_IMSI_IE		('01'O),
	OSMO_GSUP_CAUSE_IE		('02'O),
	OSMO_GSUP_AUTH_TUPLE_IE		('03'O),
	OSMO_GSUP_PDP_INFO_COMPL_IE	('04'O),
	OSMO_GSUP_PDP_INFO_IE		('05'O),
	OSMO_GSUP_CANCEL_TYPE_IE	('06'O),
	OSMO_GSUP_FREEZE_PTMSI_IE	('07'O),
	OSMO_GSUP_MSISDN_IE		('08'O),
	OSMO_GSUP_HLR_NUMBER_IE		('09'O),
	OSMO_GSUP_PDP_CONTEXT_ID_IE	('10'O),
	OSMO_GSUP_PDP_TYPE_IE		('11'O),
	OSMO_GSUP_ACCESS_POINT_NAME_IE	('12'O),
	OSMO_GSUP_PDP_QOS_IE		('13'O),
	OSMO_GSUP_CHARG_CHAR_IE		('14'O),

	OSMO_GSUP_RAND_IE		('20'O),
	OSMO_GSUP_SRES_IE		('21'O),
	OSMO_GSUP_KC_IE			('22'O),
	OSMO_GSUP_IK_IE			('23'O),
	OSMO_GSUP_CK_IE			('24'O),
	OSMO_GSUP_AUTN_IE		('25'O),
	OSMO_GSUP_AUTS_IE		('26'O),
	OSMO_GSUP_RES_IE		('27'O),
	OSMO_GSUP_CN_DOMAIN_IE		('28'O),
	OSMO_GSUP_SUPPORTED_RAT_TYPES_IE ('29'O),
	OSMO_GSUP_CURRENT_RAT_TYPE_IE	('2a'O),

	OSMO_GSUP_SESSION_ID_IE		('30'O),
	OSMO_GSUP_SESSION_STATE_IE	('31'O),
	OSMO_GSUP_SS_INFO_IE		('35'O),

	/* SM related IEs (see 3GPP TS 29.002, section 7.6.8) */
	OSMO_GSUP_SM_RP_MR_IE		('40'O),
	OSMO_GSUP_SM_RP_DA_IE		('41'O),
	OSMO_GSUP_SM_RP_OA_IE		('42'O),
	OSMO_GSUP_SM_RP_UI_IE		('43'O),
	OSMO_GSUP_SM_RP_CAUSE_IE	('44'O),
	OSMO_GSUP_SM_RP_MMS_IE		('45'O),
	OSMO_GSUP_SM_ALERT_RSN_IE	('46'O),

	OSMO_GSUP_IMEI_IE		('50'O),
	OSMO_GSUP_IMEI_RESULT_IE	('51'O),
	OSMO_GSUP_NUM_VECTORS_REQ_IE	('52'O),

	OSMO_GSUP_MESSAGE_CLASS_IE		('0a'O),

	OSMO_GSUP_SOURCE_NAME_IE	('60'O),
	OSMO_GSUP_DESTINATION_NAME_IE	('61'O),
	OSMO_GSUP_AN_APDU_IE		('62'O),
	OSMO_GSUP_CAUSE_RR_IE		('63'O),
	OSMO_GSUP_CAUSE_BSSAP_IE	('64'O),
	OSMO_GSUP_CAUSE_SM_IE		('65'O)
} with { variant "FIELDLENGTH(8)" };

type enumerated GSUP_MessageType {
	OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST	('00000100'B),
	OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR	('00000101'B),
	OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT	('00000110'B),

	OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST	('00001000'B),
	OSMO_GSUP_MSGT_SEND_AUTH_INFO_ERROR	('00001001'B),
	OSMO_GSUP_MSGT_SEND_AUTH_INFO_RESULT	('00001010'B),

	OSMO_GSUP_MSGT_AUTH_FAIL_REPORT		('00001011'B),

	OSMO_GSUP_MSGT_PURGE_MS_REQUEST		('00001100'B),
	OSMO_GSUP_MSGT_PURGE_MS_ERROR		('00001101'B),
	OSMO_GSUP_MSGT_PURGE_MS_RESULT		('00001110'B),

	OSMO_GSUP_MSGT_INSERT_DATA_REQUEST	('00010000'B),
	OSMO_GSUP_MSGT_INSERT_DATA_ERROR	('00010001'B),
	OSMO_GSUP_MSGT_INSERT_DATA_RESULT	('00010010'B),

	OSMO_GSUP_MSGT_DELETE_DATA_REQUEST	('00010100'B),
	OSMO_GSUP_MSGT_DELETE_DATA_ERROR	('00010101'B),
	OSMO_GSUP_MSGT_DELETE_DATA_RESULT	('00010110'B),

	OSMO_GSUP_MSGT_LOCATION_CANCEL_REQUEST	('00011100'B),
	OSMO_GSUP_MSGT_LOCATION_CANCEL_ERROR	('00011101'B),
	OSMO_GSUP_MSGT_LOCATION_CANCEL_RESULT	('00011110'B),

	OSMO_GSUP_MSGT_PROC_SS_REQUEST		('00100000'B),
	OSMO_GSUP_MSGT_PROC_SS_ERROR		('00100001'B),
	OSMO_GSUP_MSGT_PROC_SS_RESULT		('00100010'B),

	OSMO_GSUP_MSGT_MO_FORWARD_SM_REQUEST	('00100100'B),
	OSMO_GSUP_MSGT_MO_FORWARD_SM_ERROR	('00100101'B),
	OSMO_GSUP_MSGT_MO_FORWARD_SM_RESULT	('00100110'B),

	OSMO_GSUP_MSGT_MT_FORWARD_SM_REQUEST	('00101000'B),
	OSMO_GSUP_MSGT_MT_FORWARD_SM_ERROR	('00101001'B),
	OSMO_GSUP_MSGT_MT_FORWARD_SM_RESULT	('00101010'B),

	OSMO_GSUP_MSGT_READY_FOR_SM_REQUEST	('00101100'B),
	OSMO_GSUP_MSGT_READY_FOR_SM_ERROR	('00101101'B),
	OSMO_GSUP_MSGT_READY_FOR_SM_RESULT	('00101110'B),

	OSMO_GSUP_MSGT_CHECK_IMEI_REQUEST	('00110000'B),
	OSMO_GSUP_MSGT_CHECK_IMEI_ERROR		('00110001'B),
	OSMO_GSUP_MSGT_CHECK_IMEI_RESULT	('00110010'B),

	OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_REQUEST		('00110100'B),
	OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_ERROR			('00110101'B),
	OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_RESULT		('00110110'B),

	OSMO_GSUP_MSGT_E_PREPARE_SUBSEQUENT_HANDOVER_REQUEST	('00111000'B),
	OSMO_GSUP_MSGT_E_PREPARE_SUBSEQUENT_HANDOVER_ERROR	('00111001'B),
	OSMO_GSUP_MSGT_E_PREPARE_SUBSEQUENT_HANDOVER_RESULT	('00111010'B),

	OSMO_GSUP_MSGT_E_SEND_END_SIGNAL_REQUEST		('00111100'B),
	OSMO_GSUP_MSGT_E_SEND_END_SIGNAL_ERROR			('00111101'B),
	OSMO_GSUP_MSGT_E_SEND_END_SIGNAL_RESULT			('00111110'B),

	OSMO_GSUP_MSGT_E_PROCESS_ACCESS_SIGNALLING_REQUEST	('01000000'B),
	OSMO_GSUP_MSGT_E_FORWARD_ACCESS_SIGNALLING_REQUEST	('01000100'B),

	OSMO_GSUP_MSGT_E_CLOSE					('01000111'B),
	OSMO_GSUP_MSGT_E_ABORT					('01001011'B),

	OSMO_GSUP_MSGT_E_ROUTING_ERROR				('01001110'B),

	OSMO_GSUP_MSGT_EPDG_TUNNEL_REQUEST			('01010000'B),
	OSMO_GSUP_MSGT_EPDG_TUNNEL_ERROR			('01010001'B),
	OSMO_GSUP_MSGT_EPDG_TUNNEL_RESULT			('01010010'B)
} with { variant "FIELDLENGTH(8)" };

type enumerated GSUP_CancelType {
	OSMO_GSUP_CANCEL_TYPE_UPDATE		(0),
	OSMO_GSUP_CANCEL_TYPE_WITHDRAW		(1)
} with { variant "FIELDLENGTH(8)" };

type enumerated GSUP_CnDomain {
	OSMO_GSUP_CN_DOMAIN_PS			(1),
	OSMO_GSUP_CN_DOMAIN_CS			(2)
} with { variant "FIELDLENGTH(8)" };

type enumerated GSUP_IMEIResult {
	OSMO_GSUP_IMEI_RESULT_ACK		(0),
	OSMO_GSUP_IMEI_RESULT_NACK		(1)
} with { variant "FIELDLENGTH(8)" };

type enumerated GSUP_SessionState {
	OSMO_GSUP_SESSION_STATE_NONE		(0),
	OSMO_GSUP_SESSION_STATE_BEGIN		(1),
	OSMO_GSUP_SESSION_STATE_CONTINUE	(2),
	OSMO_GSUP_SESSION_STATE_END		(3)
} with { variant "FIELDLENGTH(8)" };

type enumerated GSUP_Message_Class {
	OSMO_GSUP_MESSAGE_CLASS_UNSET			(0),
	OSMO_GSUP_MESSAGE_CLASS_SUBSCRIBER_MANAGEMENT	(1),
	OSMO_GSUP_MESSAGE_CLASS_SMS			(2),
	OSMO_GSUP_MESSAGE_CLASS_USSD			(3),
	OSMO_GSUP_MESSAGE_CLASS_INTER_MSC		(4)
} with { variant "FIELDLENGTH(8)" };

type record GSUP_MSISDN {
	uint8_t	len,
	hexstring digits optional
} with { variant (len) "LENGTHTO(digits)" };

type record GSUP_IMEI {
	uint8_t	len,
	hexstring digits optional
} with { variant (len) "LENGTHTO(digits)" };

type enumerated GSUP_AN_PROTO {
	OSMO_GSUP_AN_PROTO_48006 (1),
	OSMO_GSUP_AN_PROTO_25413 (2)
} with { variant "FIELDLENGTH(8)" };

type record GSUP_AN_APDU {
	GSUP_AN_PROTO proto,
	octetstring pdu
};

type record GSUP_IE {
	GSUP_IEI	tag,
	uint8_t		len,
	GSUP_IeValue	val
} with { variant (len) "LENGTHTO(val)"
	 variant (val) "CROSSTAG(imsi, tag = OSMO_GSUP_IMSI_IE;
				 cause, tag = OSMO_GSUP_CAUSE_IE;
				 cancel_type, tag = OSMO_GSUP_CANCEL_TYPE_IE;
				 auth_tuple, tag = OSMO_GSUP_AUTH_TUPLE_IE;
				 auts, tag = OSMO_GSUP_AUTS_IE;
				 rand, tag = OSMO_GSUP_RAND_IE;
				 sres, tag = OSMO_GSUP_SRES_IE;
				 kc, tag = OSMO_GSUP_KC_IE;
				 ik, tag = OSMO_GSUP_IK_IE;
				 ck, tag = OSMO_GSUP_CK_IE;
				 autn, tag = OSMO_GSUP_AUTN_IE;
				 res, tag = OSMO_GSUP_RES_IE;
				 msisdn, tag = OSMO_GSUP_MSISDN_IE;
				 hlr_number, tag = OSMO_GSUP_HLR_NUMBER_IE;
				 cn_domain, tag = OSMO_GSUP_CN_DOMAIN_IE;
				 pdp_info, tag = OSMO_GSUP_PDP_INFO_IE;
				 apn, tag = OSMO_GSUP_ACCESS_POINT_NAME_IE;
				 pdp_qos, tag = OSMO_GSUP_PDP_QOS_IE;
				 pdp_type, tag = OSMO_GSUP_PDP_TYPE_IE;
				 charg_char, tag = OSMO_GSUP_CHARG_CHAR_IE;
				 pdp_ctx_id, tag = OSMO_GSUP_PDP_CONTEXT_ID_IE;
				 session_state, tag = OSMO_GSUP_SESSION_STATE_IE;
				 session_id, tag = OSMO_GSUP_SESSION_ID_IE;
				 ss_info, tag = OSMO_GSUP_SS_INFO_IE;
				 sm_rp_mr, tag = OSMO_GSUP_SM_RP_MR_IE;
				 sm_rp_da, tag = OSMO_GSUP_SM_RP_DA_IE;
				 sm_rp_oa, tag = OSMO_GSUP_SM_RP_OA_IE;
				 sm_rp_ui, tag = OSMO_GSUP_SM_RP_UI_IE;
				 sm_rp_cause, tag = OSMO_GSUP_SM_RP_CAUSE_IE;
				 sm_rp_mms, tag = OSMO_GSUP_SM_RP_MMS_IE;
				 sm_alert_rsn, tag = OSMO_GSUP_SM_ALERT_RSN_IE;
				 imei, tag = OSMO_GSUP_IMEI_IE;
				 imei_result, tag = OSMO_GSUP_IMEI_RESULT_IE;
				 num_auth_vectors, tag = OSMO_GSUP_NUM_VECTORS_REQ_IE;
				 message_class, tag = OSMO_GSUP_MESSAGE_CLASS_IE;
				 source_name, tag = OSMO_GSUP_SOURCE_NAME_IE;
				 destination_name, tag = OSMO_GSUP_DESTINATION_NAME_IE;
				 an_apdu, tag = OSMO_GSUP_AN_APDU_IE;
				 cause_rr, tag = OSMO_GSUP_CAUSE_RR_IE;
				 cause_bssap, tag = OSMO_GSUP_CAUSE_BSSAP_IE;
				 cause_sm, tag = OSMO_GSUP_CAUSE_SM_IE;
				 supported_rat_types, tag = OSMO_GSUP_SUPPORTED_RAT_TYPES_IE;
				 current_rat_type, tag = OSMO_GSUP_CURRENT_RAT_TYPE_IE;
			)"
};

type record of GSUP_IE GSUP_IEs;

type enumerated GSUP_RatType {
	RAT_TYPE_UNKNOWN	(0),
	RAT_TYPE_GERAN_A	(1),
	RAT_TYPE_UTRAN_Iu	(2),
	RAT_TYPE_EUTRAN_SGs	(3)
} with { variant "FIELDLENGTH(8)" };

type record of GSUP_RatType GSUP_RatTypes;

type union GSUP_IeValue {
	hexstring	imsi,
	integer		cause,
	GSUP_CancelType	cancel_type,
	//boolean		pdp_info_compl,
	//boolean		freeze_ptmsi,
	GSUP_IEs	auth_tuple,
	octetstring	auts,
	octetstring	rand,
	octetstring	sres,
	octetstring	kc,
	octetstring	ik,
	octetstring	ck,
	octetstring	autn,
	octetstring	res,
	GSUP_MSISDN	msisdn,
	octetstring	hlr_number,
	GSUP_CnDomain	cn_domain,
	/* PDP context + nested IEs */
	GSUP_IEs	pdp_info,
	OCT1		pdp_ctx_id,
	octetstring	apn,
	octetstring	pdp_qos,
	OCT2		pdp_type,
	octetstring	charg_char,
	/* Session information */
	GSUP_SessionState	session_state,
	OCT4			session_id,
	/* Supplementary Services */
	octetstring		ss_info,
	/* Short Message Service */
	OCT1			sm_rp_mr,
	GSUP_SM_RP_DA		sm_rp_da,
	GSUP_SM_RP_OA		sm_rp_oa,
	octetstring		sm_rp_ui,
	OCT1			sm_rp_cause,
	OCT1			sm_rp_mms,
	GSUP_SM_ALERT_RSN_Type	sm_alert_rsn,

	GSUP_IMEI		imei,
	GSUP_IMEIResult		imei_result,
	OCT1			num_auth_vectors,

	GSUP_Message_Class	message_class,

	octetstring		source_name,
	octetstring		destination_name,

	GSUP_AN_APDU		an_apdu,

	OCT1			cause_rr,
	OCT1			cause_bssap,
	OCT1			cause_sm,

	GSUP_RatTypes		supported_rat_types,
	GSUP_RatType		current_rat_type
};

type record GSUP_PDU {
	GSUP_MessageType	msg_type,
	GSUP_IEs		ies
};

type record of GSUP_PDU GSUP_PDUs;

external function enc_GSUP_PDU(in GSUP_PDU msg) return octetstring
	with { extension "prototype(convert) encode(RAW)" };

external function dec_GSUP_PDU(in octetstring msg) return GSUP_PDU
	with { extension "prototype(convert) decode(RAW)" };

function f_gsup_postprocess_decoded(inout GSUP_PDU gsup) {
	if (gsup.ies[0].tag == OSMO_GSUP_IMSI_IE) {
		/* if last digit is 'F', then there's an odd number of digits and we must strip the F */
		var integer num_digits := lengthof(gsup.ies[0].val.imsi);
		if (gsup.ies[0].val.imsi[num_digits-1] == 'F'H) {
			gsup.ies[0].val.imsi := substr(gsup.ies[0].val.imsi, 0, num_digits-1);
		}
	}
}

function f_gsup_preprocess_encoded(inout GSUP_PDU gsup) {
	if (ischosen(gsup.ies[0].val.imsi)) {
		/* if number of digits is odd, add a 'F' as padding at the end */
		var integer num_digits := lengthof(gsup.ies[0].val.imsi);
		if (num_digits rem 2 == 1) {
			gsup.ies[0].val.imsi := gsup.ies[0].val.imsi & 'F'H;
		}
	}
}

template (value) GSUP_MSISDN ts_GSUP_MSISDN(hexstring digits,
					    BIT3 ton := '000'B,
					    BIT4 npi := '0000'B) := {
	len := 0, /* overwritten */
	/* numberingPlanIdentification := npi,
	typeOfNumber := ton,
	ext1 := '0'B, */
	digits := digits
}

template GSUP_MSISDN tr_GSUP_MSISDN(template hexstring digits,
				    template BIT3 ton := ?,
				    template BIT4 npi := ?) := {
	len := ?,
	/* numberingPlanIdentification := npi,
	typeOfNumber := ton,
	ext1 := '0'B, */
	digits := digits
}



template GSUP_IE ts_GSUP_IE_AuthTuple2G(octetstring rand, octetstring sres,
				        octetstring kc) := {
	tag := OSMO_GSUP_AUTH_TUPLE_IE,
	len := 0, /* overwritten */
	val := {
		auth_tuple := {
			valueof(ts_GSUP_IE_RAND(rand)),
			valueof(ts_GSUP_IE_SRES(sres)),
			valueof(ts_GSUP_IE_Kc(kc))
		}
	}
}

template GSUP_IE tr_GSUP_IE_AuthTuple3G(
					template (present) octetstring rand := ?,
					template (present) octetstring ik := ?,
					template (present) octetstring ck := ?,
					template (present) octetstring autn := ?,
					template (present) octetstring res := ?) := {
	tag := OSMO_GSUP_AUTH_TUPLE_IE,
	len := ?,
	val := {
		auth_tuple := {
			tr_GSUP_IE_RAND(rand),
			tr_GSUP_IE_IK(ik),
			tr_GSUP_IE_CK(ck),
			tr_GSUP_IE_AUTN(autn),
			tr_GSUP_IE_RES(res)
		}
	}
}

template GSUP_IE ts_GSUP_IE_AuthTuple3G(octetstring rand, octetstring ik,
					  octetstring ck, octetstring autn,
					  octetstring res) := {
	tag := OSMO_GSUP_AUTH_TUPLE_IE,
	len := 0, /* overwritten */
	val := {
		auth_tuple := {
			valueof(ts_GSUP_IE_RAND(rand)),
			valueof(ts_GSUP_IE_IK(ik)),
			valueof(ts_GSUP_IE_CK(ck)),
			valueof(ts_GSUP_IE_AUTN(autn)),
			valueof(ts_GSUP_IE_RES(res))
		}
	}
}

template GSUP_IE tr_GSUP_IE_AuthTuple2G3G(
					template (present) octetstring rand := ?,
					template (present) octetstring sres := ?,
					template (present) octetstring kc := ?,
					template (present) octetstring ik := ?,
					template (present) octetstring ck := ?,
					template (present) octetstring autn := ?,
					template (present) octetstring res := ?) := {
	tag := OSMO_GSUP_AUTH_TUPLE_IE,
	len := ?,
	val := {
		auth_tuple := {
			tr_GSUP_IE_RAND(rand),
			tr_GSUP_IE_SRES(sres),
			tr_GSUP_IE_Kc(kc),
			tr_GSUP_IE_IK(ik),
			tr_GSUP_IE_CK(ck),
			tr_GSUP_IE_AUTN(autn),
			tr_GSUP_IE_RES(res)
		}
	}
}

template GSUP_IE ts_GSUP_IE_AuthTuple2G3G(octetstring rand, octetstring sres,
				          octetstring kc, octetstring ik,
					  octetstring ck, octetstring autn,
					  octetstring res) := {
	tag := OSMO_GSUP_AUTH_TUPLE_IE,
	len := 0, /* overwritten */
	val := {
		auth_tuple := {
			valueof(ts_GSUP_IE_RAND(rand)),
			valueof(ts_GSUP_IE_SRES(sres)),
			valueof(ts_GSUP_IE_Kc(kc)),
			valueof(ts_GSUP_IE_IK(ik)),
			valueof(ts_GSUP_IE_CK(ck)),
			valueof(ts_GSUP_IE_AUTN(autn)),
			valueof(ts_GSUP_IE_RES(res))
		}
	}
}

template GSUP_IE ts_GSUP_IE_PdpInfo(octetstring apn, octetstring pdp_type, octetstring pdp_qos) := {
	tag := OSMO_GSUP_PDP_INFO_IE,
	len := 0, /* overwritten */
	val := {
		pdp_info := {
			valueof(ts_GSUP_IE_APN(apn)),
			valueof(ts_GSUP_IE_PDP_TYPE(pdp_type)),
			valueof(ts_GSUP_IE_PDP_QOS(pdp_qos))
		}
	}
}

template (value) GSUP_IE ts_GSUP_IE_PDP_CONTEXT_ID(OCT1 ctx_id) := {
	tag := OSMO_GSUP_PDP_CONTEXT_ID_IE,
	len := 0,
	val := {
		pdp_ctx_id := ctx_id
	}
}

template GSUP_IE tr_GSUP_IE_PDP_CONTEXT_ID(template OCT1 ctx_id) := {
	tag := OSMO_GSUP_PDP_CONTEXT_ID_IE,
	len := ?,
	val := {
		pdp_ctx_id := ctx_id
	}
}


template (value) GSUP_IE ts_GSUP_IE_PDP_TYPE(OCT2 pdp_type) := {
	tag := OSMO_GSUP_PDP_TYPE_IE,
	len := 0,
	val := {
		pdp_type := pdp_type
	}
}

template (value) GSUP_IE ts_GSUP_IE_PDP_QOS(octetstring pdp_qos) := {
	tag := OSMO_GSUP_PDP_QOS_IE,
	len := 0,
	val := {
		pdp_qos := pdp_qos
	}
}


template GSUP_PDU tr_GSUP(template GSUP_MessageType msgt := ?, template GSUP_IEs ies := *) := {
	msg_type := msgt,
	ies := ies
}

template (present) GSUP_PDU tr_GSUP_IMSI(template (present) GSUP_MessageType msgt := ?, template (present) hexstring imsi := ?) := {
	msg_type := msgt,
	ies := { tr_GSUP_IE_IMSI(imsi), * }
}

template GSUP_PDU ts_GSUP(GSUP_MessageType msgt, GSUP_IEs ies := {}) := {
	msg_type := msgt,
	ies := ies
}

template (value) GSUP_IMEI ts_GSUP_IMEI(hexstring digits) := {
	len := 0, /* overwritten */
	digits := digits
}

template GSUP_IMEI tr_GSUP_IMEI(template hexstring digits) := {
	len := ?,
	digits := digits
}


template (value) GSUP_PDU ts_GSUP_SAI_REQ(hexstring imsi) :=
	ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, { valueof(ts_GSUP_IE_IMSI(imsi)) });

template (value) GSUP_PDU ts_GSUP_SAI_REQ_EPS(hexstring imsi) :=
	ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, {
		valueof(ts_GSUP_IE_IMSI(imsi)),
		valueof(ts_GSUP_IE_CURRENT_RAT_TYPE(RAT_TYPE_EUTRAN_SGs))
	});

template (value) GSUP_PDU ts_GSUP_SAI_REQ_NUM_AUTH(hexstring imsi, OCT1 num_auth_vectors) :=
	ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, {
			valueof(ts_GSUP_IE_IMSI(imsi)),
			valueof(ts_GSUP_IE_NUM_VECTORS_REQ(num_auth_vectors))
			});

template GSUP_PDU tr_GSUP_SAI_REQ(template hexstring imsi) :=
	tr_GSUP_IMSI(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, imsi);

template GSUP_PDU tr_GSUP_SAI_REQ_UMTS_AKA_RESYNC(
		template hexstring imsi,
		template octetstring auts,
		template octetstring rand) :=
	tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, {
			tr_GSUP_IE_IMSI(imsi),
			tr_GSUP_IE_AUTS(auts),
			tr_GSUP_IE_RAND(rand),
			*
			});

template (value) GSUP_PDU ts_GSUP_SAI_RES(hexstring imsi, GSUP_IE auth_tuple) :=
	ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_RESULT, {
		valueof(ts_GSUP_IE_IMSI(imsi)), auth_tuple });

template GSUP_PDU tr_GSUP_SAI_ERR(template hexstring imsi, template integer cause) :=
	tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_ERROR, {
			tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });

template (value) GSUP_PDU ts_GSUP_SAI_ERR(hexstring imsi, integer cause) :=
	ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_ERROR, {
			valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_Cause(cause)) });


template GSUP_PDU tr_GSUP_SAI_RES(template (present) hexstring imsi,
				  template (present) GSUP_IE auth_tuple_ie := tr_GSUP_IE(OSMO_GSUP_AUTH_TUPLE_IE)) :=
	tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_RESULT, {
			tr_GSUP_IE_IMSI(imsi), *, auth_tuple_ie, * });

template GSUP_PDU ts_GSUP_UL_REQ(hexstring imsi, GSUP_CnDomain dom := OSMO_GSUP_CN_DOMAIN_PS,
					 template octetstring source_name := omit) :=
	ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST, f_gen_ts_ies(imsi, dom := dom,
								     source_name := source_name));

template GSUP_PDU tr_GSUP_UL_REQ(template hexstring imsi) :=
	tr_GSUP_IMSI(OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST, imsi);

template (value) GSUP_PDU ts_GSUP_UL_RES(hexstring imsi, octetstring destination_name := ''O) :=
	ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT, { valueof(ts_GSUP_IE_IMSI(imsi)),
			valueof(ts_GSUP_IE_Destination_Name(destination_name))});

template GSUP_PDU tr_GSUP_UL_RES(template hexstring imsi, template octetstring destination_name := omit) :=
	tr_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT, f_gen_tr_ies(imsi, destination_name := destination_name));

template (value) GSUP_PDU ts_GSUP_UL_ERR(hexstring imsi, integer cause) :=
	ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR, {
			valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_Cause(cause)) });

template GSUP_PDU tr_GSUP_UL_ERR(template hexstring imsi, template integer cause := ?,
		template octetstring destination_name := omit) :=
	tr_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR,
		f_gen_tr_ies(imsi, cause := cause, destination_name := destination_name));

template (value) GSUP_PDU ts_GSUP_ISD_REQ(hexstring imsi, hexstring msisdn, octetstring destination_name := ''O) :=
	ts_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_REQUEST, {
			valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_MSISDN(msisdn)),
			valueof(ts_GSUP_IE_Destination_Name(destination_name))});

template GSUP_PDU tr_GSUP_ISD_REQ(template hexstring imsi, template hexstring msisdn := ?,
		template octetstring destination_name := omit) :=
	tr_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_REQUEST,
		f_gen_tr_ies(imsi, msisdn := msisdn, destination_name := destination_name));

template GSUP_PDU ts_GSUP_ISD_RES(hexstring imsi,
                                  template octetstring source_name := omit,
                                  template octetstring destination_name := omit) :=
	ts_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_RESULT,
                f_gen_ts_ies(imsi, source_name := source_name,
                             destination_name := destination_name));

template GSUP_PDU tr_GSUP_ISD_RES(template hexstring imsi) :=
	tr_GSUP_IMSI(OSMO_GSUP_MSGT_INSERT_DATA_RESULT, imsi);

template GSUP_PDU tr_GSUP_AUTH_FAIL_IND(hexstring imsi) :=
	tr_GSUP_IMSI(OSMO_GSUP_MSGT_AUTH_FAIL_REPORT, imsi);

template (value) GSUP_PDU ts_GSUP_CL_REQ(hexstring imsi, GSUP_CancelType ctype) :=
	ts_GSUP(OSMO_GSUP_MSGT_LOCATION_CANCEL_REQUEST, {
		valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_CancelType(ctype)) });

template GSUP_PDU tr_GSUP_CL_RES(template hexstring imsi) :=
	tr_GSUP_IMSI(OSMO_GSUP_MSGT_LOCATION_CANCEL_RESULT, imsi);

template GSUP_PDU tr_GSUP_CL_ERR(template hexstring imsi, template integer cause := ?) :=
	tr_GSUP(OSMO_GSUP_MSGT_LOCATION_CANCEL_ERROR, {
			tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause), * });

template (value) GSUP_PDU ts_GSUP_PURGE_MS_REQ(hexstring imsi, GSUP_CnDomain dom) :=
	ts_GSUP(OSMO_GSUP_MSGT_PURGE_MS_REQUEST, {
			valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_CnDomain(dom)) });

template GSUP_PDU tr_GSUP_PURGE_MS_REQ(template hexstring imsi, template GSUP_CnDomain dom := ?) :=
	tr_GSUP(OSMO_GSUP_MSGT_PURGE_MS_REQUEST, {
			tr_GSUP_IE_IMSI(imsi), *, tr_GSUP_IE_CnDomain(dom) });

template (value) GSUP_PDU ts_GSUP_PURGE_MS_RES(hexstring imsi) :=
	ts_GSUP(OSMO_GSUP_MSGT_PURGE_MS_RESULT, {
		valueof(ts_GSUP_IE_IMSI(imsi)) });

template GSUP_PDU tr_GSUP_PURGE_MS_RES(template hexstring imsi) :=
	tr_GSUP(OSMO_GSUP_MSGT_PURGE_MS_RESULT, {
		tr_GSUP_IE_IMSI(imsi), * });

template GSUP_PDU tr_GSUP_PURGE_MS_ERR(template hexstring imsi, template integer cause) :=
	tr_GSUP(OSMO_GSUP_MSGT_PURGE_MS_ERROR, {
		tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });

template (value) GSUP_PDU ts_GSUP_CHECK_IMEI_REQ(hexstring imsi, hexstring imei,
      template (omit) octetstring source_name := omit) :=
	ts_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_REQUEST, f_gen_ts_ies(imsi, imei := imei, source_name := source_name));

template GSUP_PDU tr_GSUP_CHECK_IMEI_REQ(
	template hexstring imsi,
	template hexstring imei
) := tr_GSUP(
	OSMO_GSUP_MSGT_CHECK_IMEI_REQUEST,
	{
		tr_GSUP_IE_IMSI(imsi),
		tr_GSUP_IE_IMEI(imei),
		tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SUBSCRIBER_MANAGEMENT)
	}
);

template (value) GSUP_PDU ts_GSUP_CHECK_IMEI_RES(hexstring imsi, GSUP_IMEIResult result) :=
	ts_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_RESULT, {
		valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_IMEI_Result(result)) });

template GSUP_PDU tr_GSUP_CHECK_IMEI_RES(template hexstring imsi, template GSUP_IMEIResult result,
					 template octetstring destination_name := omit) :=
	tr_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_RESULT,
		f_gen_tr_ies(imsi, imei_result := result, destination_name := destination_name));

template (value) GSUP_PDU ts_GSUP_CHECK_IMEI_ERR(hexstring imsi, integer cause) :=
	ts_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_ERROR, {
		valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_Cause(cause)) });

template GSUP_PDU tr_GSUP_CHECK_IMEI_ERR(template hexstring imsi, template integer cause,
					 template octetstring destination_name := omit) :=
	tr_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_ERROR, f_gen_tr_ies(imsi, cause := cause, destination_name := destination_name));


/* EPDG Tunnel */
template (value) GSUP_PDU ts_GSUP_EPDGTunnel_REQ(hexstring imsi, GSUP_CnDomain dom := OSMO_GSUP_CN_DOMAIN_PS,
					 template (omit) octetstring source_name := omit) :=
	ts_GSUP(OSMO_GSUP_MSGT_EPDG_TUNNEL_REQUEST, f_gen_ts_ies(imsi, dom := dom,
								     source_name := source_name));

template (present) GSUP_PDU tr_GSUP_EPDGTunnel_REQ(template (present) hexstring imsi := ?) :=
	tr_GSUP_IMSI(OSMO_GSUP_MSGT_EPDG_TUNNEL_REQUEST, imsi);

template (value) GSUP_PDU ts_GSUP_EPDGTunnel_RES(hexstring imsi, octetstring destination_name := ''O) :=
	ts_GSUP(OSMO_GSUP_MSGT_EPDG_TUNNEL_RESULT, { valueof(ts_GSUP_IE_IMSI(imsi)),
			valueof(ts_GSUP_IE_Destination_Name(destination_name))});

template (present) GSUP_PDU tr_GSUP_EPDGTunnel_RES(template (present) hexstring imsi, template octetstring destination_name := omit) :=
	tr_GSUP(OSMO_GSUP_MSGT_EPDG_TUNNEL_RESULT, f_gen_tr_ies(imsi, destination_name := destination_name));

template (value) GSUP_PDU ts_GSUP_EPDGTunnel_ERR(hexstring imsi, integer cause) :=
	ts_GSUP(OSMO_GSUP_MSGT_EPDG_TUNNEL_ERROR, {
			valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_Cause(cause)) });

template (present) GSUP_PDU tr_GSUP_EPDGTunnel_ERR(template (present) hexstring imsi, template (present) integer cause := ?,
		template octetstring destination_name := omit) :=
	tr_GSUP(OSMO_GSUP_MSGT_EPDG_TUNNEL_ERROR,
		f_gen_tr_ies(imsi, cause := cause, destination_name := destination_name));


template (value) GSUP_IE ts_GSUP_IE_CancelType(GSUP_CancelType ctype) := {
	tag := OSMO_GSUP_CANCEL_TYPE_IE,
	len := 0, /* overwritten */
	val := {
		cancel_type := ctype
	}
}

template GSUP_IE tr_GSUP_IE_CancelType(template GSUP_CancelType ctype) :=
	tr_GSUP_IE(OSMO_GSUP_CANCEL_TYPE_IE, GSUP_IeValue:{cancel_type:=ctype});

template GSUP_IE tr_GSUP_IE_CnDomain(template GSUP_CnDomain domain) :=
	tr_GSUP_IE(OSMO_GSUP_CN_DOMAIN_IE, GSUP_IeValue:{cn_domain:=domain});

template GSUP_IE tr_GSUP_IE(template GSUP_IEI iei, template GSUP_IeValue val := ?) := {
	tag := iei,
	len := ?,
	val := val
}

template (value) GSUP_IE ts_GSUP_IE_IMSI(hexstring imsi) := {
	tag := OSMO_GSUP_IMSI_IE,
	len := 0, /* overwritten */
	val := {
		imsi := imsi
	}
}

template (present) GSUP_IE tr_GSUP_IE_IMSI(template (present) hexstring imsi := ?) := {
	tag := OSMO_GSUP_IMSI_IE,
	len := ?,
	val := {
		imsi := imsi
	}
}

template (value) GSUP_IE ts_GSUP_IE_MSISDN(hexstring msisdn) := {
	tag := OSMO_GSUP_MSISDN_IE,
	len := 0, /* overwritten */
	val := {
		msisdn := ts_GSUP_MSISDN(msisdn)
	}
}

template GSUP_IE tr_GSUP_IE_MSISDN(template hexstring msisdn) := {
	tag := OSMO_GSUP_MSISDN_IE,
	len := ?,
	val := {
		msisdn := tr_GSUP_MSISDN(msisdn)
	}
}


template (value) GSUP_IE ts_GSUP_IE_Cause(integer cause) := {
	tag := OSMO_GSUP_CAUSE_IE,
	len := 0, /* overwritten */
	val := {
		cause := cause
	}
}

template GSUP_IE tr_GSUP_IE_Cause(template integer cause) := {
	tag := OSMO_GSUP_CAUSE_IE,
	len := ?,
	val := {
		cause := cause
	}
}

template (value) GSUP_IE ts_GSUP_IE_AUTS(octetstring auts) := {
	tag := OSMO_GSUP_AUTS_IE,
	len := 0, /* overwritten */
	val := {
		auts := auts
	}
}

template GSUP_IE tr_GSUP_IE_AUTS(template octetstring auts) := {
	tag := OSMO_GSUP_AUTS_IE,
	len := ?,
	val := {
		auts := auts
	}
}

template (value) GSUP_IE ts_GSUP_IE_RAND(octetstring rand) := {
	tag := OSMO_GSUP_RAND_IE,
	len := 0, /* overwritten */
	val := {
		rand := rand
	}
}

template GSUP_IE tr_GSUP_IE_RAND(template octetstring rand := ?) := {
	tag := OSMO_GSUP_RAND_IE,
	len := ?,
	val := {
		rand := rand
	}
}

template (present) GSUP_IE tr_GSUP_IE_SRES(template (present) octetstring sres := ?) := {
	tag := OSMO_GSUP_SRES_IE,
	len := ?,
	val := {
		sres := sres
	}
}

template (value) GSUP_IE ts_GSUP_IE_SRES(octetstring sres) := {
	tag := OSMO_GSUP_SRES_IE,
	len := 0, /* overwritten */
	val := {
		sres := sres
	}
}

template (present) GSUP_IE tr_GSUP_IE_Kc(template (present) octetstring kc := ?) := {
	tag := OSMO_GSUP_KC_IE,
	len := ?,
	val := {
		kc := kc
	}
}

template (value) GSUP_IE ts_GSUP_IE_Kc(octetstring kc) := {
	tag := OSMO_GSUP_KC_IE,
	len := 0, /* overwritten */
	val := {
		kc := kc
	}
}

template (present) GSUP_IE tr_GSUP_IE_IK(template (present) octetstring ik := ?) := {
	tag := OSMO_GSUP_IK_IE,
	len := ?,
	val := {
		ik := ik
	}
}

template (value) GSUP_IE ts_GSUP_IE_IK(octetstring ik) := {
	tag := OSMO_GSUP_IK_IE,
	len := 0, /* overwritten */
	val := {
		ik := ik
	}
}

template (present) GSUP_IE tr_GSUP_IE_CK(template (present) octetstring ck := ?) := {
	tag := OSMO_GSUP_CK_IE,
	len := ?,
	val := {
		ck := ck
	}
}

template (value) GSUP_IE ts_GSUP_IE_CK(octetstring ck) := {
	tag := OSMO_GSUP_CK_IE,
	len := 0, /* overwritten */
	val := {
		ck := ck
	}
}

template (present) GSUP_IE tr_GSUP_IE_AUTN(template (present) octetstring autn := ?) := {
	tag := OSMO_GSUP_AUTN_IE,
	len := ?,
	val := {
		autn := autn
	}
}

template (value) GSUP_IE ts_GSUP_IE_AUTN(octetstring autn) := {
	tag := OSMO_GSUP_AUTN_IE,
	len := 0, /* overwritten */
	val := {
		autn := autn
	}
}

template (present) GSUP_IE tr_GSUP_IE_RES(template (present) octetstring res := ?) := {
	tag := OSMO_GSUP_RES_IE,
	len := ?,
	val := {
		res := res
	}
}

template (value) GSUP_IE ts_GSUP_IE_RES(octetstring res) := {
	tag := OSMO_GSUP_RES_IE,
	len := 0, /* overwritten */
	val := {
		res := res
	}
}

template (value) GSUP_IE ts_GSUP_IE_APN(octetstring apn) := {
	tag := OSMO_GSUP_ACCESS_POINT_NAME_IE,
	len := 0, /* overwritten */
	val := {
		apn := apn
	}
}

template GSUP_IE tr_GSUP_IE_APN(template octetstring apn) := {
	tag := OSMO_GSUP_ACCESS_POINT_NAME_IE,
	len := ?,
	val := {
		apn := apn
	}
}

template GSUP_IE ts_GSUP_IE_CnDomain(template GSUP_CnDomain dom) := {
	tag := OSMO_GSUP_CN_DOMAIN_IE,
	len := 0, /* overwritten */
	val := {
		cn_domain := dom
	}
}

template (value) GSUP_IE ts_GSUP_IE_SessionId(OCT4 sid) := {
	tag := OSMO_GSUP_SESSION_ID_IE,
	len := 0, /* overwritten */
	val := {
		session_id := sid
	}
}
template GSUP_IE tr_GSUP_IE_SessionId(template OCT4 sid) := {
	tag := OSMO_GSUP_SESSION_ID_IE,
	len := ?,
	val := {
		session_id := sid
	}
}

template (value) GSUP_IE ts_GSUP_IE_SessionState(GSUP_SessionState state) := {
	tag := OSMO_GSUP_SESSION_STATE_IE,
	len := 0, /* overwritten */
	val := {
		session_state := state
	}
}
template GSUP_IE tr_GSUP_IE_SessionState(template GSUP_SessionState state) := {
	tag := OSMO_GSUP_SESSION_STATE_IE,
	len := ?,
	val := {
		session_state := state
	}
}

template (value) GSUP_IE ts_GSUP_IE_SM_RP_MR(OCT1 ref) := {
	tag := OSMO_GSUP_SM_RP_MR_IE,
	len := 0, /* overwritten */
	val := {
		sm_rp_mr := ref
	}
}
template GSUP_IE tr_GSUP_IE_SM_RP_MR(template OCT1 ref) := {
	tag := OSMO_GSUP_SM_RP_MR_IE,
	len := ?,
	val := {
		sm_rp_mr := ref
	}
}

template (value) GSUP_IE ts_GSUP_IE_SM_RP_CAUSE(OCT1 cause) := {
	tag := OSMO_GSUP_SM_RP_CAUSE_IE,
	len := 0, /* overwritten */
	val := {
		sm_rp_cause := cause
	}
}
template GSUP_IE tr_GSUP_IE_SM_RP_CAUSE(template OCT1 cause) := {
	tag := OSMO_GSUP_SM_RP_CAUSE_IE,
	len := ?,
	val := {
		sm_rp_cause := cause
	}
}

template (value) GSUP_IE ts_GSUP_IE_SM_RP_MMS(OCT1 mms) := {
	tag := OSMO_GSUP_SM_RP_MMS_IE,
	len := 0, /* overwritten */
	val := {
		sm_rp_mms := mms
	}
}
template GSUP_IE tr_GSUP_IE_SM_RP_MMS(template OCT1 mms) := {
	tag := OSMO_GSUP_SM_RP_MMS_IE,
	len := ?,
	val := {
		sm_rp_mms := mms
	}
}

template (value) GSUP_IE ts_GSUP_IE_IMEI(hexstring imei) := {
	tag := OSMO_GSUP_IMEI_IE,
	len := 0, /* overwritten */
	val := {
		imei := ts_GSUP_IMEI(imei)
	}
}
template GSUP_IE tr_GSUP_IE_IMEI(template hexstring imei) := {
	tag := OSMO_GSUP_IMEI_IE,
	len := ?,
	val := {
		imei := tr_GSUP_IMEI(imei)
	}
}

template (value) GSUP_IE ts_GSUP_IE_IMEI_Result(GSUP_IMEIResult result) := {
	tag := OSMO_GSUP_IMEI_RESULT_IE,
	len := 0, /* overwritten */
	val := {
		imei_result := result
	}
}
template GSUP_IE tr_GSUP_IE_IMEI_Result(template GSUP_IMEIResult result) := {
	tag := OSMO_GSUP_IMEI_RESULT_IE,
	len := ?,
	val := {
		imei_result := result
	}
}

template (value) GSUP_IE ts_GSUP_IE_NUM_VECTORS_REQ(OCT1 num) := {
	tag := OSMO_GSUP_NUM_VECTORS_REQ_IE,
	len := 0, /* overwritten */
	val := {
		num_auth_vectors := num
	}
}
template GSUP_IE tr_GSUP_IE_NUM_VECTORS_REQ(template OCT1 num) := {
	tag := OSMO_GSUP_NUM_VECTORS_REQ_IE,
	len := ?,
	val := {
		num_auth_vectors := num
	}
}


/* Possible identity types for SM-RP-{OA|DA} IEs */
type enumerated GSUP_SM_RP_ODA_IdType {
	OSMO_GSUP_SM_RP_ODA_ID_NONE		('00'O),
	OSMO_GSUP_SM_RP_ODA_ID_IMSI		('01'O),
	OSMO_GSUP_SM_RP_ODA_ID_MSISDN		('02'O),
	OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR	('03'O),
	/* Special value for noSM-RP-DA and noSM-RP-OA */
	OSMO_GSUP_SM_RP_ODA_ID_NULL		('FF'O)
} with { variant "FIELDLENGTH(8)" };

/* See 3GPP TS 24.011, figures 8.5 and 8.6 */
type record GSUP_SM_RP_Addr {
	BIT1		ext, /* Extension? */
	BIT3		ton, /* Type of Number */
	BIT4		npi, /* Numbering Plan Identification */
	hexstring	number length (1..20)
} with {
	variant "PADDING(yes)";
	variant "PADDING_PATTERN('1111'B)"
};

private function f_pad_SM_RP_Addr(template hexstring number)
return template hexstring {
	if (isvalue(number) and not istemplatekind(number, "omit")) {
		return f_pad_bcd_number(valueof(number));
	} else {
		return number;
	}
}

template GSUP_SM_RP_Addr t_GSUP_SM_RP_Addr(template hexstring number,
					   template BIT4 npi := '0001'B,
					   template BIT3 ton := '001'B,
					   template BIT1 ext := '1'B) := {
	ext := ext,
	ton := ton,
	npi := npi,
	/* Work around TITAN's padding problems: encoding works fine,
	 * but it does not consider 'F'H as padding in decoded data. */
	number := f_pad_SM_RP_Addr(number)
}

/**
 * SM-RP-DA represents the SM Destination Address, see 7.6.8.1.
 * It can be either of the following:
 *  - IMSI
 *  - LMSI (not implemented)
 *  - MSISDN
 *  - roaming number (not implemented)
 *  - service centre address
 */
type union GSUP_SM_RP_DA_ID {
	hexstring		imsi,
	GSUP_SM_RP_Addr		msisdn,
	GSUP_SM_RP_Addr		smsc_addr
};

type record GSUP_SM_RP_DA {
	GSUP_SM_RP_ODA_IdType	id_type,
	GSUP_SM_RP_DA_ID	id_enc optional
} with { variant (id_enc) "CROSSTAG(
		imsi, id_type = OSMO_GSUP_SM_RP_ODA_ID_IMSI;
		msisdn, id_type = OSMO_GSUP_SM_RP_ODA_ID_MSISDN;
		smsc_addr, id_type = OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR;
		/* FIXME: how to handle noSM-RP-DA? */
	)"
};

template (value) GSUP_SM_RP_DA ts_GSUP_SM_RP_DA_IMSI(hexstring imsi) := {
	id_type := OSMO_GSUP_SM_RP_ODA_ID_IMSI,
	id_enc := { imsi := imsi }
}
template GSUP_SM_RP_DA tr_GSUP_SM_RP_DA_IMSI(template hexstring imsi) := {
	id_type := OSMO_GSUP_SM_RP_ODA_ID_IMSI,
	id_enc := { imsi := imsi }
}

template (value) GSUP_SM_RP_DA ts_GSUP_SM_RP_DA_MSISDN(GSUP_SM_RP_Addr msisdn) := {
	id_type := OSMO_GSUP_SM_RP_ODA_ID_MSISDN,
	id_enc := { msisdn := msisdn }
}
template GSUP_SM_RP_DA tr_GSUP_SM_RP_DA_MSISDN(template GSUP_SM_RP_Addr msisdn) := {
	id_type := OSMO_GSUP_SM_RP_ODA_ID_MSISDN,
	id_enc := { msisdn := msisdn }
}

template (value) GSUP_SM_RP_DA ts_GSUP_SM_RP_DA_SMSC_ADDR(GSUP_SM_RP_Addr smsc_addr) := {
	id_type := OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR,
	id_enc := { smsc_addr := smsc_addr }
}
template GSUP_SM_RP_DA tr_GSUP_SM_RP_DA_SMSC_ADDR(template GSUP_SM_RP_Addr smsc_addr) := {
	id_type := OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR,
	id_enc := { smsc_addr := smsc_addr }
}

template (value) GSUP_SM_RP_DA ts_GSUP_SM_RP_DA_NULL := {
	id_type := OSMO_GSUP_SM_RP_ODA_ID_NULL,
	id_enc := omit
}
template GSUP_SM_RP_DA tr_GSUP_SM_RP_DA_NULL := {
	id_type := OSMO_GSUP_SM_RP_ODA_ID_NULL,
	id_enc := omit
}

template (value) GSUP_IE ts_GSUP_IE_SM_RP_DA(GSUP_SM_RP_DA val) := {
	tag := OSMO_GSUP_SM_RP_DA_IE,
	len := 0, /* overwritten */
	val := {
		sm_rp_da := val
	}
}
template GSUP_IE tr_GSUP_IE_SM_RP_DA(template GSUP_SM_RP_DA val) := {
	tag := OSMO_GSUP_SM_RP_DA_IE,
	len := ?,
	val := {
		sm_rp_da := val
	}
}

/**
 * SM-RP-OA represents the SM Originating Address, see 7.6.8.2.
 * It can be either of the following:
 *  - MSISDN
 *  - service centre address
 */
type union GSUP_SM_RP_OA_ID {
	GSUP_SM_RP_Addr		msisdn,
	GSUP_SM_RP_Addr		smsc_addr
};

type record GSUP_SM_RP_OA {
	GSUP_SM_RP_ODA_IdType	id_type,
	GSUP_SM_RP_OA_ID	id_enc optional
} with { variant (id_enc) "CROSSTAG(
		msisdn, id_type = OSMO_GSUP_SM_RP_ODA_ID_MSISDN;
		smsc_addr, id_type = OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR;
		/* FIXME: how to handle noSM-RP-OA? */
	)"
};

template (value) GSUP_SM_RP_OA ts_GSUP_SM_RP_OA_MSISDN(GSUP_SM_RP_Addr msisdn) := {
	id_type := OSMO_GSUP_SM_RP_ODA_ID_MSISDN,
	id_enc := { msisdn := msisdn }
}
template GSUP_SM_RP_OA tr_GSUP_SM_RP_OA_MSISDN(template GSUP_SM_RP_Addr msisdn) := {
	id_type := OSMO_GSUP_SM_RP_ODA_ID_MSISDN,
	id_enc := { msisdn := msisdn }
}

template (value) GSUP_SM_RP_OA ts_GSUP_SM_RP_OA_SMSC_ADDR(GSUP_SM_RP_Addr smsc_addr) := {
	id_type := OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR,
	id_enc := { smsc_addr := smsc_addr }
}
template GSUP_SM_RP_OA tr_GSUP_SM_RP_OA_SMSC_ADDR(template GSUP_SM_RP_Addr smsc_addr) := {
	id_type := OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR,
	id_enc := { smsc_addr := smsc_addr }
}

template (value) GSUP_SM_RP_OA ts_GSUP_SM_RP_OA_NULL := {
	id_type := OSMO_GSUP_SM_RP_ODA_ID_NULL,
	id_enc := omit
}
template GSUP_SM_RP_OA tr_GSUP_SM_RP_OA_NULL := {
	id_type := OSMO_GSUP_SM_RP_ODA_ID_NULL,
	id_enc := omit
}

template (value) GSUP_IE ts_GSUP_IE_SM_RP_OA(GSUP_SM_RP_OA val) := {
	tag := OSMO_GSUP_SM_RP_OA_IE,
	len := 0, /* overwritten */
	val := {
		sm_rp_oa := val
	}
}
template GSUP_IE tr_GSUP_IE_SM_RP_OA(template GSUP_SM_RP_OA val) := {
	tag := OSMO_GSUP_SM_RP_OA_IE,
	len := ?,
	val := {
		sm_rp_oa := val
	}
}

/* SM-RP-UI represents the SM TPDU, see 7.6.8.4 */
template (value) GSUP_IE ts_GSUP_IE_SM_RP_UI(octetstring val) := {
	tag := OSMO_GSUP_SM_RP_UI_IE,
	len := 0, /* overwritten */
	val := {
		sm_rp_ui := val
	}
}
template GSUP_IE tr_GSUP_IE_SM_RP_UI(template octetstring val) := {
	tag := OSMO_GSUP_SM_RP_UI_IE,
	len := ?,
	val := {
		sm_rp_ui := val
	}
}

/* SM Alert Reason types, see 7.6.8.8 */
type enumerated GSUP_SM_ALERT_RSN_Type {
	GSUP_SM_ALERT_RSN_TYPE_NONE		('00'O),
	GSUP_SM_ALERT_RSN_TYPE_MS_PRESENT	('01'O),
	GSUP_SM_ALERT_RSN_TYPE_MEM_AVAIL	('02'O)
} with { variant "FIELDLENGTH(8)" };

/* SM Alert Reason IE (used in READY-FOR-SM), see 7.6.8.8 */
template (value) GSUP_IE ts_GSUP_IE_SM_ALERT_RSN(GSUP_SM_ALERT_RSN_Type rsn) := {
	tag := OSMO_GSUP_SM_ALERT_RSN_IE,
	len := 0, /* overwritten */
	val := {
		sm_alert_rsn := rsn
	}
}
template GSUP_IE tr_GSUP_IE_SM_ALERT_RSN(template GSUP_SM_ALERT_RSN_Type rsn) := {
	tag := OSMO_GSUP_SM_ALERT_RSN_IE,
	len := ?,
	val := {
		sm_alert_rsn := rsn
	}
}

template (value) GSUP_IE ts_GSUP_IE_SSInfo(octetstring ss) := {
	tag := OSMO_GSUP_SS_INFO_IE,
	len := 0, /* overwritten */
	val := {
		ss_info := ss
	}
}
template GSUP_IE tr_GSUP_IE_SSInfo(template octetstring ss) := {
	tag := OSMO_GSUP_SS_INFO_IE,
	len := ?,
	val := {
		ss_info := ss
	}
}

template GSUP_IE tr_GSUP_IE_Message_Class(template GSUP_Message_Class val) := {
	tag := OSMO_GSUP_MESSAGE_CLASS_IE,
	len := ?,
	val := {
		message_class := val
	}
}

template (value) GSUP_IE ts_GSUP_IE_Message_Class(GSUP_Message_Class val) := {
	tag := OSMO_GSUP_MESSAGE_CLASS_IE,
	len := 0, /* overwritten */
	val := {
		message_class := val
	}
}

template GSUP_IE tr_GSUP_IE_Source_Name(template octetstring name) := {
	tag := OSMO_GSUP_SOURCE_NAME_IE,
	len := ?,
	val := {
		source_name := name
	}
}

template (value) GSUP_IE ts_GSUP_IE_Source_Name(octetstring name) := {
	tag := OSMO_GSUP_SOURCE_NAME_IE,
	len := 0, /* overwritten */
	val := {
		source_name := name
	}
}

template GSUP_IE tr_GSUP_IE_Destination_Name(template octetstring name) := {
	tag := OSMO_GSUP_DESTINATION_NAME_IE,
	len := ?,
	val := {
		destination_name := name
	}
}

template (value) GSUP_IE ts_GSUP_IE_Destination_Name(octetstring name) := {
	tag := OSMO_GSUP_DESTINATION_NAME_IE,
	len := 0, /* overwritten */
	val := {
		destination_name := name
	}
}

template GSUP_IE tr_GSUP_IE_AN_APDU(template GSUP_AN_APDU an_apdu) := {
	tag := OSMO_GSUP_AN_APDU_IE,
	len := ?,
	val := {
		an_apdu := an_apdu
	}
}

template (value) GSUP_IE ts_GSUP_IE_AN_APDU(GSUP_AN_APDU an_apdu) := {
	tag := OSMO_GSUP_AN_APDU_IE,
	len := 0, /* overwritten */
	val := {
		an_apdu := an_apdu
	}
}

template (present) GSUP_IE tr_GSUP_IE_SUPPORTED_RAT_TYPES(template (present) GSUP_RatTypes ratt) := {
	tag := OSMO_GSUP_SUPPORTED_RAT_TYPES_IE,
	len := ?,
	val := {
		supported_rat_types := ratt
	}
}
template (value) GSUP_IE ts_GSUP_IE_SUPPORTED_RAT_TYPES(GSUP_RatTypes ratt) := {
	tag := OSMO_GSUP_SUPPORTED_RAT_TYPES_IE,
	len := 0, /* overwritten */
	val := {
		supported_rat_types := ratt
	}
}

template (present) GSUP_IE tr_GSUP_IE_CURRENT_RAT_TYPE(template (present) GSUP_RatType ratt) := {
	tag := OSMO_GSUP_CURRENT_RAT_TYPE_IE,
	len := ?,
	val := {
		current_rat_type := ratt
	}
}
template (value) GSUP_IE ts_GSUP_IE_CURRENT_RAT_TYPE(GSUP_RatType ratt) := {
	tag := OSMO_GSUP_CURRENT_RAT_TYPE_IE,
	len := 0, /* overwritten */
	val := {
		current_rat_type := ratt
	}
}

private function f_gen_ts_ies(hexstring imsi,
			   template hexstring imei := omit,
			   template GSUP_CnDomain dom := omit,
			   template octetstring source_name := omit,
			   template octetstring destination_name := omit
			  ) return GSUP_IEs {
	var GSUP_IEs ies := {
		valueof(ts_GSUP_IE_IMSI(imsi))
	};

	if (isvalue(dom)) {
		ies := ies & { valueof(ts_GSUP_IE_CnDomain(dom)) };
	}

	if (isvalue(imei)) {
		ies := ies & { valueof(ts_GSUP_IE_IMEI(valueof(imei))) };
	}

	if (isvalue(source_name)) {
		ies := ies & { valueof(ts_GSUP_IE_Source_Name(valueof(source_name))) };
	}

	if (isvalue(destination_name)) {
		ies := ies & { valueof(ts_GSUP_IE_Destination_Name(valueof(destination_name))) };
	}

	return ies;
}

private function f_gen_tr_ies(template hexstring imsi,
			      template integer cause := omit,
			      template hexstring msisdn := omit,
			      template GSUP_IMEIResult imei_result := omit,
			      template octetstring source_name := omit,
			      template octetstring destination_name := omit
			     ) return template GSUP_IEs {
	var template GSUP_IEs ies := {
		tr_GSUP_IE_IMSI(imsi)
	};
	var integer idx := 1;

	if (isvalue(cause)) {
		ies[idx] := tr_GSUP_IE_Cause(cause);
		idx := idx + 1;
	}

	if (isvalue(msisdn)) {
		ies[idx] := tr_GSUP_IE_MSISDN(msisdn);
		idx := idx + 1;
	}

	if (isvalue(imei_result)) {
		ies[idx] := tr_GSUP_IE_IMEI_Result(imei_result);
		idx := idx + 1;
	}

	if (isvalue(source_name)) {
		ies[idx] := tr_GSUP_IE_Source_Name(source_name);
		idx := idx + 1;
	}

	ies[idx] := *;
	idx := idx + 1;

	if (isvalue(destination_name)) {
		ies[idx] := tr_GSUP_IE_Destination_Name(destination_name);
		idx := idx + 1;
	}

	return ies;
}

private function f_gen_ts_ss_ies(
	hexstring imsi,
	OCT4 sid,
	GSUP_SessionState state,
	template (omit) octetstring ss := omit,
	template (omit) integer cause := omit,
	template octetstring source_name := omit
) return GSUP_IEs {
	/* Mandatory IEs */
	var GSUP_IEs ies := {
		valueof(ts_GSUP_IE_IMSI(imsi))
	};

	/* Cause IE is needed for PROC_SS_ERR */
	if (isvalue(cause)) {
		ies := ies & { valueof(ts_GSUP_IE_Cause(valueof(cause))) };
	}

	/* Mandatory session IEs */
	ies := ies & { valueof(ts_GSUP_IE_SessionId(sid)) };
	ies := ies & { valueof(ts_GSUP_IE_SessionState(state)) };

	/* Optional SS payload */
	if (isvalue(ss)) {
		ies := ies & { valueof(ts_GSUP_IE_SSInfo(valueof(ss))) };
	}

	if (isvalue(source_name)) {
		ies := ies & { valueof(ts_GSUP_IE_Source_Name(valueof(source_name))) };
	}

	return ies;
}
private function f_gen_tr_ss_ies(
	template hexstring imsi,
	template OCT4 sid := ?,
	template GSUP_SessionState state := ?,
	template octetstring ss := omit,
	template integer cause := omit,
	template octetstring destination_name := omit
) return template GSUP_IEs {
	/* Mandatory IEs */
	var template GSUP_IEs ies := {
		tr_GSUP_IE_IMSI(imsi)
	};
	var integer idx := 1;

	/* Cause IE is needed for PROC_SS_ERR */
	if (istemplatekind(cause, "*")) {
		ies[idx] := *;
		idx := idx + 1;
	} else if (not istemplatekind(cause, "omit")) {
		ies[idx] := tr_GSUP_IE_Cause(cause);
		idx := idx + 1;
	}

	/* Mandatory session IEs */
	ies[idx] := tr_GSUP_IE_SessionId(sid);
	ies[idx + 1] := tr_GSUP_IE_SessionState(state);
	idx := idx + 2;

	/* Optional SS payload */
	if (istemplatekind(ss, "*")) {
		ies[idx] := *;
		idx := idx + 1;
	} else if (not istemplatekind(ss, "omit")) {
		ies[idx] := tr_GSUP_IE_SSInfo(ss);
		idx := idx + 1;
	}

	if (isvalue(destination_name)) {
		ies[idx] := tr_GSUP_IE_Destination_Name(destination_name);
		idx := idx + 1;
	}

	/* the GSUP Message Class IE is optional, as old implementations don't have it yet */
	var template GSUP_IEs ies2 := ies;
	ies2[idx] := tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_USSD);
	idx := idx + 1;

	return (ies, ies2);
}

template (value) GSUP_PDU ts_GSUP_PROC_SS_REQ(
	hexstring imsi,
	OCT4 sid,
	GSUP_SessionState state,
	template (omit) octetstring ss := omit,
	template (omit) octetstring source_name := omit
) := ts_GSUP(
	OSMO_GSUP_MSGT_PROC_SS_REQUEST,
	f_gen_ts_ss_ies(imsi, sid, state, ss, source_name := source_name)
);
template GSUP_PDU tr_GSUP_PROC_SS_REQ(
	template hexstring imsi,
	template OCT4 sid := ?,
	template GSUP_SessionState state := ?,
	template octetstring ss := *
) := tr_GSUP(
	OSMO_GSUP_MSGT_PROC_SS_REQUEST,
	f_gen_tr_ss_ies(imsi, sid, state, ss)
);

template (value) GSUP_PDU ts_GSUP_PROC_SS_RES(
	hexstring imsi,
	OCT4 sid,
	GSUP_SessionState state,
	template (omit) octetstring ss := omit
) := ts_GSUP(
	OSMO_GSUP_MSGT_PROC_SS_RESULT,
	f_gen_ts_ss_ies(imsi, sid, state, ss)
);
template GSUP_PDU tr_GSUP_PROC_SS_RES(
	template hexstring imsi,
	template OCT4 sid := ?,
	template GSUP_SessionState state := ?,
	template octetstring ss := *,
	template octetstring destination_name := omit
) := tr_GSUP(
	OSMO_GSUP_MSGT_PROC_SS_RESULT,
	f_gen_tr_ss_ies(imsi, sid, state, ss, destination_name := destination_name)
);

template (value) GSUP_PDU ts_GSUP_PROC_SS_ERR(
	hexstring imsi,
	OCT4 sid,
	GSUP_SessionState state,
	integer cause
) := ts_GSUP(
	OSMO_GSUP_MSGT_PROC_SS_ERROR,
	f_gen_ts_ss_ies(imsi, sid, state, cause := cause)
);
template GSUP_PDU tr_GSUP_PROC_SS_ERR(
	template hexstring imsi,
	template OCT4 sid := ?,
	template GSUP_SessionState state := ?,
	template integer cause := ?
) := tr_GSUP(
	OSMO_GSUP_MSGT_PROC_SS_ERROR,
	f_gen_tr_ss_ies(imsi, sid, state, cause := cause)
);

template (value) GSUP_PDU ts_GSUP_MO_FORWARD_SM_REQ(
	hexstring imsi,
	OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
	GSUP_SM_RP_DA sm_rp_da, /* Destination Address, see 7.6.8.1 */
	GSUP_SM_RP_OA sm_rp_oa, /* Originating Address, see 7.6.8.2 */
	octetstring sm_rp_ui /* SM TPDU, see 7.6.8.4 */
) := ts_GSUP(
	OSMO_GSUP_MSGT_MO_FORWARD_SM_REQUEST,
	{
		valueof(ts_GSUP_IE_IMSI(imsi)),
		valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
		valueof(ts_GSUP_IE_SM_RP_DA(sm_rp_da)),
		valueof(ts_GSUP_IE_SM_RP_OA(sm_rp_oa)),
		valueof(ts_GSUP_IE_SM_RP_UI(sm_rp_ui))
	}
);
template GSUP_PDU tr_GSUP_MO_FORWARD_SM_REQ(
	template hexstring imsi := ?,
	template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
	template GSUP_SM_RP_DA sm_rp_da, /* Destination Address, see 7.6.8.1 */
	template GSUP_SM_RP_OA sm_rp_oa, /* Originating Address, see 7.6.8.2 */
	template octetstring sm_rp_ui /* SM TPDU, see 7.6.8.4 */
) := tr_GSUP(
	OSMO_GSUP_MSGT_MO_FORWARD_SM_REQUEST,
	{
		tr_GSUP_IE_IMSI(imsi),
		tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
		tr_GSUP_IE_SM_RP_DA(sm_rp_da),
		tr_GSUP_IE_SM_RP_OA(sm_rp_oa),
		tr_GSUP_IE_SM_RP_UI(sm_rp_ui),
		tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS)
	}
);

template (value) GSUP_PDU ts_GSUP_MO_FORWARD_SM_RES(
	hexstring imsi,
	OCT1 sm_rp_mr /* Message Reference, see GSM TS 04.11, 8.2.3 */
) := ts_GSUP(
	OSMO_GSUP_MSGT_MO_FORWARD_SM_RESULT,
	{
		valueof(ts_GSUP_IE_IMSI(imsi)),
		valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr))
	}
);
template GSUP_PDU tr_GSUP_MO_FORWARD_SM_RES(
	template hexstring imsi := ?,
	template OCT1 sm_rp_mr := ? /* Message Reference, see GSM TS 04.11, 8.2.3 */
) := tr_GSUP(
	OSMO_GSUP_MSGT_MO_FORWARD_SM_RESULT,
	{
		tr_GSUP_IE_IMSI(imsi),
		tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
		tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS)
	}
);

template (value) GSUP_PDU ts_GSUP_MO_FORWARD_SM_ERR(
	hexstring imsi,
	OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
	OCT1 sm_rp_cause /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
) := ts_GSUP(
	OSMO_GSUP_MSGT_MO_FORWARD_SM_ERROR,
	{
		valueof(ts_GSUP_IE_IMSI(imsi)),
		valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
		valueof(ts_GSUP_IE_SM_RP_CAUSE(sm_rp_cause))
	}
);
template GSUP_PDU tr_GSUP_MO_FORWARD_SM_ERR(
	template hexstring imsi := ?,
	template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
	template OCT1 sm_rp_cause := ? /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
) := tr_GSUP(
	OSMO_GSUP_MSGT_MO_FORWARD_SM_ERROR,
	{
		tr_GSUP_IE_IMSI(imsi),
		tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
		tr_GSUP_IE_SM_RP_CAUSE(sm_rp_cause),
		tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS)
	}
);

template (value) GSUP_PDU ts_GSUP_MT_FORWARD_SM_REQ(
	hexstring imsi,
	OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
	GSUP_SM_RP_DA sm_rp_da, /* Destination Address, see 7.6.8.1 */
	GSUP_SM_RP_OA sm_rp_oa, /* Originating Address, see 7.6.8.2 */
	octetstring sm_rp_ui, /* SM TPDU, see 7.6.8.4 */
	OCT1 sm_rp_mms /* MMS (More Messages to Send), see 7.6.8.7 */
) := ts_GSUP(
	OSMO_GSUP_MSGT_MT_FORWARD_SM_REQUEST,
	{
		/**
		 * TODO: add MT-specific fields (and IEs):
		 *  - smDeliveryTimer
		 *  - smDeliveryStartTime
		 */
		valueof(ts_GSUP_IE_IMSI(imsi)),
		valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
		valueof(ts_GSUP_IE_SM_RP_DA(sm_rp_da)),
		valueof(ts_GSUP_IE_SM_RP_OA(sm_rp_oa)),
		valueof(ts_GSUP_IE_SM_RP_UI(sm_rp_ui)),
		valueof(ts_GSUP_IE_SM_RP_MMS(sm_rp_mms))
	}
);
template GSUP_PDU tr_GSUP_MT_FORWARD_SM_REQ(
	template hexstring imsi := ?,
	template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
	template GSUP_SM_RP_DA sm_rp_da, /* Destination Address, see 7.6.8.1 */
	template GSUP_SM_RP_OA sm_rp_oa, /* Originating Address, see 7.6.8.2 */
	template octetstring sm_rp_ui, /* SM TPDU, see 7.6.8.4 */
	template OCT1 sm_rp_mms /* MMS (More Messages to Send), see 7.6.8.7 */
) := tr_GSUP(
	OSMO_GSUP_MSGT_MT_FORWARD_SM_REQUEST,
	{
		/**
		 * TODO: add MT-specific fields (and IEs):
		 *  - smDeliveryTimer
		 *  - smDeliveryStartTime
		 */
		tr_GSUP_IE_IMSI(imsi),
		tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
		tr_GSUP_IE_SM_RP_DA(sm_rp_da),
		tr_GSUP_IE_SM_RP_OA(sm_rp_oa),
		tr_GSUP_IE_SM_RP_UI(sm_rp_ui),
		tr_GSUP_IE_SM_RP_MMS(sm_rp_mms),
		tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS)
	}
);

template (value) GSUP_PDU ts_GSUP_MT_FORWARD_SM_RES(
	hexstring imsi,
	OCT1 sm_rp_mr /* Message Reference, see GSM TS 04.11, 8.2.3 */
) := ts_GSUP(
	OSMO_GSUP_MSGT_MT_FORWARD_SM_RESULT,
	{
		valueof(ts_GSUP_IE_IMSI(imsi)),
		valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr))
	}
);
template GSUP_PDU tr_GSUP_MT_FORWARD_SM_RES(
	template hexstring imsi := ?,
	template OCT1 sm_rp_mr := ? /* Message Reference, see GSM TS 04.11, 8.2.3 */
) := tr_GSUP(
	OSMO_GSUP_MSGT_MT_FORWARD_SM_RESULT,
	{
		tr_GSUP_IE_IMSI(imsi),
		tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
		tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS)
	}
);

template (value) GSUP_PDU ts_GSUP_MT_FORWARD_SM_ERR(
	hexstring imsi,
	OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
	OCT1 sm_rp_cause /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
) := ts_GSUP(
	OSMO_GSUP_MSGT_MT_FORWARD_SM_ERROR,
	{
		valueof(ts_GSUP_IE_IMSI(imsi)),
		valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
		valueof(ts_GSUP_IE_SM_RP_CAUSE(sm_rp_cause))
	}
);
template GSUP_PDU tr_GSUP_MT_FORWARD_SM_ERR(
	template hexstring imsi := ?,
	template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
	template OCT1 sm_rp_cause := ? /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
) := tr_GSUP(
	OSMO_GSUP_MSGT_MT_FORWARD_SM_ERROR,
	{
		tr_GSUP_IE_IMSI(imsi),
		tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
		tr_GSUP_IE_SM_RP_CAUSE(sm_rp_cause),
		tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS)
	}
);

template (value) GSUP_PDU ts_GSUP_MO_READY_FOR_SM_REQ(
	hexstring imsi,
	OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
	GSUP_SM_ALERT_RSN_Type sm_alert_rsn /* SM Alert Reason, see 7.6.8.8 */
) := ts_GSUP(
	OSMO_GSUP_MSGT_READY_FOR_SM_REQUEST,
	{
		valueof(ts_GSUP_IE_IMSI(imsi)),
		valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
		valueof(ts_GSUP_IE_SM_ALERT_RSN(sm_alert_rsn))
	}
);
template GSUP_PDU tr_GSUP_MO_READY_FOR_SM_REQ(
	template hexstring imsi := ?,
	template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
	template GSUP_SM_ALERT_RSN_Type sm_alert_rsn := ? /* SM Alert Reason, see 7.6.8.8 */
) := tr_GSUP(
	OSMO_GSUP_MSGT_READY_FOR_SM_REQUEST,
	{
		tr_GSUP_IE_IMSI(imsi),
		tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
		tr_GSUP_IE_SM_ALERT_RSN(sm_alert_rsn),
		tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS)
	}
);

template (value) GSUP_PDU ts_GSUP_MO_READY_FOR_SM_RES(
	hexstring imsi,
	OCT1 sm_rp_mr /* Message Reference, see GSM TS 04.11, 8.2.3 */
) := ts_GSUP(
	OSMO_GSUP_MSGT_READY_FOR_SM_RESULT,
	{
		valueof(ts_GSUP_IE_IMSI(imsi)),
		valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr))
	}
);
template GSUP_PDU tr_GSUP_MO_READY_FOR_SM_RES(
	template hexstring imsi := ?,
	template OCT1 sm_rp_mr := ? /* Message Reference, see GSM TS 04.11, 8.2.3 */
) := tr_GSUP(
	OSMO_GSUP_MSGT_READY_FOR_SM_RESULT,
	{
		tr_GSUP_IE_IMSI(imsi),
		tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
		tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS)
	}
);

template (value) GSUP_PDU ts_GSUP_MO_READY_FOR_SM_ERR(
	hexstring imsi,
	OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
	OCT1 sm_rp_cause /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
) := ts_GSUP(
	OSMO_GSUP_MSGT_READY_FOR_SM_ERROR,
	{
		valueof(ts_GSUP_IE_IMSI(imsi)),
		valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
		valueof(ts_GSUP_IE_SM_RP_CAUSE(sm_rp_cause))
	}
);
template GSUP_PDU tr_GSUP_MO_READY_FOR_SM_ERR(
	template hexstring imsi := ?,
	template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
	template OCT1 sm_rp_cause := ? /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
) := tr_GSUP(
	OSMO_GSUP_MSGT_READY_FOR_SM_ERROR,
	{
		tr_GSUP_IE_IMSI(imsi),
		tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
		tr_GSUP_IE_SM_RP_CAUSE(sm_rp_cause),
		tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS)
	}
);

function f_gsup_find_nested_ie_multiple(GSUP_IEs ies, GSUP_IEI iei, integer nth,  out GSUP_IeValue ret) return boolean {
	var integer current := 0;
	for (var integer i := 0; i < sizeof(ies); i := i+1) {
		if (ies[i].tag == iei) {
			if (current == nth) {
				ret := ies[i].val;
				return true;
			} else {
				current := current + 1;
			}
		}
	}
	return false;
}

function f_gsup_find_nested_ie(GSUP_IEs ies, GSUP_IEI iei, out GSUP_IeValue ret) return boolean {
	for (var integer i := 0; i < sizeof(ies); i := i+1) {
		if (ies[i].tag == iei) {
			ret := ies[i].val;
			return true;
		}
	}
	return false;
}

function f_gsup_find_ie(GSUP_PDU msg, GSUP_IEI iei, out GSUP_IeValue ret) return boolean {
	return f_gsup_find_nested_ie(msg.ies, iei, ret);
}

template GSUP_AN_APDU t_GSUP_AN_APDU(
	template GSUP_AN_PROTO an_proto := ?,
	template octetstring pdu := ?
) := {
	proto := an_proto,
	pdu := pdu
};

template GSUP_PDU tr_GSUP_E_AN_APDU(
	template GSUP_MessageType msgt,
	template hexstring imsi := ?,
	template octetstring source_name := ?,
	template octetstring destination_name := ?,
	template GSUP_AN_APDU an_apdu := ?
) := tr_GSUP(
	msgt,
	{
		tr_GSUP_IE_IMSI(imsi),
		tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_INTER_MSC),
		tr_GSUP_IE_Source_Name(source_name),
		tr_GSUP_IE_Destination_Name(destination_name),
		tr_GSUP_IE_AN_APDU(an_apdu)
	}
);

template GSUP_PDU tr_GSUP_E_NO_PDU(
	template GSUP_MessageType msgt,
	template hexstring imsi := ?,
	template octetstring source_name := ?,
	template octetstring destination_name := ?
) := tr_GSUP(
	msgt,
	{
		tr_GSUP_IE_IMSI(imsi),
		tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_INTER_MSC),
		tr_GSUP_IE_Source_Name(source_name),
		tr_GSUP_IE_Destination_Name(destination_name)
	}
);

template (value) GSUP_PDU ts_GSUP_E_AN_APDU(
	GSUP_MessageType msgt,
	hexstring imsi,
	octetstring source_name,
	octetstring destination_name,
	GSUP_AN_APDU an_apdu
) := ts_GSUP(
	msgt,
	{
		valueof(ts_GSUP_IE_IMSI(imsi)),
		valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_INTER_MSC)),
		valueof(ts_GSUP_IE_Source_Name(source_name)),
		valueof(ts_GSUP_IE_Destination_Name(destination_name)),
		valueof(ts_GSUP_IE_AN_APDU(an_apdu))
	}
);

template (value) GSUP_PDU ts_GSUP_E_PrepareHandoverResult(
	hexstring imsi,
	hexstring msisdn,
	octetstring source_name,
	octetstring destination_name,
	GSUP_AN_APDU an_apdu
) := ts_GSUP(
	OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_RESULT,
	{
		valueof(ts_GSUP_IE_IMSI(imsi)),
		valueof(ts_GSUP_IE_MSISDN(msisdn)),
		valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_INTER_MSC)),
		valueof(ts_GSUP_IE_Source_Name(source_name)),
		valueof(ts_GSUP_IE_Destination_Name(destination_name)),
		valueof(ts_GSUP_IE_AN_APDU(an_apdu))
	}
);

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