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)
} 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)
} with { variant "FIELDLENGTH(8)" };

type enumerated GSUP_CancelType {
	OSMO_GSUP_CANCEL_TYPE_UPDATE		(1),
	OSMO_GSUP_CANCEL_TYPE_WITHDRAW		(2)
} 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_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_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;
			)"
};

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

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 (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 (value) GSUP_IE ts_GSUP_IE_RAND(octetstring rand) := {
	tag := OSMO_GSUP_RAND_IE,
	len := 0, /* overwritten */
	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_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,
	integer cause
) := ts_GSUP(
	OSMO_GSUP_MSGT_PROC_SS_ERROR,
	{
		valueof(ts_GSUP_IE_IMSI(imsi)),
		valueof(ts_GSUP_IE_SessionId(sid)),
		valueof(ts_GSUP_IE_Cause(cause))
	}
);
template GSUP_PDU tr_GSUP_PROC_SS_ERR(
	template hexstring imsi,
	template OCT4 sid := ?,
	template integer cause := ?
) := tr_GSUP(
	OSMO_GSUP_MSGT_PROC_SS_ERROR,
	{
		tr_GSUP_IE_IMSI(imsi),
		tr_GSUP_IE_SessionId(sid),
		tr_GSUP_IE_Cause(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)" }
