/* GTPv1-C Templates in TTCN-3
 * (C) 2018 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
 */

module GTPv1C_Templates {

	import from General_Types all;
	import from Osmocom_Types all;
	import from GTPC_Types all;
	import from GTPv1C_CodecPort all;
	import from IPCP_Types all;
	import from GSM_Types all; // RoutingAreaIdentification, CellIdentity

	template (present) OCT1 gtp1_requests := (
		'10'O, /* createPDPContextRequest */
		'12'O, /* updatePDPContextRequest */
		'14'O, /*  */
		'16'O, /* deletePDPContextRequest */
		'1B'O, /* pdu_NotificationRequest */
		'1D'O, /* pdu_NotificationRejectRequest */
		'1F'O, /* supportedExtensionHeadersNotification */
		'20'O, /* sendRouteingInformationForGPRSRequest */
		'22'O, /* failureReportRequest */
		'24'O, /* noteMS_GPRSPresentRequest */
		'30'O, /* identificationRequest */
		'32'O, /* sgsn_ContextRequest */
		'35'O, /* forwardRelocationRequest */
		'38'O, /* relocationCancelRequest */
		'3A'O, /* forwardSRNSContext */
		'3D'O, /* uERegistrationQueryRequest */
		'46'O, /* ranInformationRelay */
		'60'O, /* mBMSNotificationRequest */
		'62'O, /* mBMSNotificationRejectRequest */
		'64'O, /* createMBMSContextRequest */
		'66'O, /* updateMBMSContextRequest */
		'68'O, /* deleteMBMSContextRequest */
		'70'O, /* mBMSRegistrationRequest */
		'72'O, /* mBMSDeRegistrationRequest */
		'74'O, /* mBMSSessionStartRequest */
		'76'O, /* mBMSSessionStopRequest */
		'78'O, /* mBMSSessionUpdateRequest */
		'80'O /* mS_InfoChangeNotificationRequest */
	);

	type record GTP_CellId {
		RoutingAreaIdentification	ra_id,
		CellIdentity			cell_id
	} with { encode "RAW" };

	template (value) GTP_CellId ts_GTP_CellId(template (value) RoutingAreaIdentification rai, CellIdentity cell_id) := {
		ra_id := rai,
		cell_id := cell_id
	};

	/* Table 38 of 3GPP TS 29.060 */
	type enumerated GTP_Cause {
		GTP_CAUSE_REQUEST_IMEI			(1),
		GTP_CAUSE_REQUEST_IMSI_AND_IMEI		(2),
		GTP_CAUSE_NO_IDENTITY_NEDED		(3),
		GTP_CAUSE_MS_REFUSES			(4),
		GTP_CAUSE_MS_IS_NOT_GPRS_RESPONDING	(5),
		/* reserved */
		GTP_CAUSE_REQUEST_ACCEPTED		(128),
		GTP_CAUSE_INVALID_MSG_FORMAT		(193)
		/* FIXME */
	};

	template (value) Cause_gtpc ts_Cause_gtpc(template (value) GTP_Cause cause) := {
		type_gtpc := '01'O,
		causevalue := enum2oct1_Cause_gtpc_tmpl(cause)
	}
	private function enum2oct1_Cause_gtpc_tmpl(template GTP_Cause inp) return template OCT1
	{
		if (istemplatekind(inp, "omit")) {
			return omit;
		} else if (istemplatekind(inp, "*")) {
			return *;
		} else if (istemplatekind(inp, "?")) {
			return ?;
		} else {
			return int2oct(enum2int(valueof(inp)), 1);
		}
	}
	template (present) Cause_gtpc tr_Cause_gtpc(template (present) GTP_Cause cause) := {
		type_gtpc := '01'O,
		causevalue := enum2oct1_Cause_gtpc_tmpl(cause)
	}
	function f_tr_Cause_gtpc(template GTP_Cause cause) return
	template Cause_gtpc {
		if (istemplatekind(cause, "omit")) {
			return omit;
		} else if (istemplatekind(cause, "*")) {
			return *;
		} else {
			return tr_Cause_gtpc(cause);
		}
	}

	private function f_oct_or_wc(template integer inp, integer len) return template octetstring {
		if (istemplatekind(inp, "omit")) {
			return omit;
		} else if (istemplatekind(inp, "*")) {
			return *;
		} else if (istemplatekind(inp, "?")) {
			return ?;
		}
		return int2oct(valueof(inp), len);
	}

	private function f_hex_or_wc(template integer inp, integer len) return template hexstring {
		if (istemplatekind(inp, "omit")) {
			return omit;
		} else if (istemplatekind(inp, "*")) {
			return *;
		} else if (istemplatekind(inp, "?")) {
			return ?;
		}
		return int2hex(valueof(inp), len);
	}

	/* generalized GTP-C receive template */
	template (present) PDU_GTPC tr_GTP1C_PDU(template (present) OCT1 msg_type, template (present) OCT4 teid, template (present) GTPC_PDUs pdu := ?) := {
		/* N-PDU Number flag (PN) shall be set to '0'. A GTP-C receiver shall not return an
		 * error if this flag is set to '1'. */
		pn_bit := '0'B,
		/* Sequence number flag (S) shall be set to '1'. */
		s_bit := '1'B,
		e_bit := ?,
		spare := ?,
		/* Protocol Type flag (PT) shall be set to '1'.*/
		pt := '1'B,
		/* Version shall be set to decimal 1 ('001'). */
		version := '001'B,
		messageType := msg_type,
		lengthf := ?,
		teid := teid,
		opt_part := *,
		gtpc_pdu := pdu
	}

	/* generalized GTP-C send template */
	template (value) PDU_GTPC ts_GTP1C_PDU(OCT1 msg_type, OCT4 teid, GTPC_PDUs pdu, uint16_t seq_nr) := {
		/* N-PDU Number flag (PN) shall be set to '0'. A GTP-C receiver shall not return an
		 * error if this flag is set to '1'. */
		pn_bit := '0'B,
		/* Sequence number flag (S) shall be set to '1'. */
		s_bit := '1'B,
		e_bit := '0'B,
		spare := '0'B,
		/* Protocol Type flag (PT) shall be set to '1'.*/
		pt := '1'B,
		/* Version shall be set to decimal 1 ('001'). */
		version := '001'B,
		messageType := msg_type,
		lengthf := 0,	/* we assume encoder overwrites this */
		teid := teid,
		opt_part := {
			sequenceNumber := int2oct(seq_nr, 2),
			npduNumber := '00'O,
			nextExtHeader := '00'O,
			gTPC_extensionHeader_List := omit
		},
		gtpc_pdu := pdu
	}

	/* recovery IE */
	template (value) Recovery_gtpc ts_Recovery(OCT1 restart_counter) := {
		type_gtpc := '0E'O,
		restartCounter := restart_counter
	}

	template (present) Recovery_gtpc tr_Recovery(template (present) OCT1 restart_counter) := {
		type_gtpc := '0E'O,
		restartCounter := restart_counter
	}

	/* Packet TMSI - 7.7.5 */
	template (value) PacketTMSI ts_PTMSI(OCT4 ptmsi) := {
		type_gtpc := '05'O,
		p_tmsi := ptmsi
	}

	/* PTMSI Signature - 7.7.9 */
	template (value) PTMSI_Signature ts_PTMSI_sig(OCT3 ptmsi_sig) := {
		type_gtpc := '0C'O,
		ptmsi_Signature := ptmsi_sig
	}

	/* MS Validated - 7.7.10 */
	template (value) MS_Validated ts_MS_Validated(template (value) BIT1 msValidated) := {
		type_gtpc := '0D'O,
		msValidated := msValidated,
		spare := '1111111'B
	}
	template (present) MS_Validated tr_MS_Validated(template (present) BIT1 msValidated := ?) := {
		type_gtpc := '0D'O,
		msValidated := msValidated,
		spare := '1111111'B
	}
	function f_tr_MS_Validated(template BIT1 msValidated := *) return template MS_Validated {
		if (istemplatekind(msValidated, "omit")) {
			return omit;
		} else if (istemplatekind(msValidated, "*")) {
			return *;
		} else {
			return tr_MS_Validated(msValidated);
		}
	}
	private function f_ts_MS_Validated(template (omit) BIT1 msValidated)
	return template (omit) MS_Validated {
		if (istemplatekind(msValidated, "omit")) {
			return omit;
		}
		return ts_MS_Validated(msValidated);
	}

	/* 7.7.13 TEI Data I */
	template (value) TeidDataI ts_TeidDataI(template (value) OCT4 teid) := {
		type_gtpc := '10'O,
		teidDataI := teid
	}
	template (present) TeidDataI tr_TeidDataI(template (present) OCT4 teid := ?) := {
		type_gtpc := '10'O,
		teidDataI := teid
	}

	/* 7.7.14 TEI Control Plane */
	template (value) TeidControlPlane ts_TEIC(template (value) OCT4 teic) := {
		type_gtpc := '11'O,
		teidControlPlane := teic
	}
	template (present) TeidControlPlane tr_TEIC(template (present) OCT4 teic := ?) := {
		type_gtpc := '11'O,
		teidControlPlane := teic
	}
	private function f_ts_TEIC(template (omit) OCT4 teic)
	return template (omit) TeidControlPlane {
		if (istemplatekind(teic, "omit")) {
			return omit;
		}
		return ts_TEIC(teic);
	}

	/* 7.7.15 Tunnel Endpoint Identifier Data II */
	template (value) TeidDataII ts_TeidDataII(template (value) BIT4 nsapi,
						  template (value) OCT4 teid) := {
		type_gtpc := '12'O,
		nsapi := nsapi,
		unused := '0000'B,
		teidDataII := teid
	}
	template (present) TeidDataII tr_TeidDataII(template (present) BIT4 nsapi := ?,
						    template (present) OCT4 teid := ?) := {
		type_gtpc := '12'O,
		nsapi := nsapi,
		unused := '0000'B,
		teidDataII := teid
	}

	/* IMEI(SV) IE TS 29.060 7.7.53 */
	template (value) IMEISV_gtpc ts_IMEISV(template (value) OCT8 imeisv) := {
		type_gtpc := '9A'O,
		lengthf := 8,
		imeisv := imeisv
	}
	private function f_ts_IMEISV(template (omit) OCT8 imeisv)
	return template (omit) IMEISV_gtpc {
		if (istemplatekind(imeisv, "omit")) {
			return omit;
		}
		return ts_IMEISV(imeisv);
	}

	template (present) IMEISV_gtpc tr_IMEISV(template (present) OCT8 imeisv) := {
		type_gtpc := '9A'O,
		lengthf := 8,
		imeisv := imeisv
	}

	// MS Time Zone  -  7.7.52
	template (value) MS_TimeZone ts_MS_TimeZone(template (value) OCT1 timeZone := '00'O,
						    template (value) BIT2 daylightSavingTime := '00'B) := {
		type_gtpc := '99'O,
		lengthf := 2,
		timeZone := timeZone,
		daylightSavingTime := daylightSavingTime,
		spare1 := '000'B,
		sgsnAttempsToUpdateMS := '0'B, /* propietary, use it as spare */
		spare2 := '00'B
	}
	function f_ts_MS_TimeZone(template (omit) OCT1 timeZone, template (omit) BIT2 daylightSavingTime)
	return template (omit) MS_TimeZone {
		if (istemplatekind(timeZone, "omit") and istemplatekind(daylightSavingTime, "omit")) {
			return omit;
		}
		if (istemplatekind(timeZone, "omit")) {
			return ts_MS_TimeZone(daylightSavingTime := daylightSavingTime);
		}
		if (istemplatekind(daylightSavingTime, "omit")) {
			return ts_MS_TimeZone(timeZone);
		}
		return ts_MS_TimeZone(timeZone, daylightSavingTime);
	}

	template (present) MS_TimeZone tr_MS_TimeZone(template (present) OCT1 timeZone := ?,
						      template (present) BIT2 daylightSavingTime := ?) := {
		type_gtpc := '99'O,
		lengthf := 2,
		timeZone := timeZone,
		daylightSavingTime := daylightSavingTime,
		spare1 := '000'B,
		sgsnAttempsToUpdateMS := '0'B, /* propietary, use it as spare */
		spare2 := '00'B
	}

	/* Charging Characteristics IE TS 29.060 7.7.23 */
	template (value) ChargingCharacteristics_GTPC ts_ChargingCharacteristics(template (value) OCT2 chargingChar) := {
		type_gtpc := '1A'O,
		chargingChar := chargingChar
	}
	private function f_ts_ChargingCharacteristics(template (omit) OCT2 chargingChar)
		return template (omit) ChargingCharacteristics_GTPC {
		if (istemplatekind(chargingChar, "omit")) {
			return omit;
		}
		return ts_ChargingCharacteristics(chargingChar);
	}

	template (present) ChargingCharacteristics_GTPC tr_ChargingCharacteristics(template (present) OCT2 chargingChar) := {
		type_gtpc := '1A'O,
		chargingChar := chargingChar
	}

	/* 7.7.28 MM Context */
	template (value) MM_Context ts_MM_ContextGSM(template (value) OCT8 kc,
						     template (value) BIT3 cksn := '000'B,
						     template (value) BIT3 gea := '000'B,
						     template (value) octetstring triplet := ''O) := {
		type_gtpc := '81'O,
		context := {
			mmcontGSM := {
				lengthf := 0, /* overwritten */
				cksn := cksn,
				spare := '11111'B,
				usedCipher := gea,
				noofVectors := 0, /* overwritten */
				security := '01'B, /* GSM key and triplets */
				kc := kc,
				triplet := triplet,
				drx_par := '0000'O,
				msNetW_cap_length := 0, /* overwritten */
				msNetw_cap := omit,
				containerLength := 0, /* overwritten */
				container := omit,
				access_restriction_data_length := 0,
				access_restriction_data := omit
			}
		}
	}
	template (present) MM_Context tr_MM_ContextGSM(template (present) OCT8 kc := ?,
						       template (present) BIT3 cksn := ?,
						       template (present) BIT3 gea := ?,
						       template (present) octetstring triplet := ?) := {
		type_gtpc := '81'O,
		context := {
			mmcontGSM := {
				lengthf := ?,
				cksn := cksn,
				spare := ?,
				usedCipher := gea,
				noofVectors := ?,
				security := '01'B, /* GSM key and triplets */
				kc := kc,
				triplet := triplet,
				drx_par := ?,
				msNetW_cap_length := ?,
				msNetw_cap := *,
				containerLength := ?,
				container := *,
				access_restriction_data_length := ?,
				access_restriction_data := *
			}
		}
	}

	template (value) MM_Context ts_MM_ContextUMTS(template (value) OCT16 ck,
						      template (value) OCT16 ik) := {
		type_gtpc := '81'O,
		context := {
			mmcontUMTS := {
				lengthf := 0, /* overwritten */
				ksi := '001'B,
				usedGPRSIntegrityAlgorithm := '000'B,
				ugipai := '1'B, /* Integrity Protection not required */
				gupii := '1'B, /* Ignore "Used GPRS integrity protection algorithm" field" */
				spare1 := '111'B,
				noofVectors := 0, /* TODO: fill quintpuplets*/
				security := '10'B, /* UMTS key and quintuplets */
				ck := ck,
				ik := ik,
				quintupletlength := 0, /* overwritten */
				quintuplet := ''O,
				drx_par := '0000'O,
				msNetW_cap_length := 0, /* overwritten */
				msNetw_cap := omit,
				containerLength := 0, /* overwritten */
				container := omit,
				access_restriction_data_length := 0, /* overwritten */
				access_restriction_data := omit
			}
		}
	}

	/* 7.7.29 PDP Context */
	template (value) PDP_Context_GTPC ts_PDP_Context_GTPC(template (value) octetstring pdp_addr,
							      template (value) octetstring ggsn_gsn_addr,
							      template (value) octetstring apn,
							      template (value) OCT4 ggsn_teic := '12345678'O,
							      template (value) OCT4 ggsn_teid := '87654321'O) := {
		type_gtpc := '82'O,
		lengthf := 0, /* overwritten */
		nsapi := '0101'B,
		order := '0'B,
		asi := '0'B,
		vaa := '0'B,
		ea := '0'B,
		sapi := '0011'B,
		spare1 := '0000'B,
		qos_subLength := 0, /* overwritten */
		qos_sub := ts_QosProfileValueDefault,
		qos_reqLength := 0, /* overwritten */
		qos_req := ts_QosProfileValueDefault,
		qos_negLength := 0, /* overwritten */
		qos_neg := ts_QosProfileValueDefault,
		snd := '0000'O,
		snu := '0000'O,
		sendNPDUnum := '00'O,
		receiveNPDUnum := '00'O,
		uteidControlPlane := ggsn_teic,
		uteidData1 := ggsn_teid,
		pdpcontext := '00'O,
		pdp_typeorg := '0001'B, /* IETF */
		spare2 := '1111'B,
		pdp_typenum := '21'O, /* IETF IPV4 */
		pdp_addressLength := 0, /* overwritten */
		pdp_address := pdp_addr,
		ggsn_addressControlPlaneLength := 0, /* overwritten */
		ggsn_addressControlPlane := ggsn_gsn_addr,
		ggsn_addressUserPlaneLength := 0, /* overwritten */
		ggsn_addressUserPlane := ggsn_gsn_addr,
		apnLength := 0, /* overwritten */
		apn := apn,
		transactionId := '0001'B,
		spare3 := '0000'B,
		transactionID_cont := '00'O,
		pdp_typenum2 := omit,
		pdp_addresslength2 := omit,
		pdp_Address2 := omit
	}


	/* template matching reception of GTP-C unit-data */
	template (present) Gtp1cUnitdata tr_GTPC_MsgType(template (present) Gtp1cPeer peer,
							 template (present) OCT1 msg_type,
							 template (present) OCT4 teid,
							 template (present) GTPC_PDUs pdus := ?) := {
		peer := peer,
		gtpc := tr_GTP1C_PDU(msg_type, teid, pdus)
	}

	/* template matching reception of GTP-C echo-request */
	template (present) Gtp1cUnitdata tr_GTPC_PING(template (present) Gtp1cPeer peer) := tr_GTPC_MsgType(peer, echoRequest, '00000000'O);

	template (present) GTPC_PDUs tr_EchoRespPDU(template (present) OCT1 restart_counter) := {
		echoResponse := {
			recovery := tr_Recovery(restart_counter),
			private_extension_gtpc := *
		}
	}

	/* template matching reception of GTP-C echo-response */
	template (present) Gtp1cUnitdata tr_GTPC_PONG(template (present) Gtp1cPeer peer) := tr_GTPC_MsgType(peer, echoResponse, '00000000'O, tr_EchoRespPDU(?));

	template (value) GTPC_PDUs ts_EchoRespPDU(OCT1 restart_counter) := {
		echoResponse := {
			recovery := ts_Recovery(restart_counter),
			private_extension_gtpc := omit
		}
	}

	/* master template for senidng a GTP-C echo response */
	template (value) Gtp1cUnitdata ts_GTPC_PONG(Gtp1cPeer peer, uint16_t seq, OCT1 rest_ctr) := {
		peer := peer,
		gtpc := ts_GTP1C_PDU(echoResponse, '00000000'O, valueof(ts_EchoRespPDU(rest_ctr)), seq)
	}

	template (value) GTPC_PDUs ts_EchoReqPDU := {
		echoRequest := {
			private_extension_gtpc := omit
		}
	}

	/* master template for sending a GTP-C echo request */
	template (value) Gtp1cUnitdata ts_GTPC_PING(Gtp1cPeer peer, uint16_t seq) := {
		peer := peer,
		gtpc := ts_GTP1C_PDU(echoRequest, '00000000'O, valueof(ts_EchoReqPDU), seq)
	}

	private function f_eua_ipv4_len(template OCT4 ip_addr) return template (present) integer {
		if (istemplatekind(ip_addr, "omit")) {
			return 2;
		} else if (istemplatekind(ip_addr, "*")) {
			return ?;
		} else if (istemplatekind(ip_addr, "?")) {
			return 6;
		}
		return 6;
	}

	private function f_eua_ipv6_len(template OCT16 ip_addr) return template (present) integer {
		if (istemplatekind(ip_addr, "omit")) {
			return 2;
		} else if (istemplatekind(ip_addr, "*")) {
			return ?;
		} else if (istemplatekind(ip_addr, "?")) {
			return 18;
		}
		return 18;
	}

	private function f_eua_ipv4v6_len(template OCT4 ip_addr4, template OCT16 ip_addr6) return template (present) integer {
		var integer len := 2;
		if (istemplatekind(ip_addr4, "*") or
		    istemplatekind(ip_addr6, "*")) {
			return ?;
		}
		if (not istemplatekind(ip_addr4, "omit")) {
			len := len + 4;
		}
		if (not istemplatekind(ip_addr6, "omit")) {
			len := len + 16;
		}
		return len;
	}

	template (present) EndUserAddress t_EuaIPv4(template OCT4 ip_addr) := {
		type_gtpc := '80'O,
		endUserAddress := {
			endUserAddressIPv4 := {
				lengthf := 2,
				pdp_typeorg := '0001'B,
				spare := '1111'B,
				pdp_typenum := '21'O,
				ipv4_address := ip_addr
			}
		}
	}
	template (present) EndUserAddress t_EuaIPv4Dyn := t_EuaIPv4(omit);
	template (present) EndUserAddress tr_EuaIPv4(template (present) OCT4 ip_addr) modifies t_EuaIPv4 := {
		endUserAddress := {
			endUserAddressIPv4 := {
				lengthf := f_eua_ipv4_len(ip_addr)
			}
		}
	}

	template (present) EndUserAddress t_EuaIPv6(template OCT16 ip_addr) := {
		type_gtpc := '80'O,
		endUserAddress := {
			endUserAddressIPv6 := {
				lengthf := 2,
				pdp_typeorg := '0001'B,
				spare := '1111'B,
				pdp_typenum := '57'O,
				ipv6_address := ip_addr
			}
		}
	}
	template (present) EndUserAddress t_EuaIPv6Dyn := t_EuaIPv6(omit);
	template (present) EndUserAddress tr_EuaIPv6(template (present) OCT16 ip_addr) modifies t_EuaIPv6 := {
		endUserAddress := {
			endUserAddressIPv6 := {
				lengthf := f_eua_ipv6_len(ip_addr)
			}
		}
	}

	/* 3GPP TS 29.060 Figure 37A: End User Address Information Element for IPv4v6 (both static) */
	template (present) EndUserAddress t_EuaIPv4v6(template OCT4 ip_addr4, template OCT16 ip_addr6) := {
		type_gtpc := '80'O,
		endUserAddress := {
			endUserAddressIPv4andIPv6 := {
				lengthf := 2,
				pdp_typeorg := '0001'B,
				spare := '1111'B,
				pdp_typenum := '8D'O,
				ipv4_address := ip_addr4,
				ipv6_address := ip_addr6
			}
		}
	}
	template (present) EndUserAddress t_EuaIPv4Dynv6Dyn := t_EuaIPv4v6(omit, omit);
	template (present) EndUserAddress tr_EuaIPv4v6(template (present) OCT4 ip_addr4,
						       template (present) OCT16 ip_addr6) modifies t_EuaIPv4v6 := {
		endUserAddress := {
			endUserAddressIPv4andIPv6 := {
				lengthf := f_eua_ipv4v6_len(ip_addr4, ip_addr6)
			}
		}
	}

	template (value) AccessPointName ts_APN(octetstring apn) := {
		type_gtpc := '83'O,
		lengthf := lengthof(apn),
		apn_value := apn
	}

	template (value) GSN_Address_GTPC ts_GsnAddr(template (value) octetstring ip_addr) := {
		type_gtpc := '85'O,
		lengthf := lengthof(ip_addr),
		addressf := ip_addr
	}
	template (present) GSN_Address_GTPC tr_GsnAddr(template (present) octetstring ip_addr := ?) := {
		type_gtpc := '85'O,
		lengthf := ?,
		addressf := ip_addr
	}

	template (value) MSISDN ts_Msisdn(octetstring msisdn) := {
		type_gtpc := '86'O,
		lengthf := lengthof(msisdn),
		msisdn := msisdn
	}

	template (value) QoSV_GTPC ts_QosValueDefault := {
		reliabilityClass := '011'B,
		delayClass := '001'B,
		spare1 := '00'B,
		precedenceClass := '010'B,
		spare2 := '0'B,
		peakThroughput := '1001'B,
		meanThroughput := '11111'B,
		spare3 := '000'B,
		deliverErroneusSDU := '010'B, /* Erroneus SDU are delivered */
		deliveryOrder := '10'B, /* Without delivery order */
		trafficClass := '100'B, /* Background */
		maxSDUSize := '96'O, /* 1500 octets */
		maxBitrateUplink := 'FE'O, /* 8640, continues in extended octet */
		maxBitrateDownlink := 'FE'O, /* 8640, continues in extended octet */
		sduErrorRatio := '0100'B, /* 1x10^-4 */
		residualBER := '0101'B, /* 1x10^-3 */
		trafficHandlingPriority := '01'B, /* prio 1 */
		transferDelay := '000001'B, /* 10 ms */
		guaranteedBitRateUplink := 'FE'O, /* 8640, continues in extended octet */
		guaranteedBitRateDownlink := 'FE'O, /* 8640, continues in extended octet */
		sourceStatisticsDescriptor := '0000'B, /* unknown */
		signallingIndication := '0'B, /* Not optimized */
		spare4 := '000'B,
		maxBitrateDownlinkExt := '5B'O, /* 33 mbps */
		guaranteedBitRateDownlinkExt := '5B'O, /* 33 mbps */
		maxBitrateUplinkExt := '6e'O, /* 52 mbps */
		guaranteedBitRateUplinkExt := '6e'O /* 52 mbps */
	}

	template (value) QualityOfServiceProfile_Value ts_QosProfileValueDefault := {
		allocRetensionPrio := '00'O,
		qos_ProfileValue := ts_QosValueDefault
	}

	template (value) QualityOfServiceProfile ts_QosDefault := {
		type_gtpc := '87'O,
		lengthf := 17,
		allocRetensionPrio := '00'O,
		qos_ProfileValue := ts_QosValueDefault
	}

	template (value) IMSI_gtpc ts_Imsi(hexstring digits) := {
		type_gtpc := '02'O,
		digits := digits,
		padding := 'F'H
	}
	function f_ts_Imsi(template (omit) hexstring digits := omit) return template (omit) IMSI_gtpc {
		var template (omit) IMSI_gtpc imsi;
		if (istemplatekind(digits, "omit")) {
			imsi := omit;
		} else {
			imsi := ts_Imsi(valueof(digits));
		}
		return imsi;
	}
	template (present) IMSI_gtpc tr_Imsi(template (present) hexstring digits) := {
		type_gtpc := '02'O,
		digits := digits,
		padding := 'F'H
	}
	function f_tr_Imsi(template hexstring digits := *) return template IMSI_gtpc {
		if (istemplatekind(digits, "omit")) {
			return omit;
		} else if (istemplatekind(digits, "*")) {
			return *;
		} else {
			return tr_Imsi(digits);
		}
	}

	/* 7.7.50 RAT Type */
	type enumerated GTP_RATType {
		GTP_RAT_TYPE_RESERVED		(0),
		GTP_RAT_TYPE_UTRAN		(1),
		GTP_RAT_TYPE_GERAN		(2),
		GTP_RAT_TYPE_WLAN		(3),
		GTP_RAT_TYPE_GAN		(4),
		GTP_RAT_TYPE_HSPA_E		(5),
		GTP_RAT_TYPE_EUTRAN		(6)
	};
	template (value) RATType ts_RATType(template (value) OCT1 rat_type) := {
			type_gtpc := '97'O,
			lengthf := 1,
			ratTypeValue := rat_type
	}
	function f_ts_RATType(template (omit) OCT1 rat_type := omit) return template (omit) RATType {
		if (istemplatekind(rat_type, "omit")) {
			return omit;
		} else {
			return ts_RATType(rat_type);
		}
	}
	template (present) RATType tr_RATType(template (present) OCT1 rat_type) := {
			type_gtpc := '97'O,
			lengthf := 1,
			ratTypeValue := rat_type
	}
	function f_tr_RATType(template OCT1 rat_type := *) return template RATType {
		if (istemplatekind(rat_type, "omit")) {
			return omit;
		} else if (istemplatekind(rat_type, "*")) {
			return *;
		} else {
			return tr_RATType(rat_type);
		}
	}

	template (value) RoutingAreaIdentity ts_RoutingAreaIdentity(template (value) hexstring mcc_digits,
								    template (value) hexstring mnc_digits,
								    template (value) OCT2      lac,
								    template (value) OCT1      rac) := {
		type_gtpc := '03'O,
		mcc_digits := mcc_digits,
		mnc_digits := mnc_digits,
		lac := lac,
		rac := rac
	}

	template (value) GeographicLocationCGI
	ts_GeographicLocationCGI(template (value) hexstring mcc,
				 template (value) hexstring mnc,
				 template (value) OCT2 lac,
				 template (value) OCT2 cI_value) :=
	{
		mccDigit1 := mcc[0],
		mccDigit2 := mcc[1],
		mccDigit3 := mcc[2],
		mncDigit3 := mnc[2], /* 'F'H for 2 digit MNC */
		mncDigit1 := mnc[0],
		mncDigit2 := mnc[1],
		lac := lac,
		cI_value := cI_value
	}

	template (value) GTPC_PDUs ts_CreatePdpPDU(hexstring imsi, OCT1 restart_ctr, OCT4 teid_data, OCT4 teid_ctrl,
						   BIT4 nsapi, EndUserAddress eua, octetstring apn,
						   octetstring sgsn_ip_sign, octetstring sgsn_ip_data,
						   octetstring msisdn, template (omit) ProtConfigOptions pco := omit,
						   template (omit) OCT1 ratType := omit,
						   template (omit) UserLocationInformation uli := omit,
						   template (omit) OCT2 charging_char := omit,
						   template (omit) OCT8 imeisv := omit,
						   template (omit) MS_TimeZone ms_tz := omit) := {
		createPDPContextRequest := {
			imsi := ts_Imsi(imsi),
			rai := omit,
			recovery := ts_Recovery(restart_ctr),
			selectionMode := {
				type_gtpc := '0F'O,
				selectModeValue := '00'B,
				spare := '111111'B
			},
			teidDataI := {
				type_gtpc := '00'O,
				teidDataI := teid_data
			},
			teidControlPlane := {
				type_gtpc := '00'O,
				teidControlPlane := teid_ctrl
			},
			nsapi := {
				type_gtpc := '00'O,
				nsapi := nsapi,
				unused := '0000'B
			},
			linked_nsapi := omit,
			charging_char := f_ts_ChargingCharacteristics(charging_char),
			trace_ref := omit,
			trace_type := omit,
			endUserAddress := eua,
			accessPointName := ts_APN(apn),
			protConfigOptions := pco,
			sgsn_addr_signalling := ts_GsnAddr(sgsn_ip_sign),
			sgsn_addr_traffic := ts_GsnAddr(sgsn_ip_data),
			msisdn := ts_Msisdn(msisdn),
			qualityOfServiceProfile := ts_QosDefault,
			tft := omit,
			triggerId := omit,
			omcId := omit,
			commonFlags := omit,
			aPN_Restriction := omit,
			ratType := f_ts_RATType(ratType),
			userLocationInformation := uli,
			mS_TimeZone := ms_tz,
			imeisv := f_ts_IMEISV(imeisv),
			camelChargingInformationContainer := omit,
			additionalTraceInfo := omit,
			correlationID := omit,
			evolvedAllocationRetentionPriorityI := omit,
			extendedCommonFlags := omit,
			userCSGInformation := omit,
			aPN_AMBR := omit,
			signallingPriorityIndication := omit,
			cN_OperatorSelectionEntity := omit,
			private_extension_gtpc := omit
		}
	}

	template (value) Gtp1cUnitdata ts_GTPC_CreatePDP(Gtp1cPeer peer, uint16_t seq, hexstring imsi,
							 OCT1 restart_ctr, OCT4 teid_data,
							 OCT4 teid_ctrl, BIT4 nsapi, EndUserAddress eua,
							 octetstring apn, octetstring sgsn_ip_sign,
							 octetstring sgsn_ip_data, octetstring msisdn,
							 template (omit) ProtConfigOptions pco := omit,
							 template (omit) OCT1 ratType := omit,
							 template (omit) UserLocationInformation uli := omit,
							 template (omit) OCT2 charging_char := omit,
							 template (omit) OCT8 imeisv := omit,
							 template (omit) MS_TimeZone ms_tz := omit) := {
		peer := peer,
		gtpc := ts_GTP1C_PDU(createPDPContextRequest, '00000000'O,
					valueof(ts_CreatePdpPDU(imsi, restart_ctr, teid_data, teid_ctrl,
								nsapi, eua, apn, sgsn_ip_sign,
								sgsn_ip_data, msisdn, pco, ratType, uli,
								charging_char, imeisv, ms_tz)), seq)
	}


	template (value) GTPC_PDUs ts_UpdatePdpPDU(hexstring imsi, OCT1 restart_ctr, OCT4 teid_data, OCT4 teid_ctrl,
				   		   BIT4 nsapi,
						   octetstring sgsn_ip_sign, octetstring sgsn_ip_data,
						   template (omit) ProtConfigOptions pco := omit,
						   template (omit) OCT1 ratType := omit,
						   template (omit) UserLocationInformation uli := omit) := {
		updatePDPContextRequest := {
			updatePDPContextRequestSGSN := {
				imsi := ts_Imsi(imsi),
				rai := omit,
				recovery := ts_Recovery(restart_ctr),
				teidDataI := {
					type_gtpc := '00'O,
					teidDataI := teid_data
				},
				teidControlPlane := {
					type_gtpc := '00'O,
					teidControlPlane := teid_ctrl
				},
				nsapi := {
					type_gtpc := '00'O,
					nsapi := nsapi,
					unused := '0000'B
				},
				trace_ref := omit,
				trace_type := omit,
				protConfigOptions := pco,
				sgsn_addr_controlPlane := ts_GsnAddr(sgsn_ip_sign),
				sgsn_addr_traffic := ts_GsnAddr(sgsn_ip_data),
				alt_ggsn_addr_controlPane := omit,
				alt_ggsn_addr_traffic := omit,
				qualityOfServiceProfile := ts_QosDefault,
				tft := omit,
				triggerId := omit,
				omcId := omit,
				commonFlags := omit,
				ratType := f_ts_RATType(ratType),
				userLocationInformation := uli,
				mS_TimeZone := omit,
				additionalTraceInfo := omit,
				directTunnelFlags := omit,
				evolvedAllocationRetentionPriorityI := omit,
				extendedCommonFlags := omit,
				userCSGInformation := omit,
				aPN_AMBR := omit,
				signallingPriorityIndication := omit,
				cN_OperatorSelectionEntity := omit,
				private_extension_gtpc := omit
			}
		}
	}

	template (value) Gtp1cUnitdata ts_GTPC_UpdatePDP(Gtp1cPeer peer, OCT4 teid, uint16_t seq, hexstring imsi,
							 OCT1 restart_ctr, OCT4 teid_data,
							 OCT4 teid_ctrl, BIT4 nsapi, octetstring sgsn_ip_sign,
							 octetstring sgsn_ip_data,
							 template (omit) ProtConfigOptions pco := omit,
							 template (omit) OCT1 ratType := omit,
							 template (omit) UserLocationInformation uli := omit) := {
		peer := peer,
		gtpc := ts_GTP1C_PDU(updatePDPContextRequest, teid,
					valueof(ts_UpdatePdpPDU(imsi, restart_ctr, teid_data, teid_ctrl,
								nsapi, sgsn_ip_sign,
								sgsn_ip_data, pco, ratType, uli)), seq)
	}


	template (value) NSAPI_GTPC ts_NSAPI(BIT4 nsapi) := {
		type_gtpc := '14'O,
		nsapi := nsapi,
		unused := '0000'B
	}

	template (value) ReorderingRequired ts_ReorderReq(boolean req := false) := {
		type_gtpc := '08'O,
		reordreq := bool2bit(req),
		spare := '0000000'B
	}

	template (value) GTPC_PDUs ts_CreatePdpRespPDU(OCT1 cause, OCT4 teid_data, OCT4 teid_ctrl, BIT4 nsapi,
						       octetstring ggsn_ip_sign, octetstring ggsn_ip_data,
						       OCT4 chg_id, template (omit) EndUserAddress eua := omit,
						       template (omit) Recovery_gtpc recovery := omit,
						       template (omit) ProtConfigOptions pco := omit) := {
		createPDPContextResponse := {
			cause := { '00'O, cause },
			reorderingRequired := ts_ReorderReq(false),
			recovery := recovery,
			teidDataI := {
				type_gtpc := '00'O,
				teidDataI := teid_data
			},
			teidControlPlane := {
				type_gtpc := '00'O,
				teidControlPlane := teid_ctrl
			},
			nsapi := ts_NSAPI(nsapi),
			chargingID := {
				type_gtpc := '7F'O,
				chargingID := chg_id
			},
			endUserAddress := eua,
			protConfigOptions := pco,
			ggsn_addr_controlPlane := ts_GsnAddr(ggsn_ip_sign),
			ggsn_addr_traffic := ts_GsnAddr(ggsn_ip_data),
			alt_ggsn_addr_controlPane := omit,
			alt_ggsn_addr_traffic := omit,
			qualityOfServiceProfile := ts_QosDefault,
			commonFlags := omit,
			aPN_Restriction := omit,
			mS_InfoChangeReportingAction := omit,
			bearerControlMode := omit,
			evolvedAllocationRetentionPriorityI := omit,
			extendedCommonFlag := omit,
			csg_information_reporting_action := omit,
			aPN_AMBR := omit,
			gGSN_BackOffTime := omit,
			private_extension_gtpc := omit
		}
	}

	template (value) Gtp1cUnitdata ts_GTPC_CreatePdpResp(Gtp1cPeer peer, uint16_t seq, OCT4 teid,
							     OCT1 cause,
							     OCT4 teid_ctrl, OCT4 teid_data,
							     BIT4 nsapi, octetstring ggsn_ip_sign,
							     octetstring ggsn_ip_data, OCT4 chg_id,
							     template (omit) EndUserAddress eua := omit,
							     template (omit) Recovery_gtpc recovery := omit,
							     template (omit) ProtConfigOptions pco := omit) := {
		peer := peer,
		gtpc := ts_GTP1C_PDU(createPDPContextResponse, teid,
					valueof(ts_CreatePdpRespPDU(cause, teid_data, teid_ctrl, nsapi,
								ggsn_ip_sign, ggsn_ip_data, chg_id,
								eua, recovery, pco)), seq)
	}

	/* PCO send base template */
	template (value) ProtConfigOptions ts_PCO := {
		type_gtpc := '84'O,
		lengthf := 0,
		configProtocol := '000'B,
		spare := '0000'B,
		extension0 := '1'B,
		protocols := {}
	}
	/* PCO receive base template */
	template (present) ProtConfigOptions tr_PCO := {
		type_gtpc := '84'O,
		lengthf := ?,
		configProtocol := '000'B,
		spare := ?,
		extension0 := '1'B,
		protocols := {}
	}

	template (value) ProtConfigOptions ts_PCO_IPv6_DNS modifies ts_PCO := {
		protocols := {
			{ protocolID := '0003'O, lengthProtoID := 0, protoIDContents := ''O }
		}
	}
	template (present) ProtConfigOptions tr_PCO_IPv6_DNS_resp(template (present) OCT16 contents) modifies tr_PCO := {
		protocols := {
			*, { protocolID := '0003'O, lengthProtoID := 16, protoIDContents := contents }, *
		}
	}

	template (value) ProtConfigOptions ts_PCO_IPv4_DNS_IPCP(uint8_t ipcp_req_id := 0) modifies ts_PCO := {
		protocols := {
			/* dummy PAP entry to check if our parser in the GGSN can properly iterate over
			 * the list of protocols, see Change-Id Icc2e6716c33d78d3c3e000f529806228d8aa155e */
			{ protocolID := 'C023'O, lengthProtoID := 0, protoIDContents := ''O },
			{ protocolID := '8021'O, lengthProtoID := 16, protoIDContents :=
								enc_IpcpPacket(valueof(ts_IPCP_ReqDNS(ipcp_req_id))) }
		}
	}

	template (value) ProtConfigOptions ts_PCO_IPv4_PRI_DNS_IPCP modifies ts_PCO := {
		protocols := {
			/* dummy PAP entry to check if our parser can cope with a single primary DNS entry
			 * see Change-Id Icffde89f9bc5d8fcadf6e2dd6c0b4de03440edd5 and OS#3288 */
			{ protocolID := 'C023'O, lengthProtoID := 0, protoIDContents := ''O },
			{ protocolID := '8021'O, lengthProtoID := 16, protoIDContents :=
								enc_IpcpPacket(valueof(ts_IPCP_ReqDNS_Primary)) }
		}
	}
	template (value) ProtConfigOptions ts_PCO_IPv4_SEC_DNS_IPCP modifies ts_PCO := {
		protocols := {
			/* dummy PAP entry to check if our parser can cope with a single secondary DNS entry
			 * see Change-Id Icffde89f9bc5d8fcadf6e2dd6c0b4de03440edd5 and OS#3288 */
			{ protocolID := 'C023'O, lengthProtoID := 0, protoIDContents := ''O },
			{ protocolID := '8021'O, lengthProtoID := 16, protoIDContents :=
								enc_IpcpPacket(valueof(ts_IPCP_ReqDNS_Secondary)) }
		}
	}
	template (value) ProtConfigOptions ts_PCO_IPv4_SEPARATE_DNS_IPCP modifies ts_PCO := {
		protocols := {
			/* dummy PAP entry to check if our parser can cope with a primary and secondary DNS
			 * in separate IPCP containers OS#3381 */
			{ protocolID := 'C023'O, lengthProtoID := 0, protoIDContents := ''O },
			{ protocolID := '8021'O, lengthProtoID := 16, protoIDContents :=
								enc_IpcpPacket(valueof(ts_IPCP_ReqDNS_Primary)) },
			{ protocolID := '8021'O, lengthProtoID := 16, protoIDContents :=
								enc_IpcpPacket(valueof(ts_IPCP_ReqDNS_Secondary)) }
		}
	}

	template (present) ProtocolElement tr_PCO_Proto(OCT2 prot_id) := {
		protocolID := prot_id,
		lengthProtoID := ?,
		protoIDContents := ?
	}
	template (value) ProtocolElement ts_PCOelem_PAP_broken := {
		protocolID := 'C023'O,
		lengthProtoID := 60,
		/* PPP Password Authentication Protocol containing incorrect Peer-Id-Length set to 4 (6-7 should be the valid one), see OS#3914. */
		protoIDContents := '0100003c'O & '0444435338323700bc1c08087c1508083e00790000150808fd06000001000000000000000000000000000000000000000000000000000000'O
	}
	template (value) ProtConfigOptions ts_PCO_PAP_IPv4_DNS modifies ts_PCO := {
		protocols := {
			ts_PCOelem_PAP_broken,
			{ protocolID := '8021'O, lengthProtoID := 16, protoIDContents := enc_IpcpPacket(valueof(ts_IPCP_ReqDNS)) }
		}
	}
	template (present) ProtConfigOptions tr_PCO_Contains(OCT2 prot_id) modifies tr_PCO := {
		protocols := { *, tr_PCO_Proto(prot_id), * }
	}

	template (value) ProtConfigOptions ts_PCO_IPv4_DNS_CONT modifies ts_PCO := {
		protocols := {
			{ protocolID := '000d'O, lengthProtoID := 0, protoIDContents := ''O }
		}
	}
	template (present) ProtConfigOptions tr_PCO_IPv4_DNS_CONT_resp(template (present) OCT4 contents) modifies tr_PCO := {
		protocols := {
			*, { protocolID := '000d'O, lengthProtoID := 4, protoIDContents := contents }, *
		}
	}

	/* extract a given protocol payload from PCO */
	function f_PCO_extract_proto(ProtConfigOptions pco, OCT2 protocol, integer nth_match := 1) return octetstring {
		var integer i;
		var integer num_matches := 0;
		for (i := 0; i < lengthof(pco.protocols); i := i + 1) {
			if (pco.protocols[i].protocolID == protocol) {
				num_matches := num_matches + 1;
				if (num_matches == nth_match) {
					return pco.protocols[i].protoIDContents;
				}
			}
		}
		setverdict(fail, "Could not extract protocol payload from protocol ", protocol);
		mtc.stop;
		return ''O;
	}

	template (present) IpcpPacket tr_IPCP(template (present) LcpCode code, template (present)uint8_t identifier,
					      template (present) IpcpOptionList opts) := {
		code := code,
		identifier := identifier,
		len := ?,
		options := opts
	}
	template (present) IpcpOption tr_IPCP_PrimaryDns(template (present) OCT4 addr) := {
		code := IPCP_OPT_PrimaryDNS,
		len := 6,
		data := addr
	}
	template (present) IpcpOption tr_IPCP_SecondaryDns(template (present) OCT4 addr) := {
		code := IPCP_OPT_SecondaryDNS,
		len := 6,
		data := addr
	}
	template (present) IpcpPacket tr_IPCP_Ack_DNS(template (present) uint8_t identifier := ?,
						      template (present) OCT4 dns1 := ?,
						      template (present) OCT4 dns2 := ?) :=
		tr_IPCP(LCP_Configure_Ack, identifier,
				{ *, tr_IPCP_PrimaryDns(dns1), *, tr_IPCP_SecondaryDns(dns2), * });

	template (value) IpcpPacket ts_IPCP(LcpCode code, uint8_t identifier, template (value) IpcpOptionList opts) := {
		code := code,
		identifier := identifier,
		len := 0,	/* overwritten */
		options := opts
	}
	template (value) IpcpPacket ts_IPCP_ReqDNS(uint8_t identifier := 0) :=
		ts_IPCP(LCP_Configure_Request, identifier,
			{ tr_IPCP_PrimaryDns('00000000'O), tr_IPCP_SecondaryDns('00000000'O) });

	template (value) IpcpPacket ts_IPCP_ReqDNS_Primary(uint8_t identifier := 0) :=
		ts_IPCP(LCP_Configure_Request, identifier,
			{ tr_IPCP_PrimaryDns('00000000'O) });
	template (value) IpcpPacket ts_IPCP_ReqDNS_Secondary(uint8_t identifier := 0) :=
		ts_IPCP(LCP_Configure_Request, identifier,
			{ tr_IPCP_SecondaryDns('00000000'O) });

	function f_teardown_ind_IE(in template (omit) BIT1 ind) return template (omit) TearDownInd {
		if (istemplatekind(ind, "omit")) {
			return omit;
		}
		var TearDownInd ret := {
			type_gtpc := '13'O,
			tdInd := valueof(ind),
			spare:= '0000000'B
		}
		return ret;
	}

	template (value) GTPC_PDUs ts_DeletePdpPDU(BIT4 nsapi, template (omit) BIT1 teardown_ind) := {
		deletePDPContextRequest := {
			cause := omit,
			tearDownIndicator := f_teardown_ind_IE(teardown_ind),
			nsapi := {
				type_gtpc := '14'O,
				nsapi := nsapi,
				unused := '0000'B
			},
			protConfigOptions := omit,
			userLocationInformation := omit,
			mS_TimeZone := omit,
			extendedCommonFlags := omit,
			uLI_Timestamp := omit,
			private_extension_gtpc := omit
		}
	}

	template (value) Gtp1cUnitdata ts_GTPC_DeletePDP(Gtp1cPeer peer, uint16_t seq, OCT4 teid,
							 BIT4 nsapi, template (omit) BIT1 teardown_ind) := {
		peer := peer,
		gtpc := ts_GTP1C_PDU(deletePDPContextRequest, teid,
					valueof(ts_DeletePdpPDU(nsapi, teardown_ind)), seq)
	}

	template (value) GTPC_PDUs ts_DeletePdpRespPDU(OCT1 cause,
						       template (omit) ProtConfigOptions pco := omit) := {
		deletePDPContextResponse := {
			cause := { '00'O, cause },
			protConfigOptions := pco,
			userLocationInformation := omit,
			mS_TimeZone := omit,
			uLI_Timestamp := omit,
			private_extension_gtpc := omit
		}
	}

	template (value) Gtp1cUnitdata ts_GTPC_DeletePdpResp(Gtp1cPeer peer, uint16_t seq, OCT4 teid,
							     OCT1 cause,
							     template (omit) ProtConfigOptions pco := omit) := {
		peer := peer,
		gtpc := ts_GTP1C_PDU(deletePDPContextResponse, teid,
					valueof(ts_DeletePdpRespPDU(cause, pco)), seq)
	}

	/* SGSN Context Request - 7.5.3 */
	template (present) GTPC_PDUs tr_SGSNContextReqPDU(template (present) RoutingAreaIdentity rai := ?,
							template (present) OCT4 teic := ?,
							template (present) octetstring sgsn_addr_control := ?,
							template hexstring imsi := *,
							template BIT1 msValidated := *,
							template TLLI tlli := *,
							template PacketTMSI ptmsi := *,
							template PTMSI_Signature ptmsi_sig := *,
							template OCT1 rat_type := *) := {
		sgsn_ContextRequest := {
			imsi := f_tr_Imsi(imsi),
			routingAreaIdentity := rai,
			tlli := tlli,
			packetTMSI := ptmsi,
			ptmsi_Signature := ptmsi_sig,
			ms_Validated := f_tr_MS_Validated(msValidated),
			teidControlPlane := {
				type_gtpc := '11'O,
				teidControlPlane := teic
			},
			sgsn_addr_controlPlane := tr_GsnAddr(sgsn_addr_control),
			alternative_sgsn_addr_controlPlane := *,
			sGSN_Number := *,
			ratType := f_tr_RATType(rat_type),
			hopCounter := *,
			private_extension_gtpc := *
		}
	}
	template (present) Gtp1cUnitdata tr_GTPC_SGSNContextReq(template (present) Gtp1cPeer peer,
								template (present) GTPC_PDUs SGSNContextReqPDU) := {
		peer := peer,
		gtpc := tr_GTP1C_PDU(sgsnContextRequest, '00000000'O, SGSNContextReqPDU)
	}
	template (value) GTPC_PDUs ts_SGSNContextReqPDU(template (value) RoutingAreaIdentity rai,
							template (value) OCT4 teic,
							template (value) octetstring sgsn_addr_control,
							template (omit) hexstring imsi := omit,
							template (omit) BIT1 msValidated := '0'B,
							template (omit) TLLI tlli := omit,
							template (omit) PacketTMSI ptmsi := omit,
							template (omit) PTMSI_Signature ptmsi_sig := omit,
							template (omit) OCT1 rat_type := omit) := {
		sgsn_ContextRequest := {
			imsi := f_ts_Imsi(imsi),
			routingAreaIdentity := rai,
			tlli := tlli,
			packetTMSI := ptmsi,
			ptmsi_Signature := ptmsi_sig,
			ms_Validated := f_ts_MS_Validated(msValidated),
			teidControlPlane := {
				type_gtpc := '11'O,
				teidControlPlane := teic
			},
			sgsn_addr_controlPlane := ts_GsnAddr(sgsn_addr_control),
			alternative_sgsn_addr_controlPlane := omit,
			sGSN_Number := omit,
			ratType := f_ts_RATType(rat_type),
			hopCounter := omit,
			private_extension_gtpc := omit
		}
	}
	template (value) Gtp1cUnitdata ts_GTPC_SGSNContextReq(Gtp1cPeer peer, uint16_t seq,
							      template (value) GTPC_PDUs SGSNContextReqPDU) := {
		peer := peer,
		gtpc := ts_GTP1C_PDU(sgsnContextRequest, '00000000'O, valueof(SGSNContextReqPDU), seq)
	}

	/* SGSN Context Response - 7.5.4 */
	template (present) GTPC_PDUs tr_SGSNContextRespPDU(template (present) GTP_Cause cause := ?,
							  template hexstring imsi := *) := {
		sgsn_ContextResponse := {
			cause := tr_Cause_gtpc(cause),
			imsi := f_tr_Imsi(imsi),
			teidControlPlane := *,
			rabContext := *,
			radioPrioritySMS := *,
			radioPriority := *,
			packetFlowID := *,
			charging_char := *,
			mm_Context := *,
			pdp_Context := *,
			sgsn_addr_controlPlane := *,
			pdpContextPriorization := *,
			radioPriority_LCS := *,
			mBMS_UE_Context := *,
			subscribedRFSP_Index := *,
			rFSP_IndexInUse := *,
			colocatedGGSN_PGW_FQDN := *,
			evolvedAllocationRetentionPriorityII := *,
			extendedCommonFlags := *,
			ue_network_capability := *,
			ue_ambr := *,
			apn_ambr_nsapi := *,
			signallingPriorityIndication_nsapi := *,
			higher_bitrates_than_16mbps_flag := *,
			selectionMode_nsapi := *,
			localHomeNetworkID_nsapi := *,
			uE_UsageType := *,
			extendedCommonFlagsII := *,
			private_extension_gtpc := *
		}
	}
	template (present) Gtp1cUnitdata tr_GTPC_SGSNContextResp(template (present) Gtp1cPeer peer := ?,
								 template (present) OCT4 teid := ?,
								 template (present) GTPC_PDUs SGSNContextRespPDU := ?)
		:= tr_GTPC_MsgType(peer, sgsnContextResponse, teid, SGSNContextRespPDU);

	template (value) GTPC_PDUs ts_SGSNContextRespPDU(template (value) GTP_Cause cause,
							template (omit) hexstring imsi := omit,
							template (omit) OCT4 teic := omit,
							template (omit) octetstring sgsn_addr_control := omit,
							template (omit) MM_Context mm_context := omit,
							template (omit) PDP_Context_GTPC_List pdp_ctx_list := omit) := {
		sgsn_ContextResponse := {
			cause := ts_Cause_gtpc(cause),
			imsi := f_ts_Imsi(imsi),
			teidControlPlane := f_ts_TEIC(teic),
			rabContext := omit,
			radioPrioritySMS := omit,
			radioPriority := omit,
			packetFlowID := omit,
			charging_char := omit,
			mm_Context := mm_context,
			pdp_Context := pdp_ctx_list,
			sgsn_addr_controlPlane := ts_GsnAddr(sgsn_addr_control),
			pdpContextPriorization := omit,
			radioPriority_LCS := omit,
			mBMS_UE_Context := omit,
			subscribedRFSP_Index := omit,
			rFSP_IndexInUse := omit,
			colocatedGGSN_PGW_FQDN := omit,
			evolvedAllocationRetentionPriorityII := omit,
			extendedCommonFlags := omit,
			ue_network_capability := omit,
			ue_ambr := omit,
			apn_ambr_nsapi := omit,
			signallingPriorityIndication_nsapi := omit,
			higher_bitrates_than_16mbps_flag := omit,
			selectionMode_nsapi := omit,
			localHomeNetworkID_nsapi := omit,
			uE_UsageType := omit,
			extendedCommonFlagsII := omit,
			private_extension_gtpc := omit
		}
	}
	template (value) Gtp1cUnitdata ts_GTPC_SGSNContextResp(Gtp1cPeer peer, OCT4 teid, uint16_t seq,
							      template (value) GTPC_PDUs SGSNContextRespPDU) := {
		peer := peer,
		gtpc := ts_GTP1C_PDU(sgsnContextResponse, teid, valueof(SGSNContextRespPDU), seq)
	}


	/* SGSN Context Acknowledge - 7.5.5 */
	template (present) GTPC_PDUs tr_SGSNContextAckPDU(template (present) GTP_Cause cause := ?) := {
		sgsn_ContextAcknowledge := {
			cause := tr_Cause_gtpc(cause),
			teidDataII := *,
			sgsn_AddressForUserTraffic := *,
			sgsn_Number := *,
			nodeIdentifier  := *,
			private_extension_gtpc := *
		}
	}
	template (present) Gtp1cUnitdata tr_GTPC_SGSNContextAck(template (present) Gtp1cPeer peer := ?,
								 template (present) OCT4 teid := ?,
								 template (present) GTPC_PDUs SGSNContextAckPDU := ?)
		:= tr_GTPC_MsgType(peer, sgsnContextAcknowledge, teid, SGSNContextAckPDU);
	template (value) GTPC_PDUs ts_SGSNContextAckPDU(template (value) GTP_Cause cause := GTP_CAUSE_REQUEST_ACCEPTED) := {
		sgsn_ContextAcknowledge := {
			cause := ts_Cause_gtpc(cause),
			teidDataII := omit,
			sgsn_AddressForUserTraffic := omit,
			sgsn_Number := omit,
			nodeIdentifier  := omit,
			private_extension_gtpc := omit
		}
	}

	template (value) Gtp1cUnitdata ts_GTPC_SGSNContextAck(Gtp1cPeer peer, OCT4 teid, uint16_t seq,
							      template (value) GTPC_PDUs SGSNContextAckPDU := ts_SGSNContextAckPDU) := {
		peer := peer,
		gtpc := ts_GTP1C_PDU(sgsnContextAcknowledge, teid, valueof(SGSNContextAckPDU), seq)
	}

	/* GTP-C RIM */

	template (value) RIM_Application_Identity_GTPC ts_GTPC_RIM_Application_Identity(OCT1 app_id) := {
		 iEI := '4B'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 1
		 },
		 rIMApplicationIdentity := app_id
	}
	/* 3GPP TS 48.018 11.3.62 */
	template (value) RIM_Sequence_Number_GTPC ts_GTPC_RIM_Sequence_Number(integer seq) := {
		 iEI := '4C'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 4
		 },
		 rIMSequenceNumber := int2oct(seq, 4)
	}
	template (value) RIM_PDU_Indications_GTPC ts_GTPC_RIM_PDU_Indications(boolean ack, BIT3 type_ext) := {
		 iEI := '4F'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 1
		 },
		 ack := bool2bit(ack),
		 pDU_Type_Extension := type_ext,
		 reserved := '0000'B
	}
	/* 3GPP TS 48.018 11.3.67 */
	template (value) RIM_Protocol_Version_Number_GTPC ts_GTPC_RIM_Protocol_Version_Number(integer ver) := {
		 iEI := '55'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 1
		 },
		 rIMProtocolVersionNumber := int2oct(ver, 1)
	}
	function tr_GTPC_Cell_Identifier_V(template (present) GTP_CellId cid) return template (present) Cell_Identifier_V_GTPC {
		var template Cell_Identifier_V_GTPC ret := {
			mccDigit1 := ?,
			mccDigit2 := ?,
			mccDigit3 := ?,
			mncDigit3 := ?,
			mncDigit1 := ?,
			mncDigit2 := ?,
			lac := ?,
			rac := ?,
			cI_value := ?
		}
		if (istemplatekind(cid, "?")) {
			return ?;
		}
		if (isvalue(cid) and isvalue(cid.ra_id) and isvalue(cid.ra_id.lai)) {
			if (isvalue(cid.ra_id.lai.mcc_mnc)) {
				ret.mccDigit1 := cid.ra_id.lai.mcc_mnc[0];
				ret.mccDigit2 := cid.ra_id.lai.mcc_mnc[1];
				ret.mccDigit3 := cid.ra_id.lai.mcc_mnc[2];
				ret.mncDigit3 := cid.ra_id.lai.mcc_mnc[3];
				ret.mncDigit1 := cid.ra_id.lai.mcc_mnc[4];
				ret.mncDigit2 := cid.ra_id.lai.mcc_mnc[5];
			}
			if (isvalue(cid.ra_id.lai.lac)) {
				ret.lac := f_oct_or_wc(cid.ra_id.lai.lac, 2);
			}
		}
		if (isvalue(cid) and isvalue(cid.ra_id)) {
			ret.rac := f_oct_or_wc(cid.ra_id.rac, 1);
		}
		if (isvalue(cid)) {
			ret.cI_value := f_oct_or_wc(cid.cell_id, 2);
		}
		return ret;
	}
	template (value) Cell_Identifier_V_GTPC ts_GTPC_Cell_Identifier_V(GTP_CellId cid) := {
		mccDigit1 := cid.ra_id.lai.mcc_mnc[0],
		mccDigit2 := cid.ra_id.lai.mcc_mnc[1],
		mccDigit3 := cid.ra_id.lai.mcc_mnc[2],
		mncDigit3 := cid.ra_id.lai.mcc_mnc[3],
		mncDigit1 := cid.ra_id.lai.mcc_mnc[4],
		mncDigit2 := cid.ra_id.lai.mcc_mnc[5],
		lac := int2oct(cid.ra_id.lai.lac, 2),
		rac := int2oct(cid.ra_id.rac, 1),
		cI_value := int2oct(cid.cell_id, 2)
	}
	template (value) RIM_Routing_Address_GTPC t_GTPC_RIM_Routing_Address_cid(GTP_CellId cid) := {
		cell_Identifier := ts_GTPC_Cell_Identifier_V(cid)
	}
	function tr_GTPC_ENB_Identifier(template (present) GTP_CellId cid,
					template (present) integer tac,
					template (present) octetstring gnbid) return template (present) ENB_Identifier {
		var template (present) ENB_Identifier ret := {
			mccDigit1 := ?,
			mccDigit2 := ?,
			mccDigit3 := ?,
			mncDigit3 := ?,
			mncDigit1 := ?,
			mncDigit2 := ?,
			tAC := ?,
			globalENB_ID := ?
		}
		if (istemplatekind(cid, "?") and istemplatekind(tac, "?") and istemplatekind(gnbid, "?")) {
			return ?;
		}
		if (isvalue(cid) and isvalue(cid.ra_id) and isvalue(cid.ra_id.lai)) {
			if (isvalue(cid.ra_id.lai.mcc_mnc)) {
				ret.mccDigit1 := cid.ra_id.lai.mcc_mnc[0];
				ret.mccDigit2 := cid.ra_id.lai.mcc_mnc[1];
				ret.mccDigit3 := cid.ra_id.lai.mcc_mnc[2];
				ret.mncDigit3 := cid.ra_id.lai.mcc_mnc[3];
				ret.mncDigit1 := cid.ra_id.lai.mcc_mnc[4];
				ret.mncDigit2 := cid.ra_id.lai.mcc_mnc[5];
			}
		}
		if (isvalue(tac)) {
			ret.tAC := int2oct(valueof(tac), 2);
		}
		if (isvalue(gnbid)) {
			ret.globalENB_ID := gnbid;
		}

		return ret;
	}
	template (value) ENB_Identifier ts_GTPC_ENB_Identifier(GTP_CellId cid, integer tac, octetstring gnbid) := {
		mccDigit1 := cid.ra_id.lai.mcc_mnc[0],
		mccDigit2 := cid.ra_id.lai.mcc_mnc[1],
		mccDigit3 := cid.ra_id.lai.mcc_mnc[2],
		mncDigit3 := cid.ra_id.lai.mcc_mnc[3],
		mncDigit1 := cid.ra_id.lai.mcc_mnc[4],
		mncDigit2 := cid.ra_id.lai.mcc_mnc[5],
		tAC := int2oct(tac, 2),
		globalENB_ID := gnbid
	}
	template (value) RIM_Routing_Address_GTPC t_GTPC_RIM_Routing_Address_enbid(GTP_CellId cid, integer tac, octetstring gnbid) := {
		eNB_Identifier := ts_GTPC_ENB_Identifier(cid, tac, gnbid)
	}
	template (present) RIM_Routing_Information_GTPC
	tr_GTPC_RIM_Routing_Information(HEX1 addr_discr, template (present) RIM_Routing_Address_GTPC addr) := {
		iEI := '54'O,
		ext := '1'B,
			lengthIndicator := {
				length1 := ?
		},
		rIMRoutingAddressDiscriminator := addr_discr,
		spare := '0'H,
		rIM_Routing_Address := addr
	}
	template (value) RIM_Routing_Information_GTPC
	ts_GTPC_RIM_Routing_Information(HEX1 addr_discr, template (value) RIM_Routing_Address_GTPC addr) := {
		iEI := '54'O,
		ext := '1'B,
			lengthIndicator := {
				length1 := 0 /* overwritten */
		},
		rIMRoutingAddressDiscriminator := addr_discr,
		spare := '0'H,
		rIM_Routing_Address := addr
	}
	/* 3GPP TS 48.018 11.3.63.1.1 */
	template (present) RAN_Information_Request_Application_Container_NACC_GTPC
	tr_GTPC_RAN_Information_Request_Application_Container_NACC(template (present) GTP_CellId cid) := {
		iEI := '4D'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := ?
		},
		reporting_Cell_Identifier := tr_GTPC_Cell_Identifier_V(cid)
	}
	template (value) RAN_Information_Request_Application_Container_NACC_GTPC
	ts_GTPC_RAN_Information_Request_Application_Container_NACC(GTP_CellId cid) := {
		iEI := '4D'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 0 /* overwritten */
		},
		reporting_Cell_Identifier := ts_GTPC_Cell_Identifier_V(cid)
	}
	/* 3GPP TS 48.018 11.3.63.1 */
	template (present) RAN_Information_Request_Application_Container_GTPC
	tru_GTPC_RAN_Information_Request_Application_Container_NACC(template (present) GTP_CellId cid) := {
		nacc := tr_GTPC_RAN_Information_Request_Application_Container_NACC(cid)
	}
	template (value) RAN_Information_Request_Application_Container_GTPC
	tsu_GTPC_RAN_Information_Request_Application_Container_NACC(GTP_CellId cid) := {
		nacc := ts_GTPC_RAN_Information_Request_Application_Container_NACC(cid)
	}
	/* 3GPP TS 48.018 11.3.63.2.1 */
	template (present) RAN_Information_Application_Container_NACC_GTPC
	tr_GTPC_RAN_Information_Application_Container_NACC(template (present) GTP_CellId cid, boolean psi_type, integer si_psi_num, octetstring si_psi) := {
		 iEI := '4E'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := ?
		 },
		 reporting_Cell_Identifier := tr_GTPC_Cell_Identifier_V(cid),
		 typeBit := bool2bit(psi_type),
		 number_of_SI_PSI := int2bit(si_psi_num, 7),
		 sI_PSI := si_psi
	}
	template (value) RAN_Information_Application_Container_NACC_GTPC
	ts_GTPC_RAN_Information_Application_Container_NACC(GTP_CellId cid, boolean psi_type, integer si_psi_num, octetstring si_psi) := {
		 iEI := '4E'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 0 /* overwritten */
		 },
		 reporting_Cell_Identifier := ts_GTPC_Cell_Identifier_V(cid),
		 typeBit := bool2bit(psi_type),
		 number_of_SI_PSI := int2bit(si_psi_num, 7),
		 sI_PSI := si_psi
	}
	external function enc_RIM_Routing_Address_GTPC(in RIM_Routing_Address_GTPC ra) return octetstring
		with { extension "prototype(convert) encode(RAW)" };
	external function dec_RIM_Routing_Address_GTPC(in octetstring stream) return RIM_Routing_Address_GTPC
		with { extension "prototype(convert) decode(RAW)" };

	/* RAN_Information_Request */
	template (value) RAN_Information_Request_RIM_Container_GTPC
	ts_GTPC_RAN_Information_Request_RIM_Container(template (value) RIM_Application_Identity_GTPC app_id,
						      template (value) RIM_Sequence_Number_GTPC seq,
						      template (value) RIM_PDU_Indications_GTPC ind,
						      template (omit) RIM_Protocol_Version_Number_GTPC ver := omit,
						      template (omit) RAN_Information_Request_Application_Container_GTPC app_cont := omit,
						      template (omit) SON_TransferApplicationIdentity son_app_id := omit) := {
		iEI := '57'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 0 /* overwritten */
		},
		rIM_Application_Identity := app_id,
		rIM_Sequence_Number := seq,
		rIM_PDU_Indications := ind,
		rIM_Protocol_Version_Number := ver,
		application_Container := app_cont,
		sON_TransferApplicationIdentity := son_app_id
	}
	template (value) PDU_BSSGP_RAN_INFORMATION_REQUEST_GTPC
	ts_GTPC_RAN_Information_Request(template (value) RIM_Routing_Information_GTPC dest,
					template (value) RIM_Routing_Information_GTPC src,
					template (value) RAN_Information_Request_RIM_Container_GTPC cont) := {
		bssgpPduType := '71'O,
		destination_Cell_Identifier := dest,
		source_Cell_Identifier := src,
		rIM_Container := cont
	}
	template (present) PDU_BSSGP_RAN_INFORMATION_REQUEST_GTPC
	tr_GTPC_RAN_Information_Request(template (present) RIM_Routing_Information_GTPC dest := ?,
					template (present) RIM_Routing_Information_GTPC src := ?,
					template (present) RAN_Information_Request_RIM_Container_GTPC cont := ?) := {
		bssgpPduType := '71'O,
		destination_Cell_Identifier := dest,
		source_Cell_Identifier := src,
		rIM_Container := cont
	}

	template (value) RANTransparentContainer ts_RANTransparentContainer_RAN_INFO_REQ(template (value) PDU_BSSGP_RAN_INFORMATION_REQUEST_GTPC pdu) := {
		type_gtpc := '90'O,
		lengthf := 0, /* FIXME */
		rANTransparentContainerField := {
			pDU_BSSGP_RAN_INFORMATION_REQUEST := pdu
		}
	}
	template (present) RANTransparentContainer tr_RANTransparentContainer_RAN_INFO_REQ(template (present) PDU_BSSGP_RAN_INFORMATION_REQUEST_GTPC pdu := ?) := {
		type_gtpc := '90'O,
		lengthf := ?,
		rANTransparentContainerField := {
			pDU_BSSGP_RAN_INFORMATION_REQUEST := pdu
		}
	}

	/* RAN_Information */
	template (present) ApplContainer_or_ApplErrContainer_NACC_GTPC
	tru_GTPC_ApplContainer_NACC(GTP_CellId cid, boolean psi_type, integer si_psi_num, octetstring si_psi) := {
		application_Container := tr_GTPC_RAN_Information_Application_Container_NACC(cid, psi_type, si_psi_num, si_psi)
	}
	template (value) ApplContainer_or_ApplErrContainer_NACC_GTPC
	tsu_GTPC_ApplContainer_NACC(GTP_CellId cid, boolean psi_type, integer si_psi_num, octetstring si_psi) := {
		application_Container := ts_GTPC_RAN_Information_Application_Container_NACC(cid, psi_type, si_psi_num, si_psi)
	}
	template (present) ApplContainer_or_ApplErrContainer_GTPC
	tru_GTPC_ApplContainer_or_ApplErrContainer_NACC(template (present) ApplContainer_or_ApplErrContainer_NACC_GTPC cont) := {
		nacc := cont
	}
	template (value) ApplContainer_or_ApplErrContainer_GTPC
	tsu_GTPC_ApplContainer_or_ApplErrContainer_NACC(template (value) ApplContainer_or_ApplErrContainer_NACC_GTPC cont) := {
		nacc := cont
	}
	template (present) RAN_Information_RIM_Container_GTPC
	tr_GTPC_RAN_Information_RIM_Container(template (present) RIM_Application_Identity_GTPC app_id,
					      template (present) RIM_Sequence_Number_GTPC seq,
					      template (present) RIM_PDU_Indications_GTPC ind,
					      template RIM_Protocol_Version_Number_GTPC ver := *,
					      template ApplContainer_or_ApplErrContainer_GTPC app_cont := *,
					      template SON_TransferApplicationIdentity son_app_id := *) := {
		iEI := '58'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := ?
		},
		rIM_Application_Identity := app_id,
		rIM_Sequence_Number := seq,
		rIM_PDU_Indications := ind,
		rIM_Protocol_Version_Number := ver,
		applContainer_or_ApplErrContainer := app_cont,
		sON_TransferApplicationIdentity := son_app_id
	}
	template (value) RAN_Information_RIM_Container_GTPC
	ts_GTPC_RAN_Information_RIM_Container(template (value) RIM_Application_Identity_GTPC app_id,
						      template (value) RIM_Sequence_Number_GTPC seq,
						      template (value) RIM_PDU_Indications_GTPC ind,
						      template (omit) RIM_Protocol_Version_Number_GTPC ver := omit,
						      template (omit) ApplContainer_or_ApplErrContainer_GTPC app_cont := omit,
						      template (omit) SON_TransferApplicationIdentity son_app_id := omit) := {
		iEI := '58'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 0 /* overwritten */
		},
		rIM_Application_Identity := app_id,
		rIM_Sequence_Number := seq,
		rIM_PDU_Indications := ind,
		rIM_Protocol_Version_Number := ver,
		applContainer_or_ApplErrContainer := app_cont,
		sON_TransferApplicationIdentity := son_app_id
	}
	template (present) PDU_BSSGP_RAN_INFORMATION_GTPC
	tr_GTPC_RAN_Information(template (present) RIM_Routing_Information_GTPC dest,
				template (present) RIM_Routing_Information_GTPC src,
				template (present) RAN_Information_RIM_Container_GTPC cont) := {
		bssgpPduType := '70'O,
		destination_Cell_Identifier := dest,
		source_Cell_Identifier := src,
		rIM_Container := cont
	}
	template (value) PDU_BSSGP_RAN_INFORMATION_GTPC
	ts_GTPC_RAN_Information(template (value) RIM_Routing_Information_GTPC dest,
				template (value) RIM_Routing_Information_GTPC src,
				template (value) RAN_Information_RIM_Container_GTPC cont) := {
		bssgpPduType := '70'O,
		destination_Cell_Identifier := dest,
		source_Cell_Identifier := src,
		rIM_Container := cont
	}
	template (present) RANTransparentContainer tr_RANTransparentContainer_RAN_INFO(template (present) PDU_BSSGP_RAN_INFORMATION_GTPC pdu) := {
		type_gtpc := '90'O,
		lengthf := ?,
		rANTransparentContainerField := {
			pDU_BSSGP_RAN_INFORMATION := pdu
		}
	}
	template (value) RANTransparentContainer ts_RANTransparentContainer_RAN_INFO(template (value) PDU_BSSGP_RAN_INFORMATION_GTPC pdu) := {
		type_gtpc := '90'O,
		lengthf := 0, /* overwritten */
		rANTransparentContainerField := {
			pDU_BSSGP_RAN_INFORMATION := pdu
		}
	}

	template (present) RANTransparentContainer tr_RANTransparentContainer(template (present) RANTransparentContainerField rANTransparentContainerField) := {
		type_gtpc := '90'O,
		lengthf := ?,
		rANTransparentContainerField := rANTransparentContainerField
	}
	template (value) RANTransparentContainer ts_RANTransparentContainer(template (value) RANTransparentContainerField rANTransparentContainerField) := {
		type_gtpc := '90'O,
		lengthf := 0, /* overwritten */
		rANTransparentContainerField := rANTransparentContainerField
	}
	template (present) GTPC_PDUs tr_RANInfoRelay(template (present) RANTransparentContainer transparentContainer) := {
		ranInformationRelay := {
			transparentContainer := transparentContainer,
			rIM_RoutingAddress := *,
			rIM_RoutingAddress_Discriminator := *,
			private_extension_gtpc := *
		}
	}
	template (value) GTPC_PDUs ts_RANInfoRelay(template (value) RANTransparentContainer transparentContainer,
						    template (omit) RIM_RoutingAddress ra := omit,
						    template (omit) RIM_RoutingAddress_Discriminator ra_discr := omit) := {
		ranInformationRelay := {
			transparentContainer := transparentContainer,
			rIM_RoutingAddress := ra,
			rIM_RoutingAddress_Discriminator := ra_discr,
			private_extension_gtpc := omit
		}
	}
	template (present) Gtp1cUnitdata
	tr_GTPC_RANInfoRelay(template (present) Gtp1cPeer peer,
			     template (present) RANTransparentContainer transparentContainer) := {
		peer := peer,
		gtpc := tr_GTP1C_PDU(rANInformationRelay, '00000000'O, tr_RANInfoRelay(transparentContainer))
	}
	template (value) Gtp1cUnitdata
	ts_GTPC_RANInfoRelay(template (value) Gtp1cPeer peer,
			     template (value) RANTransparentContainer transparentContainer,
			     template (omit) RIM_RoutingAddress ra := omit,
			     template (omit) RIM_RoutingAddress_Discriminator ra_discr := omit) := {
		peer := peer,
		gtpc := ts_GTP1C_PDU(rANInformationRelay, '00000000'O, valueof(ts_RANInfoRelay(transparentContainer, ra, ra_discr)), 0)
	}


	template (present) RAN_Information_Request_RIM_Container_GTPC
	tr_GTPC_RAN_Information_Request_RIM_Container(template (present) RIM_Application_Identity_GTPC app_id := ?,
						      template (present) RIM_Sequence_Number_GTPC seq := ?,
						      template (present) RIM_PDU_Indications_GTPC ind := ?,
						      template RIM_Protocol_Version_Number_GTPC ver := *,
						      template RAN_Information_Request_Application_Container_GTPC app_cont := *,
						      template SON_TransferApplicationIdentity son_app_id := *) := {
		 iEI := '57'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := ?
		 },
		 rIM_Application_Identity := app_id,
		 rIM_Sequence_Number := seq,
		 rIM_PDU_Indications := ind,
		 rIM_Protocol_Version_Number := ver,
		 application_Container := app_cont,
		 sON_TransferApplicationIdentity := son_app_id
	}

	/* 3GPP TS 29.060, section 7.7.57 */
	template (value) RIM_RoutingAddress ts_RIM_RoutingAddress(octetstring addr_value) := {
		type_gtpc := '9F'O,
		lengthf := 0,	/* we assume encoder overwrites this */
		rIM_RoutingAddressValue := addr_value
	}
	template (present) RIM_RoutingAddress tr_RIM_RoutingAddress(template (present) octetstring addr_value := ?) := {
		type_gtpc := '9F'O,
		lengthf := ?,
		rIM_RoutingAddressValue := addr_value
	}

	/* 3GPP TS 29.060, section 7.7.77 */
	template (value) RIM_RoutingAddress_Discriminator ts_RIM_RoutingAddress_Discriminator(bitstring addr_discr) := {
		type_gtpc := 'B2'O,
		lengthf := 0,	/* we assume encoder overwrites this */
		rra_discriminator := addr_discr,
		spare := '0000'B
	}
	template (present) RIM_RoutingAddress_Discriminator tr_RIM_RoutingAddress_Discriminator(template (present) bitstring addr_discr := ?) := {
		type_gtpc := 'B2'O,
		lengthf := ?,
		rra_discriminator := addr_discr,
		spare := '0000'B
	}
}
