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 by 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.
 */

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_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)
} 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)
} 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 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 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;
				 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;
			)"
};

type record of GSUP_IE GSUP_IEs;

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

type record GSUP_PDU {
	GSUP_MessageType	msg_type,
	GSUP_IEs		ies
};

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 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_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 GSUP_PDU tr_GSUP_IMSI(template GSUP_MessageType msgt := ?, template 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_PDU ts_GSUP_SAI_REQ(hexstring imsi) :=
	ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, { valueof(ts_GSUP_IE_IMSI(imsi)) });

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 hexstring imsi) :=
	tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_RESULT, {
			tr_GSUP_IE_IMSI(imsi), *, tr_GSUP_IE(OSMO_GSUP_AUTH_TUPLE_IE), * });

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

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) :=
	ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT, { valueof(ts_GSUP_IE_IMSI(imsi)) });

template GSUP_PDU tr_GSUP_UL_RES(template hexstring imsi) :=
	tr_GSUP_IMSI(OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT, imsi);

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 := ?) :=
	tr_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR, {
			tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });

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

template GSUP_PDU tr_GSUP_ISD_REQ(template hexstring imsi, template hexstring msisdn := ?) :=
	tr_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_REQUEST, {
			tr_GSUP_IE_IMSI(imsi), *, tr_GSUP_IE_MSISDN(msisdn), * });

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

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_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 GSUP_IE tr_GSUP_IE_IMSI(template 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 (value) GSUP_IE ts_GSUP_IE_SRES(octetstring sres) := {
	tag := OSMO_GSUP_SRES_IE,
	len := 0, /* overwritten */
	val := {
		sres := sres
	}
}

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

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

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

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

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 (value) GSUP_IE ts_GSUP_IE_CnDomain(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_IE(GSUP_IMEI imei) := {
	tag := OSMO_GSUP_IMEI_IE,
	len := 0, /* overwritten */
	val := {
		imei := imei
	}
}
template GSUP_IE tr_GSUP_IE_IMEI_IE(template GSUP_IMEI imei) := {
	tag := OSMO_GSUP_IMEI_IE,
	len := ?,
	val := {
		imei := imei
	}
}

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

/* 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)" };

/**
 * 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,
	hexstring	msisdn,
	hexstring	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(hexstring 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 hexstring 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(hexstring 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 hexstring 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 {
	hexstring	msisdn,
	hexstring	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(hexstring 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 hexstring 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(hexstring 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 hexstring 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
	}
}

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

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

	return ies;
}
private function f_gen_tr_ss_ies(
	template hexstring imsi,
	template OCT4 sid := ?,
	template GSUP_SessionState state := ?,
	template octetstring ss := ?
) return template GSUP_IEs {
	/* Mandatory IEs */
	var template GSUP_IEs ies := {
		tr_GSUP_IE_IMSI(imsi),
		tr_GSUP_IE_SessionId(sid),
		tr_GSUP_IE_SessionState(state)
	};

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

	return ies;
}

template (value) GSUP_PDU ts_GSUP_PROC_SS_REQ(
	hexstring imsi,
	OCT4 sid,
	GSUP_SessionState state,
	template (omit) octetstring ss := omit
) := ts_GSUP(
	OSMO_GSUP_MSGT_PROC_SS_REQUEST,
	f_gen_ts_ss_ies(imsi, sid, state, ss)
);
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 := *
) := tr_GSUP(
	OSMO_GSUP_MSGT_PROC_SS_RESULT,
	f_gen_tr_ss_ies(imsi, sid, state, ss)
);

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,
	{
		valueof(ts_GSUP_IE_IMSI(imsi)),
		valueof(ts_GSUP_IE_Cause(cause)),
		valueof(ts_GSUP_IE_SessionId(sid)),
		valueof(ts_GSUP_IE_SessionState(state))
	}
);
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,
	{
		tr_GSUP_IE_IMSI(imsi),
		tr_GSUP_IE_Cause(cause),
		tr_GSUP_IE_SessionId(sid),
		tr_GSUP_IE_SessionState(state)
	}
);

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

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

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

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

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

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

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

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

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

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


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