module GSUP_Templates {

/* GSUP_Templates, defining TTCN-3 templates 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;
import from GSUP_Types all;

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 (value) GSUP_PDP_Address ts_GSUP_PDP_Address_IPv4(template (omit) OCT4 ip_addr) := {
	ipv4 := {
		spare := '1111'B,
		pdp_typeorg := '0001'B,
		pdp_typenum := '21'O,
		ipv4_address := ip_addr
	}
}
template (value) GSUP_PDP_Address ts_EuaIPv4Dyn := ts_GSUP_PDP_Address_IPv4(omit);

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 (value) GSUP_IE ts_GSUP_IE_PdpInfoCompl := {
	tag := OSMO_GSUP_PDP_INFO_COMPL_IE,
	len := 0, /* overwritten */
	val := {
		pdp_info_compl := ''O
	}
}

template (present) GSUP_IE tr_GSUP_IE_PdpInfoCompl := {
	tag := OSMO_GSUP_PDP_INFO_COMPL_IE,
	len := 0, /* overwritten */
	val := {
		pdp_info_compl := ''O
	}
}

template (value) GSUP_IE ts_GSUP_IE_PdpInfo(template (value) OCT1 ctx_id,
					    template (value) octetstring apn,
					    template (value) GSUP_PDP_Address pdp_address,
					    template (value) octetstring pdp_qos) := {
	tag := OSMO_GSUP_PDP_INFO_IE,
	len := 0, /* overwritten */
	val := {
		pdp_info := {
			valueof(ts_GSUP_IE_PDP_CONTEXT_ID(ctx_id)),
			valueof(ts_GSUP_IE_PDP_ADDRESS(pdp_address)),
			valueof(ts_GSUP_IE_APN(apn)),
			valueof(ts_GSUP_IE_PDP_QOS(pdp_qos))
		}
	}
}
template (value) GSUP_IE ts_GSUP_IE_PdpInfo_ie(template (value) GSUP_IEs pdp_info) := {
	tag := OSMO_GSUP_PDP_INFO_IE,
	len := 0, /* overwritten */
	val := {
		pdp_info := pdp_info
	}
}

template (present) GSUP_IE tr_GSUP_IE_PdpInfo(template (present) OCT1 ctx_id,
					      template (present) octetstring apn,
					      template (present) GSUP_PDP_Address pdp_address) := {
	tag := OSMO_GSUP_PDP_INFO_IE,
	len := ?,
	val := {
		pdp_info := {
			tr_GSUP_IE_PDP_CONTEXT_ID(ctx_id),
			tr_GSUP_IE_PDP_ADDRESS(pdp_address),
			tr_GSUP_IE_APN(apn)
		}
	}
}
template (present) GSUP_IE tr_GSUP_IE_PdpInfo_ie(template (present) GSUP_IEs pdp_info := ?) := {
	tag := OSMO_GSUP_PDP_INFO_IE,
	len := ?,
	val := {
		pdp_info := pdp_info
	}
}

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

template (present) 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_ADDRESS(template (value) GSUP_PDP_Address pdp_address) := {
	tag := OSMO_GSUP_PDP_ADDRESS_IE,
	len := 0,
	val := {
		pdp_address := pdp_address
	}
}

template (present) GSUP_IE tr_GSUP_IE_PDP_ADDRESS(template (present) GSUP_PDP_Address pdp_address := ?) := {
	tag := OSMO_GSUP_PDP_ADDRESS_IE,
	len := ?,
	val := {
		pdp_address := pdp_address
	}
}

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

template (present) GSUP_IE tr_GSUP_IE_PDP_QOS(template (present) octetstring pdp_qos := ?) := {
	tag := OSMO_GSUP_PDP_QOS_IE,
	len := ?,
	val := {
		pdp_qos := pdp_qos
	}
}

template (value) GSUP_IE ts_GSUP_IE_Charging_Characteristics(template (value) octetstring charg_char) := {
	tag := OSMO_GSUP_CHARG_CHAR_IE,
	len := 0,
	val := {
		charg_char := charg_char
	}
}

template (present) GSUP_IE tr_GSUP_IE_Charging_Characteristics(template (present) octetstring charg_char := ?) := {
	tag := OSMO_GSUP_CHARG_CHAR_IE,
	len := ?,
	val := {
		charg_char := charg_char
	}
}

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_Message_Class message_class := OSMO_GSUP_MESSAGE_CLASS_IPSEC_EPDG,
						 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,
								 message_class := message_class,
								 dom := dom,
								 source_name := source_name));

template (present) GSUP_PDU tr_GSUP_EPDGTunnel_REQ(template (present) hexstring imsi := ?,
						   template (present) GSUP_Message_Class message_class := OSMO_GSUP_MESSAGE_CLASS_IPSEC_EPDG) :=
	tr_GSUP(OSMO_GSUP_MSGT_EPDG_TUNNEL_REQUEST,
		f_gen_tr_ies(imsi,
			     message_class := message_class));


template (value) GSUP_PDU ts_GSUP_EPDGTunnel_RES(hexstring imsi,
						template (value) GSUP_IEs pdp_info,
						GSUP_Message_Class message_class := OSMO_GSUP_MESSAGE_CLASS_IPSEC_EPDG,
						octetstring destination_name := ''O) :=
	ts_GSUP(OSMO_GSUP_MSGT_EPDG_TUNNEL_RESULT, {
		valueof(ts_GSUP_IE_IMSI(imsi)),
		valueof(ts_GSUP_IE_PdpInfoCompl),
		valueof(ts_GSUP_IE_PdpInfo_ie(pdp_info)),
		valueof(ts_GSUP_IE_Message_Class(message_class)),
		valueof(ts_GSUP_IE_Destination_Name(destination_name))
		});

template (present) GSUP_PDU tr_GSUP_EPDGTunnel_RES(template (present) hexstring imsi,
						   template (present) GSUP_IEs pdp_info,
						   template (present) GSUP_Message_Class message_class := OSMO_GSUP_MESSAGE_CLASS_IPSEC_EPDG,
						   template octetstring destination_name := omit) :=
	tr_GSUP(OSMO_GSUP_MSGT_EPDG_TUNNEL_RESULT,
		f_gen_tr_ies(imsi,
			     pdp_info_compl := true,
			     pdp_info := pdp_info,
			     message_class := message_class,
			     destination_name := destination_name));

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

template (present) GSUP_PDU tr_GSUP_EPDGTunnel_ERR(template (present) hexstring imsi,
						   template (present) GSUP_Message_Class message_class := OSMO_GSUP_MESSAGE_CLASS_IPSEC_EPDG,
						   template (present) integer cause := ?,
						   template octetstring destination_name := omit) :=
	tr_GSUP(OSMO_GSUP_MSGT_EPDG_TUNNEL_ERROR,
		f_gen_tr_ies(imsi,
			     message_class := message_class,
			     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(template (value) 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
	}
}

/* See 3GPP TS 24.011, figures 8.5 and 8.6 */
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
 */
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
 */
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 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 (omit) boolean pdp_info_compl := omit,
			   template (omit) GSUP_Message_Class message_class := omit,
			   template (omit) hexstring imei := omit,
			   template (omit) GSUP_CnDomain dom := omit,
			   template (omit) octetstring source_name := omit,
			   template (omit) 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(pdp_info_compl) and valueof(pdp_info_compl)) {
		ies := ies & { valueof(ts_GSUP_IE_PdpInfoCompl) };
	}

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

	if (isvalue(message_class)) {
		ies := ies & { valueof(ts_GSUP_IE_Message_Class(valueof(message_class))) };
	}

	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 boolean pdp_info_compl := omit,
			      template GSUP_IEs pdp_info := omit,
			      template GSUP_Message_Class message_class := omit,
			      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 (not istemplatekind(msisdn, "omit")) {
		ies[idx] := tr_GSUP_IE_MSISDN(msisdn);
		idx := idx + 1;
	}

	if (not istemplatekind(cause, "omit")) {
		ies[idx] := tr_GSUP_IE_Cause(cause);
		idx := idx + 1;
	}

	if (not istemplatekind(pdp_info_compl, "omit")) {
		ies[idx] := tr_GSUP_IE_PdpInfoCompl;
		idx := idx + 1;
	}

	if (not istemplatekind(pdp_info, "omit")) {
		ies[idx] := tr_GSUP_IE_PdpInfo_ie(pdp_info);
		idx := idx + 1;
	}

	if (not istemplatekind(imei_result, "omit")) {
		ies[idx] := tr_GSUP_IE_IMEI_Result(imei_result);
		idx := idx + 1;
	}

	if (not istemplatekind(message_class, "omit")) {
		ies[idx] := tr_GSUP_IE_Message_Class(message_class);
		idx := idx + 1;
	}

	if (not istemplatekind(source_name, "omit")) {
		ies[idx] := tr_GSUP_IE_Source_Name(source_name);
		idx := idx + 1;
	}

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

	if (not istemplatekind(destination_name, "omit")) {
		if (istemplatekind(destination_name, "*")) {
			ies[idx] := *;
		} else {
			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)),
		valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
	}
);
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),
		tr_GSUP_IE_Source_Name(?)
	}
);

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)),
		valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
	}
);
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),
		tr_GSUP_IE_Source_Name(?)
	}
);

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)),
		valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
	}
);
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),
		tr_GSUP_IE_Source_Name(?)
	}
);

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)),
		valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
	}
);
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),
		tr_GSUP_IE_Source_Name(?)
	}
);

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)),
		valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
	}
);
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),
		tr_GSUP_IE_Source_Name(?)
	}
);

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)),
		valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
	}
);
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),
		tr_GSUP_IE_Source_Name(?)
	}
);

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)),
		valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
	}
);
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),
		tr_GSUP_IE_Source_Name(?)
	}
);

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)),
		valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
	}
);
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),
		tr_GSUP_IE_Source_Name(?)
	}
);

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)),
		valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
	}
);
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),
		tr_GSUP_IE_Source_Name(?)
	}
);

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