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

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

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_REQUEST, {
			tr_GSUP_IE_IMSI(imsi), *, tr_GSUP_IE(OSMO_GSUP_AUTH_TUPLE_IE), * });

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 (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 (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_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 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 (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
	}
}



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