module AbisOML_Types {

/* AbisOML_Types, defining abstract TTCN-3 data types for the A-bis OML protocol.
 *
 * A-bis OML is a 3GP standard protocol used between BTS and BSC in a GSM network;
 * it is specified in 3GPP TS 12.21.
 *
 * (C) 2019 by Harald Welte <laforge@gnumonks.org>
 * All rights reserved.
 *
 * Released under the terms of the 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 GSM_Types all;

type enumerated OML_MessageDiscriminator {
	ABIS_OM_MDISC_FOM	('80'H),
	ABIS_OM_MDISC_MMI	('40'H),
	ABIS_OM_MDISC_TRAU	('20'H),
	ABIS_OM_MDISC_MANUF	('10'H)
} with { variant "FIELDLENGTH(8)" };

type enumerated OML_Placement {
	ABIS_OM_PLACEMENT_ONLY		('80'H),
	ABIS_OM_PLACEMENT_FIRST		('40'H),
	ABIS_OM_PLACEMENT_MIDDLE	('20'H),
	ABIS_OM_PLACEMENT_LAST		('10'H)
} with { variant "FIELDLENGTH(8)" };

type union OML_Union {
	OML_FOM		fom,
	OML_MANUF	manuf,
	octetstring	other
};

type record OML_PDU {
	OML_MessageDiscriminator	mdisc,
	OML_Placement			placement,
	uint8_t				sequence,
	OML_Union			u
} with {
	 variant (u) "CROSSTAG(
			fom, mdisc = ABIS_OM_MDISC_FOM;
			manuf, mdisc = ABIS_OM_MDISC_MANUF;
			other, OTHERWISE;
		)" };


type record OML_FOM_ObjectInstance {
	uint8_t		bts_nr,
	uint8_t		trx_nr,
	uint8_t		ts_nr
};


type record OML_FOM_Header {
	OML_FOM_MessageType		msg_type,
	OML_FOM_ObjectClass		obj_class,
	OML_FOM_ObjectInstance		obj_inst
};

/* Section 9.1 */
type enumerated OML_FOM_MessageType {
	/* SW Download Management Messages */
	NM_MT_LOAD_INIT			('01'H),
	NM_MT_LOAD_INIT_ACK		('02'H),
	NM_MT_LOAD_INIT_NACK		('03'H),
	NM_MT_LOAD_SEG			('04'H),
	NM_MT_LOAD_SEG_ACK		('05'H),
	NM_MT_LOAD_ABORT		('06'H),
	NM_MT_LOAD_END			('07'H),
	NM_MT_LOAD_END_ACK		('08'H),
	NM_MT_LOAD_END_NACK		('09'H),
	NM_MT_SW_ACT_REQ		('0a'H),
	NM_MT_SW_ACT_REQ_ACK		('0b'H),
	NM_MT_SW_ACT_REQ_NACK		('0c'H),
	NM_MT_ACTIVATE_SW		('0d'H),
	NM_MT_ACTIVATE_SW_ACK		('0e'H),
	NM_MT_ACTIVATE_SW_NACK		('0f'H),
	NM_MT_SW_ACTIVATED_REP		('10'H),

	/* A-bis Interface Management Messages */
	NM_MT_ESTABLISH_TEI		('21'H),
	NM_MT_ESTABLISH_TEI_ACK		('22'H),
	NM_MT_ESTABLISH_TEI_NACK	('23'H),
	NM_MT_CONN_TERR_SIGN		('24'H),
	NM_MT_CONN_TERR_SIGN_ACK	('25'H),
	NM_MT_CONN_TERR_SIGN_NACK	('26'H),
	NM_MT_DISC_TERR_SIGN		('27'H),
	NM_MT_DISC_TERR_SIGN_ACK	('28'H),
	NM_MT_DISC_TERR_SIGN_NACK	('29'H),
	NM_MT_CONN_TERR_TRAF		('2a'H),
	NM_MT_CONN_TERR_TRAF_ACK	('2b'H),
	NM_MT_CONN_TERR_TRAF_NACK	('2c'H),
	NM_MT_DISC_TERR_TRAF		('2d'H),
	NM_MT_DISC_TERR_TRAF_ACK	('2e'H),
	NM_MT_DISC_TERR_TRAF_NACK	('2f'H),
	/* Transmission Management Messages */	
	NM_MT_CONN_MDROP_LINK		('31'H),
	NM_MT_CONN_MDROP_LINK_ACK	('32'H),
	NM_MT_CONN_MDROP_LINK_NACK	('33'H),
	NM_MT_DISC_MDROP_LINK		('34'H),
	NM_MT_DISC_MDROP_LINK_ACK	('35'H),
	NM_MT_DISC_MDROP_LINK_NACK	('36'H),
	/* Air Interface Management Messages */
	NM_MT_SET_BTS_ATTR		('41'H),
	NM_MT_SET_BTS_ATTR_ACK		('42'H),
	NM_MT_SET_BTS_ATTR_NACK		('43'H),
	NM_MT_SET_RADIO_ATTR		('44'H),
	NM_MT_SET_RADIO_ATTR_ACK	('45'H),
	NM_MT_SET_RADIO_ATTR_NACK	('46'H),
	NM_MT_SET_CHAN_ATTR		('47'H),
	NM_MT_SET_CHAN_ATTR_ACK		('48'H),
	NM_MT_SET_CHAN_ATTR_NACK	('49'H),
	/* Test Management Messages */
	NM_MT_PERF_TEST			('51'H),
	NM_MT_PERF_TEST_ACK		('52'H),
	NM_MT_PERF_TEST_NACK		('53'H),
	NM_MT_TEST_REP			('54'H),
	NM_MT_SEND_TEST_REP		('55'H),
	NM_MT_SEND_TEST_REP_ACK		('56'H),
	NM_MT_SEND_TEST_REP_NACK	('57'H),
	NM_MT_STOP_TEST			('58'H),
	NM_MT_STOP_TEST_ACK		('59'H),
	NM_MT_STOP_TEST_NACK		('5a'H),
	/* State Management and Event Report Messages */
	NM_MT_STATECHG_EVENT_REP	('61'H),
	NM_MT_FAILURE_EVENT_REP		('62'H),
	NM_MT_STOP_EVENT_REP		('63'H),
	NM_MT_STOP_EVENT_REP_ACK	('64'H),
	NM_MT_STOP_EVENT_REP_NACK	('65'H),
	NM_MT_REST_EVENT_REP		('66'H),
	NM_MT_REST_EVENT_REP_ACK	('67'H),
	NM_MT_REST_EVENT_REP_NACK	('68'H),
	NM_MT_CHG_ADM_STATE		('69'H),
	NM_MT_CHG_ADM_STATE_ACK		('6a'H),
	NM_MT_CHG_ADM_STATE_NACK	('6b'H),
	NM_MT_CHG_ADM_STATE_REQ		('6c'H),
	NM_MT_CHG_ADM_STATE_REQ_ACK	('6d'H),
	NM_MT_CHG_ADM_STATE_REQ_NACK	('6e'H),

	NM_MT_REP_OUTST_ALARMS		('93'H),
	NM_MT_REP_OUTST_ALARMS_ACK	('94'H),
	NM_MT_REP_OUTST_ALARMS_NACK	('95'H),

	/* Equipment Management Messages */
	NM_MT_CHANGEOVER		('71'H),
	NM_MT_CHANGEOVER_ACK		('72'H),
	NM_MT_CHANGEOVER_NACK		('73'H),
	NM_MT_OPSTART			('74'H),
	NM_MT_OPSTART_ACK		('75'H),
	NM_MT_OPSTART_NACK		('76'H),
	NM_MT_REINIT			('77'H),
	NM_MT_REINIT_ACK		('78'H),
	NM_MT_REINIT_NACK		('79'H),
	NM_MT_SET_SITE_OUT		('7a'H),
	NM_MT_SET_SITE_OUT_ACK		('7b'H),
	NM_MT_SET_SITE_OUT_NACK		('7c'H),

	NM_MT_CHG_HW_CONF		('90'H),
	NM_MT_CHG_HW_CONF_ACK		('91'H),
	NM_MT_CHG_HW_CONF_NACK		('92'H),

	/* Measurement Management Messages */
	NM_MT_MEAS_RES_REQ		('8a'H),
	NM_MT_MEAS_RES_RESP		('8b'H),
	NM_MT_STOP_MEAS			('8c'H),
	NM_MT_START_MEAS		('8d'H),

	/* Other Messages */
	NM_MT_GET_ATTR			('81'H),
	NM_MT_GET_ATTR_RESP		('82'H),
	NM_MT_GET_ATTR_NACK		('83'H),
	NM_MT_SET_ALARM_THRES		('84'H),
	NM_MT_SET_ALARM_THRES_ACK	('85'H),
	NM_MT_SET_ALARM_THRES_NACK	('86'H),

	/* IPA specific messages */
	NM_MT_IPACC_RESTART		('87'H),
	NM_MT_IPACC_RESTART_ACK		('88'H),
	NM_MT_IPACC_RESTART_NACK	('89'H),

	NM_MT_IPACC_RSL_CONNECT		('e0'H),
	NM_MT_IPACC_RSL_CONNECT_ACK	('e1'H),
	NM_MT_IPACC_RSL_CONNECT_NACK	('e2'H),
	NM_MT_IPACC_RSL_DISCONNECT	('e3'H),
	NM_MT_IPACC_RSL_DISCONNECT_ACK	('e4'H),
	NM_MT_IPACC_RSL_DISCONNECT_NACK	('e5'H),
	NM_MT_IPACC_CONN_TRAF		('e6'H),
	NM_MT_IPACC_CONN_TRAF_ACK	('e7'H),
	NM_MT_IPACC_CONN_TRAF_NACK	('e8'H),
	NM_MT_IPACC_DEF_BOOT_SW		('ec'H),
	NM_MT_IPACC_DEF_BOOT_SW_ACK	('ed'H),
	MN_MT_IPACC_DEF_BOOT_SW_NACK	('ee'H),
	NM_MT_IPACC_SET_NVATTR		('ef'H),
	NM_MT_IPACC_SET_NVATTR_ACK	('f0'H),
	NM_MT_IPACC_SET_NVATTR_NACK	('f1'H),
	NM_MT_IPACC_GET_NVATTR		('f2'H),
	NM_MT_IPACC_GET_NVATTR_ACK	('f3'H),
	NM_MT_IPACC_GET_NVATTR_NACK	('f4'H),
	NM_MT_IPACC_SET_ATTR		('f5'H),
	NM_MT_IPACC_SET_ATTR_ACK	('f6'H),
	NM_MT_IPACC_SET_ATTR_NACK	('f7'H)

} with { variant "FIELDLENGTH(8)" };

/* Section 9.2 */
type enumerated OML_FOM_ObjectClass {
	NM_OC_SITE_MANAGER		('00'H),
	NM_OC_BTS			('01'H),
	NM_OC_RADIO_CARRIER		('02'H),
	NM_OC_CHANNEL			('03'H),
	NM_OC_BASEB_TRANSC		('04'H),

	NM_OC_IPAC_E1_TRUNK		('0e'H),
	NM_OC_IPAC_E1_PORT		('0f'H),
	NM_OC_IPAC_E1_CHAN		('10'H),
	NM_OC_IPAC_CLK_MODULE		('22'H),

	NM_OC_GPRS_NSE			('f0'H),
	NM_OC_GPRS_CELL			('f1'H),
	NM_OC_GPRS_NSVC			('f2'H),

	NM_OC_NULL			('ff'H)
} with { variant "FIELDLENGTH(8)" };

/* Section 9.4 */
type enumerated OML_FOM_IE_Type {
	NM_ATT_ABIS_CHANNEL		('01'H),
	NM_ATT_ADD_INFO			('02'H),
	NM_ATT_ADD_TEXT			('03'H),
	NM_ATT_ADM_STATE		('04'H),
	NM_ATT_ARFCN_LIST		('05'H),
	NM_ATT_AUTON_REPORT		('06'H),
	NM_ATT_AVAIL_STATUS		('07'H),
	NM_ATT_BCCH_ARFCN		('08'H),
	NM_ATT_BSIC			('09'H),
	NM_ATT_BTS_AIR_TIMER		('0a'H),
	NM_ATT_CCCH_L_I_P		('0b'H),
	NM_ATT_CCCH_L_T			('0c'H),
	NM_ATT_CHAN_COMB		('0d'H),
	NM_ATT_CONN_FAIL_CRIT		('0e'H),
	NM_ATT_DEST			('0f'H),
	/* res */
	NM_ATT_EVENT_TYPE		('11'H),
	NM_ATT_FILE_ID			('12'H),
	NM_ATT_FILE_VERSION		('13'H),
	NM_ATT_GSM_TIME			('14'H),
	NM_ATT_HSN			('15'H),
	NM_ATT_HW_CONFIG		('16'H),
	NM_ATT_HW_DESC			('17'H),
	NM_ATT_INTAVE_PARAM		('18'H),
	NM_ATT_INTERF_BOUND		('19'H),
	NM_ATT_LIST_REQ_ATTR		('1a'H),
	NM_ATT_MAIO			('1b'H),
	NM_ATT_MANUF_STATE		('1c'H),
	NM_ATT_MANUF_THRESH		('1d'H),
	NM_ATT_MANUF_ID			('1e'H),
	NM_ATT_MAX_TA			('1f'H),
	NM_ATT_MDROP_LINK		('20'H),
	NM_ATT_MDROP_NEXT		('21'H),
	NM_ATT_NACK_CAUSES		('22'H),
	NM_ATT_NY1			('23'H),
	NM_ATT_OPER_STATE		('24'H),
	NM_ATT_OVERL_PERIOD		('25'H),
	NM_ATT_PHYS_CONF		('26'H),
	NM_ATT_POWER_CLASS		('27'H),
	NM_ATT_POWER_THRESH		('28'H),
	NM_ATT_PROB_CAUSE		('29'H),
	NM_ATT_RACH_B_THRESH		('2a'H),
	NM_ATT_LDAVG_SLOTS		('2b'H),
	NM_ATT_RAD_SUBC			('2c'H),
	NM_ATT_RF_MAXPOWR_R		('2d'H),
	NM_ATT_SITE_INPUTS		('2e'H),
	NM_ATT_SITE_OUTPUTS		('2f'H),
	NM_ATT_SOURCE			('30'H),
	NM_ATT_SPEC_PROB		('31'H),
	NM_ATT_START_TIME		('32'H),
	NM_ATT_T200			('33'H),
	NM_ATT_TEI			('34'H),
	NM_ATT_TEST_DUR			('35'H),
	NM_ATT_TEST_NO			('36'H),
	NM_ATT_TEST_REPORT		('37'H),
	NM_ATT_VSWR_THRESH		('38'H),
	NM_ATT_WINDOW_SIZE		('39'H),
	/* res */
	NM_ATT_BS11_RSSI_OFFS		('3d'H),
	NM_ATT_BS11_TXPWR		('3e'H),
	NM_ATT_BS11_DIVERSITY		('3f'H),
	/* res */
	NM_ATT_TSC			('40'H),
	NM_ATT_SW_CONFIG		('41'H),
	NM_ATT_SW_DESCR			('42'H),
	NM_ATT_SEVERITY			('43'H),
	NM_ATT_GET_ARI			('44'H),
	NM_ATT_HW_CONF_CHG		('45'H),
	NM_ATT_OUTST_ALARM		('46'H),
	NM_ATT_FILE_DATA		('47'H),
	NM_ATT_MEAS_RES			('48'H),
	NM_ATT_MEAS_TYPE		('49'H),
	/* res */
	NM_ATT_BS11_ESN_FW_CODE_NO	('4c'H),
	NM_ATT_BS11_ESN_HW_CODE_NO	('4f'H),
	/* res */
	NM_ATT_BS11_ESN_PCB_SERIAL	('55'H),
	NM_ATT_BS11_EXCESSIVE_DISTANCE	('58'H),
	NM_ATT_BS11_ALL_TEST_CATG	('60'H),
	NM_ATT_BS11_BTSLS_HOPPING	('61'H),
	NM_ATT_BS11_CELL_ALLOC_NR	('62'H),
	NM_ATT_BS11_CELL_GLOBAL_ID	('63'H),

	NM_ATT_BS11_ENA_INTERF_CLASS	('66'H),
	NM_ATT_BS11_ENA_INT_INTEC_HANDO	('67'H),
	NM_ATT_BS11_ENA_INT_INTRC_HANDO	('68'H),
	NM_ATT_BS11_ENA_MS_PWR_CTRL	('69'H),
	NM_ATT_BS11_ENA_PWR_BDGT_HO	('6a'H),
	NM_ATT_BS11_ENA_PWR_CTRL_RLFW	('6b'H),
	NM_ATT_BS11_ENA_RXLEV_HO	('6c'H),
	NM_ATT_BS11_ENA_RXQUAL_HO	('6d'H),
	NM_ATT_BS11_FACCH_QUAL		('6e'H),

	NM_ATT_IPACC_DST_IP		('80'H),
	NM_ATT_IPACC_DST_IP_PORT	('81'H),
	NM_ATT_IPACC_SSRC		('82'H),
	NM_ATT_IPACC_RTP_PAYLD_TYPE	('83'H),
	NM_ATT_IPACC_BASEB_ID		('84'H),
	NM_ATT_IPACC_STREAM_ID		('85'H),
	NM_ATT_IPACC_NV_FLAGS		('86'H),
	NM_ATT_IPACC_FREQ_CTRL		('87'H),
	NM_ATT_IPACC_PRIM_OML_CFG	('88'H),
	NM_ATT_IPACC_SEC_OML_CFG	('89'H),
	NM_ATT_IPACC_IP_IF_CFG		('8a'H),
	NM_ATT_IPACC_IP_GW_CFG		('8b'H),
	NM_ATT_IPACC_IN_SERV_TIME	('8c'H),
	NM_ATT_IPACC_TRX_BTS_ASS	('8d'H),
	NM_ATT_IPACC_LOCATION		('8e'H),	/* string describing location */
	NM_ATT_IPACC_PAGING_CFG		('8f'H),
	NM_ATT_IPACC_FILE_DATA		('90'H),
	NM_ATT_IPACC_UNIT_ID		('91'H),	/* Site/BTS/TRX */
	NM_ATT_IPACC_PARENT_UNIT_ID	('92'H),
	NM_ATT_IPACC_UNIT_NAME		('93'H),	/* default: nbts-<mac-as-string> */
	NM_ATT_IPACC_SNMP_CFG		('94'H),
	NM_ATT_IPACC_PRIM_OML_CFG_LIST	('95'H),
	NM_ATT_IPACC_PRIM_OML_FB_TOUT	('96'H),
	NM_ATT_IPACC_CUR_SW_CFG		('97'H),
	NM_ATT_IPACC_TIMING_BUS		('98'H),
	NM_ATT_IPACC_CGI		('99'H),
	NM_ATT_IPACC_RAC		('9a'H),
	NM_ATT_IPACC_OBJ_VERSION	('9b'H),
	NM_ATT_IPACC_GPRS_PAGING_CFG	('9c'H),
	NM_ATT_IPACC_NSEI		('9d'H),
	NM_ATT_IPACC_BVCI		('9e'H),
	NM_ATT_IPACC_NSVCI		('9f'H),
	NM_ATT_IPACC_NS_CFG		('a0'H),
	NM_ATT_IPACC_BSSGP_CFG		('a1'H),
	NM_ATT_IPACC_NS_LINK_CFG	('a2'H),
	NM_ATT_IPACC_RLC_CFG		('a3'H),
	NM_ATT_IPACC_ALM_THRESH_LIST	('a4'H),
	NM_ATT_IPACC_MONIT_VAL_LIST	('a5'H),
	NM_ATT_IPACC_TIB_CONTROL	('a6'H),
	NM_ATT_IPACC_SUPP_FEATURES	('a7'H),
	NM_ATT_IPACC_CODING_SCHEMES	('a8'H),
	NM_ATT_IPACC_RLC_CFG_2		('a9'H),
	NM_ATT_IPACC_HEARTB_TOUT	('aa'H),
	NM_ATT_IPACC_UPTIME		('ab'H),
	NM_ATT_IPACC_RLC_CFG_3		('ac'H),
	NM_ATT_IPACC_SSL_CFG		('ad'H),
	NM_ATT_IPACC_SEC_POSSIBLE	('ae'H),
	NM_ATT_IPACC_IML_SSL_STATE	('af'H),
	NM_ATT_IPACC_REVOC_DATE		('b0'H),


/*
	NM_ATT_BS11_RF_RES_IND_PER	('8f'H),

	NM_ATT_BS11_RX_LEV_MIN_CELL	('90'H),
	NM_ATT_BS11_ABIS_EXT_TIME	('91'H),
	NM_ATT_BS11_TIMER_HO_REQUEST	('92'H),
	NM_ATT_BS11_TIMER_NCELL		('93'H),
	NM_ATT_BS11_TSYNC		('94'H),
	NM_ATT_BS11_TTRAU		('95'H),
	NM_ATT_BS11_EMRG_CFG_MEMBER	('9b'H),
	NM_ATT_BS11_TRX_AREA		('9f'H),

	NM_ATT_BS11_BCCH_RECONF		('d7'H),
	NM_ATT_BS11_BIT_ERR_THESH	('a0'H),
	NM_ATT_BS11_BOOT_SW_VERS	('a1'H),
	NM_ATT_BS11_CCLK_ACCURACY	('a3'H),
	NM_ATT_BS11_CCLK_TYPE		('a4'H),
	NM_ATT_BS11_INP_IMPEDANCE	('aa'H),
	NM_ATT_BS11_L1_PROT_TYPE	('ab'H),
	NM_ATT_BS11_LINE_CFG		('ac'H),
	NM_ATT_BS11_LI_PORT_1		('ad'H),
	NM_ATT_BS11_LI_PORT_2		('ae'H),

	NM_ATT_BS11_L1_REM_ALM_TYPE	('b0'H),
	NM_ATT_BS11_SW_LOAD_INTENDED	('bb'H),
	NM_ATT_BS11_SW_LOAD_SAFETY	('bc'H),
	NM_ATT_BS11_SW_LOAD_STORED	('bd'H),

	NM_ATT_BS11_VENDOR_NAME		('c1'H),
	NM_ATT_BS11_HOPPING_MODE	('c5'H),
	NM_ATT_BS11_LMT_LOGON_SESSION	('c6'H),
	NM_ATT_BS11_LMT_LOGIN_TIME	('c7'H),
	NM_ATT_BS11_LMT_USER_ACC_LEV	('c8'H),
	NM_ATT_BS11_LMT_USER_NAME	('c9'H),

	NM_ATT_BS11_L1_CONTROL_TS	('d8'H),
	NM_ATT_BS11_RADIO_MEAS_GRAN	('dc'H),
	NM_ATT_BS11_RADIO_MEAS_REP	('dd'H),

	NM_ATT_BS11_SH_LAPD_INT_TIMER	('e8'H),

	NM_ATT_BS11_BTS_STATE		('f0'H),
	NM_ATT_BS11_E1_STATE		('f1'H),
	NM_ATT_BS11_PLL			('f2'H),
	NM_ATT_BS11_RX_OFFSET		('f3'H),
	NM_ATT_BS11_ANT_TYPE		('f4'H),
	NM_ATT_BS11_PLL_MODE		('fc'H),
	NM_ATT_BS11_PASSWORD		('fd'H),
*/

	/* osmocom (osmo-bts) specific attributes, used in combination
	 * with the "org.osmocom" manufacturer identification */
	NM_ATT_OSMO_REDUCEPOWER		('fe'H)	/* TLV_TYPE_TV */

} with { variant "FIELDLENGTH(8)" };

/* Section 9.4.4 */
type enumerated OML_FOM_AdministrativeState {
	NM_STATE_LOCKED			('01'H),
	NM_STATE_UNLOCKED		('02'H),
	NM_STATE_SHUTDOWN		('03'H),
	NM_STATE_NULL			('ff'H)
} with { variant "FIELDLENGTH(8)" };

/* Section 9.4.7 */
type enumerated OML_FOM_AvailabilityStatus {
	NM_AVSTATE_IN_TEST		(1),
	NM_AVSTATE_POWER_OFF		(2),
	NM_AVSTATE_OFF_LINE		(3),
	NM_AVSTATE_DEPENDENCY		(5),
	NM_AVSTATE_DEGRADED		(6),
	NM_AVSTATE_NOT_INSTALLED	(7),
	NM_AVSTATE_OK			(255)
} with { variant "FIELDLENGTH(8)" };

type enumerated OML_FOM_OperationalState {
	NM_OPSTATE_DISABLED		(1),
	NM_OPSTATE_ENABLED		(2),
	NM_OPSTATE_NULL			(255)
} with { variant "FIELDLENGTH(8)" };

/* Section 9.4.13 */
type enumerated OML_ChannelCombination {
	NM_CHANC_TCHFull		('00'H), /* TCH/F + TCH/H + SACCH/TF */
	NM_CHANC_TCHHalf		('01'H), /* TCH/H(0,1) + FACCH/H(0,1) + SACCH/TH(0,1) */
	NM_CHANC_TCHHalf2		('02'H), /* TCH/H(0) + FACCH/H(0) + SACCH/TH(0) + TCH/H(1) */
	NM_CHANC_SDCCH			('03'H), /* SDCCH/8 + SACCH/8 */
	NM_CHANC_mainBCCH		('04'H), /* FCCH + SCH + BCCH + CCCH */
	NM_CHANC_BCCHComb		('05'H), /* FCCH + SCH + BCCH + CCCH + SDCCH/4 + SACCH/C4 */
	NM_CHANC_BCCH			('06'H), /* BCCH + CCCH */
	NM_CHANC_BCCH_CBCH		('07'H), /* CHANC_BCCHComb + CBCH */
	NM_CHANC_SDCCH_CBCH		('08'H), /* CHANC_SDCCH8 + CBCH */
	/* ip.access + Osmocom */
	NM_CHANC_IPAC_bPDCH		('0b'H), /* PBCCH + PCCCH + PDTCH/F + PACCH/F + PTCCH/F */
	NM_CHANC_IPAC_cPDCH		('0c'H), /* PBCCH + PDTCH/F + PACCH/F + PTCCH/F */
	NM_CHANC_IPAC_PDCH		('0d'H), /* PDTCH/F + PACCH/F + PTCCH/F */
	NM_CHANC_IPAC_TCHFull_PDCH	('80'H),
	NM_CHANC_IPAC_TCHFull_TCHHalf	('81'H),
	/* Osmocom */
	NM_CHANC_OSMO_TCHFull_TCHHalf_PDCH ('90'H)
} with { variant "FIELDLENGTH(8)" };

/* Section 9.4.16 */
type enumerated OML_FOM_EventType {
	NM_EVT_COMM_FAIL		(1),
	NM_EVT_QOS_FAIL			(2),
	NM_EVT_PROC_FAIL		(3),
	NM_EVT_EQUIP_FAIL		(4),
	NM_EVT_ENV_FAIL			(5)
} with { variant "FIELDLENGTH(8)" };

/* Section 9.4.63 */
type enumerated OML_FOM_Severity {
	NM_SEVER_CEASED			(0),
	NM_SEVER_CRITICAL		(1),
	NM_SEVER_MAJOR			(2),
	NM_SEVER_MINOR			(3),
	NM_SEVER_WARNING		(4),
	NM_SEVER_INDETERMINATE		(5)
} with { variant "FIELDLENGTH(8)" };

/* Section 9.4.36 */
type enumerated OML_FOM_NackCause {
	/* General Nack Causes */
	NM_NACK_INCORR_STRUCT		('01'H),
	NM_NACK_MSGTYPE_INVAL		('02'H),
	NM_NACK_OBJCLASS_INVAL		('05'H),
	NM_NACK_OBJCLASS_NOTSUPP	('06'H),
	NM_NACK_BTSNR_UNKN		('07'H),
	NM_NACK_TRXNR_UNKN		('08'H),
	NM_NACK_OBJINST_UNKN		('09'H),
	NM_NACK_ATTRID_INVAL		('0c'H),
	NM_NACK_ATTRID_NOTSUPP		('0d'H),
	NM_NACK_PARAM_RANGE		('0e'H),
	NM_NACK_ATTRLIST_INCONSISTENT	('0f'H),
	NM_NACK_SPEC_IMPL_NOTSUPP	('10'H),
	NM_NACK_CANT_PERFORM		('11'H),
	/* Specific Nack Causes */
	NM_NACK_RES_NOTIMPL		('19'H),
	NM_NACK_RES_NOTAVAIL		('1a'H),
	NM_NACK_FREQ_NOTAVAIL		('1b'H),
	NM_NACK_TEST_NOTSUPP		('1c'H),
	NM_NACK_CAPACITY_RESTR		('1d'H),
	NM_NACK_PHYSCFG_NOTPERFORM	('1e'H),
	NM_NACK_TEST_NOTINIT		('1f'H),
	NM_NACK_PHYSCFG_NOTRESTORE	('20'H),
	NM_NACK_TEST_NOSUCH		('21'H),
	NM_NACK_TEST_NOSTOP		('22'H),
	NM_NACK_MSGINCONSIST_PHYSCFG	('23'H),
	NM_NACK_FILE_INCOMPLETE		('25'H),
	NM_NACK_FILE_NOTAVAIL		('26'H),
	NM_NACK_FILE_NOTACTIVATE	('27'H),
	NM_NACK_REQ_NOT_GRANT		('28'H),
	NM_NACK_WAIT			('29'H),
	NM_NACK_NOTH_REPORT_EXIST	('2a'H),
	NM_NACK_MEAS_NOTSUPP		('2b'H),
	NM_NACK_MEAS_NOTSTART		('2c'H)
} with { variant "FIELDLENGTH(8)" };



type record OML_FOM {
	uint8_t				len,
	OML_FOM_Header			hdr,
	OML_FOM_IE_List			ies optional
} with { variant (len) "LENGTHTO(hdr,ies)" };

type record OML_IE_LV {
	uint8_t		len,
	octetstring	payload
} with { variant (len) "LENGTHTO(payload)" };

type record OML_IE_L16V {
	uint16_t	len,
	octetstring	payload
} with { variant (len) "LENGTHTO(payload)" };

template (value) OML_IE_L16V ts_OML_IE_L16V(template (value) uint16_t len, template (value) octetstring payload) := {
	len := len,
	payload := payload
}
template OML_IE_L16V tr_OML_IE_L16V(template uint16_t len, template octetstring payload) := {
	len := len,
	payload := payload
}


type record OML_IE_AvailStatus {
	uint16_t			len,
	OML_FOM_AvailabilityStatus	avail_status
} with { variant (len) "LENGTHTO(avail_status)" };

/* Section 9.4.1 */
type record OML_FOM_AbisChannel {
	uint8_t		bts_port_nr,
	uint8_t		timeslot_nr,
	OML_FOM_Subslot	subslot_nr
};
type enumerated OML_FOM_Subslot {
	NM_SUBSLOT_A		(0),
	NM_SUBSLOT_B		(1),
	NM_SUBSLOT_C		(2),
	NM_SUBSLOT_D		(3),
	NM_SUBSLOT_64k		(255)
} with { variant "FIELDLENGTH(8)" };

/* Section 9.4.5 */
type record of uint16_t OML_ArfcnList;
type record OML_IE_ArfcnList {
	uint16_t 	len,
	OML_ArfcnList	arfcn_list
};

/* Section 9.4.25 */
type record length(6) of uint8_t OML_FOM_InterfLevBoundaries;

/* Section 9.4.42 */
type record length(3) of uint8_t OML_FOM_PowerOuthputThresholds;

/* Section 9.4.43 */
type enumerated OML_FOM_ProbableCauseType {
	NM_PCAUSE_T_X721	(1),
	NM_PCAUSE_T_GSM		(2),
	NM_PCAUSE_T_MANUF	(3)
} with { variant "FIELDLENGTH(8)" };
type record OML_FOM_ProbableCause {
	OML_FOM_ProbableCauseType	cause_type,
	OCT2				cause_value
};

/* Section 9.4.53 */
type record OML_FOM_T200 {
	uint8_t		sdcch_5ms,
	uint8_t		facch_f_5ms,
	uint8_t		facch_h_5ms,
	uint8_t		sacch_tch_sapi0_10ms,
	uint8_t		sacch_sdcch_10ms,
	uint8_t		sdcch_sapi3_5ms,
	uint8_t		sacch_rch_sapi3_10ms
};

type union OML_FOM_IE_Body {
	OML_FOM_AbisChannel		abis_channel,
	OML_FOM_AdministrativeState	adm_state,
	OCT1				auton_report,
	uint16_t			bcch_arfcn,
	uint8_t				bsic,
	uint8_t				air_timer,
	uint8_t				load_ind_period,
	uint8_t				load_threshold,
	OML_ChannelCombination		chan_comb,
	OML_FOM_EventType		event_type,
	uint16_t			gsm_time,
	uint8_t				hsn,
	uint8_t				intave_param,
	OML_FOM_InterfLevBoundaries	interf_bound,
	uint8_t				maio,
	uint8_t				manuf_state,
	uint8_t				max_ta,
	OML_FOM_NackCause		nack_causes,
	uint8_t				ny1,
	OML_FOM_OperationalState	opstate,
	uint8_t				power_class,
	OML_FOM_PowerOuthputThresholds	power_thresh,
	OML_FOM_ProbableCause		prob_cause,
	uint8_t				rach_b_thresh,
	uint16_t			loadavg_slots,
	uint8_t				radio_subch,
	uint8_t				rf_maxpwr_r,
	uint8_t				spec_prob,
	uint16_t			start_time,
	OML_FOM_T200			t200,
	uint8_t				tei,
	uint8_t				test_no,
	OCT2				vswr_thresh,
	uint8_t				window_size,
	uint8_t				tsc,
	OML_FOM_Severity		severity,
	uint8_t				outst_alarm,
	uint8_t				meas_type,

	OML_IE_AvailStatus		avail_status,
	OML_IE_ArfcnList		arfcn_list,

	uint32_t		ip,
	uint16_t		portnr,
	uint8_t			stream_id,
	OCT6			sec_oml_cfg,
	OCT8			ip_if_cfg,
	OCT12			ip_gw_cfg,
	uint32_t		in_serv_time,
	uint16_t		paging_cfg,
	OCT2			freq_ctrl,

	OML_IE_L16V		other
};

type record OML_FOM_IE {
	OML_FOM_IE_Type		iei,
	OML_FOM_IE_Body		body
} with { variant (body) "CROSSTAG(
		abis_channel, iei = NM_ATT_ABIS_CHANNEL;
		adm_state, iei = NM_ATT_ADM_STATE;
		auton_report, iei = NM_ATT_AUTON_REPORT;
		bcch_arfcn, iei = NM_ATT_BCCH_ARFCN;
		bsic, iei = NM_ATT_BSIC;
		air_timer, iei = NM_ATT_BTS_AIR_TIMER;
		load_ind_period, iei = NM_ATT_CCCH_L_I_P;
		load_threshold, iei = NM_ATT_CCCH_L_T;
		chan_comb, iei = NM_ATT_CHAN_COMB;
		event_type, iei = NM_ATT_EVENT_TYPE;
		gsm_time, iei = NM_ATT_GSM_TIME;
		hsn, iei = NM_ATT_HSN;
		intave_param, iei = NM_ATT_INTAVE_PARAM;
		interf_bound, iei = NM_ATT_INTERF_BOUND;
		maio, iei = NM_ATT_MAIO;
		manuf_state, iei = NM_ATT_MANUF_STATE;
		max_ta, iei = NM_ATT_MAX_TA;
		nack_causes, iei = NM_ATT_NACK_CAUSES;
		ny1, iei = NM_ATT_NY1;
		opstate, iei = NM_ATT_OPER_STATE;
		power_class, iei = NM_ATT_POWER_CLASS;
		power_thresh, iei = NM_ATT_POWER_THRESH;
		prob_cause, iei = NM_ATT_PROB_CAUSE;
		rach_b_thresh, iei = NM_ATT_RACH_B_THRESH;
		loadavg_slots, iei = NM_ATT_LDAVG_SLOTS;
		radio_subch, iei = NM_ATT_RAD_SUBC;
		rf_maxpwr_r, iei = NM_ATT_RF_MAXPOWR_R;
		spec_prob, iei = NM_ATT_SPEC_PROB;
		start_time, iei = NM_ATT_START_TIME;
		t200, iei = NM_ATT_T200;
		tei, iei = NM_ATT_TEI;
		test_no, iei = NM_ATT_TEST_NO;
		vswr_thresh, iei = NM_ATT_VSWR_THRESH;
		window_size, iei = NM_ATT_WINDOW_SIZE;
		tsc, iei = NM_ATT_TSC;
		severity, iei = NM_ATT_SEVERITY;
		outst_alarm, iei = NM_ATT_OUTST_ALARM;
		meas_type, iei = NM_ATT_MEAS_TYPE;

		avail_status, iei = NM_ATT_AVAIL_STATUS;
		arfcn_list, iei = NM_ATT_ARFCN_LIST;

		ip, iei = NM_ATT_IPACC_DST_IP;
		portnr, iei = NM_ATT_IPACC_DST_IP_PORT;
		stream_id, iei = NM_ATT_IPACC_STREAM_ID;
		sec_oml_cfg, iei = NM_ATT_IPACC_SEC_OML_CFG;
		ip_if_cfg, iei = NM_ATT_IPACC_IP_IF_CFG;
		ip_gw_cfg, iei = NM_ATT_IPACC_IP_GW_CFG;
		in_serv_time, iei = NM_ATT_IPACC_IN_SERV_TIME;
		paging_cfg, iei = NM_ATT_IPACC_PAGING_CFG;
		freq_ctrl, iei = NM_ATT_IPACC_FREQ_CTRL;

		other, OTHERWISE;
	)" };

type record of OML_FOM_IE OML_FOM_IE_List;

type record OML_MANUF_IPA {
	uint8_t			len,
	uint8_t			str_len,
	charstring		manuf_str,
	OML_FOM_Header		hdr,
	OML_FOM_IE_List		ies optional
} with { variant (len) "LENGTHTO(hdr,ies)"
         variant (str_len) "LENGTHTO(manuf_str)" };

type union OML_MANUF {
	OML_MANUF_IPA			ipa
};


external function enc_OML_PDU(in OML_PDU msg) return octetstring
	with { extension "prototype(convert) encode(RAW)" };
external function dec_OML_PDU(in octetstring stream) return OML_PDU
	with { extension "prototype(convert) decode(RAW)" };



template (value) OML_FOM_IE ts_OML_IE(OML_FOM_IE_Type iei, template (value) OML_FOM_IE_Body body) := {
	iei := iei,
	body := body
}
template OML_FOM_IE tr_OML_IE(OML_FOM_IE_Type iei, template OML_FOM_IE_Body body) := {
	iei := ?,
	body := body
}

template OML_PDU tr_OML_FOM_only := {
	mdisc := ABIS_OM_MDISC_FOM,
	placement := ABIS_OM_PLACEMENT_ONLY,
	sequence := 0,
	u := ?
}

template OML_PDU tr_OML_MsgType(template OML_FOM_MessageType msg_type,
				template OML_FOM_ObjectClass obj_class := ?,
				template OML_FOM_ObjectInstance obj_inst := ?,
				template OML_FOM_IE_List ies := *)
modifies tr_OML_FOM_only := {
	u := {
		fom := {
			hdr := {
				msg_type := msg_type,
				obj_class := obj_class,
				obj_inst := obj_inst
			},
			ies := ies
		}
	}
}
template (value) OML_PDU ts_OML_MsgType(template (value) OML_FOM_MessageType msg_type,
					template (value) OML_FOM_ObjectClass obj_class,
					template (value) OML_FOM_ObjectInstance obj_inst,
					template (omit) OML_FOM_IE_List ies := omit) := {
	mdisc := ABIS_OM_MDISC_FOM,
	placement := ABIS_OM_PLACEMENT_ONLY,
	sequence := 0,
	u := {
		fom := {
			len := 0, /* overwritten */
			hdr := ts_OML_FomHeader(msg_type, obj_class, obj_inst),
			ies := ies
		}
	}
}


template (value) OML_FOM_Header ts_OML_FomHeader(template (value) OML_FOM_MessageType msg_type,
						 template (value) OML_FOM_ObjectClass obj_class,
						 template (value) OML_FOM_ObjectInstance obj_inst) := {
	msg_type := msg_type,
	obj_class := obj_class,
	obj_inst := obj_inst
}
template OML_FOM_Header tr_OML_FomHeader(template OML_FOM_MessageType msg_type,
					 template OML_FOM_ObjectClass obj_class,
					 template OML_FOM_ObjectInstance obj_inst) := {
	msg_type := msg_type,
	obj_class := obj_class,
	obj_inst := obj_inst
}


template (value) OML_FOM_ObjectInstance ts_OML_ObjectInstance(uint8_t bts, uint8_t trx, uint8_t ts) := {
	bts_nr := bts,
	trx_nr := trx,
	ts_nr := ts
}
template OML_FOM_ObjectInstance tr_OML_ObjectInstance(template uint8_t bts, template uint8_t trx,
						      template uint8_t ts) := {
	bts_nr := bts,
	trx_nr := trx,
	ts_nr := ts
}



template (value) OML_PDU ts_OML_IPA_MsgType(template (value) OML_FOM_MessageType msg_type,
					    template (value) OML_FOM_ObjectClass obj_class,
					    template (value) OML_FOM_ObjectInstance obj_inst,
					    template (omit) OML_FOM_IE_List ies := omit) := {
	mdisc := ABIS_OM_MDISC_MANUF,
	placement := ABIS_OM_PLACEMENT_ONLY,
	sequence := 0,
	u := {
		manuf := {
			ipa := {
				len := 0, /* overwritten */
				str_len := 13,
				manuf_str := "com.ipaccess" & char(0,0,0,0),
				hdr := ts_OML_FomHeader(msg_type, obj_class, obj_inst),
				ies := ies
			}
		}
	}
}
template OML_PDU tr_OML_IPA_MsgType(template OML_FOM_MessageType msg_type := ?,
				    template OML_FOM_ObjectClass obj_class := ?,
				    template OML_FOM_ObjectInstance obj_inst := ?,
				    template OML_FOM_IE_List ies := *) := {
	mdisc := ABIS_OM_MDISC_MANUF,
	placement := ABIS_OM_PLACEMENT_ONLY,
	sequence := 0,
	u := {
		manuf := {
			ipa := {
				len := ?,
				str_len := 13,
				manuf_str := "com.ipaccess" & char(0,0,0,0),
				hdr := tr_OML_FomHeader(msg_type, obj_class, obj_inst),
				ies := ies
			}
		}
	}
}

/* 8.8.1 State Changed Event Report */
template (value) OML_PDU ts_OML_StateChgEvtRep(template (value) OML_FOM_ObjectClass obj_class,
					       template (value) OML_FOM_ObjectInstance obj_inst,
					       template (value) OML_FOM_OperationalState opstate,
					       template (value) OML_FOM_AvailabilityStatus avstate) :=
	ts_OML_MsgType(NM_MT_STATECHG_EVENT_REP, obj_class, obj_inst, {
			ts_OML_IE(NM_ATT_OPER_STATE, OML_FOM_IE_Body:{opstate := opstate}),
			ts_OML_IE(NM_ATT_AVAIL_STATUS, OML_FOM_IE_Body:{avail_status := {len:= 1, avail_status := avstate}})
			});
template OML_PDU tr_OML_StateChgEvtRep(template OML_FOM_ObjectClass obj_class,
				       template OML_FOM_ObjectInstance obj_inst,
				       template OML_FOM_OperationalState opstate := ?,
				       template OML_FOM_AvailabilityStatus avstate := ?) :=
	tr_OML_MsgType(NM_MT_STATECHG_EVENT_REP, obj_class, obj_inst, {
			tr_OML_IE(NM_ATT_OPER_STATE, OML_FOM_IE_Body:{opstate := opstate}),
			tr_OML_IE(NM_ATT_AVAIL_STATUS, OML_FOM_IE_Body:{avail_status := {len := 1, avail_status := avstate}})
			});

/* 8.8.2 Failure Event Report */
template (value) OML_PDU ts_OML_FailureEvtRep(template (value) OML_FOM_ObjectClass obj_class,
					      template (value) OML_FOM_ObjectInstance obj_inst,
					      template (value) OML_FOM_EventType evt_type,
					      template (value) OML_FOM_Severity severity,
					      template (value) OML_FOM_ProbableCause cause) :=
	ts_OML_MsgType(NM_MT_FAILURE_EVENT_REP, obj_class, obj_inst, {
			ts_OML_IE(NM_ATT_EVENT_TYPE, OML_FOM_IE_Body:{event_type := evt_type}),
			ts_OML_IE(NM_ATT_SEVERITY, OML_FOM_IE_Body:{severity := severity}),
			ts_OML_IE(NM_ATT_PROB_CAUSE, OML_FOM_IE_Body:{prob_cause := cause})
			});
template OML_PDU tr_OML_FailureEvtRep(template OML_FOM_ObjectClass obj_class,
				      template OML_FOM_ObjectInstance obj_inst,
				      template OML_FOM_EventType evt_type,
				      template OML_FOM_Severity severity,
				      template OML_FOM_ProbableCause cause) :=
	tr_OML_MsgType(NM_MT_FAILURE_EVENT_REP, obj_class, obj_inst, {
			tr_OML_IE(NM_ATT_EVENT_TYPE, OML_FOM_IE_Body:{event_type := evt_type}),
			tr_OML_IE(NM_ATT_SEVERITY, OML_FOM_IE_Body:{severity := severity}),
			tr_OML_IE(NM_ATT_PROB_CAUSE, OML_FOM_IE_Body:{prob_cause := cause}),
			*
			});

/* 8.8.5 Change Administrative State */
template (value) OML_PDU ts_OML_ChangeAdmState(template (value) OML_FOM_ObjectClass obj_class,
						template (value) OML_FOM_ObjectInstance obj_inst,
						template (value) OML_FOM_AdministrativeState adm_st) :=
	ts_OML_MsgType(NM_MT_CHG_ADM_STATE, obj_class, obj_inst, {
			ts_OML_IE(NM_ATT_ADM_STATE, OML_FOM_IE_Body:{adm_state := adm_st})
			});
template OML_PDU tr_OML_ChangeAdmState(template OML_FOM_ObjectClass obj_class,
					template OML_FOM_ObjectInstance obj_inst,
					template OML_FOM_AdministrativeState adm_st) :=
	tr_OML_MsgType(NM_MT_CHG_ADM_STATE, obj_class, obj_inst, {
			tr_OML_IE(NM_ATT_ADM_STATE, OML_FOM_IE_Body:{adm_state := adm_st})
			});

template (value) OML_PDU ts_OML_ChangeAdmStateACK(template (value) OML_FOM_ObjectClass obj_class,
						template (value) OML_FOM_ObjectInstance obj_inst,
						template (value) OML_FOM_AdministrativeState adm_st) :=
	ts_OML_MsgType(NM_MT_CHG_ADM_STATE_ACK, obj_class, obj_inst, {
			ts_OML_IE(NM_ATT_ADM_STATE, OML_FOM_IE_Body:{adm_state := adm_st})
			});
template OML_PDU tr_OML_ChangeAdmStateACK(template OML_FOM_ObjectClass obj_class,
					template OML_FOM_ObjectInstance obj_inst,
					template OML_FOM_AdministrativeState adm_st) :=
	tr_OML_MsgType(NM_MT_CHG_ADM_STATE_ACK, obj_class, obj_inst, {
			tr_OML_IE(NM_ATT_ADM_STATE, OML_FOM_IE_Body:{adm_state := adm_st})
			});
template (value) OML_PDU ts_OML_ChangeAdmStateNACK(template (value) OML_FOM_ObjectClass obj_class,
						template (value) OML_FOM_ObjectInstance obj_inst,
						template (value) OML_FOM_NackCause cause) :=
	ts_OML_MsgType(NM_MT_CHG_ADM_STATE_NACK, obj_class, obj_inst, {
			ts_OML_IE(NM_ATT_NACK_CAUSES, OML_FOM_IE_Body:{nack_causes := cause})
			});
template OML_PDU tr_OML_ChangeAdmStateNACK(template OML_FOM_ObjectClass obj_class,
					   template OML_FOM_ObjectInstance obj_inst,
					   template OML_FOM_NackCause cause := ?) :=
	tr_OML_MsgType(NM_MT_CHG_ADM_STATE_NACK, obj_class, obj_inst, {
			*,
			tr_OML_IE(NM_ATT_NACK_CAUSES, OML_FOM_IE_Body:{nack_causes := cause})
			});





/* 8.9.2 Opstart */
template (value) OML_PDU ts_OML_Opstart(template (value) OML_FOM_ObjectClass obj_class,
					template (value) OML_FOM_ObjectInstance obj_inst) :=
	ts_OML_MsgType(NM_MT_OPSTART, obj_class, obj_inst);
template OML_PDU tr_OML_Opstart(template OML_FOM_ObjectClass obj_class,
				template OML_FOM_ObjectInstance obj_inst) :=
	tr_OML_MsgType(NM_MT_OPSTART, obj_class, obj_inst);

template (value) OML_PDU ts_OML_OpstartACK(template (value) OML_FOM_ObjectClass obj_class,
					   template (value) OML_FOM_ObjectInstance obj_inst) :=
	ts_OML_MsgType(NM_MT_OPSTART_ACK, obj_class, obj_inst);
template OML_PDU tr_OML_OpstartACK(template OML_FOM_ObjectClass obj_class,
				   template OML_FOM_ObjectInstance obj_inst) :=
	tr_OML_MsgType(NM_MT_OPSTART_ACK, obj_class, obj_inst);

template (value) OML_PDU ts_OML_OpstartNACK(template (value) OML_FOM_ObjectClass obj_class,
					    template (value) OML_FOM_ObjectInstance obj_inst,
					    template (value) OML_FOM_NackCause cause) :=
	ts_OML_MsgType(NM_MT_OPSTART_NACK, obj_class, obj_inst, {
		ts_OML_IE(NM_ATT_NACK_CAUSES, OML_FOM_IE_Body:{nack_causes := cause})
		});
template OML_PDU tr_OML_OpstartNACK(template OML_FOM_ObjectClass obj_class,
				   template OML_FOM_ObjectInstance obj_inst,
				   template OML_FOM_NackCause cause := ?) :=
	tr_OML_MsgType(NM_MT_OPSTART_NACK, obj_class, obj_inst, {
		tr_OML_IE(NM_ATT_NACK_CAUSES, OML_FOM_IE_Body:{nack_causes := cause})
		});

/* 8.3.5 SW Activate Request */
template (value) OML_PDU ts_OML_SwActReq(template (value) OML_FOM_ObjectClass obj_class,
					 template (value) OML_FOM_ObjectInstance obj_inst,
					 template (value) octetstring hw_config,
					 template (value) octetstring sw_config) :=
	ts_OML_MsgType(NM_MT_SW_ACT_REQ, obj_class, obj_inst, {
		ts_OML_IE(NM_ATT_HW_CONFIG, OML_FOM_IE_Body:{other := ts_OML_IE_L16V(0, hw_config)}),
		ts_OML_IE(NM_ATT_SW_CONFIG, OML_FOM_IE_Body:{other := ts_OML_IE_L16V(0, sw_config)})
		});
template OML_PDU tr_OML_SwActReq(template OML_FOM_ObjectClass obj_class,
				 template OML_FOM_ObjectInstance obj_inst,
				 template octetstring hw_config,
				 template octetstring sw_config) :=
	tr_OML_MsgType(NM_MT_SW_ACT_REQ, obj_class, obj_inst, {
		tr_OML_IE(NM_ATT_HW_CONFIG, OML_FOM_IE_Body:{other := tr_OML_IE_L16V(?, hw_config)}),
		tr_OML_IE(NM_ATT_SW_CONFIG, OML_FOM_IE_Body:{other := tr_OML_IE_L16V(?, sw_config)})
		});

template (value) OML_PDU ts_OML_SwActReqACK(template (value) OML_FOM_ObjectClass obj_class,
					 template (value) OML_FOM_ObjectInstance obj_inst,
					 template (value) octetstring hw_config,
					 template (value) octetstring sw_config) :=
	ts_OML_MsgType(NM_MT_SW_ACT_REQ_ACK, obj_class, obj_inst, {
		ts_OML_IE(NM_ATT_HW_CONFIG, OML_FOM_IE_Body:{other := ts_OML_IE_L16V(0, hw_config)}),
		ts_OML_IE(NM_ATT_SW_CONFIG, OML_FOM_IE_Body:{other := ts_OML_IE_L16V(0, sw_config)})
		});
template OML_PDU tr_OML_SwActReqACK(template OML_FOM_ObjectClass obj_class,
				 template OML_FOM_ObjectInstance obj_inst,
				 template octetstring hw_config,
				 template octetstring sw_config) :=
	tr_OML_MsgType(NM_MT_SW_ACT_REQ_ACK, obj_class, obj_inst, {
		tr_OML_IE(NM_ATT_HW_CONFIG, OML_FOM_IE_Body:{other := tr_OML_IE_L16V(?, hw_config)}),
		tr_OML_IE(NM_ATT_SW_CONFIG, OML_FOM_IE_Body:{other := tr_OML_IE_L16V(?, sw_config)})
		});

/* 8.3.6 Activate SW */
template (value) OML_PDU ts_OML_ActivateSw(template (value) OML_FOM_ObjectClass obj_class,
					 template (value) OML_FOM_ObjectInstance obj_inst,
					 template (value) octetstring file_id,
					 template (value) octetstring sw_desc) :=
	ts_OML_MsgType(NM_MT_ACTIVATE_SW, obj_class, obj_inst, {
		ts_OML_IE(NM_ATT_FILE_ID, OML_FOM_IE_Body:{other := ts_OML_IE_L16V(0, file_id)}),
		ts_OML_IE(NM_ATT_SW_DESCR, OML_FOM_IE_Body:{other := ts_OML_IE_L16V(0, sw_desc)})
		});
template OML_PDU tr_OML_ActivateSw(template OML_FOM_ObjectClass obj_class,
				 template OML_FOM_ObjectInstance obj_inst,
				 template octetstring file_id,
				 template octetstring sw_desc) :=
	tr_OML_MsgType(NM_MT_ACTIVATE_SW, obj_class, obj_inst, {
		tr_OML_IE(NM_ATT_FILE_ID, OML_FOM_IE_Body:{other := tr_OML_IE_L16V(?, file_id)}),
		tr_OML_IE(NM_ATT_SW_DESCR, OML_FOM_IE_Body:{other := tr_OML_IE_L16V(?, sw_desc)})
		});

template (value) OML_PDU ts_OML_ActivateSwACK(template (value) OML_FOM_ObjectClass obj_class,
					 template (value) OML_FOM_ObjectInstance obj_inst,
					 template (value) octetstring file_id,
					 template (value) octetstring sw_desc) :=
	ts_OML_MsgType(NM_MT_ACTIVATE_SW_ACK, obj_class, obj_inst, {
		ts_OML_IE(NM_ATT_FILE_ID, OML_FOM_IE_Body:{other := ts_OML_IE_L16V(0, file_id)}),
		ts_OML_IE(NM_ATT_SW_DESCR, OML_FOM_IE_Body:{other := ts_OML_IE_L16V(0, sw_desc)})
		});
template OML_PDU tr_OML_ActivateSwACK(template OML_FOM_ObjectClass obj_class,
				 template OML_FOM_ObjectInstance obj_inst,
				 template octetstring file_id,
				 template octetstring sw_desc) :=
	tr_OML_MsgType(NM_MT_ACTIVATE_SW_ACK, obj_class, obj_inst, {
		tr_OML_IE(NM_ATT_FILE_ID, OML_FOM_IE_Body:{other := tr_OML_IE_L16V(?, file_id)}),
		tr_OML_IE(NM_ATT_SW_DESCR, OML_FOM_IE_Body:{other := tr_OML_IE_L16V(?, sw_desc)})
		});

/* 8.3.7 SW Activated Report */
template (value) OML_PDU ts_OML_SwActivatedRep(template (value) OML_FOM_ObjectClass obj_class,
					       template (value) OML_FOM_ObjectInstance obj_inst) :=
	ts_OML_MsgType(NM_MT_SW_ACTIVATED_REP, obj_class, obj_inst, {});
template OML_PDU tr_OML_SwActivatedRep(template OML_FOM_ObjectClass obj_class,
				       template OML_FOM_ObjectInstance obj_inst) :=
	tr_OML_MsgType(NM_MT_SW_ACTIVATED_REP, obj_class, obj_inst, *);


/* 8.6.1 Set BTS Attributes */
template (value) OML_PDU ts_OML_SetBtsAttr(template (value) OML_FOM_ObjectInstance obj_inst,
					   template (value) OML_FOM_IE_List ies) :=
	ts_OML_MsgType(NM_MT_SET_BTS_ATTR, NM_OC_BTS, obj_inst, ies);
template OML_PDU tr_OML_SetBtsAttr(template OML_FOM_ObjectInstance obj_inst,
				   template OML_FOM_IE_List ies) :=
	tr_OML_MsgType(NM_MT_SET_BTS_ATTR, NM_OC_BTS, obj_inst, ies);


/* 8.6.2 Set Radio Carrier Attributes */
template (value) OML_PDU ts_OML_SetRadioAttr(template (value) OML_FOM_ObjectInstance obj_inst,
					     template (value) uint8_t maxpwr_r,
					     template (value) OML_ArfcnList arfcn_list) :=
	ts_OML_MsgType(NM_MT_SET_RADIO_ATTR, NM_OC_RADIO_CARRIER, obj_inst, {
		ts_OML_IE(NM_ATT_RF_MAXPOWR_R, OML_FOM_IE_Body:{rf_maxpwr_r := maxpwr_r}),
		ts_OML_IE(NM_ATT_ARFCN_LIST, OML_FOM_IE_Body:{arfcn_list := {len:=0, arfcn_list:=arfcn_list}})
		});
template OML_PDU tr_OML_SetRadioAttr(template OML_FOM_ObjectInstance obj_inst,
				     template uint8_t maxpwr_r,
				     template OML_ArfcnList arfcn_list) :=
	tr_OML_MsgType(NM_MT_SET_RADIO_ATTR, NM_OC_RADIO_CARRIER, obj_inst, {
		tr_OML_IE(NM_ATT_RF_MAXPOWR_R, OML_FOM_IE_Body:{rf_maxpwr_r := maxpwr_r}),
		tr_OML_IE(NM_ATT_ARFCN_LIST, OML_FOM_IE_Body:{arfcn_list := {len:=0, arfcn_list:=arfcn_list}})
		});


/* 8.6.3 Set Channel Attributes */
template (value) OML_PDU ts_OML_SetChanAttr(template (value) OML_FOM_ObjectInstance obj_inst,
					    template (value) OML_ChannelCombination chan_comb,
					    template (value) uint8_t tsc) :=
	ts_OML_MsgType(NM_MT_SET_CHAN_ATTR, NM_OC_CHANNEL, obj_inst, {
		ts_OML_IE(NM_ATT_CHAN_COMB, OML_FOM_IE_Body:{chan_comb := chan_comb}),
		ts_OML_IE(NM_ATT_TSC, OML_FOM_IE_Body:{tsc := tsc})
		});
template OML_PDU tr_OML_SetChanAttr(template OML_FOM_ObjectInstance obj_inst,
				    template OML_ChannelCombination chan_comb,
				    template uint8_t tsc) :=
	tr_OML_MsgType(NM_MT_SET_CHAN_ATTR, NM_OC_CHANNEL, obj_inst, {
		tr_OML_IE(NM_ATT_CHAN_COMB, OML_FOM_IE_Body:{chan_comb := chan_comb}),
		*,
		tr_OML_IE(NM_ATT_TSC, OML_FOM_IE_Body:{tsc := tsc})
		});


/* 8.11.1 Get Attributes */
template (value) OML_PDU ts_OML_GetAttributes(template (value) OML_FOM_ObjectClass obj_class,
					      template (value) OML_FOM_ObjectInstance obj_inst,
					      template (value) octetstring req_attr) :=
	ts_OML_MsgType(NM_MT_GET_ATTR, obj_class, obj_inst, {
		ts_OML_IE(NM_ATT_LIST_REQ_ATTR, OML_FOM_IE_Body:{other := ts_OML_IE_L16V(0, req_attr)})
			});
template OML_PDU tr_OML_GetAttributes(template OML_FOM_ObjectClass obj_class,
				      template OML_FOM_ObjectInstance obj_inst,
				      template octetstring req_attr) :=
	tr_OML_MsgType(NM_MT_GET_ATTR, obj_class, obj_inst, {
		tr_OML_IE(NM_ATT_LIST_REQ_ATTR, OML_FOM_IE_Body:{other := tr_OML_IE_L16V(?, req_attr)})
			});

/* convert a request into an ACK */
function f_OML_make_ack(OML_PDU orig) return OML_PDU {
	var OML_PDU resp := orig;
	if (ischosen(resp.u.fom)) {
		int2enum(enum2int(orig.u.fom.hdr.msg_type)+1, resp.u.fom.hdr.msg_type);
	} else if (ischosen(resp.u.manuf)) {
		int2enum(enum2int(orig.u.manuf.ipa.hdr.msg_type)+1, resp.u.manuf.ipa.hdr.msg_type);
	} else {
		testcase.stop("Unsupported OML in f_OML_make_ack(): ", orig);
	}
	return resp;
}
function f_OML_make_ack_exp(OML_PDU orig) return template OML_PDU {
	var template OML_PDU resp := orig;
	var OML_FOM_MessageType msg_t;
	if (ischosen(resp.u.fom)) {
		resp.u.fom.len := ?;
		int2enum(enum2int(orig.u.fom.hdr.msg_type)+1, msg_t);
		resp.u.fom.hdr.msg_type := msg_t;
	} else if (ischosen(resp.u.manuf)) {
		resp.u.manuf.ipa.len := ?;
		int2enum(enum2int(orig.u.manuf.ipa.hdr.msg_type)+1, msg_t);
		resp.u.manuf.ipa.hdr.msg_type := msg_t;
	} else {
		testcase.stop("Unsupported OML in f_OML_make_ack(): ", orig);
	}
	return resp;
}

/* convert a request into a NACK, appending the cause IE */
function f_OML_make_nack(OML_PDU orig, OML_FOM_NackCause cause) return OML_PDU {
	var OML_PDU resp := orig;
	if (ischosen(resp.u.fom)) {
		int2enum(enum2int(orig.u.fom.hdr.msg_type)+2, resp.u.fom.hdr.msg_type);
		resp.u.fom.ies := orig.u.fom.ies & {
			valueof(ts_OML_IE(NM_ATT_NACK_CAUSES, OML_FOM_IE_Body:{nack_causes := cause}))
			};
	} else if (ischosen(resp.u.manuf)) {
		int2enum(enum2int(orig.u.manuf.ipa.hdr.msg_type)+2, resp.u.manuf.ipa.hdr.msg_type);
		resp.u.manuf.ipa.ies := orig.u.manuf.ipa.ies & {
			valueof(ts_OML_IE(NM_ATT_NACK_CAUSES, OML_FOM_IE_Body:{nack_causes := cause}))
			};
	} else {
		testcase.stop("Unsupported OML in f_OML_make_nack(): ", orig);
	}
	return resp;
}
function f_OML_make_nack_exp(OML_PDU orig, template OML_FOM_NackCause cause) return template OML_PDU {
	var template OML_PDU resp := orig;
	var OML_FOM_MessageType msg_t;
	if (ischosen(resp.u.fom)) {
		resp.u.fom.len := ?;
		int2enum(enum2int(orig.u.fom.hdr.msg_type)+2, msg_t);
		resp.u.fom.hdr.msg_type := msg_t;
		resp.u.fom.ies := { *,
			tr_OML_IE(NM_ATT_NACK_CAUSES, OML_FOM_IE_Body:{nack_causes := cause})
			};
	} else if (ischosen(resp.u.manuf)) {
		resp.u.manuf.ipa.len := ?;
		int2enum(enum2int(orig.u.manuf.ipa.hdr.msg_type)+2, msg_t);
		resp.u.manuf.ipa.hdr.msg_type := msg_t;
		resp.u.manuf.ipa.ies := { *,
			tr_OML_IE(NM_ATT_NACK_CAUSES, OML_FOM_IE_Body:{nack_causes := cause})
			};
/*
		resp.u.manuf.ipa.ies := resp.u.manuf.ipa.ies & {
			tr_OML_IE(NM_ATT_NACK_CAUSES, OML_FOM_IE_Body:{nack_causes := cause})
			};
*/
	} else {
		testcase.stop("Unsupported OML in f_OML_make_nack_exp(): ", orig);
	}
	return resp;
}



/***********************************************************************
 * IPA / Osmocom specifics
 ***********************************************************************/



template (value) OML_PDU ts_OML_IPA_RslConnect(uint8_t stream_id, uint16_t port_nr) :=
	ts_OML_IPA_MsgType(NM_MT_IPACC_RSL_CONNECT, NM_OC_BASEB_TRANSC, ts_OML_ObjectInstance(0,0,255), {
			   ts_OML_IE(NM_ATT_IPACC_STREAM_ID, OML_FOM_IE_Body:{stream_id := stream_id}),
			   ts_OML_IE(NM_ATT_IPACC_DST_IP_PORT, OML_FOM_IE_Body:{portnr := port_nr})
			   });
template OML_PDU tr_OML_IPA_RslConnect(template uint8_t stream_id, template uint16_t port_nr) :=
	tr_OML_IPA_MsgType(NM_MT_IPACC_RSL_CONNECT, NM_OC_BASEB_TRANSC, tr_OML_ObjectInstance(0,0,255), {
			   tr_OML_IE(NM_ATT_IPACC_STREAM_ID, OML_FOM_IE_Body:{stream_id := stream_id}),
			   tr_OML_IE(NM_ATT_IPACC_DST_IP_PORT, OML_FOM_IE_Body:{portnr := port_nr})
			   });





} with { encode "RAW"; variant "FIELDORDER(msb)" };
