module BSSMAP_Templates {

/* BSSMAP Templates, building on top of BSSAP_Types from Ericsson.
 *
 * (C) 2017-2019 by 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
 */

import from General_Types all;
import from Osmocom_Types all;
import from Native_Functions all;
import from Misc_Helpers all;
import from GSM_Types all;
import from BSSAP_Types all;

type integer BssmapCause;
type integer SpeechVersion;
type integer Channel;
type integer ChannelMode;
//type octetstring BSSMAP_oldToNewBSSIEs;

// Old BSS to New BSS Information - 48.008 subclause 3.2.2.58
type record BSSMAP_oldToNewBSSIEs
{
  BSSAMAP_IE_LastUsedEUTRANPLMNId LastUsedEUTRANPLMNId optional
  /* TODO: add other FIELDS here from specs */
}
external function enc_BSSMAP_oldToNewBSSIEs(in BSSMAP_oldToNewBSSIEs val) return octetstring
	with { extension "prototype(convert) encode(RAW)" };

/* 48.008 3.2.2.5 - this actually belongs to BSSAP_Types.ttcn */
type enumerated myBSSMAP_Cause {
	/* 000 / 001: Normal event */
	GSM0808_CAUSE_RADIO_INTERFACE_MESSAGE_FAILURE			('0000000'B),
	GSM0808_CAUSE_RADIO_INTERFACE_FAILURE				('0000001'B),
	GSM0808_CAUSE_UPLINK_QUALITY					('0000010'B),
	GSM0808_CAUSE_UPLINK_STRENGTH					('0000011'B),
	GSM0808_CAUSE_DOWNLINK_QUALITY					('0000100'B),
	GSM0808_CAUSE_DOWNLINK_STRENGTH					('0000101'B),
	GSM0808_CAUSE_DISTANCE						('0000110'B),
	GSM0808_CAUSE_O_AND_M_INTERVENTION				('0000111'B),
	GSM0808_CAUSE_RESPONSE_TO_MSC_INVOCATION			('0001000'B),
	GSM0808_CAUSE_CALL_CONTROL					('0001001'B),
	GSM0808_CAUSE_RADIO_INTERFACE_FAILURE_REVERSION			('0001010'B),
	GSM0808_CAUSE_HANDOVER_SUCCESSFUL				('0001011'B),
	GSM0808_CAUSE_BETTER_CELL					('0001100'B),
	GSM0808_CAUSE_DIRECTED_RETRY					('0001101'B),
	GSM0808_CAUSE_JOINED_GROUP_CALL_CHANNEL				('0001110'B),
	GSM0808_CAUSE_TRAFFIC						('0001111'B),
	GSM0808_CAUSE_REDUCE_LOAD_IN_SERVING_CELL			('0010000'B),
	GSM0808_CAUSE_TRAFFIC_LOAD_IN_TGT_HIGHER_THAN_IN_SRC_CELL	('0010001'B),
	GSM0808_CAUSE_RELOCATION_TRIGGERED				('0010010'B),
	GSM0808_CAUSE_REQUSTED_OPT_NOT_AUTHORISED			('0010100'B),
	GSM0808_CAUSE_ALT_CHAN_CONFIG_REQUESTED				('0010101'B),
	GSM0808_CAUSE_RESP_TO_INT_HO_ENQ_MSG				('0010110'B),
	GSM0808_CAUSE_INT_HO_ENQUIRY_REJECT				('0010111'B),
	GSM0808_CAUSE_REDUNDANCY_LEVEL_NOT_ADEQUATE			('0011000'B),
	/* reserved */
	/* 010: Resource unavailable */
	GSM0808_CAUSE_EQUIPMENT_FAILURE					('0100000'B),
	GSM0808_CAUSE_NO_RADIO_RESOURCE_AVAILABLE			('0100001'B),
	GSM0808_CAUSE_RQSTED_TERRESTRIAL_RESOURCE_UNAVAILABLE		('0100010'B),
	GSM0808_CAUSE_CCCH_OVERLOAD					('0100011'B),
	GSM0808_CAUSE_PROCESSOR_OVERLOAD				('0100100'B),
	GSM0808_CAUSE_BSS_NOT_EQUIPPED					('0100101'B),
	GSM0808_CAUSE_MS_NOT_EQUIPPED					('0100110'B),
	GSM0808_CAUSE_INVALID_CELL					('0100111'B),
	GSM0808_CAUSE_TRAFFIC_LOAD					('0101000'B),
	GSM0808_CAUSE_PREEMPTION					('0101001'B),
	GSM0808_CAUSE_DTM_HO_SGSN_FAILURE				('0101010'B),
	GSM0808_CAUSE_DTM_HO_PS_ALLOC_FAILURE				('0101011'B),
	/* reserved */
	/* 011: Service or option not available, but implemented */
	GSM0808_CAUSE_RQSTED_TRANSCODING_RATE_ADAPTION_UNAVAILABLE	('0110000'B),
	GSM0808_CAUSE_CIRCUIT_POOL_MISMATCH				('0110001'B),
	GSM0808_CAUSE_SWITCH_CIRCUIT_POOL				('0110010'B),
	GSM0808_CAUSE_RQSTED_SPEECH_VERSION_UNAVAILABLE			('0110011'B),
	GSM0808_CAUSE_LSA_NOT_ALLOWED					('0110100'B),
	GSM0808_CAUSE_REQ_CODEC_TYPE_OR_CONFIG_UNAVAIL			('0110101'B),
	GSM0808_CAUSE_REQ_A_IF_TYPE_UNAVAIL				('0110110'B),
	GSM0808_CAUSE_INVALID_CSG_CELL					('0110111'B),
	/* reserved */
	/* 100: Service or option not implemented or currently disabled */
	GSM0808_CAUSE_REQ_REDUND_LEVEL_NOT_AVAIL			('0111111'B),
	GSM0808_CAUSE_CIPHERING_ALGORITHM_NOT_SUPPORTED			('1000000'B),
	GSM0808_CAUSE_GERAN_IU_MODE_FAILURE				('1000001'B),
	GSM0808_CAUSE_INC_RELOC_NOT_SUPP_DT_PUESBINE_FEATURE		('1000010'B),
	GSM0808_CAUSE_ACCESS_RESTRICTED_DUE_TO_SHARED_NETWORKS		('1000011'B),
	GSM0808_CAUSE_REQ_CODEC_TYPE_OR_CONFIG_NOT_SUPP			('1000100'B),
	GSM0808_CAUSE_REQ_A_IF_TYPE_NOT_SUPP				('1000101'B),
	GSM0808_CAUSE_REQ_REDUND_LVL_NOT_SUPP				('1000110'B),
	/* reserved */
	/* 101: Invalid message */
	GSM0808_CAUSE_TERRESTRIAL_CIRCUIT_ALREADY_ALLOCATED		('1010000'B),
	GSM0808_CAUSE_INVALID_MESSAGE_CONTENTS				('1010001'B),
	GSM0808_CAUSE_INFORMATION_ELEMENT_OR_FIELD_MISSING		('1010010'B),
	GSM0808_CAUSE_INCORRECT_VALUE					('1010011'B),
	GSM0808_CAUSE_UNKNOWN_MESSAGE_TYPE				('1010100'B),
	GSM0808_CAUSE_UNKNOWN_INFORMATION_ELEMENT			('1010101'B),
	GSM0808_CAUSE_DTM_HO_INVALID_PS_IND				('1010110'B),
	GSM0808_CAUSE_CALL_ID_ALREADY_ALLOC				('1010111'B),
	/* reserved */
	/* 110: protocol error */
	GSM0808_CAUSE_PROTOCOL_ERROR_BETWEEN_BSS_AND_MSC		('1100000'B),
	GSM0808_CAUSE_VGCS_VBS_CALL_NON_EXISTANT			('1100001'B),
	GSM0808_CAUSE_DTM_HO_TIMER_EXPIRY				('1100010'B)
} with { variant "FIELDLENGTH(7)" };

/* 3GPP TS 48.008 3.2.2.11 Channel Type
 * Transparent: Data Rate */
const OCT1 GSM0808_DATA_RATE_TRANSP_32k0    := ('3a'O);
const OCT1 GSM0808_DATA_RATE_TRANSP_28k8    := ('39'O);
const OCT1 GSM0808_DATA_RATE_TRANSP_14k4    := ('18'O);
const OCT1 GSM0808_DATA_RATE_TRANSP_9k6     := ('10'O);
const OCT1 GSM0808_DATA_RATE_TRANSP_4k8     := ('11'O);
const OCT1 GSM0808_DATA_RATE_TRANSP_2k4	    := ('12'O);
const OCT1 GSM0808_DATA_RATE_TRANSP_1k2	    := ('13'O);
const OCT1 GSM0808_DATA_RATE_TRANSP_600	    := ('14'O);
const OCT1 GSM0808_DATA_RATE_TRANSP_1200_75 := ('15'O);

/* 3GPP TS 48.008 3.2.2.11 Channel Type
 * Non-Transparent: Radio Interface Data Rate (preferred) */
const OCT1 GSM0808_DATA_RATE_NON_TRANSP_12000_6000 := ('00'O);
const OCT1 GSM0808_DATA_RATE_NON_TRANSP_43k5       := ('34'O);
const OCT1 GSM0808_DATA_RATE_NON_TRANSP_29k0       := ('31'O);
const OCT1 GSM0808_DATA_RATE_NON_TRANSP_14k5       := ('14'O);
const OCT1 GSM0808_DATA_RATE_NON_TRANSP_12k0       := ('10'O);
const OCT1 GSM0808_DATA_RATE_NON_TRANSP_6k0        := ('11'O);

/* 3GPP TS 48.008 3.2.2.11 Channel Type
 * Non-Transparent: Allowed Radio Interface Data Rate (all possible allowed) */
const OCT1 GSM0808_DATA_RATE_NON_TRANSP_ALLOWED_43k5 := ('40'O);
const OCT1 GSM0808_DATA_RATE_NON_TRANSP_ALLOWED_32k0 := ('20'O);
const OCT1 GSM0808_DATA_RATE_NON_TRANSP_ALLOWED_29k0 := ('10'O);
const OCT1 GSM0808_DATA_RATE_NON_TRANSP_ALLOWED_14k5 := ('08'O);
const OCT1 GSM0808_DATA_RATE_NON_TRANSP_ALLOWED_12k0 := ('02'O);
const OCT1 GSM0808_DATA_RATE_NON_TRANSP_ALLOWED_6k0  := ('01'O);

type enumerated BSSMAP_LcsCause {
	BSSMAP_LCS_CAUSE_UNSPECIFIED		('00000000'B),
	BSSMAP_LCS_CAUSE_SYSTEM_FAILURE		('00000001'B),
	BSSMAP_LCS_CAUSE_PROTOCOL_ERROR		('00000010'B),
	BSSMAP_LCS_CAUSE_DATA_MISSING_IN_REQ	('00000011'B),
	BSSMAP_LCS_CAUSE_UNEXP_DATA_IN_REQ	('00000100'B),
	BSSMAP_LCS_CAUSE_POS_METH_FAILURE	('00000101'B),
	BSSMAP_LCS_CAUSE_TGT_MS_UNREACHABLE	('00000110'B),
	BSSMAP_LCS_CAUSE_REQUEST_ABORTED	('00000111'B),
	BSSMAP_LCS_CAUSE_FACILITY_NOTSUPP	('00001000'B),
	BSSMAP_LCS_CAUSE_INTER_BSC_HO		('00001001'B),
	BSSMAP_LCS_CAUSE_INTRA_BSC_HO		('00001010'B),
	BSSMAP_LCS_CAUSE_CONGESTION		('00001011'B),
	BSSMAP_LCS_CAUSE_INTER_NSE_CHG		('00001100'B),
	BSSMAP_LCS_CAUSE_RA_UPDAT		('00001101'B),
	BSSMAP_LCS_CAUSE_PTMSI_REALLOC		('00001110'B),
	BSSMAP_LCS_CAUSE_GPRS_SUSPENSION	('00001111'B)
} with { variant "FIELDLENGTH(8)" };

template PDU_BSSAP ts_BSSAP_BSSMAP := {
	discriminator := '0'B,
	spare := '0000000'B,
	dlci := omit,
	lengthIndicator := 0,	/* overwritten by codec */
	pdu := {
		bssmap := ?
	}
}

template PDU_BSSAP tr_BSSAP_BSSMAP := {
	discriminator := '0'B,
	spare := '0000000'B,
	dlci := *,
	lengthIndicator := ?,
	pdu := {
		bssmap := ?
	}
}

template PDU_BSSAP ts_BSSAP_DTAP(octetstring dtap, template OCT1 dlci := omit) := {
	discriminator := '1'B,
	spare := '0000000'B,
	dlci := dlci,
	lengthIndicator := 0,	/* overwritten by codec */
	pdu := {
		dtap := dtap
	}
}

template PDU_BSSAP tr_BSSAP_DTAP := {
	discriminator := '1'B,
	spare := '0000000'B,
	dlci := *,
	lengthIndicator := ?,
	pdu := {
		dtap := ?
	}
}

template (value) BSSMAP_IE_Cause ts_BSSMAP_IE_Cause(BssmapCause val) := {
	elementIdentifier := '04'O,
	lengthIndicator := 0,
	causeValue := int2bit(val, 7),
	extensionCauseValue := '0'B,
	spare1 := omit
}
template BSSMAP_IE_Cause tr_BSSMAP_IE_Cause(template (present) myBSSMAP_Cause val) := {
	elementIdentifier := '04'O,
	lengthIndicator := ?,
	causeValue := f_tr_causeValue(val),
	extensionCauseValue := ?,
	spare1 := *
}
private function f_tr_causeValue(template (present) myBSSMAP_Cause val)
return template (present) BIT7 {
	if (istemplatekind(val, "?")) {
		return ?;
	} else {
		var integer int_val := enum2int(valueof(val));
		return int2bit(valueof(int_val), 7);
	}
}

template (value) BSSMAP_IE_SpeechVersion ts_BSSMAP_IE_SpeechVersion(SpeechVersion val) := {
	elementIdentifier := '40'O,
	speechVersionIdentifier := int2bit(val, 7),
	spare1_1 := '0'B
}

template (value) BSSMAP_IE_CurrentChannelType1 ts_BSSMAP_IE_CurrentChannelType1(Channel c, ChannelMode cm) := {
	elementIdentifier := '31'O,
	channel := int2bit(c, 4),
	channelMode := int2bit(cm, 4)
}

template (value) BSSMAP_oldToNewBSSIEs ts_BSSMAP_oldToNewBSSIEs(template (omit) BSSAMAP_IE_LastUsedEUTRANPLMNId last_used_eutran_plmn) := {
	LastUsedEUTRANPLMNId := last_used_eutran_plmn
}
function f_ts_BSSMAP_oldToNewBSSIEs(template (omit) BSSAMAP_IE_LastUsedEUTRANPLMNId last_used_eutran_plmn)
	 return template (omit) BSSMAP_oldToNewBSSIEs {
	if (istemplatekind(last_used_eutran_plmn, "omit")) {
		return omit;
	} else {
		return ts_BSSMAP_oldToNewBSSIEs(last_used_eutran_plmn);
	}
}
template (value) BSSMAP_IE_OldToNewBSSInfo ts_BSSMAP_IE_OldToNewBSSInfo(template (value) BSSMAP_oldToNewBSSIEs val) := {
	elementIdentifier := '3A'O,
	lengthIndicator := 0,	/* overwritten by codec */
	oldToNewBSSIEs := enc_BSSMAP_oldToNewBSSIEs(valueof(val))
}
function f_ts_BSSMAP_IE_OldToNewBSSInfo(template (omit) BSSMAP_oldToNewBSSIEs val)
	 return template (omit) BSSMAP_IE_OldToNewBSSInfo {
	if (istemplatekind(val, "omit")) {
		return omit;
	} else {
		return ts_BSSMAP_IE_OldToNewBSSInfo(val);
	}
}

template BSSMAP_IE_OldToNewBSSInfo tr_BSSMAP_IE_OldToNewBSSInfo(template (value) BSSMAP_oldToNewBSSIEs val) := {
	elementIdentifier := '3A'O,
	lengthIndicator := ?,	/* overwritten by codec */
	oldToNewBSSIEs := enc_BSSMAP_oldToNewBSSIEs(valueof(val))
}
function f_tr_BSSMAP_IE_OldToNewBSSInfo(template BSSMAP_oldToNewBSSIEs val := *)
	 return template BSSMAP_IE_OldToNewBSSInfo {
	if (istemplatekind(val, "*")) {
		return *;
	} else if (istemplatekind(val, "?")) {
		return ?;
	} else if (istemplatekind(val, "omit")) {
		return omit;
	} else {
		return tr_BSSMAP_IE_OldToNewBSSInfo(val);
	}
}

template (value) BSSMAP_IE_Osmo_OsmuxSupport tr_BSSMAP_IE_Osmo_OsmuxSupport := {
	elementIdentifier := 'F0'O
}

private function f_enc_osmux_support(boolean osmux_enabled) return template (omit) BSSMAP_IE_Osmo_OsmuxSupport {
	if (osmux_enabled) {
		return tr_BSSMAP_IE_Osmo_OsmuxSupport;
	}
	return omit;
}

template (value) PDU_BSSAP ts_BSSMAP_Reset(BssmapCause cause, boolean osmux_enabled := false) modifies ts_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			reset := {
				messageType := '30'O,
				cause := ts_BSSMAP_IE_Cause(cause),
				a_InterfaceSelectorForReset := omit,
				osmuxSupport := f_enc_osmux_support(osmux_enabled)
			}
		}
	}
}

template PDU_BSSAP tr_BSSMAP_Reset(boolean osmux_enabled := false) modifies tr_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			reset := {
				messageType := '30'O,
				cause := ?,
				a_InterfaceSelectorForReset := *,
				osmuxSupport := f_enc_osmux_support(osmux_enabled)
			}
		}
	}
}

template (value) PDU_BSSAP ts_BSSMAP_ResetAck(boolean osmux_enabled := false) modifies ts_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			resetAck := {
				messageType := '31'O,
				a_InterfaceSelectorForReset := omit,
				osmuxSupport := f_enc_osmux_support(osmux_enabled)
			}
		}
	}
}

template PDU_BSSAP tr_BSSMAP_ResetAck(boolean osmux_enabled := false) modifies tr_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			resetAck := {
				messageType := '31'O,
				a_InterfaceSelectorForReset := *,
				osmuxSupport := f_enc_osmux_support(osmux_enabled)
			}
		}
	}
}

template BSSMAP_IE_CellIdentifier ts_BSSMAP_IE_CellID := {
	elementIdentifier := '05'O,
	lengthIndicator := 0,
	cellIdentifierDiscriminator := '0000'B,
	spare1_4 := '0000'B,
	cellIdentification := ?
}

type uint16_t BssmapLAC;
type uint16_t BssmapCI;
type uint16_t BssmapSAC;

template BSSMAP_IE_CellIdentifier ts_CellId_CGI(hexstring mcc, hexstring mnc, BssmapLAC lac, BssmapCI ci)
modifies ts_BSSMAP_IE_CellID := {
	cellIdentification := {
		cI_CGI := ts_BSSMAP_CI_CGI(mcc, mnc, lac, ci)
	}
}

template (value) BSSMAP_IE_CellIdentifier ts_CellID_LAC_CI(BssmapLAC lac, BssmapCI ci)
modifies ts_BSSMAP_IE_CellID := {
	cellIdentification := {
		cI_LAC_CI := {
			lac := int2oct(lac, 2),
			ci := int2oct(ci, 2)
		}
	}
}

template BSSMAP_IE_CellIdentifier ts_CellId_CI(BssmapCI ci)
modifies ts_BSSMAP_IE_CellID := {
	cellIdentification := {
		cI_CI := int2oct(ci, 2)
	}
}

template BSSMAP_IE_CellIdentifier ts_CellId_none
modifies ts_BSSMAP_IE_CellID := {
	cellIdentification := {
		cI_noCell := ''O
	}
}

template (value) BSSMAP_IE_CellIdentifier ts_CellID_SAI(OCT3 mcc_mnc, BssmapLAC lac, BssmapSAC sac)
modifies ts_BSSMAP_IE_CellID := {
	cellIdentification := {
		cI_SAI := {
			mcc_mnc := mcc_mnc,
			lac := int2oct(lac, 2),
			sac := int2oct(sac, 2)
		}
	}
}


template BSSMAP_IE_Layer3Information ts_BSSMAP_IE_L3Info(octetstring l3info) := {
	elementIdentifier := '17'O,
	lengthIndicator := 0,
	layer3info := l3info
}

template BSSMAP_IE_Layer3Information tr_BSSMAP_IE_L3Info(template octetstring l3info) := {
	elementIdentifier := '17'O,
	lengthIndicator := ?,
	layer3info := l3info
}


template PDU_BSSAP ts_BSSMAP_ComplL3(BSSMAP_IE_CellIdentifier cell_id, octetstring l3_info)
modifies ts_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			completeLayer3Information := {
				messageType := '57'O,
				cellIdentifier := cell_id,
				layer3Information := ts_BSSMAP_IE_L3Info(l3_info),
				chosenChannel := omit,
				lSAIdentifier := omit,
				aPDU := omit,
				codecList := omit,
				redirectAttemptFlag := omit,
				sendSequenceNumber := omit,
				iMSI := omit
			}
		}
	}
}

template PDU_BSSAP tr_BSSMAP_ComplL3(template octetstring l3_info := ?,
				     template BSSMAP_IE_CellIdentifier cell_id := ?,
				     template BSSMAP_IE_SpeechCodecList codec_list := *)
modifies tr_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			completeLayer3Information := {
				messageType := '57'O,
				cellIdentifier := cell_id,
				layer3Information := tr_BSSMAP_IE_L3Info(l3_info),
				chosenChannel := *,
				lSAIdentifier := *,
				aPDU := *,
				codecList := codec_list,
				redirectAttemptFlag := *,
				sendSequenceNumber := *,
				iMSI := *
			}
		}
	}
}

template BSSMAP_IE_CellIdentifierList ts_BSSMAP_IE_CidList(template BSSMAP_FIELD_CellIdentificationList cid_list) := {
	elementIdentifier := '1A'O,
	lengthIndicator := 0, /* overwritten */
	cellIdentifierDiscriminator := '0000'B, /* overwritten */
	spare1_4 := '0000'B,
	cellIdentificationList := cid_list
}

const OCT1 ChRate_ANY := '00'O;
const OCT1 ChRate_TCHF	:= '08'O;
const OCT1 ChRate_TCHH	:= '09'O;
const OCT1 ChRate_TCHForH_Fpref := '0A'O;
const OCT1 ChRate_TCHForH_Hpref := '0B'O;
const OCT1 ChRate_TCHForH_Fpref_nochg := '1A'O;
const OCT1 ChRate_TCHForH_Hpref_nochg := '1B'O;
const OCT1 ChRate_TCHForH := '0F'O;
const OCT1 ChRate_TCHForH_nochg := '1F'O;

const OCT1 Spdi_TCHF_FR  := '01'O;
const OCT1 Spdi_TCHF_EFR := '11'O;
const OCT1 Spdi_TCHF_AMR := '21'O;
const OCT1 Spdi_TCHH_HR  := '05'O;
const OCT1 Spdi_TCHH_AMR := '25'O;

template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelType := {
	elementIdentifier := '0B'O,	/* overwritten */
	lengthIndicator := 0,		/* overwritten */
	speechOrDataIndicator := '0001'B,	/* speech */
	spare1_4 := '0000'B,
	channelRateAndType := ChRate_TCHF,
	speechId_DataIndicator := Spdi_TCHF_FR
}

template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelTypeCTM modifies ts_BSSMAP_IE_ChannelType := {
	speechOrDataIndicator := '0100'B	/* speech + CTM */
}

template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelTypeCSD := {
	elementIdentifier := '0B'O,	/* overwritten */
	lengthIndicator := 0,		/* overwritten */
	speechOrDataIndicator := '0010'B,	/* data */
	spare1_4 := '0000'B,
	channelRateAndType := ChRate_TCHF,
	speechId_DataIndicator := '10'O	/* 9600 bps / transparent */
}

template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelTypeSIGNAL := {
	elementIdentifier := '0B'O,	/* overwritten */
	lengthIndicator := 0,		/* overwritten */
	speechOrDataIndicator := '0011'B,	/* data */
	spare1_4 := '0000'B,
	channelRateAndType := ChRate_ANY,
	speechId_DataIndicator := '00'O	/* spare */
}

template (value) BSSMAP_IE_EncryptionInformation ts_BSSMAP_IE_EncrInfo(OCT8 kc, OCT1 algs := '05'O) := {
	elementIdentifier := '0A'O,
	lengthIndicator := 0,	/* overwritten */
	permittedAlgorithms := algs,
	key := kc
}

template BSSMAP_IE_EncryptionInformation tr_BSSMAP_IE_EncrInfo(template OCT8 kc := ?, template OCT1 algs := ?) := {
	elementIdentifier := '0A'O,
	lengthIndicator := ?,	/* overwritten */
	permittedAlgorithms := algs,
	key := kc
}

template BSSMAP_IE_ChosenEncryptionAlgorithm ts_BSSMAP_IE_ChosenEncryptionAlgorithm(OCT1 algorithmIdentifier) := {
	elementIdentifier := '2C'O,
	algorithmIdentifier := algorithmIdentifier
}

template BSSMAP_IE_ChosenEncryptionAlgorithm tr_BSSMAP_IE_ChosenEncryptionAlgorithm(template OCT1 algorithmIdentifier := ?) := {
	elementIdentifier := '2C'O,
	algorithmIdentifier := algorithmIdentifier
}

template (value) BSSMAP_IE_CircuitIdentityCode ts_BSSMAP_IE_CIC(uint11_t span, uint5_t ts) := {
	elementIdentifier := '01'O,	/* overwritten */
	cicHigh := bit2oct(substr(int2bit(span, 11) << 5, 0, 8)),
	cicLow := bit2oct((substr(int2bit(span, 11), 8, 3) << 5) & int2bit(ts, 5))
}

function f_bssmap_ie_cic_2_int(BSSMAP_IE_CircuitIdentityCode cic_ie) return integer {
	var integer cic := (oct2int(cic_ie.cicHigh) * 256) + oct2int(cic_ie.cicLow);
	return cic;
}

template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA(BSSMAP_FIELD_IPAddress addr,
									    uint16_t udp_port,
									    integer len) := {
	elementIdentifier := '7C'O,
	lengthIndicator := len, /* overwritten */
	ipAddress := addr,
	uDPPortValue := udp_port
}
template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA4(OCT4 ip, uint16_t pt) :=
							ts_BSSMAP_IE_AoIP_TLA({ipv4:=ip}, pt, 6);
template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA6(OCT16 ip, uint16_t pt) :=
							ts_BSSMAP_IE_AoIP_TLA({ipv6:=ip}, pt, 18);

function f_ts_BSSMAP_IE_AoIP_TLA(charstring addr, uint16_t udp_port)
		return template (value) BSSMAP_IE_AoIP_TransportLayerAddress  {
	if (f_addr_is_ipv6(addr)) {
		var OCT16 ip6 := f_inet6_addr(addr);
		return ts_BSSMAP_IE_AoIP_TLA6(ip6, udp_port);
	} else {
		var OCT4 ip := f_inet_addr(addr);
		return ts_BSSMAP_IE_AoIP_TLA4(ip, udp_port);
	}
}

template BSSMAP_IE_AoIP_TransportLayerAddress tr_BSSMAP_IE_AoIP_TLA(template BSSMAP_FIELD_IPAddress addr,
								    template uint16_t udp_port,
								    template integer len := ?) := {
	elementIdentifier := '7C'O,
	lengthIndicator := len,
	ipAddress := addr,
	uDPPortValue := udp_port
}
template BSSMAP_IE_AoIP_TransportLayerAddress tr_BSSMAP_IE_AoIP_TLA4(template OCT4 ip, template uint16_t pt) :=
	tr_BSSMAP_IE_AoIP_TLA({ipv4:=ip}, pt, 6);
template BSSMAP_IE_AoIP_TransportLayerAddress tr_BSSMAP_IE_AoIP_TLA6(template OCT16 ip, template uint16_t pt) :=
	tr_BSSMAP_IE_AoIP_TLA({ipv6:=ip}, pt, 18);

function f_tr_BSSMAP_IE_AoIP_TLA(charstring addr, template uint16_t udp_port)
		return template BSSMAP_IE_AoIP_TransportLayerAddress  {
	if (f_addr_is_ipv6(addr)) {
		var OCT16 ip6 := f_inet6_addr(addr);
		return tr_BSSMAP_IE_AoIP_TLA6(ip6, udp_port);
	} else {
		var OCT4 ip := f_inet_addr(addr);
		return tr_BSSMAP_IE_AoIP_TLA4(ip, udp_port);
	}
}

template (present) BSSMAP_IE_KC128 tr_BSSMAP_IE_Kc128(template (present) OCT16 kc128) := {
	elementIdentifier := '83'O,
	kC128_Value := kc128
}

template (value) BSSMAP_IE_KC128 ts_BSSMAP_IE_Kc128(OCT16 kc128) := {
	elementIdentifier := '83'O,
	kC128_Value := kc128
}

/* 3.2.2.103 */
template (value) BSSMAP_FIELD_CodecElement ts_CodecBase := {
	codecType := GSM_FR,
	tF := '0'B,
	pT := '0'B,
	pI := '0'B,
	fI := '1'B,
	extendedCodecType := omit,
	s0_7 := omit,
	s8_15 := omit
}
template (value) BSSMAP_FIELD_CodecElement ts_CodecFR modifies ts_CodecBase := {
	codecType := GSM_FR
}
template (value) BSSMAP_FIELD_CodecElement ts_CodecEFR modifies ts_CodecBase := {
	codecType := GSM_EFR
}
template (value) BSSMAP_FIELD_CodecElement ts_CodecHR modifies ts_CodecBase := {
	codecType := GSM_HR
}
template (value) BSSMAP_FIELD_CodecElement ts_CodecAMR_F modifies ts_CodecBase := {
	codecType := FR_AMR,
	s0_7 :=  '11111111'B,
	s8_15 := '01010111'B	/* S11, S13 and S15 are reserved and coded with zeroes */
}
template (value) BSSMAP_FIELD_CodecElement ts_CodecAMR_H modifies ts_CodecBase := {
	codecType := HR_AMR,
	s0_7 :=  '00111111'B,
	s8_15 := '00000111'B	/* S6 - S7 and S11 – S15 are reserved and coded with zeroes */
}
template (value) BSSMAP_FIELD_CodecElement ts_CodecAMR_WB modifies ts_CodecBase := {
	codecType := FR_AMR_WB,
	s0_7 :=  '00000001'B
}
template (value) BSSMAP_FIELD_CodecElement ts_CodecCSData modifies ts_CodecBase := {
	codecType := CodecExtension,
	tF := '0'B, /* Spare */
	pT := '0'B, /* CSDoTDM */
	pI := '1'B, /* CSDoIP */
	fI := '0'B, /* Spare */
	extendedCodecType := 'FD'O, /* CSData */
	s0_7 := '00000000'B /* R2, R3, Spare */
}
template BSSMAP_IE_SpeechCodecList ts_BSSMAP_IE_CodecList(template BSSMAP_FIELD_CodecElements elem) := {
	elementIdentifier := '7D'O,
	lengthIndicator := 0, /* overwritten */
	codecElements := valueof(elem)
}
template BSSMAP_IE_SpeechCodec ts_BSSMAP_IE_SpeechCodec(template BSSMAP_FIELD_CodecElements elem) := {
	elementIdentifier := '7E'O,
	lengthIndicator := 0, /* overwritten */
	codecElements := valueof(elem)
}

template (present) BSSMAP_IE_Osmo_OsmuxCID tr_OsmuxCID(template (present) INT1 cid := ?) := {
	elementIdentifier := 'F1'O,
	osmuxCID := cid
}
template (value) BSSMAP_IE_Osmo_OsmuxCID ts_OsmuxCID(INT1 cid) := {
	elementIdentifier := 'F1'O,
	osmuxCID := cid
}

template PDU_BSSAP
ts_BSSMAP_AssignmentReq(template BSSMAP_IE_CircuitIdentityCode cic := omit,
			template BSSMAP_IE_AoIP_TransportLayerAddress aoip := omit,
			template BSSMAP_IE_Osmo_OsmuxCID osmuxCID := omit)
modifies ts_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			assignmentRequest := {
				messageType :='01'O,	/* overwritten */
				channelType := ts_BSSMAP_IE_ChannelType,
				layer3HeaderInfo := omit,
				priority := omit,
				circuitIdentityCode := cic,
				downLinkDTX_Flag := omit,
				interferenceBandToBeUsed := omit,
				classmarkInformationType2 := omit,
				groupCallReference := omit,
				talkerFlag := omit,
				configurationEvolutionIndication := omit,
				lsaAccesControlSuppression := omit,
				serviceHandover := omit,
				encryptionInformation := omit,
				talkerPriority := omit,
				aoIPTransportLayer := aoip,
				codecList := omit,
				callIdentifier := omit,
				kC128 := omit,
				globalCallReference := omit,
				lCLS_Configuration := omit,
				lCLS_ConnectionStatusControl := omit,
				lCLS_CorrelationNotNeeded := omit,
				osmuxCID := osmuxCID
			}
		}
	}
}

template PDU_BSSAP tr_BSSMAP_AssignmentReq(template BSSMAP_IE_CircuitIdentityCode cic := *,
					   template BSSMAP_IE_AoIP_TransportLayerAddress aoip := *,
					   template BSSMAP_IE_Osmo_OsmuxCID osmuxCID := *)
modifies tr_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			assignmentRequest := {
				messageType :='01'O,	/* overwritten */
				channelType := ?,
				layer3HeaderInfo := *,
				priority := *,
				circuitIdentityCode := cic,
				downLinkDTX_Flag := *,
				interferenceBandToBeUsed := *,
				classmarkInformationType2 := *,
				groupCallReference := *,
				talkerFlag := *,
				configurationEvolutionIndication := *,
				lsaAccesControlSuppression := *,
				serviceHandover := *,
				encryptionInformation := *,
				talkerPriority := *,
				aoIPTransportLayer := aoip,
				codecList := *,
				callIdentifier := *,
				kC128 := *,
				globalCallReference := *,
				lCLS_Configuration := *,
				lCLS_ConnectionStatusControl := *,
				lCLS_CorrelationNotNeeded := *,
				osmuxCID := osmuxCID
			}
		}
	}
}

template PDU_BSSAP
ts_BSSMAP_AssignmentComplete(template BSSMAP_IE_CircuitIdentityCode cic := omit,
			     template BSSMAP_IE_AoIP_TransportLayerAddress aoip := omit,
			     template BSSMAP_IE_SpeechCodec speechCodec := omit,
			     template BSSMAP_IE_Osmo_OsmuxCID osmuxCID := omit)
modifies ts_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			assignmentComplete := {
				messageType :='02'O,	/* overwritten */
				rR_Cause := omit,
				circuitIdentityCode := cic,
				cellIdentifier := omit,
				chosenChannel := omit,
				chosenEncryptionAlgorithm := omit,
				circuitPool := omit,
				speechVersion := omit,
				lSAIdentifier := omit,
				talkerPriority := omit,
				aoIPTransportLayer := aoip,
				speechCodec := speechCodec,
				codecList := omit,
				lCLS_BSS_Status := omit,
				osmuxCID := osmuxCID
			}
		}
	}
}

template PDU_BSSAP tr_BSSMAP_AssignmentComplete(template BSSMAP_IE_CircuitIdentityCode cic := *,
						template BSSMAP_IE_AoIP_TransportLayerAddress aoip := *,
						template BSSMAP_IE_Osmo_OsmuxCID osmuxCID := *)
modifies tr_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			assignmentComplete := {
				messageType := '02'O,	/* overwritten */
				rR_Cause := *,
				circuitIdentityCode := cic,
				cellIdentifier := *,
				chosenChannel := *,
				chosenEncryptionAlgorithm := *,
				circuitPool := *,
				speechVersion := *,
				lSAIdentifier := *,
				talkerPriority := *,
				aoIPTransportLayer := aoip,
				speechCodec := *,
				codecList := *,
				lCLS_BSS_Status := *,
				osmuxCID := osmuxCID
			}
		}
	}
}

template PDU_BSSAP tr_BSSMAP_AssignmentFail modifies tr_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			assignmentFailure := {
				messageType := '03'O,	/* overwritten */
				rR_Cause := *,
				circuitPool := *,
				circuitPoolList := *,
				talkerPriority := *,
				codecList := *
			}
		}
	}
}


template (value) PDU_BSSAP ts_BSSMAP_ClearCommand(BssmapCause cause)
modifies ts_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			clearCommand := {
				messageType := '20'O,	/* overwritten */
				layer3HeaderInfo := omit,
				cause := ts_BSSMAP_IE_Cause(cause),
				cSFB_Indication := omit
			}
		}
	}
}
template (value) PDU_BSSAP ts_BSSMAP_ClearCommandCSFB(BssmapCause cause)
modifies ts_BSSMAP_ClearCommand := {
	pdu := {
		bssmap := {
			clearCommand := {
				cSFB_Indication := {
					elementIdentifier := '8F'O
				}
			}
		}
	}
}

template PDU_BSSAP tr_BSSMAP_ClearCommand modifies tr_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			clearCommand := {
				messageType := '20'O,	/* overwritten */
				layer3HeaderInfo := *,
				cause := ?,
				cSFB_Indication := *
			}
		}
	}
}

template PDU_BSSAP tr_BSSMAP_ClearCommandCSFB modifies tr_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			clearCommand := {
				messageType := '20'O,	/* overwritten */
				layer3HeaderInfo := *,
				cause := ?,
				cSFB_Indication := {
					elementIdentifier := '8F'O
				}
			}
		}
	}
}

template (value) PDU_BSSAP ts_BSSMAP_ClearComplete
modifies ts_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			clearComplete := {
				messageType := '21'O	/* overwritten */
			}
		}
	}
}

template PDU_BSSAP tr_BSSMAP_ClearComplete modifies tr_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			clearComplete := {
				messageType := '21'O
			}
		}
	}
}

template (value) PDU_BSSAP ts_BSSMAP_ClearRequest(BssmapCause cause)
modifies ts_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			clearRequest := {
				messageType := '22'O,	/* overwritten */
				cause := ts_BSSMAP_IE_Cause(cause)
			}
		}
	}
}

template PDU_BSSAP tr_BSSMAP_ClearRequest modifies tr_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			clearRequest := {
				messageType := '22'O,	/* overwritten */
				cause := ?
			}
		}
	}
}

template PDU_BSSAP ts_BSSMAP_HandoverRequired(BssmapCause cause,
					      template BSSMAP_FIELD_CellIdentificationList cid_list,
					      template (omit) BSSMAP_oldToNewBSSIEs oldToNewBSSIEs := omit)
modifies ts_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			handoverRequired := {
				messageType := '11'O,
				cause := ts_BSSMAP_IE_Cause(cause),
				responseRequest := omit,
				cellIdentifierList := ts_BSSMAP_IE_CidList(cid_list),
				circuitPoolList := omit,
				currentChannelType1 := omit,
				speechVersion := omit,
				queueingIndicator := omit,
				oldToNewBSSInfo := f_ts_BSSMAP_IE_OldToNewBSSInfo(oldToNewBSSIEs),
				sourceToTargetRNCTransparentInfo := omit,
				sourceToTargetRNCTransparentInfoCDMA := omit,
				gERANClassmark := omit,
				talkerPriority := omit,
				speechCodec := omit,
				cSG_Identifier := omit
			}
		}
	}
}


template PDU_BSSAP tr_BSSMAP_HandoverRequired(template BSSMAP_oldToNewBSSIEs oldToNewBSSIEs := *,
					      template (present) BSSMAP_FIELD_CellIdentificationList cid_list := ?)
modifies tr_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			handoverRequired := {
				messageType := '11'O,
				cellIdentifierList := {
					cellIdentificationList := cid_list
				},
                                oldToNewBSSInfo := f_tr_BSSMAP_IE_OldToNewBSSInfo(oldToNewBSSIEs)
			}
		}
	}
}

template PDU_BSSAP tr_BSSMAP_HandoverRequiredReject modifies tr_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			handoverRequiredReject := {
				messageType := '1A'O
			}
		}
	}
}

template PDU_BSSAP tr_BSSMAP_HandoverCommand
modifies tr_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			handoverCommand := {
				messageType := '13'O
			}
		}
	}
}

template PDU_BSSAP tr_BSSMAP_HandoverSucceeded
modifies tr_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			handoverSucceeded := {
				messageType := '15'O
			}
		}
	}
}

template (value) PDU_BSSAP ts_BSSMAP_HandoverCommand(octetstring layer3info)
modifies ts_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			handoverCommand := {
				messageType := '13'O,
				layer3Information := {
					elementIdentifier := '17'O,
					lengthIndicator := 0,
					layer3info := layer3info
				},
				cellIdentifier := omit,
				newBSSToOldBSSInfo := omit,
				talkerPriority := omit
			}
		}
	}
}

template PDU_BSSAP tr_BSSMAP_HandoverFailure modifies tr_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			handoverFailure := {
				messageType := '16'O,
				cause := ?,
				rR_Cause := *,
				circuitPool := *,
				circuitPoolList := *,
				gERANClassmark := *,
				newBSSToOldBSSInfo := *,
				interSystemInformation := *,
				talkerPriority := *,
				codecList := *
			}
		}
	}
}

template PDU_BSSAP tr_BSSMAP_HandoverRequest(template BSSMAP_IE_EncryptionInformation encryptionInformation := *,
					     template BSSMAP_IE_ChosenEncryptionAlgorithm chosenEncryptionAlgorithm := *,
					     template BSSMAP_IE_KC128 kC128 := *,
					     template BSSMAP_IE_SpeechCodecList codecList := *
					    )
  modifies tr_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			handoverRequest := {
				messageType := '10'O,
				encryptionInformation := encryptionInformation,
				chosenEncryptionAlgorithm := chosenEncryptionAlgorithm,
				codecList := codecList,
				kC128 := kC128
			}
		}
	}
}

template PDU_BSSAP ts_BSSMAP_HandoverRequest(
		template BSSMAP_IE_CircuitIdentityCode cic := omit,
		template BSSMAP_IE_AoIP_TransportLayerAddress aoip_tla := omit,
		template BSSMAP_IE_CellIdentifier cell_id_target := ts_CellID_LAC_CI(1, 0),
		template BSSMAP_IE_CellIdentifier cell_id_source := ts_CellID_LAC_CI(1, 1),
		template (omit) BSSMAP_oldToNewBSSIEs oldToNewBSSIEs := omit,
		template BSSMAP_IE_EncryptionInformation encryptionInformation := ts_BSSMAP_IE_EncrInfo('0000000000000000'O,'01'O),
		template (omit) BSSMAP_IE_ChosenEncryptionAlgorithm chosenEncryptionAlgorithm := omit,
		template (omit) BSSMAP_IE_KC128 kC128 := omit,
		template (omit) BSSMAP_IE_SpeechCodecList codecList := omit
		)
modifies ts_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			handoverRequest := {
				messageType := '10'O,
				channelType := ts_BSSMAP_IE_ChannelType,
				encryptionInformation := encryptionInformation,
				classmarkInformationType := {
					classmarkInformationType1 := {
						elementIdentifier := '1D'O,
						rf_PowerCapability := '000'B,
						a5_1 := '0'B,
						esind := '0'B,
						revisionLevel := '10'B,
						spare1_1 := '0'B
					}
					},
				cellIdentifierSource := cell_id_source,
				priority := omit,
				circuitIdentityCode := cic,
				downLinkDTX_Flag := omit,
				cellIdentifierTarget := cell_id_target,
				interferenceBandToBeUsed := omit,
				cause := omit,
				classmarkInformationType3 := omit,
				currentChannelType1 := omit,
				speechVersion := omit,
				groupCallReference := omit,
				talkerFlag := omit,
				configurationEvolutionIndication := omit,
				chosenEncryptionAlgorithm := chosenEncryptionAlgorithm,
				oldToNewBSSInfo := f_ts_BSSMAP_IE_OldToNewBSSInfo(oldToNewBSSIEs),
				lSAInformation := omit,
				lSAAccessControlSuppression := omit,
				serviceHandover := omit,
				iMSI_bssmap := omit,
				sourceToTargetRNCTransparentInfo := omit,
				sourceToTargetRNCTransparentInfoCDMA := omit,
				sNAAccessInformation := omit,
				talkerPriority := omit,
				aoIPTransportLayer := aoip_tla,
				codecList := codecList,
				callIdentifier := omit,
				kC128 := kC128,
				globalCallReference := omit,
				lCLS_Configuration := omit,
				connectionStatusControl := omit
			}
		}
	}
}

template PDU_BSSAP tr_BSSMAP_HandoverRequestAcknowledge(template octetstring layer3info)
modifies tr_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			handoverRequestAck := {
				messageType := '12'O,
				layer3Information := {
					elementIdentifier := '17'O,
					lengthIndicator := ?,
					layer3info := layer3info
				}
			}
		}
	}
}

template PDU_BSSAP ts_BSSMAP_HandoverRequestAcknowledge(
			template octetstring layer3info,
			template LIN1 layer3infoLength,
			template BSSMAP_IE_AoIP_TransportLayerAddress aoIPTransportLayer := omit,
			template BSSMAP_IE_SpeechCodec speechCodec := omit,
			template BSSMAP_IE_ChosenChannel chosenChannel := omit,
			template BSSMAP_IE_ChosenEncryptionAlgorithm chosenEncryptionAlgorithm := omit)
modifies ts_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			handoverRequestAck := {
				messageType := '12'O,
				layer3Information := {
					elementIdentifier := '17'O,
					lengthIndicator := layer3infoLength,
					layer3info := layer3info
				},
				chosenChannel := chosenChannel,
				chosenEncryptionAlgorithm := chosenEncryptionAlgorithm,
				circuitPool := omit,
				speechVersion := omit,
				circuitIdentityCode := omit,
				lSAIdentifier := omit,
				newBSSToOldBSSInfo := omit,
				interSystemInformation := omit,
				talkerPriority := omit,
				aoIPTransportLayer := aoIPTransportLayer,
				codecList := omit,
				speechCodec := speechCodec,
				lCLS_bSS_Status := omit
			}
		}
	}
}

template PDU_BSSAP tr_BSSMAP_HandoverDetect
modifies tr_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			handoverDetect := {
				messageType := '1B'O,
				talkerPriority := *
			}
		}
	}
}

template PDU_BSSAP ts_BSSMAP_HandoverDetect
modifies ts_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			handoverDetect := {
				messageType := '1B'O,
				talkerPriority := omit
			}
		}
	}
}

template PDU_BSSAP tr_BSSMAP_HandoverComplete
modifies tr_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			handoverComplete := {
				messageType := '14'O,
				rR_Cause := *,
				talkerPriority := *,
				speechCodec := *,
				codecList := *,
				chosenEncryptionAlgorithm := *,
				chosenChannel := *,
				lCLS_BSS_Status := *
			}
		}
	}
}

template PDU_BSSAP ts_BSSMAP_HandoverComplete
modifies ts_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			handoverComplete := {
				messageType := '14'O,
				rR_Cause := omit,
				talkerPriority := omit,
				speechCodec := omit,
				codecList := omit,
				chosenEncryptionAlgorithm := omit,
				chosenChannel := omit,
				lCLS_BSS_Status := omit
			}
		}
	}
}

template PDU_BSSAP tr_BSSMAP_HandoverPerformed
modifies tr_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			handoverPerformed := {
				messageType := '17'O,
				cause := ?,
				cellIdentifier := ?,
				chosenChannel := *,
				chosenEncryptionAlgorithm := *,
				speechVersion := *,
				lSAIdentifier := *,
				talkerPriority := *,
				codecList := *,
				speechCodec := *,
				lCLS_BSS_Status := *
			}
		}
	}
}

template BSSMAP_IE_IMSI ts_BSSMAP_Imsi(hexstring imsi_digits) := {
	elementIdentifier := '08'O,
	lengthIndicator := 0, /* overwritten */
	typeOfIdentity := '001'B, /* IMSI */
	oddEvenIndicator := f_hex_is_odd_length(imsi_digits),
	digits := imsi_digits
}

template BSSMAP_IE_IMSI tr_BSSMAP_Imsi(template hexstring imsi_digits) := {
	elementIdentifier := '08'O,
	lengthIndicator := ?, /* overwritten */
	typeOfIdentity := '001'B, /* IMSI */
	oddEvenIndicator := ?,
	digits := imsi_digits
}

template (value) BSSAMAP_IE_LastUsedEUTRANPLMNId ts_BSSMAP_LastUsedEUTRANPLMNId(OCT3 mcc_mnc) := {
	elementIdentifier := '95'O,
	mcc_mnc := mcc_mnc
}
template BSSAMAP_IE_LastUsedEUTRANPLMNId tr_BSSMAP_LastUsedEUTRANPLMNId(template OCT3 mcc_mnc) := {
	elementIdentifier := '95'O,
	mcc_mnc := mcc_mnc
}
function f_ts_BSSMAP_LastUsedEUTRANPLMNId(template (omit) OCT3 mcc_mnc)
			return template (omit) BSSAMAP_IE_LastUsedEUTRANPLMNId {
	if (not istemplatekind(mcc_mnc, "omit")) {
		return ts_BSSMAP_LastUsedEUTRANPLMNId(valueof(mcc_mnc));
	} else {
		return omit;
	}
}
function f_tr_BSSMAP_LastUsedEUTRANPLMNId(template OCT3 mcc_mnc)
return template BSSAMAP_IE_LastUsedEUTRANPLMNId {
	if (istemplatekind(mcc_mnc, "*")) {
		return *;
	} else if (istemplatekind(mcc_mnc, "?")) {
		return ?;
	} else if (istemplatekind(mcc_mnc, "omit")) {
		return omit;
	} else {
		return ts_BSSMAP_LastUsedEUTRANPLMNId(valueof(mcc_mnc));
	}
}

template BSSMAP_FIELD_CellIdentificationList ts_BSSMAP_CIL_noCell := {
	cIl_noCell := ''O
}
template (value) BSSMAP_FIELD_CellIdentificationList ts_BSSMAP_CIL_BSS := {
	cIl_allInBSS := ''O
}
template BSSMAP_FIELD_CellIdentificationList tr_BSSMAP_CIL_BSS := {
	cIl_allInBSS := ''O
}

template (value) BSSMAP_FIELD_CellIdentificationList
		ts_BSSMAP_CIL_CGI(template (value) BSSMAP_FIELD_CellIdentificationList_CGI cgil) := {
	cIl_CGI := cgil
}
template BSSMAP_FIELD_CellIdentificationList
		tr_BSSMAP_CIL_CGI(template BSSMAP_FIELD_CellIdentificationList_CGI cgil) := {
	cIl_CGI := cgil
}

template (value) BSSMAP_FIELD_CellIdentificationList
		ts_BSSMAP_CIL_LAC_CI(template (value) BSSMAP_FIELD_CellIdentificationList_LAC_CI lac_cil) := {
	cIl_LAC_CI := lac_cil
}
template BSSMAP_FIELD_CellIdentificationList
		tr_BSSMAP_CIL_LAC_CI(template BSSMAP_FIELD_CellIdentificationList_LAC_CI lac_cil) := {
	cIl_LAC_CI := lac_cil
}

template (value) BSSMAP_FIELD_CellIdentificationList
		ts_BSSMAP_CIL_CI(template (value) RecordOfOCT2 cil) := {
	cIl_CI := cil
}
template BSSMAP_FIELD_CellIdentificationList tr_BSSMAP_CIL_CI(template RecordOfOCT2 cil) := {
	cIl_CI := cil
}

template (value) BSSMAP_FIELD_CellIdentificationList
		ts_BSSMAP_CIL_LAI(template (value) BSSMAP_FIELD_CellIdentificationList_LAI lail) := {
	cIl_LAI := lail
}
template BSSMAP_FIELD_CellIdentificationList
		tr_BSSMAP_CIL_LAI(template BSSMAP_FIELD_CellIdentificationList_LAI lail) := {
	cIl_LAI := lail
}

template (value) BSSMAP_FIELD_CellIdentificationList
		ts_BSSMAP_CIL_LAC(template (value) RecordOfOCT2 lacl) := {
	cIl_LAC := lacl
}
template BSSMAP_FIELD_CellIdentificationList tr_BSSMAP_CIL_LAC(template RecordOfOCT2 lacl) := {
	cIl_LAC := lacl
}


function f_enc_mcc_mnc(GsmMcc mcc, GsmMnc mnc) return OCT3 {
	if (lengthof(mnc) == 2) {
		return hex2oct(mcc[1] & mcc[0] & 'F'H & mcc[2] & mnc[1] & mnc[0]);
	} else {
		return hex2oct(mcc[1] & mcc[0] & mnc[2] & mcc[2] & mnc[1] & mnc[0]);
	}
}

function f_dec_mcc_mnc(in OCT3 mcc_mnc, out GsmMcc mcc, out GsmMnc mnc) {
	var hexstring hs := oct2hex(mcc_mnc);
	mcc := hs[1] & hs[0] & hs[3];
	mnc := hs[5] & hs[4];
	if (hs[2] == 'F'H) {
		mnc := mnc & hs[2];
	}
}

template (value) BSSMAP_FIELD_CellIdentification_CGI ts_BSSMAP_CI_CGI(GsmMcc mcc, GsmMnc mnc, GsmLac lac, GsmCellId ci) := {
	mcc_mnc := f_enc_mcc_mnc(mcc, mnc),
	lac := int2oct(lac, 2),
	ci := int2oct(ci, 2)
}

template (value) BSSMAP_FIELD_CellIdentification_LAC_CI ts_BSSMAP_CI_LAC_CI(GsmLac lac, GsmCellId ci) := {
	lac := int2oct(lac, 2),
	ci := int2oct(ci, 2)
}

template (value) BSSMAP_FIELD_CellIdentification_LAI ts_BSSMAP_CI_LAI(GsmMcc mcc, GsmMnc mnc, GsmLac lac) := {
	mcc_mnc := f_enc_mcc_mnc(mcc, mnc),
	lac := int2oct(lac, 2)
}

template (value) OCT2 ts_BSSMAP_CI_LAC(GsmLac lac) := int2oct(lac, 2);
template (value) OCT2 ts_BSSMAP_CI_CI(GsmCellId ci) := int2oct(ci, 2);

template (value) BSSMAP_FIELD_CellIdentification_PLMN_LAC_RNC
ts_BSSMAP_CI_PLMN_LAC_RNC(GsmMcc mcc, GsmMnc mnc, GsmLac lac, uint16_t rnc_id) := {
	mcc_mnc := f_enc_mcc_mnc(mcc, mnc),
	lac := int2oct(lac, 2),
	rncId := int2oct(rnc_id, 2)
}

template (value) BSSMAP_FIELD_CellIdentification_LAC_RNC ts_BSSMAP_CI_LAC_RNC(GsmLac lac, uint16_t rnc_id) := {
	lac := int2oct(lac, 2),
	rncId := int2oct(rnc_id, 2)
}

template BSSMAP_IE_ChannelNeeded ts_BSSMAP_IE_ChanNeeded(BIT2 chneed) := {
	elementIdentifier := '24'O,
	channel := chneed,
	spare := '000000'B
}

template BSSMAP_IE_TMSI ts_BSSMAP_IE_TMSI(OCT4 tmsi) := {
	elementIdentifier := '09'O,
	lengthIndicator := 4,
	tmsiOctets := tmsi
};

template BSSMAP_IE_TMSI tr_BSSMAP_IE_TMSI(template OCT4 tmsi) := {
	elementIdentifier := '09'O,
	lengthIndicator := 4,
	tmsiOctets := tmsi
};

private function f_tmsi_or_omit(template OCT4 tmsi) return template BSSMAP_IE_TMSI {
	var template BSSMAP_IE_TMSI ret;
	if (ispresent(tmsi)) {
		ret := ts_BSSMAP_IE_TMSI(valueof(tmsi));
	} else {
		ret := omit;
	}
	return ret;
}

template PDU_BSSAP ts_BSSMAP_Paging(hexstring imsi_digits,
					template BSSMAP_FIELD_CellIdentificationList cid_list,
					template OCT4 tmsi := omit,
					template BSSMAP_IE_ChannelNeeded chneed := omit)
modifies ts_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			paging := {
				messageType := '52'O,
				iMSI := ts_BSSMAP_Imsi(imsi_digits),
				tMSI := f_tmsi_or_omit(tmsi),
				cellIdentifierList := ts_BSSMAP_IE_CidList(cid_list),
				channelNeeded := chneed,
				eMLPP_Priority := omit,
				pagingInformation := omit /* only VGCS/VBS flag */
			}
		}
	}
}

template PDU_BSSAP tr_BSSMAP_Paging(template hexstring imsi_digits := ?,
					template OCT4 tmsi := *,
					template BSSMAP_IE_ChannelNeeded chneed := *)
modifies tr_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			paging := {
				messageType := '52'O,
				iMSI := tr_BSSMAP_Imsi(imsi_digits),
				tMSI := tr_BSSMAP_IE_TMSI(tmsi) ifpresent,
				cellIdentifierList := ?,
				channelNeeded := chneed,
				eMLPP_Priority := omit,
				pagingInformation := omit /* only VGCS/VBS flag */
			}
		}
	}
}


template PDU_BSSAP ts_BSSMAP_CipherModeCmd(OCT1 alg, OCT8 key)
modifies ts_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			cipherModeCommand := {
				messageType := '53'O,
				layer3HeaderInfo := omit,
				encryptionInformation := ts_BSSMAP_IE_EncrInfo(key, alg),
				cipherResponseMode := omit,
				kC128 := omit
			}
		}
	}
}

template PDU_BSSAP ts_BSSMAP_CipherModeCmdKc128(OCT1 alg, OCT8 key, OCT16 kc128)
modifies ts_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			cipherModeCommand := {
				messageType := '53'O,
				layer3HeaderInfo := omit,
				encryptionInformation := ts_BSSMAP_IE_EncrInfo(key, alg),
				cipherResponseMode := omit,
				kC128 := { '83'O, kc128 }
			}
		}
	}
}

template PDU_BSSAP tr_BSSMAP_CipherModeCmd2(template BSSMAP_IE_EncryptionInformation encryptionInformation := *,
					    template BSSMAP_IE_KC128 kC128 := *)
modifies tr_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			cipherModeCommand := {
				messageType := '53'O,
				layer3HeaderInfo := *,
				encryptionInformation := encryptionInformation,
				cipherResponseMode := *,
				kC128 := kC128
			}
		}
	}
}

template PDU_BSSAP tr_BSSMAP_CipherModeCmd(template OCT1 alg, template OCT8 key, template BSSMAP_IE_KC128 kC128 := omit)
 := tr_BSSMAP_CipherModeCmd2(tr_BSSMAP_IE_EncrInfo(key, alg), kC128);

template PDU_BSSAP ts_BSSMAP_CipherModeCompl(OCT1 alg)
modifies ts_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			cipherModeComplete := {
				messageType := '55'O,
				layer3MessageContents := omit,
				chosenEncryptionAlgorithm := {
					elementIdentifier := '2C'O,
					algorithmIdentifier := alg
				}
			}
		}
	}
}

template PDU_BSSAP ts_BSSMAP_CipherModeComplAlg(template BSSMAP_IE_ChosenEncryptionAlgorithm chosenEncryptionAlgorithm := ?)
modifies ts_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			cipherModeComplete := {
				messageType := '55'O,
				layer3MessageContents := omit,
				chosenEncryptionAlgorithm := chosenEncryptionAlgorithm
			}
		}
	}
}

template PDU_BSSAP tr_BSSMAP_CipherModeCompl(template OCT1 alg := ?) modifies tr_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			cipherModeComplete := {
				messageType := '55'O,
				layer3MessageContents := *,
				chosenEncryptionAlgorithm := {
					elementIdentifier := '2C'O,
					algorithmIdentifier := alg
				}
			}
		}
	}
}

template PDU_BSSAP tr_BSSMAP_CipherModeRej modifies tr_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			cipherModeReject := {
				messageType := '59'O,
				cause  := ?
			}
		}
	}
}

template PDU_BSSAP tr_BSSMAP_ClassmarkReq modifies tr_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			classmarkRequest := {
				messageType := '58'O,
				talkerPriority := *
			}
		}
	}
}

template BSSMAP_IE_ClassmarkInformationType2 ts_CM2_default := {
	elementIdentifier := '12'O,
	lengthIndicator := 0,	/* overwritten */
	/* CM1 */
	rf_PowerCapability := '010'B,	/* class3 */
	a5_1 := '0'B,			/* supported */
	esind := '1'B,			/* early classmark supported */
	revisionLevel := '10'B,		/* R99 */
	spare1_1 := '0'B,
	/* CM2 */
	fc := '1'B,			/* E-GSM support */
	vgcs := '0'B,
	vbs := '0'B,
	sm_Capability := '1'B,
	ss_ScreenIndicator := '00'B,
	ps_Capability := '1'B,
	spare2_1 := '0'B,
	classmarkInformationType2_oct5 := {
		a5_2 := '0'B,		/* not available */
		a5_3 := '1'B,		/* available */
		cmsp := '0'B,		/* not supported */
		solsa := '0'B,		/* not suported */
		ucs2 := '0'B,		/* GSM alphabet preferred */
		lcsvacap := '0'B,	/* not supported */
		spare := '0'B,
		cm3 := '0'B		/* no CM3 */
	}
}


template BSSMAP_IE_ClassmarkInformationType3 ts_CM3_default := {
	elementIdentifier := '13'O,
	lengthIndicator := 0,	/* overwritten */
	classmark3ValuePart := '01'O /* A5/4 supported */
}

template PDU_BSSAP ts_BSSMAP_ClassmarkUpd(template BSSMAP_IE_ClassmarkInformationType2 cm2 := ts_CM2_default,
					  template BSSMAP_IE_ClassmarkInformationType3 cm3 := omit)
modifies ts_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			classmarkUpdate := {
				messageType := '54'O,
				classmarkInformationType2 := cm2,
				classmarkInformationType3 := cm3,
				talkerPriority := omit
			}
		}
	}
}

template PDU_BSSAP tr_BSSMAP_ClassmarkUpd(template BSSMAP_IE_ClassmarkInformationType2 cm2 := *,
					  template BSSMAP_IE_ClassmarkInformationType3 cm3 := *)
modifies tr_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			classmarkUpdate := {
				messageType := '54'O,
				classmarkInformationType2 := cm2,
				classmarkInformationType3 := cm3,
				talkerPriority := *
			}
		}
	}
}

template PDU_BSSAP ts_BSSMAP_ClassmarkRequest
modifies ts_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			classmarkRequest := {
				messageType := '58'O,
				talkerPriority := omit
			}
		}
	}
}

template PDU_BSSAP tr_BSSMAP_ClassmarkRequest
modifies tr_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			classmarkRequest := {
				messageType := '58'O,
				talkerPriority := *
			}
		}
	}
}

/* return Layer3 octetstring inside BSSAP PDU */
function f_bssap_extract_l3(PDU_BSSAP bssap) return template octetstring {
	if (ischosen(bssap.pdu.bssmap)) {
		var PDU_BSSMAP bssmap := bssap.pdu.bssmap;
		if (ischosen(bssmap.completeLayer3Information)) {
			return bssmap.completeLayer3Information.layer3Information.layer3info;
		} else if (ischosen(bssmap.handoverRequestAck)) {
			return bssmap.handoverRequestAck.layer3Information.layer3info;
		} else if (ischosen(bssmap.handoverCommand)) {
			return bssmap.handoverCommand.layer3Information.layer3info;
		} else if (ischosen(bssmap.uplinkRequest)) {
			return bssmap.uplinkRequest.layer3Information.layer3info;
		} else if (ischosen(bssmap.uplinkRequestConfirmation)) {
			return bssmap.uplinkRequestConfirmation.layer3Information.layer3info;
		} else if (ischosen(bssmap.uplinkApplicationData)) {
			return bssmap.uplinkApplicationData.layer3Information.layer3info;
		} else if (ischosen(bssmap.rerouteCommand)) {
			return bssmap.rerouteCommand.initialLayer3Information.layer3info;
		} else {
			return omit;
		}
	} else {
		return bssap.pdu.dtap;
	}
}

/* TS 29.205 B.2.1.9 */
template (value) GlobalCallReferenceValue ts_GCR(octetstring net_id, OCT2 node_id, OCT5 cref_id) := {
	networkIDLengthIndicator := 0, /* overwritten */
	networkID := net_id,
	nodeIDLengthIndicator := 0, /* overwritten */
	nodeID := node_id,
	callReferenceIDLengthIndicator := 0, /* overwritten */
	callReferenceID := cref_id
}
template GlobalCallReferenceValue tr_GCR(template octetstring net_id,
				    template OCT2 node_id,
				    template OCT5 cref_id) := {
	networkIDLengthIndicator := ?,
	networkID := net_id,
	nodeIDLengthIndicator := ?,
	nodeID := node_id,
	callReferenceIDLengthIndicator := ?,
	callReferenceID := cref_id
}

/* TS 47.008 3.2.2.115 */
template (value) BSSMAP_IE_GlobalCallReference ts_BSSMAP_IE_GCR(template (value) GlobalCallReferenceValue gcr) := {
	elementIdentifier := '89'O,
	lengthIndicator := 0, /* overwritten */
	globalCallReferenceValue := gcr
}
template BSSMAP_IE_GlobalCallReference tr_BSSMAP_IE_GCR(template GlobalCallReferenceValue gcr) := {
	elementIdentifier := '89'O,
	lengthIndicator := ?,
	globalCallReferenceValue := gcr
}

/* TS 48.008 3.2.2.116 */
const BIT4 LCLS_CFG_both_way := '0000'B;
const BIT4 LCLS_CFG_both_way_and_bicast_UL := '0001'B;
const BIT4 LCLS_CFG_both_way_and_send_DL := '0010'B;
const BIT4 LCLS_CFG_both_way_and_send_DL_block_local_DL := '0011'B;
const BIT4 LCLS_CFG_both_way_and_bicast_UL_send_DL := '0100'B;
const BIT4 LCLS_CFG_both_way_and_bicast_UL_send_DL_block_local_DL := '0101'B;

template (value) BSSMAP_IE_LCLS_Configuration ts_BSSMAP_IE_LclsCfg(BIT4 cfg_val) := {
	elementIdentifier := '8A'O,
	lCLS_ConfigurationValue := cfg_val,
	spare := '0000'B
}
template BSSMAP_IE_LCLS_Configuration tr_BSSMAP_IE_LclsCfg(template BIT4 cfg_val) := {
	elementIdentifier := '8A'O,
	lCLS_ConfigurationValue := cfg_val,
	spare := '0000'B
}

/* TS 48.008 3.2.2.117 */
const BIT4 LCLS_CSC_connect := '0000'B;
const BIT4 LCLS_CSC_do_not_connect := '0001'B;
const BIT4 LCLS_CSC_release_lcls := '0010'B;
const BIT4 LCLS_CSC_bicast_UL_at_handover := '0011'B;
const BIT4 LCLS_CSC_bicast_UL_and_recv_DL_at_handover := '0100'B;

template (value) BSSMAP_IE_LCLS_ConnectionStatusControl ts_BSSMAP_IE_LclsCsc(BIT4 csc) := {
	elementIdentifier := '8B'O,
	lCLS_ConnectionStatusControlValue := csc,
	spare := '0000'B
}
template BSSMAP_IE_LCLS_ConnectionStatusControl tr_BSSMAP_IE_LclsCsc(template BIT4 csc) := {
	elementIdentifier := '8B'O,
	lCLS_ConnectionStatusControlValue := csc,
	spare := '0000'B
}

/* TS 48.008 3.2.2.119 */
const BIT4 LCLS_STS_not_yet_ls := '0000'B;
const BIT4 LCLS_STS_not_possible_ls := '0001'B;
const BIT4 LCLS_STS_no_longer_ls := '0010'B;
const BIT4 LCLS_STS_req_lcls_not_supp := '0011'B;
const BIT4 LCLS_STS_locally_switched := '0100'B;

template (value) BSSMAP_IE_LCLS_BSS_Status ts_BSSMAP_IE_LclsSts(BIT4 sts) := {
	elementIdentifier := '8D'O,
	lCLS_BSS_StatusValue := sts,
	spare := '0000'B
}
template BSSMAP_IE_LCLS_BSS_Status tr_BSSMAP_IE_LclsSts(template BIT4 sts) := {
	elementIdentifier := '8D'O,
	lCLS_BSS_StatusValue := sts,
	spare := '0000'B
}

/* TS 48.008 3.2.1.91 */
template (value) PDU_BSSAP ts_BSSMAP_LclsConnCtrl(template (omit) BSSMAP_IE_LCLS_Configuration cfg,
						  template (omit) BSSMAP_IE_LCLS_ConnectionStatusControl csc) modifies ts_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			lCLS_ConnectControl := {
				messageType := '74'O,
				lCLS_Configuration := cfg,
				lCLS_ConnectionStatusControl := csc
			}
		}
	}
}
template PDU_BSSAP tr_BSSMAP_LclsConnCtrl(template BSSMAP_IE_LCLS_Configuration cfg,
					  template BSSMAP_IE_LCLS_ConnectionStatusControl csc)
modifies tr_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			lCLS_ConnectControl := {
				messageType := '74'O,
				lCLS_Configuration := cfg,
				lCLS_ConnectionStatusControl := csc
			}
		}
	}
}

/* TS 48.008 3.2.1.92 */
template (value) PDU_BSSAP ts_BSSMAP_LclsConnCtrlAck(template (value) BSSMAP_IE_LCLS_BSS_Status sts)
modifies ts_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			lCLS_connectControlAck := {
				messageType := '75'O,
				lCLS_BSS_Status := sts
			}
		}
	}
}
template PDU_BSSAP tr_BSSMAP_LclsConnCtrlAck(template BSSMAP_IE_LCLS_BSS_Status sts)
modifies tr_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			lCLS_connectControlAck := {
				messageType := '75'O,
				lCLS_BSS_Status := sts
			}
		}
	}
}

/* TS 48.008 3.2.1.93 */
template (value) PDU_BSSAP ts_BSSMAP_LclsNotification(template (omit) BSSMAP_IE_LCLS_BSS_Status sts,
						      template (omit) BSSMAP_IE_LCLS_BreakRequest brq)
modifies ts_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			lCLS_Notification := {
				messageType := '76'O,
				lCLS_BSS_Status := sts,
				lCLS_BreakRequest := brq
			}
		}
	}
}
template PDU_BSSAP tr_BSSMAP_LclsNotification(template BSSMAP_IE_LCLS_BSS_Status sts,
					      template BSSMAP_IE_LCLS_BreakRequest brq)
modifies tr_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			lCLS_Notification := {
				messageType := '76'O,
				lCLS_BSS_Status := sts,
				lCLS_BreakRequest := brq
			}
		}
	}
}

template PDU_BSSAP tr_BSSMAP_LclsNotificationSts(BIT4 sts)
modifies tr_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			lCLS_Notification := {
				messageType := '76'O,
				lCLS_BSS_Status := tr_BSSMAP_IE_LclsSts(sts),
				lCLS_BreakRequest := omit
			}
		}
	}
}

template PDU_BSSAP ts_BSSMAP_CommonId(hexstring imsi_digits,
				      template (omit) OCT3 last_eutran_plmn := omit)
modifies ts_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			commonID := {
				messageType := '2F'O,
				iMSI := ts_BSSMAP_Imsi(imsi_digits),
				sNAAccessInformation := omit,
				selectedPLMNId := omit,
				lastUsedEUTRANPLMNId := f_ts_BSSMAP_LastUsedEUTRANPLMNId(last_eutran_plmn)
			}
		}
	}
}

template PDU_BSSAP tr_BSSMAP_CommonId(template hexstring imsi_digits,
				      template BSSAMAP_IE_LastUsedEUTRANPLMNId lastUsedEUTRANPLMNId := *)
modifies tr_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			commonID := {
				messageType := '2F'O,
				iMSI := tr_BSSMAP_Imsi(imsi_digits),
				sNAAccessInformation := *,
				selectedPLMNId := *,
				lastUsedEUTRANPLMNId := lastUsedEUTRANPLMNId
			}
		}
	}
}

template PDU_BSSAP tr_BSSMAP_SAPInReject(template (present) GsmSapi sapi := ?,
					 template BSSMAP_IE_Cause cause := ?)
modifies tr_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			sAPInReject := {
				messageType := '25'O,
				dLCI := {
					elementIdentifier := '18'O,
					sapiValue := f_tr_SAPI(sapi),
					spare := ?,
					c1 := ?, c2 := ?
				},
				cause := cause
			}
		}
	}
}

private function f_tr_SAPI(template (present) GsmSapi sapi)
return template (present) BIT3 {
	if (istemplatekind(sapi, "?")) {
		return ?;
	} else {
		return int2bit(valueof(sapi), 3);
	}
}

template (value) BSSMAP_IE_LocationType ts_BSSMAP_IE_LocationType
:= {
	elementIdentifier := '44'O,
	lengthIndicator := 1,
	locationInformation := '00'O,
	positioningMethod := omit
}

template (value) BSSMAP_IE_LCSClientType
ts_BSSMAP_IE_LCSClientType(template (value) BIT4 category := '0010'B,
			   template (value) BIT4 subtype := '0000'B) := {
	elementIdentifier := '48'O,
	lengthIndicator := 0, /* overwritten */
	subtype := subtype,
	category := category
}

template (value) BSSMAP_IE_LCSPriority
ts_BSSMAP_IE_LCSPriority(template (value) OCT1 priority := '00'O) := {
	elementIdentifier := '43'O,
	lengthIndicator := 0, /* overwritten */
	priority := priority
}

template (value) BSSMAP_IE_LCSQOS
ts_BSSMAP_IE_LCSQOS(template (value) BIT1 vCI := '0'B,
		    template (value) BIT1 vEL := '0'B,
		    template (value) BIT1 hAI := '1'B,
		    template (value) BIT7 hAV := '0010010'B,
		    template (value) BIT1 vAI := '0'B,
		    template (value) BIT7 vAV := '0000000'B) := {
	elementIdentifier := '3E'O,
	lengthIndicator := 0, /* overwritten */
	vCI := vCI, /* Vertical Coordinate Indicator: VC requested ('1'B) or not ('0'B) */
	vEL := vEL, /* report velocity if available (1) or not(0) */
	spare_1_6 := '000000'B,
	horizontalAccuracy := hAV, /* Accuracy Horizontal (HA) */
	hAI := hAI, /* Horizontal Accuracy Indicator HA is specified (1) or not (0) */
	verticalAccuracy := vAV, /* Accuracy Vertical (VA) */
	vAI := vAI, /* Vertical Accuracy Indicator VA is specified (1) or not (0) */
	spare_2_6 := '000000'B,
	rTC := '00'B /* Response Time is not specified */
}

template (value) PDU_BSSAP
ts_BSSMAP_Perform_Location_Request(template (omit) BSSMAP_IE_IMSI imsi,
				   template (omit) BSSMAP_IE_CellIdentifier cellIdentifier := omit,
				   template (omit) BSSMAP_IE_LCSClientType clientType := ts_BSSMAP_IE_LCSClientType,
				   template (omit) BSSMAP_IE_LCSPriority priority := ts_BSSMAP_IE_LCSPriority,
				   template (omit) BSSMAP_IE_LCSQOS qos := ts_BSSMAP_IE_LCSQOS)
modifies ts_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			performLocationRequest := {
				messageType := '2B'O,
				locationType := ts_BSSMAP_IE_LocationType,
				cellIdentifier := cellIdentifier,
				classmarkInformationType3 := omit,
				lCS_ClientType := clientType,
				chosenChannel := omit,
				lCS_Priority := priority,
				lCS_QOS := qos,
				gPS_AssistanceData := omit,
				aPDU := omit,
				iMSI := imsi,
				iMEI := omit,
				gANSS_LocationType := omit,
				gANSS_AssistanceData := omit
			}
		}
	}
}

template (present) BSSMAP_IE_LocationEstimate tr_BSSMAP_IE_LocationEstimate(template (present) octetstring geo_loc := ?)
:= {
	elementIdentifier := '45'O,
	lengthIndicator := ?,
	geographicLocation := geo_loc
}

function tr_BSSMAP_LcsCause(template (present) BSSMAP_LcsCause cause)
return template (omit) BSSMAP_IE_LCSCause {
	if (istemplatekind(cause, "omit")) {
		return omit;
	}
	var template BSSMAP_IE_LCSCause ie := {
		elementIdentifier := '47'O,
		lengthIndicator := 1,
		causeValue := int2bit(enum2int(valueof(cause)), 8),
		diagnosticValue := omit
	}
	return ie;
}

template (present) PDU_BSSAP tr_BSSMAP_Perform_Location_Response(
	template BSSMAP_IE_LocationEstimate locationEstimate := *,
	template BSSMAP_IE_PositioningData positioningData := *,
	template BSSMAP_IE_LCSCause lCS_Cause := *
	)
modifies tr_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			performLocationResponse := {
				messageType := '2D'O,
				locationEstimate := locationEstimate,
				positioningData := positioningData,
				decipheringKeys := *,
				lCS_Cause := lCS_Cause,
				velocityEstimate := *,
				gANSS_PositioningData := *
			}
		}
	}
}

template (present) PDU_BSSAP tr_BSSMAP_Perform_Location_Abort(template (present) BSSMAP_IE_LCSCause lCS_Cause := ?)
modifies tr_BSSAP_BSSMAP := {
	pdu := {
		bssmap := {
			performLocationAbort := {
				messageType := '2E'O,
				lCS_Cause := lCS_Cause
			}
		}
	}
}

} with { encode "RAW" };
