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

	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 NS_SDU_ControlBits t_SduCtrlB := {
		rBit := '0'B,
		cBit := '0'B,
		spare := '000000'B
	}

	function t_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 (isvalue(cause)) {
			ret.cause := int2oct(enum2int(valueof(cause)), 1);
		} else {
			ret.cause := ?
		}
		return ret;
	}

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

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

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

	template PDU_NS t_NS_RESET(template NsCause cause, template Nsvci nsvci, template Nsei nsei) := {
		pDU_NS_Reset := {
			nsPduType := '02'O,
			causeNS := t_NS_IE_CAUSE(cause),
			nS_VCI := t_NS_IE_NSVCI(nsvci),
			nSEI_NS := t_NS_IE_NSEI(nsei)
		}
	}

	template PDU_NS t_NS_RESET_ACK(template Nsvci nsvci, template Nsei nsei) := {
		pDU_NS_Reset_Ack := {
			nsPduType := '03'O,
			nS_VCI := t_NS_IE_NSVCI(nsvci),
			nSEI_NS := t_NS_IE_NSEI(nsei)
		}
	}

	template PDU_NS t_NS_BLOCK(template NsCause cause, template Nsvci nsvci) := {
		pDU_NS_Block := {
			nsPduType := '04'O,
			causeNS := t_NS_IE_CAUSE(cause),
			nS_VCI := t_NS_IE_NSVCI(nsvci)
		}
	}

	template PDU_NS t_NS_BLOCK_ACK(template Nsvci nsvci) := {
		pDU_NS_Block_Ack := {
			nsPduType := '05'O,
			nS_VCI := t_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 PDU_NS ts_NS_STATUS(NsCause cause, PDU_NS pdu) := {
		pDU_NS_Status := {
			nsPduType := '08'O,
			causeNS := t_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 PDU_NS t_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
		}
	}


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