module Osmocom_Gb_Types {

	/* This module contains additional definitions and templates that we use on top of the
	 * TITAN NS + BSSGP modules */

	import from General_Types all;
	import from Osmocom_Types all;
	import from GSM_Types all;
	import from GSM_RR_Types all;
	import from BSSGP_Types all
	import from NS_Types all
	import from Native_Functions all;

	type uint16_t Nsvci;
	type uint16_t Nsei;
	type uint16_t BssgpBvci;

	/* TS 48.016 10.3.7 */
	type enumerated NsPduType {
		NS_PDUT_NS_UNITDATA	('00000000'B),
		NS_PDUT_NS_RESET	('00000010'B),
		NS_PDUT_NS_RESET_ACK	('00000011'B),
		NS_PDUT_NS_BLOCK	('00000100'B),
		NS_PDUT_NS_BLOCK_ACK	('00000101'B),
		NS_PDUT_NS_UNBLOCK	('00000110'B),
		NS_PDUT_NS_UNBLOCK_ACK	('00000111'B),
		NS_PDUT_NS_STATUS	('00001000'B),
		NS_PDUT_NS_ALIVE	('00001010'B),
		NS_PDUT_NS_ALIVE_ACK	('00001011'B)
		/* FIXME: SNS */
	} with { variant "FIELDLENGTH(8)" };

	/* TS 48.016 10.3 */
	type enumerated NsIEI {
		NS_IEI_CAUSE		('00000000'B),
		NS_IEI_NSVCI		('00000001'B),
		NS_IEI_NS_PDU		('00000010'B),
		NS_IEI_BVCI		('00000011'B),
		NS_IEI_NSEI		('00000100'B),
		NS_IEI_LIST_IPv4	('00000101'B),
		NS_IEI_LIST_IPv6	('00000110'B),
		NS_IEI_MAX_NUM_NSVC	('00000111'B),
		NS_IEI_NUM_IPv4_EP	('00001000'B),
		NS_IEI_NUM_IPv6_EP	('00001001'B),
		NS_IEI_RESET_FLAG	('00001010'B),
		NS_IEI_IP_ADDRESS	('00001011'B)
	} with { variant "FIELDLENGTH(8)" };

	/* TS 48.016 10.3.2 */
	type enumerated NsCause {
		NS_CAUSE_TRANSIT_NETWORK_FAILURE		('00000000'B),
		NS_CAUSE_OM_INTERVENTION			('00000001'B),
		NS_CAUSE_EQUIPMENT_FAILURE			('00000010'B),
		NS_CAUSE_NSVC_BLOCKED				('00000011'B),
		NS_CAUSE_NSVC_UNKNOWN				('00000100'B),
		NS_CAUSE_BVCI_UNKNOWN_AT_NSE			('00000101'B),
		NS_CAUSE_SEMANTICALLY_INCORRECT_PDU		('00001000'B),
		NS_CAUSE_PDU_NOT_COMPATIBLE_WITH_PROTOCOL_STATE	('00001010'B),
		NS_CAUSE_PROTOCOL_ERROR_UNSPEIFIED		('00001011'B),
		NS_CAUSE_INVALID_ESSENTIAL_IE			('00001100'B),
		NS_CAUSE_MISSING_ESSENTIAL_IE			('00001101'B),
		NS_CAUSE_INVALID_NR_OF_IPv4_ENDPOINTS		('00001110'B),
		NS_CAUSE_INVALID_NR_OF_IPv6_ENDPOINTS		('00001111'B),
		NS_CAUSE_INVALID_NR_OF_NSVCS			('00010000'B),
		NS_CAUSE_INVALID_WEIGHTS			('00010001'B),
		NS_CAUSE_UNKNOWN_IP_ENDPOINT			('00010010'B),
		NS_CAUSE_UNKNOWN_IP_ADDRESS			('00010011'B),
		NS_CAUSE_IP_TEST_FAILEDA			('00010100'B)
	} with { variant "FIELDLENGTH(8)" };

	template (value) NS_SDU_ControlBits t_SduCtrlB := {
		rBit := '0'B,
		cBit := '0'B,
		spare := '000000'B
	}

	template (value) CauseNS ts_NS_IE_CAUSE(NsCause cause) := {
		iEI := '00'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 1
		},
		cause := int2oct(enum2int(valueof(cause)), 1)
	}
	function ts_NS_IE_CAUSE_omit(template (omit) NsCause cause) return template (omit) CauseNS {
		var template (omit) CauseNS ret;
		if (istemplatekind(cause, "omit")) {
			return omit;
		} else {
			ret := {
				iEI := '00'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 1
				},
				cause := int2oct(enum2int(valueof(cause)), 1)
			}
			return ret;
		}
	}

	function tr_NS_IE_CAUSE(template NsCause cause) return template CauseNS {
		var template CauseNS ret;
		ret.iEI := '00'O;
		ret.ext := '1'B;
		ret.lengthIndicator := { length1 := 1 };
		if (istemplatekind(cause, "omit")) {
			return omit;
		} else if (istemplatekind(cause, "*")) {
			return *;
		} else if (istemplatekind(cause, "?")) {
			ret.cause := ?
		} else {
			ret.cause := int2oct(enum2int(valueof(cause)), 1);
		}
		return ret;
	}

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

	template (value) NS_VCI ts_NS_IE_NSVCI(Nsvci nsvci) := {
		iEI := '01'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 2
		},
		nS_VCI := int2oct(nsvci, 2)
	}
	template NS_VCI tr_NS_IE_NSVCI(template Nsvci nsvci) := {
		iEI := '01'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 2
		},
		nS_VCI := f_oct_or_wc(nsvci, 2)
	}

	template (value) NSEI_NS ts_NS_IE_NSEI(Nsei nsei) := {
		iEI:= '04'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 2
		},
		nSEI := int2oct(nsei, 2)
	}
	template NSEI_NS tr_NS_IE_NSEI(template Nsei nsei) := {
		iEI:= '04'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 2
		},
		nSEI := f_oct_or_wc(nsei, 2)
	}

	template (value) IP4_Element ts_SNS_IPv4(charstring ip, integer udp_port,
						 uint8_t sig_weight := 1, uint8_t data_weight := 1) := {
		ipAddress := f_inet_addr(ip),
		uDP_Port := int2oct(udp_port, 2),
		signallingWeight := int2oct(sig_weight, 1),
		dataWeight := int2oct(data_weight, 1)
	}
	function tr_SNS_IPv4(template charstring ip, template integer udp_port,
				template uint8_t sig_weight := ?, template uint8_t data_weight := ?)
	return template IP4_Element {
		var template IP4_Element e;
		if (istemplatekind(ip, "?")) {
			e.ipAddress := ?;
		} else {
			e.ipAddress := f_inet_addr(valueof(ip));
		}
		if (istemplatekind(udp_port, "?")) {
			e.uDP_Port := ?;
		} else {
			e.uDP_Port := int2oct(valueof(udp_port), 2);
		}
		if (istemplatekind(sig_weight, "?")) {
			e.signallingWeight := ?;
		} else {
			e.signallingWeight := int2oct(valueof(sig_weight), 1);
		}
		if (istemplatekind(data_weight, "?")) {
			e.dataWeight := ?;
		} else {
			e.dataWeight := int2oct(valueof(data_weight), 1);
		}
		return e;
	}


	template (value) PDU_NS ts_NS_RESET(NsCause cause, Nsvci nsvci, Nsei nsei) := {
		pDU_NS_Reset := {
			nsPduType := '02'O,
			causeNS := ts_NS_IE_CAUSE(cause),
			nS_VCI := ts_NS_IE_NSVCI(nsvci),
			nSEI_NS := ts_NS_IE_NSEI(nsei)
		}
	}
	template PDU_NS tr_NS_RESET(template NsCause cause, template Nsvci nsvci, template Nsei nsei) := {
		pDU_NS_Reset := {
			nsPduType := '02'O,
			causeNS := tr_NS_IE_CAUSE(cause),
			nS_VCI := tr_NS_IE_NSVCI(nsvci),
			nSEI_NS := tr_NS_IE_NSEI(nsei)
		}
	}

	template (value) PDU_NS ts_NS_RESET_ACK(Nsvci nsvci, Nsei nsei) := {
		pDU_NS_Reset_Ack := {
			nsPduType := '03'O,
			nS_VCI := ts_NS_IE_NSVCI(nsvci),
			nSEI_NS := ts_NS_IE_NSEI(nsei)
		}
	}
	template PDU_NS tr_NS_RESET_ACK(template Nsvci nsvci, template Nsei nsei) := {
		pDU_NS_Reset_Ack := {
			nsPduType := '03'O,
			nS_VCI := tr_NS_IE_NSVCI(nsvci),
			nSEI_NS := tr_NS_IE_NSEI(nsei)
		}
	}

	template (value) PDU_NS ts_NS_BLOCK(NsCause cause, Nsvci nsvci) := {
		pDU_NS_Block := {
			nsPduType := '04'O,
			causeNS := ts_NS_IE_CAUSE(cause),
			nS_VCI := ts_NS_IE_NSVCI(nsvci)
		}
	}
	template PDU_NS tr_NS_BLOCK(template NsCause cause, template Nsvci nsvci) := {
		pDU_NS_Block := {
			nsPduType := '04'O,
			causeNS := tr_NS_IE_CAUSE(cause),
			nS_VCI := tr_NS_IE_NSVCI(nsvci)
		}
	}

	template (value) PDU_NS ts_NS_BLOCK_ACK(Nsvci nsvci) := {
		pDU_NS_Block_Ack := {
			nsPduType := '05'O,
			nS_VCI := ts_NS_IE_NSVCI(nsvci)
		}
	}
	template PDU_NS tr_NS_BLOCK_ACK(template Nsvci nsvci) := {
		pDU_NS_Block_Ack := {
			nsPduType := '05'O,
			nS_VCI := tr_NS_IE_NSVCI(nsvci)
		}
	}

	template PDU_NS t_NS_UNBLOCK := {
		pDU_NS_Unblock := {
			nsPduType := '06'O
		}
	}

	template PDU_NS t_NS_UNBLOCK_ACK := {
		pDU_NS_Unblock_Ack := {
			nsPduType := '07'O
		}
	}

	template PDU_NS t_NS_ALIVE := {
		pDU_NS_Alive := {
			nsPduType := '0A'O
		}
	}

	template PDU_NS t_NS_ALIVE_ACK := {
		pDU_NS_Alive_Ack := {
			nsPduType := '0B'O
		}
	}

	template (value) PDU_NS ts_NS_STATUS(NsCause cause, PDU_NS pdu) := {
		pDU_NS_Status := {
			nsPduType := '08'O,
			causeNS := ts_NS_IE_CAUSE(cause),
			nS_VCI := omit,
			nS_PDU := {
				iEI := '02'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 0 /* overwritten */
				},
				ns_PDU := enc_PDU_NS(pdu)
			},
			bVCI_NS := omit,
			listofIP4Elements := omit,
			listofIP6Elements := omit
		}
	}

	template (value) PDU_NS ts_NS_UNITDATA(template (value) NS_SDU_ControlBits bits, BssgpBvci bvci, octetstring sdu) := {
		pDU_NS_Unitdata := {
			nsPduType := '00'O,
			nS_SDU_ControlBits := bits,
			bVCI := int2oct(bvci, 2),
			nS_SDU := sdu
		}
	}
	template PDU_NS tr_NS_UNITDATA(template NS_SDU_ControlBits bits, template BssgpBvci bvci, template
octetstring sdu) := {
		pDU_NS_Unitdata := {
			nsPduType := '00'O,
			nS_SDU_ControlBits := bits,
			bVCI := f_oct_or_wc(bvci, 2),
			nS_SDU := sdu
		}
	}



	private function ts_num_of_ep(OCT1 iei, template (omit) uint16_t num_ep)
	return template (omit) NumberOfIP_Endpoints {
		var template (omit) NumberOfIP_Endpoints t;
		if (istemplatekind(num_ep, "omit")) {
			return omit;
		} else {
			t.iEI := iei;
			t.numberOfIP_Endpoints := int2oct(valueof(num_ep), 2);
			return t;
		}
	}
	private function tr_num_of_ep(OCT1 iei, template uint16_t num_ep)
	return template NumberOfIP_Endpoints {
		var template NumberOfIP_Endpoints t;
		if (istemplatekind(num_ep, "omit")) {
			return omit;
		} else if (istemplatekind(num_ep, "*")) {
			return *;
		} else if (istemplatekind(num_ep, "?")) {
			return ?;
		} else {
			t.iEI := iei;
			t.numberOfIP_Endpoints := int2oct(valueof(num_ep), 2);
			return t;
		}
	}


	template (value) ResetFlag ts_SNS_IE_ResetFlag(boolean rst) := {
		iEI := '0A'O,
		resetBIT := bool2bit(rst),
		spare := '0000000'B
	}
	template ResetFlag tr_SNS_IE_ResetFlag(template boolean rst) := {
		iEI := '0A'O,
		resetBIT := bool2bit_tmpl(rst),
		spare := '0000000'B
	}

	template (value) EndFlag ts_SNS_IE_EndFlag(boolean end) := {
		eBIT := bool2bit(end),
		spare := '0000000'B
	}
	template EndFlag tr_SNS_IE_EndFlag(template boolean end) := {
		eBIT := bool2bit_tmpl(end),
		spare := '0000000'B
	}

	template (value) MaxNumberOfNSVCs ts_SNS_IE_MaxNumOfNSVCs(uint16_t num) := {
		iEI := '07'O,
		maxNumberOfNSVCs := int2oct(num, 2)
	}
	template MaxNumberOfNSVCs tr_SNS_IE_MaxNumOfNSVCs(template uint16_t num) := {
		iEI := '07'O,
		maxNumberOfNSVCs := f_oct_or_wc(num, 2)
	}

	template (value) PDU_NS ts_SNS_SIZE(Nsei nsei, boolean rst_flag := true,
				uint16_t max_nsvcs := 2,
				template (omit) uint16_t num_v4 := 1,
				template (omit) uint16_t num_v6 := omit) := {
		pDU_SNS_Size := {
			nsPduType := '12'O,
			nSEI_NS := ts_NS_IE_NSEI(nsei),
			resetFlag := ts_SNS_IE_ResetFlag(rst_flag),
			maxNumberOfNSVCs := ts_SNS_IE_MaxNumOfNSVCs(max_nsvcs),
			numberOfIP4_Endpoints := ts_num_of_ep('08'O, num_v4),
			numberOfIP6_Endpoints := ts_num_of_ep('09'O, num_v6)
		}
	}
	template PDU_NS tr_SNS_SIZE(template Nsei nsei, template boolean rst_flag := ?,
				template uint16_t max_nsvcs := ?,
				template uint16_t num_v4 := ?,
				template uint16_t num_v6 := *) := {
		pDU_SNS_Size := {
			nsPduType := '12'O,
			nSEI_NS := tr_NS_IE_NSEI(nsei),
			resetFlag := tr_SNS_IE_ResetFlag(rst_flag),
			maxNumberOfNSVCs := tr_SNS_IE_MaxNumOfNSVCs(max_nsvcs),
			numberOfIP4_Endpoints := tr_num_of_ep('08'O, num_v4),
			numberOfIP6_Endpoints := tr_num_of_ep('09'O, num_v6)
		}
	}

	template PDU_NS ts_SNS_SIZE_ACK(Nsei nsei, template (omit) NsCause cause) := {
		pDU_SNS_Size_Ack := {
			nsPduType := '13'O,
			nSEI_NS := ts_NS_IE_NSEI(nsei),
			causeNS := ts_NS_IE_CAUSE_omit(cause)
		}
	}
	template PDU_NS tr_SNS_SIZE_ACK(template Nsei nsei, template NsCause cause) := {
		pDU_SNS_Size_Ack := {
			nsPduType := '13'O,
			nSEI_NS := tr_NS_IE_NSEI(nsei),
			causeNS := tr_NS_IE_CAUSE(cause)
		}
	}

	private function ts_SNS_IE_ListIP4(template (omit) IP4_Elements elem)
	return template (omit) ListofIP4Elements {
		var template (omit) ListofIP4Elements r;
		if (istemplatekind(elem, "omit")) {
			return omit;
		} else {
			r := {
				iEI := '05'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 0 /* overwritten */
				},
				iP4_Elements := elem
			}
			return r;
		}
	}
	private function tr_SNS_IE_ListIP4(template IP4_Elements elem)
	return template ListofIP4Elements {
		var template ListofIP4Elements r;
		if (istemplatekind(elem, "omit")) {
			return omit;
		} else {
			r := {
				iEI := '05'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := ? /* overwritten */
				},
				iP4_Elements := elem
			}
			return r;
		}
	}

	private function ts_SNS_IE_ListIP6(template (omit) IP6_Elements elem)
	return template (omit) ListofIP6Elements {
		var template (omit) ListofIP6Elements r;
		if (istemplatekind(elem, "omit")) {
			return omit;
		} else {
			r := {
				iEI := '06'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 0 /* overwritten */
				},
				iP6_Elements := elem
			}
			return r;
		}
	}
	private function tr_SNS_IE_ListIP6(template IP6_Elements elem)
	return template ListofIP6Elements {
		var template ListofIP6Elements r;
		if (istemplatekind(elem, "omit")) {
			return omit;
		} else {
			r := {
				iEI := '06'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := ? /* overwritten */
				},
				iP6_Elements := elem
			}
			return r;
		}
	}

	template (value) PDU_NS ts_SNS_CONFIG(Nsei nsei, boolean end_flag,
					template (omit) IP4_Elements v4,
					template (omit) IP6_Elements v6 := omit) := {
		pDU_SNS_Config := {
			nsPduType := '0F'O,
			endFlag := ts_SNS_IE_EndFlag(end_flag),
			nSEI_NS := ts_NS_IE_NSEI(nsei),
			listofIP4Elements := ts_SNS_IE_ListIP4(v4),
			listofIP6Elements := ts_SNS_IE_ListIP6(v6)
		}
	}
	template PDU_NS tr_SNS_CONFIG(template Nsei nsei, template boolean end_flag,
					template IP4_Elements v4,
					template IP6_Elements v6 := omit) := {
		pDU_SNS_Config := {
			nsPduType := '0F'O,
			endFlag := tr_SNS_IE_EndFlag(end_flag),
			nSEI_NS := tr_NS_IE_NSEI(nsei),
			listofIP4Elements := tr_SNS_IE_ListIP4(v4),
			listofIP6Elements := tr_SNS_IE_ListIP6(v6)
		}
	}

	template (value) PDU_NS ts_SNS_CONFIG_ACK(Nsei nsei, template (omit) NsCause cause) := {
		pDU_SNS_Config_Ack := {
			nsPduType := '10'O,
			nSEI_NS := ts_NS_IE_NSEI(nsei),
			causeNS := ts_NS_IE_CAUSE_omit(cause)
		}
	}
	template PDU_NS tr_SNS_CONFIG_ACK(template Nsei nsei, template NsCause cause) := {
		pDU_SNS_Config_Ack := {
			nsPduType := '10'O,
			nSEI_NS := tr_NS_IE_NSEI(nsei),
			causeNS := tr_NS_IE_CAUSE(cause)
		}
	}

	type record BssgpCellId {
		RoutingAreaIdentification	ra_id,
		CellIdentity			cell_id
	} with { variant "" };

	type enumerated BssgpCause {
		BSSGP_CAUSE_PROC_OVERLOAD			('00'H),
		BSSGP_CAUSE_EQUIMENT_FAILURE			('01'H),
		BSSGP_CAUSE_TRANSIT_NETWORK_FAILURE		('02'H),
		BSSGP_CAUSE_NET_SV_CAP_MOD_GT_ZERO_KBPS		('03'H),
		BSSGP_CAUSE_UNKNOWN_MS				('04'H),
		BSSGP_CAUSE_BVCI_UNKNOWN			('05'H),
		BSSGP_CAUSE_CELL_TRAFFIC_CONGESTION		('06'H),
		BSSGP_CAUSE_SGSN_CONGESTION			('07'H),
		BSSGP_CAUSE_OM_INTERVENTION			('08'H),
		BSSGP_CAUSE_BVCI_BLOCKED			('09'H),
		BSSGP_CAUSE_PFC_CREATE_FAILURE			('0a'H),
		BSSGP_CAUSE_PFC_PREEMPTED			('0b'H),
		BSSGP_CAUSE_ABQP_NO_MORE_SUPPORTED		('0c'H),
		BSSGP_CAUSE_SEMANTICALLY_INCORRECT_PDU		('20'H),
		BSSGP_CAUSE_INVALID_MANDATORY_IE		('21'H),
		BSSGP_CAUSE_MISSING_MANDATORY_IE		('22'H),
		BSSGP_CAUSE_MISSING_CONDITIONAL_IE		('23'H),
		BSSGP_CAUSE_UNEXPECTED_CONDITIONAL_IE		('24'H),
		BSSGP_CAUSE_CONDITIONAL_IE_ERROR		('25'H),
		BSSGP_CAUSE_PDU_NOT_COMPATIBLE_WITH_PROTOCOL_STATE ('26'H),
		BSSGP_CAUSE_PROTOCOL_ERROR_UNSPECIFIED		('27'H),
		BSSGP_CAUSE_PDU_NOT_COMPATIBLE_WITH_FEATURE_SET	('28'H),
		BSSGP_CAUSE_REQUESTED_INFO_NOT_AVAILABLE	('29'H),
		BSSGP_CAUSE_UNKNOWN_DESTINATION_ADDRESS		('2a'H),
		BSSGP_CAUSE_UNKNOWN_RIM_APP_IDENTITY		('2b'H),
		BSSGP_CAUSE_INVALID_CONTAINER_UNIT_INFO		('2c'H),
		BSSGP_CAUSE_PFC_QUEUING				('2d'H),
		BSSGP_CAUSE_PFC_CREATED_SUCCESSFULLY		('2e'H),
		BSSGP_CAUSE_T12_EXPIRY				('2f'H),
		BSSGP_CAUSE_MS_UNDER_PS_HANDOVER_TREATMENT	('30'H),
		BSSGP_CAUSE_UPLINK_QUALITY			('31'H),
		BSSGP_CAUSE_UPLINK_STRENGTH			('32'H),
		BSSGP_CAUSE_DOWNLINK_QUALITY			('33'H),
		BSSGP_CAUSE_DOWNLINK_STRENGTH			('34'H),
		BSSGP_CAUSE_DISTANCE				('35'H),
		BSSGP_CAUSE_BETTER_CELL				('36'H),
		BSSGP_CAUSE_TRAFFIC				('37'H),
		BSSGP_CAUSE_OM_INTERVENTION2			('38'H),
		BSSGP_CAUSE_MS_BACK_ON_OLD_CHANNEL		('39'H),
		BSSGP_CAUSE_T13_EXPIRY				('3a'H),
		BSSGP_CAUSE_T14_EXPIRY				('3b'H),
		BSSGP_CAUSE_NOT_ALL_REQUESTED_PFC_CREATED	('3c'H)
	} with { variant "FIELDLENGTH(8)" };


	template BVCI t_BSSGP_BVCI(template BssgpBvci bvci) := {
		iEI := '04'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 2
		},
		unstructured_value := f_oct_or_wc(bvci, 2)
	}

	template IMSI_BSSGP tr_BSSGP_IMSI(template hexstring imsi) := {
		iEI := '0D'O,
		ext := '1'B,
		lengthIndicator := ?,
		type_of_Identity := '001'B,
		oddevenIndicator := ?,
		digits := imsi
	}

	template IMSI_BSSGP ts_BSSGP_IMSI(hexstring imsi) := {
		iEI := '0D'O,
		ext := '1'B,
		lengthIndicator := { length1 := 0 /* overwritten */ },
		type_of_Identity := '001'B,
		oddevenIndicator := f_hex_is_odd_length(imsi),
		digits := imsi
	}

	template TMSI_BSSGP ts_BSSGP_TMSI(GsmTmsi tmsi) := {
		iEI := '20'O,
		ext := '1'B,
		lengthIndicator := { length1 := 4 },
		tMSI_Value := int2oct(tmsi, 4)
	}

	function f_bssgp_length_ind(integer len) return LIN2_2a {
		var LIN2_2a ret;
		if (len > 255) {
			ret := { length2 := len };
		} else {
			ret := { length1 := len };
		}
		return ret;
	}

	template LLC_PDU ts_BSSGP_LLC_PDU(octetstring pdu) := {
		iEI := '0D'O,
		ext := '1'B,
		lengthIndicator := f_bssgp_length_ind(lengthof(pdu)),
		lLC_PDU := pdu
	}

	template LLC_PDU tr_BSSGP_LLC_PDU(template octetstring pdu := ?) := {
		iEI := '0E'O,
		ext := ?,
		lengthIndicator := ?,
		lLC_PDU := pdu
	}

	function t_BSSGP_CAUSE(template BssgpCause cause) return template Cause_BSSGP {
		var template Cause_BSSGP ret;
		ret.iEI := '07'O;
		ret.ext := '1'B;
		ret.lengthIndicator := { length1 := 1 };
		if (isvalue(cause)) {
			ret.cause_Value := int2oct(enum2int(valueof(cause)), 1);
		} else {
			ret.cause_Value := ?
		}
		return ret;
	}

	function t_BSSGP_IE_CellId(template BssgpCellId cid) return template Cell_Identifier {
		var template Cell_Identifier ret := {
			iEI := '08'O,
			ext := '1'B,
			lengthIndicator := { length1 := 8 },
			mccDigit1 := ?,
			mccDigit2 := ?,
			mccDigit3 := ?,
			mncDigit3 := ?,
			mncDigit1 := ?,
			mncDigit2 := ?,
			lac := ?,
			rac := ?,
			cI_value := ?
		}
		if (istemplatekind(cid, "omit")) {
			return omit;
		} else if (istemplatekind(cid, "*")) {
			return *;
		} else 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[5];
				ret.mncDigit2 := cid.ra_id.lai.mcc_mnc[4];
				ret.mncDigit1 := cid.ra_id.lai.mcc_mnc[3];
			}
			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 PDU_BSSGP ts_BVC_RESET(BssgpCause cause, BssgpBvci bvci,
					template BssgpCellId cell_id) := {
		pDU_BSSGP_BVC_RESET := {
			bssgpPduType := '22'O,
			bVCI := t_BSSGP_BVCI(bvci),
			cause := t_BSSGP_CAUSE(cause),
			cell_Identifier := t_BSSGP_IE_CellId(cell_id),
			feature_bitmap := omit,
			extended_Feature_Bitmap := omit
		}
	}

	template PDU_BSSGP tr_BVC_RESET(template BssgpCause cause, template BssgpBvci bvci,
					template BssgpCellId cell_id) := {
		pDU_BSSGP_BVC_RESET := {
			bssgpPduType := '22'O,
			bVCI := t_BSSGP_BVCI(bvci),
			cause := t_BSSGP_CAUSE(cause),
			cell_Identifier := t_BSSGP_IE_CellId(cell_id),
			feature_bitmap := *,
			extended_Feature_Bitmap := *
		}
	}

	template PDU_BSSGP ts_BVC_RESET_ACK(BssgpBvci bvci, template BssgpCellId cell_id) := {
		pDU_BSSGP_BVC_RESET_ACK := {
			bssgpPduType := '23'O,
			bVCI := t_BSSGP_BVCI(bvci),
			cell_Identifier := t_BSSGP_IE_CellId(cell_id),
			feature_bitmap := omit,
			extended_Feature_Bitmap := omit
		}
	}

	template PDU_BSSGP tr_BVC_RESET_ACK(template BssgpBvci bvci, template BssgpCellId cell_id) := {
		pDU_BSSGP_BVC_RESET_ACK := {
			bssgpPduType := '23'O,
			bVCI := t_BSSGP_BVCI(bvci),
			cell_Identifier := t_BSSGP_IE_CellId(cell_id),
			feature_bitmap := *,
			extended_Feature_Bitmap := *
		}
	}


	template PDU_BSSGP t_BVC_UNBLOCK(template BssgpBvci bvci) := {
		pDU_BSSGP_BVC_UNBLOCK := {
			bssgpPduType := '24'O,
			bVCI := t_BSSGP_BVCI(bvci)
		}
	}

	template PDU_BSSGP t_BVC_UNBLOCK_ACK(template BssgpBvci bvci) := {
		pDU_BSSGP_BVC_UNBLOCK_ACK := {
			bssgpPduType := '25'O,
			bVCI := t_BSSGP_BVCI(bvci)
		}
	}

	template PDU_BSSGP t_BVC_BLOCK(template BssgpBvci bvci, template BssgpCause cause) := {
		pDU_BSSGP_BVC_BLOCK := {
			bssgpPduType := '20'O,
			bVCI := t_BSSGP_BVCI(bvci),
			cause := t_BSSGP_CAUSE(cause)
		}
	}

	template PDU_BSSGP t_BVC_BLOCK_ACK(template BssgpBvci bvci) := {
		pDU_BSSGP_BVC_BLOCK_ACK := {
			bssgpPduType := '21'O,
			bVCI := t_BSSGP_BVCI(bvci)
		}
	}

	template PDU_BSSGP t_BVC_FC_BVC(uint16_t bmax, uint16_t bucket_leak_rate,
					uint16_t bmax_default_ms, uint16_t r_default_ms, OCT1 tag) := {
		pDU_BSSGP_FLOW_CONTROL_BVC := {
			bssgpPduType := '26'O,
			tag := {
				iEI := '1E'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 1
				},
				unstructured_Value := tag
			},
			bVC_Bucket_Size := {
				iEI := '05'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				bmax := f_oct_or_wc(bmax, 2)
			},
			bucket_Leak_Rate := {
				iEI := '03'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				r_Value := f_oct_or_wc(bucket_leak_rate, 2)
			},
			bmax_default_MS := {
				iEI := '01'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				bmax := f_oct_or_wc(bmax_default_ms, 2)
			},
			r_default_MS := {
				iEI := '1C'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				r_default_MS_value := f_oct_or_wc(r_default_ms, 2)
			},
			bucket_Full_Ratio := omit,
			bVC_Measurement := omit,
			flow_Control_Granularity := omit
		}
	}
	template PDU_BSSGP tr_BVC_FC_BVC(template uint16_t bmax := ?,
					 template uint16_t bucket_leak_rate := ?,
					 template uint16_t bmax_default_ms := ?,
					 template uint16_t r_default_ms := ?,
					 template OCT1 tag := ?) := {
		pDU_BSSGP_FLOW_CONTROL_BVC := {
			bssgpPduType := '26'O,
			tag := {
				iEI := '1E'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 1
				},
				unstructured_Value := tag
			},
			bVC_Bucket_Size := {
				iEI := '05'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				bmax := f_oct_or_wc(bmax, 2)
			},
			bucket_Leak_Rate := {
				iEI := '03'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				r_Value := f_oct_or_wc(bucket_leak_rate, 2)
			},
			bmax_default_MS := {
				iEI := '01'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				bmax := f_oct_or_wc(bmax_default_ms, 2)
			},
			r_default_MS := {
				iEI := '1C'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				r_default_MS_value := f_oct_or_wc(r_default_ms, 2)
			},
			bucket_Full_Ratio := *,
			bVC_Measurement := *,
			flow_Control_Granularity := *
		}
	}

	template PDU_BSSGP t_BVC_FC_BVC_ACK(template OCT1 tag) := {
		pDU_BSSGP_FLOW_CONTROL_BVC_ACK := {
			bssgpPduType := '27'O,
			tag := {
				iEI := '1E'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				unstructured_Value := tag
			}
		}
	}

	template PDU_BSSGP ts_BSSGP_STATUS(template BssgpBvci bvci, template BssgpCause cause,
					   PDU_BSSGP pdu) := {
		pDU_BSSGP_STATUS := {
			bssgpPduType := '0A'O,
			cause := t_BSSGP_CAUSE(cause),
			bVCI := t_BSSGP_BVCI(bvci),
			pDU_in_Error := {
				iEI := '15'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 0 /* overwritten */
				},
				erroneous_BSSGP_PDU := enc_PDU_BSSGP(pdu)
			}
		}
	}

	template QoS_Profile_V t_defaultQos := {
		peak_Bit_Rate := int2oct(80, 2),
		precedence := '000'B,
		a_bit := '0'B,
		t_bit := '0'B,
		c_r_bit := '0'B,
		peakBitRateGranularity := '00'B
	}

	template QoS_Profile ts_QoS_TLV(template QoS_Profile_V qos) := {
		iEI := '18'O,
		ext := '1'B,
		lengthIndicator := { length1 := 3 },
		peak_Bit_Rate := qos.peak_Bit_Rate,
		precedence := qos.precedence,
		a_bit := qos.a_bit,
		t_bit := qos.t_bit,
		c_r_bit := qos.c_r_bit,
		peakBitRateGranularity := qos.peakBitRateGranularity
	}

	template PDU_Lifetime t_DefaultLifetime(uint16_t delay := 65535) := {
		iEI := '16'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 2
		},
		delay_Value := f_oct_or_wc(delay, 2)
	}

	template PDU_BSSGP ts_BSSGP_DL_UD(GprsTlli tlli, octetstring pdu) := {
		pDU_BSSGP_DL_UNITDATA := {
			bssgpPduType := '00'O,
			tLLI_current := tlli,
			qoS_Profile := t_defaultQos,
			pDU_Lifetime := t_DefaultLifetime(65535),
			mS_Radio_Access_Capability := omit,
			priority := omit,
			dRX_Parameters := omit,
			iMSI := omit,
			tLLI_old := omit,
			pFI := omit,
			lSA_Information := omit,
			service_UTRAN_CCO := omit,
			service_Class_Indicator := omit,
			subscriber_Profile_ID_For_RAT_Priority := omit,
			redirection_Indication := omit,
			redirection_Completed := omit,
			unconfirmed_Send_State_Variable := omit,
			sCI := omit,
			gGSN_PGW_Location := omit,
			eDRX_Paremeters := omit,
			old_Routing_Area_Identification := omit,
			attach_Indicator := omit,
			alignment_octets := omit,
			lLC_PDU := ts_BSSGP_LLC_PDU(pdu),
			initialLLC_PDU := omit
		}
	}

	template PDU_BSSGP tr_BSSGP_DL_UD := {
		pDU_BSSGP_DL_UNITDATA := {
			bssgpPduType := '00'O,
			tLLI_current := ?,
			qoS_Profile := ?,
			pDU_Lifetime := ?,
			mS_Radio_Access_Capability := *,
			priority := *,
			dRX_Parameters := *,
			iMSI := *,
			tLLI_old := *,
			pFI := *,
			lSA_Information := *,
			service_UTRAN_CCO := *,
			service_Class_Indicator := *,
			subscriber_Profile_ID_For_RAT_Priority := *,
			redirection_Indication := *,
			redirection_Completed := *,
			unconfirmed_Send_State_Variable := *,
			sCI := *,
			gGSN_PGW_Location := *,
			eDRX_Paremeters := *,
			old_Routing_Area_Identification := *,
			attach_Indicator := *,
			alignment_octets := *,
			lLC_PDU := tr_BSSGP_LLC_PDU,
			initialLLC_PDU := *
		}
	}

	template PDU_BSSGP ts_BSSGP_UL_UD(GprsTlli tlli, BssgpCellId cell_id, octetstring payload) := {
		pDU_BSSGP_UL_UNITDATA := {
			bssgpPduType := '01'O,
			tLLI := tlli,
			qoS_Profile := t_defaultQos,
			cell_Identifier := t_BSSGP_IE_CellId(cell_id),
			pFI := omit,
			lSA_Identifier_List := omit,
			redirect_Attempt_Flag := omit,
			iMSI_BSSGP := omit,
			unconfirmed_Send_State_Variable := omit,
			selected_PLMN_ID := omit,
			selected_Operator := omit,
			cS_Registered_Operator := omit,
			alignment_octets := omit,
			lLC_PDU := ts_BSSGP_LLC_PDU(payload)
		}
	}

	template PDU_BSSGP tr_BSSGP_UL_UD(template GprsTlli tlli := ?, template BssgpCellId cell_id := ?,
					  template octetstring payload := ?) := {
		pDU_BSSGP_UL_UNITDATA := {
			bssgpPduType := '01'O,
			tLLI := tlli,
			qoS_Profile := ?,
			cell_Identifier := t_BSSGP_IE_CellId(cell_id),
			pFI := *,
			lSA_Identifier_List := *,
			redirect_Attempt_Flag := *,
			iMSI_BSSGP := *,
			unconfirmed_Send_State_Variable := *,
			selected_PLMN_ID := *,
			selected_Operator := *,
			cS_Registered_Operator := *,
			alignment_octets := *,
			lLC_PDU := tr_BSSGP_LLC_PDU(payload)
		}
	}

	template PDU_BSSGP tr_BSSGP_PS_PAGING(BssgpBvci bvci) := {
		pDU_BSSGP_PAGING_PS := {
			bssgpPduType := '06'O,
			iMSI := ?,
			dRX_Parameters := *,
			paging_Field4 := {
				bVCI := t_BSSGP_BVCI(bvci)
			},
			pFI := *,
			aBQP := *,
			qoS_Profile := ?,
			pTMSI := *,
			eDRX_Paremeters := *
		}
	}

	template PDU_BSSGP ts_BSSGP_PS_PAGING_IMSI(BssgpBvci bvci, hexstring imsi) := {
		pDU_BSSGP_PAGING_PS := {
			bssgpPduType := '06'O,
			iMSI := ts_BSSGP_IMSI(imsi),
			dRX_Parameters := omit,
			paging_Field4 := {
				bVCI := t_BSSGP_BVCI(bvci)
			},
			pFI := omit,
			aBQP := omit,
			qoS_Profile := ts_QoS_TLV(t_defaultQos),
			pTMSI := omit,
			eDRX_Paremeters := omit
		}
	}

	template PDU_BSSGP ts_BSSGP_PS_PAGING_PTMSI(BssgpBvci bvci, hexstring imsi, GsmTmsi tmsi) := {
		pDU_BSSGP_PAGING_PS := {
			bssgpPduType := '06'O,
			iMSI := ts_BSSGP_IMSI(imsi),
			dRX_Parameters := omit,
			paging_Field4 := {
				bVCI := t_BSSGP_BVCI(bvci)
			},
			pFI := omit,
			aBQP := omit,
			qoS_Profile := ts_QoS_TLV(t_defaultQos),
			pTMSI := ts_BSSGP_TMSI(tmsi),
			eDRX_Paremeters := omit
		}
	}


} with { encode "RAW" };
