GSUP Support and first test against OsmoHLR

Change-Id: Idd7a6aca1ab193da39294f49a3adc4c1cd7cecff
diff --git a/library/GSUP_Types.ttcn b/library/GSUP_Types.ttcn
new file mode 100644
index 0000000..b994d1f
--- /dev/null
+++ b/library/GSUP_Types.ttcn
@@ -0,0 +1,197 @@
+module GSUP_Types {
+
+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_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;
+				 auts, tag = OSMO_GSUP_AUTS_IE;
+				 rand, tag = OSMO_GSUP_RAND_IE;
+				 msisdn, tag = OSMO_GSUP_MSISDN_IE;
+				 hlr_number, tag = OSMO_GSUP_HLR_NUMBER_IE;
+				 cn_domain, tag = OSMO_GSUP_CN_DOMAIN_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	pdp_info,
+	GSUP_IEs	auth_tuple,
+	octetstring	auts,
+	octetstring	rand,
+	hexstring	msisdn,
+	octetstring	hlr_number,
+	GSUP_CnDomain	cn_domain,
+	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)" };
+
+
+template GSUP_PDU tr_GSUP(template GSUP_MessageType msgt := ?, template GSUP_IEs ies := *) := {
+	msg_type := msgt,
+	ies := ies
+}
+
+template GSUP_PDU ts_GSUP(GSUP_MessageType msgt, GSUP_IEs ies := {}) := {
+	msg_type := msgt,
+	ies := ies
+}
+
+template 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_ERR(template hexstring imsi, template integer cause) :=
+	tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, {
+			tr_GSUP_IE_IMSI(imsi), tr_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_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_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
+	}
+}
+
+
+
+
+} with { encode "RAW"; variant "FIELDORDER(msb)" }