[wireshark] Major wireshark OML dissector

Now it properly parses message types and IEs that are defined different
depending on the BTS vendor / A-bis implementor.  This fixes a lot of
decoding bugs with Siemens BS-11 traces.
diff --git a/wireshark/abis_oml.patch b/wireshark/abis_oml.patch
index b9248dc..ccefdbd 100644
--- a/wireshark/abis_oml.patch
+++ b/wireshark/abis_oml.patch
@@ -11,11 +11,11 @@
  create mode 100644 epan/dissectors/packet-gsm_abis_oml.c
  create mode 100644 epan/dissectors/packet-gsm_abis_oml.h
 
-diff --git a/epan/dissectors/Makefile.common b/epan/dissectors/Makefile.common
-index b18f42e..115fa09 100644
---- a/epan/dissectors/Makefile.common
-+++ b/epan/dissectors/Makefile.common
-@@ -485,6 +485,7 @@ DISSECTOR_SRC = \
+Index: wireshark/epan/dissectors/Makefile.common
+===================================================================
+--- wireshark.orig/epan/dissectors/Makefile.common
++++ wireshark/epan/dissectors/Makefile.common
+@@ -483,6 +483,7 @@
  	packet-gsm_a_gm.c		\
  	packet-gsm_a_rp.c		\
  	packet-gsm_a_rr.c	\
@@ -23,15 +23,14 @@
  	packet-gsm_ipa.c	\
  	packet-gsm_bsslap.c		\
  	packet-gsm_bssmap_le.c	\
-diff --git a/epan/dissectors/packet-gsm_abis_oml.c b/epan/dissectors/packet-gsm_abis_oml.c
-new file mode 100644
-index 0000000..0f16f18
+Index: wireshark/epan/dissectors/packet-gsm_abis_oml.c
+===================================================================
 --- /dev/null
-+++ b/epan/dissectors/packet-gsm_abis_oml.c
-@@ -0,0 +1,1405 @@
++++ wireshark/epan/dissectors/packet-gsm_abis_oml.c
+@@ -0,0 +1,1604 @@
 +/* packet-abis_oml.c
 + * Routines for packet dissection of GSM A-bis over IP (3GPP TS 12.21)
-+ * Copyright 2009 by Harald Welte <laforge@gnumonks.org>
++ * Copyright 2009-2010 by Harald Welte <laforge@gnumonks.org>
 + * Copyright 2009 by Holger Hans Peter Freyther <zecke@selfish.org>
 + * based on A-bis OML code in OpenBSC
 + *
@@ -106,6 +105,8 @@
 +static int hf_attr_ach_sslot = -1;
 +static int hf_attr_gsm_time = -1;
 +static int hf_attr_chan_comb = -1;
++static int hf_attr_hsn = -1;
++static int hf_attr_maio = -1;
 +/* Ipaccess */
 +static int hf_oml_ipa_tres_attr_tag = -1;
 +static int hf_oml_ipa_tres_attr_len = -1;
@@ -167,8 +168,8 @@
 +	{ ABIS_OM_PLACEMENT_LAST,	"Last" },
 +};
 +
-+/* TS 12.21 Chapter 9.2 */
-+static const value_string oml_fom_msgtype_vals[] = {
++/* Standard Message Types as per TS 12.21 Chapter 9.2 */
++static const value_string _oml_fom_msgtype_vals[] = {
 +	{ NM_MT_LOAD_INIT,		"Software Load Init" },
 +	{ NM_MT_LOAD_INIT_ACK,		"Software Load Init ACK" },
 +	{ NM_MT_LOAD_INIT_NACK,		"Software Load Init NACK" },
@@ -266,7 +267,11 @@
 +	{ NM_MT_SET_ALARM_THRES,	"Set Alarm Threshold" },
 +	{ NM_MT_SET_ALARM_THRES_ACK,	"Set Alarm Threshold ACK" },
 +	{ NM_MT_SET_ALARM_THRES_NACK,	"Set Alarm Threshold NACK" },
-+	/* proprietary, not in the standard */
++	{ 0, NULL }
++};
++
++/* proprietary ip.access message types, not in the standard */
++static const value_string _oml_fom_msgtype_vals_ipa[] = {
 +	{ NM_MT_IPACC_RESTART,		"IPA Restart" },
 +	{ NM_MT_IPACC_RESTART_ACK,	"IPA Restart ACK" },
 +	{ NM_MT_IPACC_RSL_CONNECT,	"IPA RSL Connect" },
@@ -300,6 +305,11 @@
 +	{ NM_MT_IPACC_MEAS_RES_REQ_NACK,"IPA Measurement Result Request NACK" },
 +	{ NM_MT_IPACC_START_MEAS_NACK,	"IPA Start Measurement NACK" },
 +	{ NM_MT_IPACC_STOP_MEAS_NACK,	"IPA Stop Measurement NACK" },
++	{ 0, NULL }
++};
++
++/* proprietary Siemens message types, not in the standard */
++static const value_string _oml_fom_msgtype_vals_bs11[] = {
 +	{ NM_MT_BS11_RESET_RESOURCE,	"SIE Reset Resource" },
 +	{ NM_MT_BS11_BEGIN_DB_TX,	"SIE Begin Database Transmission" },
 +	{ NM_MT_BS11_BEGIN_DB_TX_ACK,	"SIE Begin Database Transmission ACK" },
@@ -313,6 +323,9 @@
 +	{ NM_MT_BS11_DELETE_OBJ,	"SIE Delete Object" },
 +	{ NM_MT_BS11_DELETE_OBJ_ACK,	"SIE Delete Object ACK" },
 +	{ NM_MT_BS11_DELETE_OBJ_NACK,	"SIE Delete Object NACK" },
++	{ NM_MT_BS11_SET_ATTR,		"SIE Set Attribute" },
++	{ NM_MT_BS11_SET_ATTR_ACK,	"SIE Set Attribute ACK" },
++	{ NM_MT_BS11_SET_ATTR_NACK,	"SIE Set Attribute NACK" },
 +	{ NM_MT_BS11_GET_STATE,		"SIE Get State" },
 +	{ NM_MT_BS11_GET_STATE_ACK,	"SIE Get State ACK" },
 +	{ NM_MT_BS11_LMT_LOGON,		"SIE LMT Logon" },
@@ -325,8 +338,12 @@
 +	{ NM_MT_BS11_LMT_LOGOFF_ACK,	"SIE LMT Logoff ACK" },
 +	{ NM_MT_BS11_RECONNECT,		"SIE Reconnect BTS" },
 +	{ NM_MT_BS11_RECONNECT_ACK,	"SIE Reconnect BTS ACK" },
++	{ 0, NULL }
 +};
 +
++/* initialize with the standard message types only */
++static value_string_ext oml_fom_msgtype_vse = VALUE_STRING_EXT_INIT(_oml_fom_msgtype_vals);
++
 +/* TS 12.21 Section 9.2: Object Class */
 +static const value_string oml_fom_objclass_vals[] = {
 +	{ NM_OC_SITE_MANAGER,		"BTS Site Manager" },
@@ -334,6 +351,7 @@
 +	{ NM_OC_RADIO_CARRIER,		"Radio Carrier" },
 +	{ NM_OC_CHANNEL,		"Radio Channel" },
 +	{ NM_OC_BASEB_TRANSC,		"Baseband Transceiver" },
++
 +	/* proprietary, vendor specific */
 +	{ NM_OC_BS11_ADJC,		"SIE Adjacend Channel" },
 +	{ NM_OC_BS11_HANDOVER,		"SIE Handover" },
@@ -344,15 +362,18 @@
 +	{ NM_OC_BS11_TEST,		"SIE Test" },
 +	{ NM_OC_BS11_ENVABTSE,		"SIE EnvaBTSE" },
 +	{ NM_OC_BS11_BPORT,		"SIE BPort" },
++
 +	{ NM_OC_GPRS_NSE,		"GPRS NSE" },
 +	{ NM_OC_GPRS_CELL,		"GPRS Cell" },
 +	{ NM_OC_GPRS_NSVC0,		"GPRS NSVC0" },
 +	{ NM_OC_GPRS_NSVC1,		"GPRS NSVC1" },
++
 +	{ NM_OC_NULL,			"NULL" },
++	{ 0, NULL }
 +};
 +
 +/* TS 12.21 Section 9.4: Attributes */
-+static const value_string oml_fom_attr_vals[] = {
++static const value_string _oml_fom_attr_vals[] = {
 +	{ NM_ATT_ABIS_CHANNEL,		"A-bis Channel" },
 +	{ NM_ATT_ADD_INFO,		"Additional Information" },
 +	{ NM_ATT_ADD_TEXT,		"Additional Text" },
@@ -422,6 +443,54 @@
 +	{ NM_ATT_FILE_DATA,		"File Data" },
 +	{ NM_ATT_MEAS_RES,		"Measurement Result" },
 +	{ NM_ATT_MEAS_TYPE,		"Measurement Type" },
++	{ 0, NULL }
++};
++
++static value_string_ext oml_fom_attr_vse = VALUE_STRING_EXT_INIT(_oml_fom_attr_vals);
++
++/* proprietary Siemens attributes, not in the standard */
++static const value_string oml_fom_attr_vals_bs11[] = {
++	{ NM_ATT_BS11_OM_LAPD_REL_TIMER,"SIE OML LAPD Release Timer" },
++	{ NM_ATT_BS11_RF_RES_IND_PER,	"SIE RF Resource Indication Period" },
++	{ NM_ATT_BS11_RX_LEV_MIN_CELL,	"SIE RxLevel Min Cell" },
++	{ NM_ATT_BS11_ABIS_EXT_TIME,	"SIE A-bis external time" },
++	{ NM_ATT_BS11_TIMER_HO_REQUEST,	"SIE Timer Handover Request" },
++	{ NM_ATT_BS11_TIMER_NCELL,	"SIE Timer nCell" },
++	{ NM_ATT_BS11_TSYNC,		"SIE Timer Tsync" },
++	{ NM_ATT_BS11_TTRAU,		"SIE Timer Ttrau" },
++	{ NM_ATT_BS11_EMRG_CFG_MEMBER,	"SIE Emergency Config Member" },
++	{ NM_ATT_BS11_TRX_AREA,		"SIE TRX Area" },
++	{ NM_ATT_BS11_BCCH_RECONF,	"SIE BCCH Reconfiguration" },
++	{ NM_ATT_BS11_BIT_ERR_THESH,	"SIE Bit Error Threshold" },
++	{ NM_ATT_BS11_BOOT_SW_VERS,	"SIE Boot Software Version" },
++	{ NM_ATT_BS11_CCLK_ACCURACY,	"SIE CCLK Accuracy" },
++	{ NM_ATT_BS11_CCLK_TYPE,	"SIE CCLK Type" },
++	{ NM_ATT_BS11_INP_IMPEDANCE,	"SIE Input Impedance" },
++	{ NM_ATT_BS11_L1_PROT_TYPE,	"SIE L1 Protocol Type" },
++	{ NM_ATT_BS11_LINE_CFG,		"SIE Line Configuration" },
++	{ NM_ATT_BS11_LI_PORT_1,	"SIE Line Interface Port 1" },
++	{ NM_ATT_BS11_LI_PORT_2,	"SIE Line Interface Port 2" },
++	{ NM_ATT_BS11_L1_REM_ALM_TYPE,	"SIE L1 Remote Alarm Type" },
++	{ NM_ATT_BS11_SW_LOAD_INTENDED,	"SIE Software Load Intended" },
++	{ NM_ATT_BS11_SW_LOAD_SAFETY,	"SIE Software Load Safety" },
++	{ NM_ATT_BS11_SW_LOAD_STORED,	"SIE Software Load Stored" },
++	{ NM_ATT_BS11_VENDOR_NAME,	"SIE Vendor Name" },
++	{ NM_ATT_BS11_HOPPING_MODE,	"SIE Hopping Mode" },
++	{ NM_ATT_BS11_LMT_LOGON_SESSION,"SIE LMT Logon Session" },
++	{ NM_ATT_BS11_LMT_LOGIN_TIME,	"SIE LMT Login Time" },
++	{ NM_ATT_BS11_LMT_USER_ACC_LEV,	"SIE LMT User Account Level" },
++	{ NM_ATT_BS11_LMT_USER_NAME,	"SIE LMT User Account Name" },
++	{ NM_ATT_BS11_L1_CONTROL_TS,	"SIE L1 Control TS" },
++	{ NM_ATT_BS11_RADIO_MEAS_GRAN,	"SIE Radio Measurement Granularity" },
++	{ NM_ATT_BS11_RADIO_MEAS_REP,	"SIE Rdadio Measurement Report" },
++	{ NM_ATT_BS11_SH_LAPD_INT_TIMER,"SIE LAPD Internal Timer" },
++	{ NM_ATT_BS11_BTS_STATE,	"SIE BTS State" },
++	{ NM_ATT_BS11_E1_STATE,		"SIE E1 State" },
++	{ NM_ATT_BS11_PLL,		"SIE PLL" },
++	{ NM_ATT_BS11_RX_OFFSET,	"SIE Rx Offset" },
++	{ NM_ATT_BS11_ANT_TYPE,		"SIE Antenna Type" },
++	{ NM_ATT_BS11_PLL_MODE,		"SIE PLL Mode" },
++	{ NM_ATT_BS11_PASSWORD,		"SIE Password" },
 +	{ NM_ATT_BS11_ESN_FW_CODE_NO,	"SIE ESN FW Code Number" },
 +	{ NM_ATT_BS11_ESN_HW_CODE_NO,	"SIE ESN HW Code Number" },
 +	{ NM_ATT_BS11_ESN_PCB_SERIAL,	"SIE ESN PCB Serial Number" },
@@ -431,12 +500,18 @@
 +	{ NM_ATT_BS11_CELL_ALLOC_NR,	"SIE Cell Allocation Number" },
 +	{ NM_ATT_BS11_CELL_GLOBAL_ID,	"SIE Cell Global ID" },
 +	{ NM_ATT_BS11_ENA_INTERF_CLASS,	"SIE Enable Interference Class" },
-+	/* FIXME */
++	{ NM_ATT_BS11_ENA_INT_INTEC_HANDO, "SIE Enable Int Intec Handover" },
++	{ NM_ATT_BS11_ENA_INT_INTRC_HANDO, "SIE Enable Int Intrc Handover" },
 +	{ NM_ATT_BS11_ENA_MS_PWR_CTRL,	"SIE Enable MS Power Control" },
 +	{ NM_ATT_BS11_ENA_PWR_BDGT_HO,	"SIE Enable Power Budget HO" },
 +	{ NM_ATT_BS11_ENA_RXLEV_HO,	"SIE Enable RxLevel HO" },
 +	{ NM_ATT_BS11_ENA_RXQUAL_HO,	"SIE Enable RxQual HO" },
 +	{ NM_ATT_BS11_FACCH_QUAL,	"SIE FACCH Quality" },
++	{ 0, NULL }
++};
++
++/* proprietary ip.access attributes, not in the standard */
++static const value_string oml_fom_attr_vals_ipa[] = {
 +	{ NM_ATT_IPACC_DST_IP,		"IPA Destination IP Address" },
 +	{ NM_ATT_IPACC_DST_IP_PORT,	"IPA Destionation IP Port" },
 +	{ NM_ATT_IPACC_SSRC,		"IPA RTP SSRC" },
@@ -486,21 +561,84 @@
 +	{ NM_ATT_IPACC_SEC_POSSIBLE,	"IPA Security Possible" },
 +	{ NM_ATT_IPACC_IML_SSL_STATE,	"IPA IML SSL State" },
 +	{ NM_ATT_IPACC_REVOC_DATE,	"IPA Revocation Date" },
-+	/* FIXME: More SIE */
++	{ 0, NULL }
 +};
 +
++#if 0
++static gint merge_value_strings(value_string **dst, const value_string *base, const value_string delta)
++{
++	const value_string *cur;
++	guint num_base, num_delta, num_max, num_out;
++
++	for (cur = base; cur->value || cur->strptr; cur++)
++		num_base++;
++	for (cur = delta; cur->value || cur->strptr; cur++)
++		num_delta++;
++	num_max = num_base + num_delta + 1; /* terminating entry */
++
++	*dst = g_malloc(sizeof(value_string) * num_max);
++	if (!*dst)
++		return -ENOMEM;
++	/* zero-initialize the entire array so we always are zero-
++	 * terminated */
++	memset(*dst, 0, sizeof(value_string * num_max));
++
++	/* initialize with the 'base' */
++	memcpy(*dst, base, sizeof(value_string)*num_base);
++	num_out = num_base;
++
++	/* patch/append the delta */
++	for (cur = delta; cur->value || cur->strptr; cur++) {
++		guint idx;
++		if (match_strval_idx(cur->value, base, &idx)) {
++			/* the base set already contains a definition,
++ 			 * we need to override it */
++			memcpy((*dst)[idx], cur, sizeof(value_string));
++		} else {
++			/* append the entry to the end */
++			memcpy((*dst)[num_out], cur, sizeof(value_string));
++			num_out++;
++		}
++	}
++
++	return 0;
++}
++#endif
++
++static const gchar *
++_match_oml_fom_msgtype(const guint32 val, const value_string_ext *vs)
++{
++	const char *ret;
++	ret = match_strval(val, vs->vals);
++	if (!ret)
++		ret = match_strval(val, _oml_fom_msgtype_vals);
++	return ret;
++}
++
++static const gchar *
++_match_oml_fom_attr(const guint32 val, const value_string_ext *vs)
++{
++	const char *ret;
++	ret = match_strval(val, vs->vals);
++	if (!ret)
++		ret = match_strval(val, _oml_fom_attr_vals);
++	return ret;
++}
++
 +/* Section 9.4.4: Administrative State */
 +static const value_string oml_adm_state_vals[] = {
 +	{ NM_STATE_LOCKED,		"Locked" },
 +	{ NM_STATE_UNLOCKED,		"Unlocked" },
 +	{ NM_STATE_SHUTDOWN,		"Shutdown" },
 +	{ NM_STATE_NULL,		"Null" },
++	{ 0, NULL }
 +};
 +
 +static const value_string oml_oper_state_vals[] = {
 +	{ 1,	"Disabled" },
 +	{ 2,	"Enabled" },
 +	{ 0xff,	"NULL" },
++	{ 0, NULL }
 +};
 +
 +/* Section 9.4.7 Availability Status */
@@ -513,6 +651,7 @@
 +	{ 6,	"Degraded" },
 +	{ 7, 	"Not installed" },
 +	{ 0xff,	"OK" },
++	{ 0, NULL }
 +};
 +
 +/* Section 9.4.13: Channel Combination */
@@ -526,6 +665,7 @@
 +	{ NM_CHANC_BCCH,		"BCCH" },
 +	{ NM_CHANC_BCCH_CBCH,		"BCCH+CBCH" },
 +	{ NM_CHANC_SDCCH_CBCH,		"SDCCH+CBCH" },
++	{ 0, NULL }
 +};
 +
 +/* Section 9.4.16: Event Type */
@@ -535,6 +675,7 @@
 +	{ NM_EVT_PROC_FAIL,		"Processor Failure" },
 +	{ NM_EVT_EQUIP_FAIL,		"Equipment Failure" },
 +	{ NM_EVT_ENV_FAIL,		"Environment Failure" },
++	{ 0, NULL }
 +};
 +
 +/* Section 9.4.63: Perceived Severity */
@@ -545,6 +686,7 @@
 +	{ NM_SEVER_MINOR,		"Minor" },
 +	{ NM_SEVER_WARNING,		"Warning" },
 +	{ NM_SEVER_INDETERMINATE,	"Indeterminate" },
++	{ 0, NULL }
 +};
 +
 +/* Section 9.4.36: NACK Causes */
@@ -582,6 +724,7 @@
 +	{ NM_NACK_MEAS_NOTSUPP,		"Measurement not supported" },
 +	{ NM_NACK_MEAS_NOTSTART,	"Measurement not started" },
 +	{ 0xff,				"NULL" },
++	{ 0, NULL }
 +};
 +
 +static const value_string oml_test_no_vals[] = {
@@ -595,6 +738,7 @@
 +	{ NM_IPACC_TESTNO_TX_BEACON,	"Transmit Beacon" },
 +	{ NM_IPACC_TESTNO_SYSINFO_MONITOR, "SysInfo Monitor" },
 +	{ NM_IPACC_TESTNO_BCCCH_MONITOR, "BCCH & CCCH Monitor" },
++	{ 0, NULL }
 +};
 +
 +static const value_string ipacc_test_res_vals[] = {
@@ -603,6 +747,7 @@
 +	{ NM_IPACC_TESTRES_NO_CHANS,	"No suitable channels available" },
 +	{ NM_IPACC_TESTRES_PARTIAL,	"Partial" },
 +	{ NM_IPACC_TESTRES_STOPPED,	"Stopped" },
++	{ 0, NULL }
 +};
 +
 +static const value_string ipacc_testres_ie_vals[] = {
@@ -611,6 +756,7 @@
 +	{ NM_IPACC_TR_IE_BCCH_INFO,	"BCCH Information" },
 +	{ NM_IPACC_TR_IE_RESULT_DETAILS,"Result Details" },
 +	{ NM_IPACC_TR_IE_FREQ_ERR,	"Frequency Error" },
++	{ 0, NULL }
 +};
 +
 +static const struct tlv_def *
@@ -813,6 +959,11 @@
 +			len = tvb_get_guint8(tvb, offset+1) << 8 |
 +						tvb_get_guint8(tvb, offset+2);
 +			break;
++		case TLV_TYPE_TLV16:
++			hlen = 2;
++			len_len = 1;
++			len = tvb_get_guint8(tvb, offset+1) * 2;
++			break;
 +		case TLV_TYPE_UNKNOWN: /* fall through */
 +		default:
 +			hlen = len_len = len = 0;
@@ -869,7 +1020,7 @@
 +			break;
 +		case NM_ATT_BCCH_ARFCN:
 +			proto_tree_add_item(att_tree, hf_attr_bcch_arfcn, tvb,
-+					    offset, len, TRUE);
++					    offset, len, FALSE);
 +			break;
 +		case NM_ATT_BSIC:
 +			proto_tree_add_item(att_tree, hf_attr_bsic, tvb,
@@ -918,7 +1069,20 @@
 +					val_to_str(val8, oml_test_no_vals,
 +						   "%02x"));
 +			break;
++		case NM_ATT_HSN:
++			proto_tree_add_item(att_tree, hf_attr_hsn, tvb,
++					    offset, len, TRUE);
++			break;
++		case NM_ATT_MAIO:
++			proto_tree_add_item(att_tree, hf_attr_maio, tvb,
++					    offset, len, TRUE);
++			break;
++		default:
++			proto_tree_add_item(att_tree, hf_oml_fom_attr_val, tvb,
++					    offset, len, FALSE);
++		}
 +
++		if (global_oml_use_nano_bts) switch (tag) {
 +		/* proprietary ip.access extensions */
 +		case NM_ATT_IPACC_DST_IP:
 +			val32 = tvb_get_ntohl(tvb, offset);
@@ -991,9 +1155,6 @@
 +			proto_tree_add_uint(att_tree, hf_attr_ipa_nsl_dport,
 +					   tvb, offset+6, 2, val16);
 +			break;
-+		default:
-+			proto_tree_add_item(att_tree, hf_oml_fom_attr_val, tvb,
-+					    offset, len, FALSE);
 +		}
 +		offset += len;
 +	}
@@ -1016,12 +1177,12 @@
 +	proto_item_append_text(top_ti, ", %s(%02x,%02x,%02x) %s ",
 +			val_to_str(obj_class, oml_fom_objclass_vals, "%02x"),
 +			bts_nr, trx_nr, ts_nr,
-+			val_to_str(msg_type, oml_fom_msgtype_vals,
++			val_to_str_ext(msg_type, &oml_fom_msgtype_vse,
 +				   "unknown 0x%x"));
 +	col_append_fstr(pinfo->cinfo, COL_INFO, "%s(%02x,%02x,%02x) %s ",
 +			val_to_str(obj_class, oml_fom_objclass_vals, "%02x"),
 +			bts_nr, trx_nr, ts_nr,
-+			val_to_str(msg_type, oml_fom_msgtype_vals,
++			val_to_str_ext(msg_type, &oml_fom_msgtype_vse,
 +				   "unknown 0x%x"));
 +	ti = proto_tree_add_item(tree, hf_oml_fom_msgtype, tvb, offset++, 1, FALSE);
 +	fom_tree = proto_item_add_subtree(ti, ett_oml_fom);
@@ -1123,7 +1284,7 @@
 +		},
 +		{ &hf_oml_fom_msgtype,
 +			{ "FOM Message Type", "oml.fom.msg_type",
-+			  FT_UINT8, BASE_HEX, VALS(oml_fom_msgtype_vals), 0,
++			  FT_UINT8, BASE_HEX|BASE_EXT_STRING, (&oml_fom_msgtype_vse), 0,
 +			  NULL, HFILL }
 +		},
 +		{ &hf_oml_fom_objclass,
@@ -1148,7 +1309,7 @@
 +		},
 +		{ &hf_oml_fom_attr_tag,
 +			{ "FOM Attribute ID", "oml.fom.attr_id",
-+			  FT_UINT8, BASE_HEX, VALS(oml_fom_attr_vals), 0,
++			  FT_UINT8, BASE_HEX|BASE_EXT_STRING, (&oml_fom_attr_vse), 0,
 +			  NULL, HFILL }
 +		},
 +		{ &hf_oml_fom_attr_len,
@@ -1244,6 +1405,17 @@
 +			  FT_UINT8, BASE_HEX, VALS(oml_chan_comb_vals), 0,
 +			  NULL, HFILL }
 +		},
++		{ &hf_attr_hsn,
++			{ "HSN", "oml.fom.attr.hsn",
++			  FT_UINT8, BASE_DEC, NULL, 0,
++			  "Hopping Sequence Number", HFILL }
++		},
++		{ &hf_attr_maio,
++			{ "MAIO", "oml.fom.attr.maio",
++			  FT_UINT8, BASE_DEC, NULL, 0,
++			  "Mobile Allocation Index Offset", HFILL }
++		},
++
 +		/* IP Access */
 +		{ &hf_oml_ipa_tres_attr_tag,
 +			{ "IPA Test Result Embedded IE",
@@ -1409,7 +1581,11 @@
 +
 +	module_t *oml_module;
 +
-+	proto_abis_oml = proto_register_protocol("GSM A-bis OML", "OML",
++	/* assign our custom match functions */
++	oml_fom_msgtype_vse.match = _match_oml_fom_msgtype;
++	oml_fom_attr_vse.match = _match_oml_fom_attr;
++
++	proto_abis_oml = proto_register_protocol("GSM A-bis OML", "A-bis OML",
 +						 "gsm_abis_oml");
 +
 +	proto_register_field_array(proto_abis_oml, hf, array_length(hf));
@@ -1418,7 +1594,6 @@
 +
 +	register_dissector("gsm_abis_oml", dissect_abis_oml, proto_abis_oml);
 +
-+
 +	oml_module = prefs_register_protocol(proto_abis_oml, proto_reg_handoff_abis_oml);
 +	prefs_register_bool_preference(oml_module, "use_ipaccess_oml",
 +		    "Use nanoBTS definitions",
@@ -1426,20 +1601,42 @@
 +		    &global_oml_use_nano_bts);
 +}
 +
++/* This function is called once at startup and every time the user hits
++ * 'apply' in the preferences dialogue */
 +void
 +proto_reg_handoff_abis_oml(void)
 +{
-+	dissector_handle_t abis_oml_handle;
++	static gboolean initialized = FALSE;
 +
-+	abis_oml_handle = create_dissector_handle(dissect_abis_oml, proto_abis_oml);
-+	dissector_add("lapd.gsm.sapi", LAPD_GSM_SAPI_OM_PROC, abis_oml_handle);
++	if (!initialized) {
++		dissector_handle_t abis_oml_handle;
++
++		abis_oml_handle = create_dissector_handle(dissect_abis_oml, proto_abis_oml);
++		dissector_add("lapd.gsm.sapi", LAPD_GSM_SAPI_OM_PROC, abis_oml_handle);
++
++	} else {
++		/* preferences have been changed */
++	}
++
++	if (global_oml_use_nano_bts == TRUE) {
++		/* initialize with nanobts definitions */
++		oml_fom_msgtype_vse.vals = _oml_fom_msgtype_vals_ipa;
++		oml_fom_msgtype_vse.length = array_length(_oml_fom_msgtype_vals_ipa)-1;
++		oml_fom_attr_vse.vals = oml_fom_attr_vals_ipa;
++		oml_fom_attr_vse.length = array_length(oml_fom_attr_vals_ipa)-1;
++	} else {
++		/* initialize with BS11 defaults */
++		oml_fom_msgtype_vse.vals = _oml_fom_msgtype_vals_bs11;
++		oml_fom_msgtype_vse.length = array_length(_oml_fom_msgtype_vals_bs11)-1;
++		oml_fom_attr_vse.vals = oml_fom_attr_vals_bs11;
++		oml_fom_attr_vse.length = array_length(oml_fom_attr_vals_bs11)-1;
++	}
 +}
-diff --git a/epan/dissectors/packet-gsm_abis_oml.h b/epan/dissectors/packet-gsm_abis_oml.h
-new file mode 100644
-index 0000000..bdc414d
+Index: wireshark/epan/dissectors/packet-gsm_abis_oml.h
+===================================================================
 --- /dev/null
-+++ b/epan/dissectors/packet-gsm_abis_oml.h
-@@ -0,0 +1,800 @@
++++ wireshark/epan/dissectors/packet-gsm_abis_oml.h
+@@ -0,0 +1,830 @@
 +/* GSM Network Management messages on the A-bis interface
 + * 3GPP TS 12.21 version 8.0.0 Release 1999 / ETSI TS 100 623 V8.0.0 */
 +
@@ -1790,10 +1987,17 @@
 +	NM_ATT_FILE_DATA,
 +	NM_ATT_MEAS_RES,
 +	NM_ATT_MEAS_TYPE,
++};
 +
++enum abis_nm_attr_bs11 {
++	NM_ATT_BS11_OM_LAPD_REL_TIMER	= 0x02,
++	NM_ATT_BS11_EMERG_TIMER1	= 0x42,
++	NM_ATT_BS11_EMERG_TIMER2	= 0x44,
 +	NM_ATT_BS11_ESN_FW_CODE_NO	= 0x4c,
 +	NM_ATT_BS11_ESN_HW_CODE_NO	= 0x4f,
 +
++	NM_ATT_BS11_FILE_DATA		= NM_ATT_EVENT_TYPE,
++
 +	NM_ATT_BS11_ESN_PCB_SERIAL	= 0x55,
 +	NM_ATT_BS11_EXCESSIVE_DISTANCE	= 0x58,
 +
@@ -1811,57 +2015,6 @@
 +	NM_ATT_BS11_ENA_RXQUAL_HO	= 0x6d,
 +	NM_ATT_BS11_FACCH_QUAL		= 0x6e,
 +
-+	NM_ATT_IPACC_DST_IP		= 0x80,
-+	NM_ATT_IPACC_DST_IP_PORT	= 0x81,
-+	NM_ATT_IPACC_SSRC		= 0x82,		/* RTP Sync Source */
-+	NM_ATT_IPACC_RTP_PAYLD_TYPE	= 0x83,
-+	NM_ATT_IPACC_BASEB_ID		= 0x84,
-+	NM_ATT_IPACC_STREAM_ID		= 0x85,
-+	NM_ATT_IPACC_NV_FLAGS		= 0x86,
-+	NM_ATT_IPACC_FREQ_CTRL		= 0x87,
-+	NM_ATT_IPACC_PRIM_OML_CFG	= 0x88,
-+	NM_ATT_IPACC_SEC_OML_CFG	= 0x89,
-+	NM_ATT_IPACC_IP_IF_CFG		= 0x8a,		/* IP interface */
-+	NM_ATT_IPACC_IP_GW_CFG		= 0x8b,		/* IP gateway */
-+	NM_ATT_IPACC_IN_SERV_TIME	= 0x8c,
-+	NM_ATT_IPACC_TRX_BTS_ASS	= 0x8d,
-+	NM_ATT_IPACC_LOCATION		= 0x8e,		/* string describing location */
-+	NM_ATT_IPACC_PAGING_CFG		= 0x8f,
-+	NM_ATT_IPACC_FILE_DATA		= 0x90,
-+	NM_ATT_IPACC_UNIT_ID		= 0x91,		/* Site/BTS/TRX */
-+	NM_ATT_IPACC_PARENT_UNIT_ID	= 0x92,
-+	NM_ATT_IPACC_UNIT_NAME		= 0x93,		/* default: nbts-<mac-as-string> */
-+	NM_ATT_IPACC_SNMP_CFG		= 0x94,
-+	NM_ATT_IPACC_PRIM_OML_CFG_LIST	= 0x95,
-+	NM_ATT_IPACC_PRIM_OML_FB_TOUT	= 0x96,		/* fallback timeout */
-+	NM_ATT_IPACC_CUR_SW_CFG		= 0x97,
-+	NM_ATT_IPACC_TIMING_BUS		= 0x98,
-+	NM_ATT_IPACC_CGI		= 0x99,		/* Cell Global ID */
-+	NM_ATT_IPACC_RAC		= 0x9a,
-+	NM_ATT_IPACC_OBJ_VERSION	= 0x9b,
-+	NM_ATT_IPACC_GPRS_PAGING_CFG	= 0x9c,
-+	NM_ATT_IPACC_NSEI		= 0x9d,
-+	NM_ATT_IPACC_BVCI		= 0x9e,
-+	NM_ATT_IPACC_NSVCI		= 0x9f,
-+	NM_ATT_IPACC_NS_CFG		= 0xa0,
-+	NM_ATT_IPACC_BSSGP_CFG		= 0xa1,
-+	NM_ATT_IPACC_NS_LINK_CFG	= 0xa2,
-+	NM_ATT_IPACC_RLC_CFG		= 0xa3,
-+	NM_ATT_IPACC_ALM_THRESH_LIST	= 0xa4,
-+	NM_ATT_IPACC_MONIT_VAL_LIST	= 0xa5,
-+	NM_ATT_IPACC_TIB_CONTROL	= 0xa6,
-+	NM_ATT_IPACC_SUPP_FEATURES	= 0xa7,
-+	NM_ATT_IPACC_CODING_SCHEMES	= 0xa8,
-+	NM_ATT_IPACC_RLC_CFG_2		= 0xa9,
-+	NM_ATT_IPACC_HEARTB_TOUT	= 0xaa,
-+	NM_ATT_IPACC_UPTIME		= 0xab,
-+	NM_ATT_IPACC_RLC_CFG_3		= 0xac,
-+	NM_ATT_IPACC_SSL_CFG		= 0xad,
-+	NM_ATT_IPACC_SEC_POSSIBLE	= 0xae,
-+	NM_ATT_IPACC_IML_SSL_STATE	= 0xaf,
-+	NM_ATT_IPACC_REVOC_DATE		= 0xb0,
-+
-+
 +	NM_ATT_BS11_RF_RES_IND_PER	= 0x8f,
 +
 +	NM_ATT_BS11_RX_LEV_MIN_CELL	= 0x90,
@@ -1910,7 +2063,58 @@
 +	NM_ATT_BS11_PLL_MODE		= 0xfc,
 +	NM_ATT_BS11_PASSWORD		= 0xfd,
 +};
-+#define NM_ATT_BS11_FILE_DATA	NM_ATT_EVENT_TYPE
++
++enum abis_nm_attr_ipa {
++	NM_ATT_IPACC_DST_IP		= 0x80,
++	NM_ATT_IPACC_DST_IP_PORT	= 0x81,
++	NM_ATT_IPACC_SSRC		= 0x82,		/* RTP Sync Source */
++	NM_ATT_IPACC_RTP_PAYLD_TYPE	= 0x83,
++	NM_ATT_IPACC_BASEB_ID		= 0x84,
++	NM_ATT_IPACC_STREAM_ID		= 0x85,
++	NM_ATT_IPACC_NV_FLAGS		= 0x86,
++	NM_ATT_IPACC_FREQ_CTRL		= 0x87,
++	NM_ATT_IPACC_PRIM_OML_CFG	= 0x88,
++	NM_ATT_IPACC_SEC_OML_CFG	= 0x89,
++	NM_ATT_IPACC_IP_IF_CFG		= 0x8a,		/* IP interface */
++	NM_ATT_IPACC_IP_GW_CFG		= 0x8b,		/* IP gateway */
++	NM_ATT_IPACC_IN_SERV_TIME	= 0x8c,
++	NM_ATT_IPACC_TRX_BTS_ASS	= 0x8d,
++	NM_ATT_IPACC_LOCATION		= 0x8e,		/* string describing location */
++	NM_ATT_IPACC_PAGING_CFG		= 0x8f,
++	NM_ATT_IPACC_FILE_DATA		= 0x90,
++	NM_ATT_IPACC_UNIT_ID		= 0x91,		/* Site/BTS/TRX */
++	NM_ATT_IPACC_PARENT_UNIT_ID	= 0x92,
++	NM_ATT_IPACC_UNIT_NAME		= 0x93,		/* default: nbts-<mac-as-string> */
++	NM_ATT_IPACC_SNMP_CFG		= 0x94,
++	NM_ATT_IPACC_PRIM_OML_CFG_LIST	= 0x95,
++	NM_ATT_IPACC_PRIM_OML_FB_TOUT	= 0x96,		/* fallback timeout */
++	NM_ATT_IPACC_CUR_SW_CFG		= 0x97,
++	NM_ATT_IPACC_TIMING_BUS		= 0x98,
++	NM_ATT_IPACC_CGI		= 0x99,		/* Cell Global ID */
++	NM_ATT_IPACC_RAC		= 0x9a,
++	NM_ATT_IPACC_OBJ_VERSION	= 0x9b,
++	NM_ATT_IPACC_GPRS_PAGING_CFG	= 0x9c,
++	NM_ATT_IPACC_NSEI		= 0x9d,
++	NM_ATT_IPACC_BVCI		= 0x9e,
++	NM_ATT_IPACC_NSVCI		= 0x9f,
++	NM_ATT_IPACC_NS_CFG		= 0xa0,
++	NM_ATT_IPACC_BSSGP_CFG		= 0xa1,
++	NM_ATT_IPACC_NS_LINK_CFG	= 0xa2,
++	NM_ATT_IPACC_RLC_CFG		= 0xa3,
++	NM_ATT_IPACC_ALM_THRESH_LIST	= 0xa4,
++	NM_ATT_IPACC_MONIT_VAL_LIST	= 0xa5,
++	NM_ATT_IPACC_TIB_CONTROL	= 0xa6,
++	NM_ATT_IPACC_SUPP_FEATURES	= 0xa7,
++	NM_ATT_IPACC_CODING_SCHEMES	= 0xa8,
++	NM_ATT_IPACC_RLC_CFG_2		= 0xa9,
++	NM_ATT_IPACC_HEARTB_TOUT	= 0xaa,
++	NM_ATT_IPACC_UPTIME		= 0xab,
++	NM_ATT_IPACC_RLC_CFG_3		= 0xac,
++	NM_ATT_IPACC_SSL_CFG		= 0xad,
++	NM_ATT_IPACC_SEC_POSSIBLE	= 0xae,
++	NM_ATT_IPACC_IML_SSL_STATE	= 0xaf,
++	NM_ATT_IPACC_REVOC_DATE		= 0xb0,
++};
 +
 +/* Section 9.4.4: Administrative State */
 +enum abis_nm_adm_state {
@@ -2056,6 +2260,7 @@
 +	TLV_TYPE_TV,
 +	TLV_TYPE_TLV,
 +	TLV_TYPE_TL16V,
++	TLV_TYPE_TLV16,
 +};
 +
 +struct tlv_def {
@@ -2172,12 +2377,35 @@
 +/* BS11 specifics */
 +static const struct tlv_definition nm_att_tlvdev_bs11 = {
 +	.def = {
-+		/* a difference.. */
++		/* different stndard IEs */
++		[NM_ATT_OUTST_ALARM] =		{ TLV_TYPE_TLV, 0 },
 +		[NM_ATT_HW_DESC] =		{ TLV_TYPE_TL16V, 0 },
++		[NM_ATT_ARFCN_LIST]=		{ TLV_TYPE_TLV16, 0 },
++
++		/* proprietary IEs */
++		[NM_ATT_BS11_ABIS_EXT_TIME] =	{ TLV_TYPE_TLV, 0 },
++		[NM_ATT_BS11_OM_LAPD_REL_TIMER]={ TLV_TYPE_FIXED, 2 },
++		[NM_ATT_BS11_SH_LAPD_INT_TIMER]={ TLV_TYPE_TLV, 0 },
++		[NM_ATT_BS11_EMERG_TIMER1] =	{ TLV_TYPE_TLV, 0 },
++		[NM_ATT_BS11_EMERG_TIMER2] =	{ TLV_TYPE_TLV, 0 },
++		[NM_ATT_BS11_BTSLS_HOPPING] =	{ TLV_TYPE_FIXED, 1 },
++		[NM_ATT_BS11_CELL_ALLOC_NR] =	{ TLV_TYPE_FIXED, 1 },
++		[NM_ATT_BS11_ENA_INTERF_CLASS]= { TLV_TYPE_FIXED, 1 },
++		[NM_ATT_BS11_FACCH_QUAL] =	{ TLV_TYPE_FIXED, 1 },
++		[NM_ATT_BS11_TSYNC] =		{ TLV_TYPE_FIXED, 2 },
++		[NM_ATT_BS11_TTRAU] =		{ TLV_TYPE_FIXED, 2 },
++		[NM_ATT_BS11_EXCESSIVE_DISTANCE] = { TLV_TYPE_TLV, 1 },
++		[NM_ATT_BS11_HOPPING_MODE] =	{ TLV_TYPE_TLV, 1 },
++		[NM_ATT_BS11_RF_RES_IND_PER] =	{ TLV_TYPE_FIXED, 1 },
++		[NM_ATT_BS11_RADIO_MEAS_GRAN] =	{ TLV_TYPE_TLV, 0 },
++		[NM_ATT_BS11_RADIO_MEAS_REP] =	{ TLV_TYPE_TLV, 0 },
++		[NM_ATT_BS11_EMRG_CFG_MEMBER] =	{ TLV_TYPE_TLV, 0 },
++		[NM_ATT_BS11_TRX_AREA] =	{ TLV_TYPE_TLV, 0 },
 +		[NM_ATT_BS11_ESN_FW_CODE_NO] =	{ TLV_TYPE_TLV, 0 },
 +		[NM_ATT_BS11_ESN_HW_CODE_NO] =	{ TLV_TYPE_TLV, 0 },
 +		[NM_ATT_BS11_ESN_PCB_SERIAL] =	{ TLV_TYPE_TLV, 0 },
 +		[NM_ATT_BS11_BOOT_SW_VERS] =	{ TLV_TYPE_TLV, 0 },
++		[0x59] =			{ TLV_TYPE_TLV, 0 },
 +		[0xd5] =			{ TLV_TYPE_TLV, 0 },
 +		[0xa8] =			{ TLV_TYPE_TLV, 0 },
 +		[NM_ATT_BS11_PASSWORD] =	{ TLV_TYPE_TLV, 0 },
@@ -2197,7 +2425,6 @@
 +		[NM_ATT_BS11_PLL]	=	{ TLV_TYPE_TLV, 0 },
 +		[NM_ATT_BS11_CCLK_ACCURACY] =	{ TLV_TYPE_TV, 0 },
 +		[NM_ATT_BS11_CCLK_TYPE] =	{ TLV_TYPE_TV, 0 },
-+		[0x95] =			{ TLV_TYPE_FIXED, 2 },
 +	},
 +};
 +
@@ -2240,6 +2467,3 @@
 +};
 +
 +#endif /* _NM_H */
--- 
-1.7.0.1
-