wireshark: More work on Ericsson OML (OM2000) dissector

We now decode virtually everything in a RBS startup.
diff --git a/wireshark/ericsson_rbs2409.patch b/wireshark/ericsson_rbs2409.patch
index 6550092..e8cdb86 100644
--- a/wireshark/ericsson_rbs2409.patch
+++ b/wireshark/ericsson_rbs2409.patch
@@ -60,7 +60,7 @@
 ===================================================================
 --- /dev/null
 +++ wireshark/epan/dissectors/packet-gsm_abis_om2000.c
-@@ -0,0 +1,1195 @@
+@@ -0,0 +1,1439 @@
 +/* packet-abis_om2000.c
 + * Routines for packet dissection of Ericsson A-bis OML (OM 2000)
 + * Copyright 2010 by Harald Welte <laforge@gnumonks.org>
@@ -108,6 +108,7 @@
 +static int hf_om2k_msg_code = -1;
 +static int hf_om2k_mo_if = -1;
 +static int hf_om2k_mo_class = -1;
++static int hf_om2k_mo_instance = -1;
 +
 +static int hf_om2k_aip = -1;
 +static int hf_om2k_oip = -1;
@@ -140,6 +141,7 @@
 +static int hf_om2k_cst = -1;
 +static int hf_om2k_ea = -1;
 +static int hf_om2k_unknown_tag = -1;
++static int hf_om2k_unknown_val = -1;
 +static int hf_om2k_nom_pwr = -1;
 +static int hf_om2k_fill_mark = -1;
 +static int hf_om2k_bcc = -1;
@@ -161,9 +163,27 @@
 +static int hf_om2k_cal_time = -1;
 +static int hf_om2k_list_nr = -1;
 +static int hf_om2k_list_nr_end = -1;
++static int hf_om2k_isl = -1;
++static int hf_om2k_isl_icp1 = -1;
++static int hf_om2k_isl_icp2 = -1;
++static int hf_om2k_isl_ci = -1;
++static int hf_om2k_conl = -1;
++static int hf_om2k_conl_nr_cgs = -1;
++static int hf_om2k_conl_nr_cps_cg = -1;
++static int hf_om2k_conl_ccp = -1;
++static int hf_om2k_conl_ci = -1;
++static int hf_om2k_conl_tag = -1;
++static int hf_om2k_conl_tei = -1;
++static int hf_om2k_tf_mode = -1;
++static int hf_om2k_tf_fs_offset = -1;
++
++
 +
 +/* initialize the subtree pointers */
 +static int ett_om2000 = -1;
++static int ett_om2k_mo = -1;
++static int ett_om2k_isl = -1;
++static int ett_om2k_conl = -1;
 +
 +static proto_tree *top_tree;
 +
@@ -275,7 +295,7 @@
 +	{ 0x00a3, "TF Configuration Request Reject" },
 +	{ 0x00a4, "TF Configuration Result ACK" },
 +	{ 0x00a5, "TF Configuration Result NACK" },
-+	{ 0x00a7, "TF Configuration Result" },
++	{ 0x00a6, "TF Configuration Result" },
 +	{ 0x00a8, "TS Configuration Request" },
 +	{ 0x00aa, "TS Configuration Request Accept" },
 +	{ 0x00ab, "TS Configuration Request Reject" },
@@ -300,7 +320,36 @@
 +	{ 0x00c8, "DIP Quality Report II ACK" },
 +	{ 0x00c9, "DIP Quality Report II NACK" },
 +	{ 0x00ca, "DIP Quality Report II" },
-+	/* FIXME */
++	{ 0x00dc, "DP Configuration Request" },
++	{ 0x00de, "DP Configuration Request Accept" },
++	{ 0x00df, "DP Configuration Request Reject" },
++	{ 0x00e0, "DP Configuration Result ACK" },
++	{ 0x00e1, "DP Configuration Result NACK" },
++	{ 0x00e2, "DP Configuration Result" },
++	{ 0x00e4, "Capabilities HW Info Report ACK" },
++	{ 0x00e5, "Capabilities HW Info Report NACK" },
++	{ 0x00e6, "Capabilities HW Info Report" },
++	{ 0x00e8, "Capabilities Request" },
++	{ 0x00ea, "Capabilities Request Accept" },
++	{ 0x00eb, "Capabilities Request Reject" },
++	{ 0x00ec, "Capabilities Result ACK" },
++	{ 0x00ed, "Capabilities Result NACK" },
++	{ 0x00ee, "Capabilities Result" },
++	{ 0x00f0, "FM Configuration Request" },
++	{ 0x00f2, "FM Configuration Request Accept" },
++	{ 0x00f3, "FM Configuration Request Reject" },
++	{ 0x00f4, "FM Configuration Result ACK" },
++	{ 0x00f5, "FM Configuration Result NACK" },
++	{ 0x00f6, "FM Configuration Result" },
++	{ 0x00f8, "FM Report Request" },
++	{ 0x00fa, "FM Report Response" },
++	{ 0x00fb, "FM Report Reject" },
++	{ 0x00fc, "FM Start Command" },
++	{ 0x00fe, "FM Start Complete" },
++	{ 0x00ff, "FM Start Reject" },
++	{ 0x0100, "FM Stop Command" },
++	{ 0x0102, "FM Stop Complete" },
++	{ 0x0103, "FM Stop Reject" },
 +	{ 0x0104, "Negotiation Request ACK" },
 +	{ 0x0105, "Negotiation Request NACK" },
 +	{ 0x0106, "Negotiation Request" },
@@ -518,7 +567,20 @@
 +	{ 0, NULL }
 +};
 +
++static const value_string om2k_mo_class_short_vals[] = {
++	{ 0x01, "TRXC" },
++	{ 0x03, "TS" },
++	{ 0x04, "TF" },
++	{ 0x05, "IS" },
++	{ 0x06, "CON" },
++	{ 0x0a, "CF" },
++	{ 0x0b, "TX" },
++	{ 0x0c, "RX" },
++	{ 0, NULL }
++};
++
 +static const value_string om2k_mo_class_vals[] = {
++	{ 0x01, "TRXC (TRX Controller)" },
 +	{ 0x03, "TS (Timeslot)" },
 +	{ 0x04, "TF (Timing Function)" },
 +	{ 0x05, "IS (Interface Switch)" },
@@ -529,6 +591,14 @@
 +	{ 0, NULL }
 +};
 +
++static const value_string om2k_tf_mode_vals[] = {
++	{ 0x00, "Master" },
++	{ 0x01, "Standalone" },
++	{ 0x02, "Slave" },
++	{ 0xff, "Not defined" },
++	{ 0, NULL }
++};
++
 +static gint
 +dissect_tss_mo_state(tvbuff_t *tvb, gint offset, packet_info *pinfo,
 +		     proto_tree *tree)
@@ -552,7 +622,7 @@
 +
 +
 +static gint
-+dissect_om2k_time(tvbuff_t *tvb, int offset, proto_tree *tree)
++dissect_om2k_time(tvbuff_t *tvb, gint offset, proto_tree *tree)
 +{
 +	nstime_t tmptime;
 +	time_t tval;
@@ -576,7 +646,76 @@
 +}
 +
 +static gint
-+dissect_om2k_attrs(tvbuff_t *tvb, int base_offs, packet_info *pinfo,
++dissect_om2k_attr_unkn(tvbuff_t *tvb, gint offset, gint len, gint iei, proto_tree *tree)
++{
++	proto_tree_add_bytes_format(tree, hf_om2k_unknown_val, tvb,
++				    offset, len, tvb_get_ptr(tvb, offset, len),
++				    "%s: %s",
++				    val_to_str(iei, om2k_attr_vals, "0x%02x"),
++				    tvb_bytes_to_str(tvb, offset, len));
++	return len;
++}
++
++static gint
++dissect_om2k_is_list(tvbuff_t *tvb, gint base_offset, proto_tree *tree)
++{
++	gint offset = base_offset;
++	proto_item *ti;
++	proto_tree *isl_tree;
++	guint8 len = tvb_get_guint8(tvb, offset++);
++
++	ti = proto_tree_add_item(tree, hf_om2k_isl, tvb, offset, len, FALSE);
++	isl_tree = proto_item_add_subtree(ti, ett_om2k_isl);
++
++	while (offset < base_offset + len) {
++		proto_tree_add_item(isl_tree, hf_om2k_isl_icp1, tvb,
++				    offset, 2, FALSE);
++		offset += 2;
++		proto_tree_add_item(isl_tree, hf_om2k_isl_icp2, tvb,
++				    offset, 2, FALSE);
++		offset += 2;
++		proto_tree_add_item(isl_tree, hf_om2k_isl_ci, tvb,
++				    offset++, 1, FALSE);
++	}
++	return offset - base_offset;
++}
++
++static gint
++dissect_om2k_con_list(tvbuff_t *tvb, gint base_offset, proto_tree *tree)
++{
++	gint offset = base_offset;
++	proto_item *ti;
++	proto_tree *conl_tree;
++	guint8 len = tvb_get_guint8(tvb, offset++);
++
++	ti = proto_tree_add_item(tree, hf_om2k_conl, tvb, offset, len, FALSE);
++	conl_tree = proto_item_add_subtree(ti, ett_om2k_conl);
++
++	proto_tree_add_item(conl_tree, hf_om2k_conl_nr_cgs, tvb,
++			    offset++, 1, FALSE);
++
++	while (offset < base_offset + len) {
++		guint8 nr_cps_cg = tvb_get_guint8(tvb, offset);
++		proto_tree_add_item(conl_tree, hf_om2k_conl_nr_cps_cg, tvb,
++				    offset++, 1, FALSE);
++		while (nr_cps_cg--) {
++			proto_tree_add_item(conl_tree, hf_om2k_conl_ccp, tvb,
++				    offset, 2, FALSE);
++			offset += 2;
++			proto_tree_add_item(conl_tree, hf_om2k_conl_ci, tvb,
++				    offset++, 1, FALSE);
++			proto_tree_add_item(conl_tree, hf_om2k_conl_tag, tvb,
++				    offset++, 1, FALSE);
++			proto_tree_add_item(conl_tree, hf_om2k_conl_tei, tvb,
++				    offset++, 1, FALSE);
++		}
++	}
++	return offset - base_offset;
++}
++
++
++static gint
++dissect_om2k_attrs(tvbuff_t *tvb, gint base_offs, packet_info *pinfo,
 +		  proto_tree *tree)
 +{
 +	int offset = base_offs;
@@ -627,9 +766,7 @@
 +					    offset++, 1, FALSE);
 +			break;
 +		case 0x10: /* CON Connection List */
-+			len = tvb_get_guint8(tvb, offset++);
-+			/* FIXME */
-+			offset += len;
++			offset += dissect_om2k_con_list(tvb, offset, tree);
 +			break;
 +		case 0x12: /* DRX_DEV_MAX */
 +			proto_tree_add_item(tree, hf_om2k_drx_dev_max, tvb,
@@ -643,7 +780,7 @@
 +			/* FIXME */
 +		case 0x15: /* External Condition Map Class 2 */
 +			/* FIXME */
-+			offset += 2;
++			offset += dissect_om2k_attr_unkn(tvb, offset, 2, iei, tree);
 +			break;
 +		case 0x16: /* File Relation Indication */
 +			proto_tree_add_item(tree, hf_om2k_filerel_ilr, tvb,
@@ -672,13 +809,13 @@
 +		case 0x1e: /* Frequency List */
 +			len = tvb_get_guint8(tvb, offset++);
 +			/* FIXME */
-+			offset += len;
++			offset += dissect_om2k_attr_unkn(tvb, offset, len, iei, tree);
 +			break;
 +		case 0x1f: /* Frequency Specifier Rx */
 +			/* FIXME */
 +		case 0x20: /* Frequency Specifier Rx */
 +			/* FIXME */
-+			offset += 2;
++			offset += dissect_om2k_attr_unkn(tvb, offset, 2, iei, tree);
 +			break;
 +		case 0x21: /* HSN */
 +			proto_tree_add_item(tree, hf_om2k_hsn, tvb,
@@ -696,12 +833,10 @@
 +			/* FIXME */
 +		case 0x26: /* Internal Fault Map Class 2A Ext */
 +			/* FIXME */
-+			offset += 6;
++			offset += dissect_om2k_attr_unkn(tvb, offset, 6, iei, tree);
 +			break;
 +		case 0x27: /* IS Connection List */
-+			len = tvb_get_guint8(tvb, offset++);
-+			/* FIXME */
-+			offset += len;
++			offset += dissect_om2k_is_list(tvb, offset, tree);
 +			break;
 +		case 0x28: /* List Number */
 +			proto_tree_add_item(tree, hf_om2k_list_nr, tvb,
@@ -737,12 +872,16 @@
 +			break;
 +		case 0x34: /* Replacement Unit Map */
 +			/* FIXME */
-+			offset += 6;
++			offset += dissect_om2k_attr_unkn(tvb, offset, 6, iei, tree);
 +			break;
 +		case 0x38: /* T3105 */
 +			proto_tree_add_item(tree, hf_om2k_t3105, tvb,
 +					    offset++, 1, FALSE);
 +			break;
++		case 0x3a: /* TF Mode */
++			proto_tree_add_item(tree, hf_om2k_tf_mode, tvb,
++					    offset++, 1, FALSE);
++			break;
 +		case 0x3c: /* TS Number */
 +			proto_tree_add_item(tree, hf_om2k_ts, tvb,
 +					    offset++, 1, FALSE);
@@ -771,7 +910,7 @@
 +		case 0x46: /* RSL Function Map 2 */
 +			len = tvb_get_guint8(tvb, offset++);
 +			/* FIXME */
-+			offset += len;
++			offset += dissect_om2k_attr_unkn(tvb, offset, len, iei, tree);
 +			break;
 +		case 0x47: /* Ext Range */
 +			proto_tree_add_item(tree, hf_om2k_ext_range, tvb,
@@ -786,11 +925,11 @@
 +			break;
 +		case 0x50: /* Replacement Unit Map Extension */
 +			/* FIXME */
-+			offset += 6;
++			offset += dissect_om2k_attr_unkn(tvb, offset, 6, iei, tree);
 +			break;
 +		case 0x74: /* ICM Boundary */
 +			/* FIXME */
-+			offset += 5;
++			offset += dissect_om2k_attr_unkn(tvb, offset, 5, iei, tree);
 +			break;
 +		case 0x79: /* Link Supervision Control */
 +			proto_tree_add_item(tree, hf_om2k_lsc_fm, tvb,
@@ -831,7 +970,7 @@
 +		case 0x91: /* Negotiation Record II */
 +			len = tvb_get_guint8(tvb, offset++);
 +			/* FIXME */
-+			offset += len;
++			offset += dissect_om2k_attr_unkn(tvb, offset, len, iei, tree);
 +			break;
 +		case 0x92: /* Encryption Algorithm */
 +			proto_tree_add_item(tree, hf_om2k_ea, tvb,
@@ -843,11 +982,16 @@
 +			break;
 +		case 0x95: /* Dedication information */
 +			/* FIXME */
-+			offset += 3;
++			offset += dissect_om2k_attr_unkn(tvb, offset, 3, iei, tree);
++			break;
++		case 0x98: /* FS Offset */
++			proto_tree_add_item(tree, hf_om2k_tf_fs_offset, tvb,
++					    offset, 5, FALSE);
++			offset += 5;
 +			break;
 +		case 0x9c: /* External Condition Class 2 Extension */
 +			/* FIXME */
-+			offset += 4;
++			offset += dissect_om2k_attr_unkn(tvb, offset, 4, iei, tree);
 +			break;
 +		case 0x9d: /* TSs MO State */
 +			dissect_tss_mo_state(tvb, offset, pinfo, tree);
@@ -868,6 +1012,30 @@
 +	return offset;
 +}
 +
++static guint
++dissect_om2k_mo(tvbuff_t *tvb, gint offset, packet_info *pinfo, proto_tree *tree)
++{
++	proto_item *ti;
++	proto_tree *mo_tree;
++	guint8 class = tvb_get_guint8(tvb, offset);
++	guint8 inst = tvb_get_guint8(tvb, offset+3);
++
++	ti = proto_tree_add_item(tree, hf_om2k_mo_if, tvb, offset,
++				 4, FALSE);
++	mo_tree = proto_item_add_subtree(ti, ett_om2k_mo);
++	proto_tree_add_item(mo_tree, hf_om2k_mo_class, tvb, offset,
++				    1, FALSE);
++	proto_tree_add_item(mo_tree, hf_om2k_mo_instance, tvb, offset+3,
++				    1, FALSE);
++	proto_item_append_text(ti, ", Class: %s, Instance: %u",
++				val_to_str(class, om2k_mo_class_vals, "0x%02x"),
++				inst);
++	col_append_fstr(pinfo->cinfo, COL_INFO, ", (%-4s %u)",
++				val_to_str(class, &om2k_mo_class_short_vals,
++					   "0x%02x"), inst);
++	return 4;
++}
++
 +static void
 +dissect_abis_om2000(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 +{
@@ -881,7 +1049,6 @@
 +	top_tree = tree;
 +	if (tree) {
 +		guint16 msg_code = tvb_get_ntohs(tvb, offset);
-+		guint32 mo_if = tvb_get_ntohl(tvb, offset+2);
 +		guint8 tmp;
 +
 +		ti = proto_tree_add_item(tree, proto_abis_om2000,
@@ -890,18 +1057,16 @@
 +
 +		proto_tree_add_item(om2k_tree, hf_om2k_msg_code, tvb, offset,
 +				    2, FALSE);
-+		col_append_fstr(pinfo->cinfo, COL_INFO, " %08x %s ", mo_if,
-+				val_to_str(msg_code, &om2k_msgcode_vals,
-+					   "unknown 0x%04x"));
-+		proto_item_append_text(ti, ": %08x %s ", mo_if,
-+				val_to_str(msg_code, &om2k_msgcode_vals,
-+					   "unknown 0x%04x"));
 +		offset += 2;
-+		proto_tree_add_item(om2k_tree, hf_om2k_mo_if, tvb, offset,
-+				    4, FALSE);
-+		proto_tree_add_item(om2k_tree, hf_om2k_mo_class, tvb, offset,
-+				    1, FALSE);
-+		offset += 4;
++
++		offset += dissect_om2k_mo(tvb, offset, pinfo, om2k_tree);
++
++		col_append_fstr(pinfo->cinfo, COL_INFO, " %s ",
++				val_to_str(msg_code, &om2k_msgcode_vals,
++					   "unknown 0x%04x"));
++		proto_item_append_text(ti, " %s ",
++				val_to_str(msg_code, &om2k_msgcode_vals,
++					   "unknown 0x%04x"));
 +
 +		switch (msg_code) {
 +		case 0x74: /* Operational Info */
@@ -952,6 +1117,11 @@
 +			  FT_UINT8, BASE_HEX, VALS(om2k_mo_class_vals), 0,
 +			  NULL, HFILL }
 +		},
++		{ &hf_om2k_mo_instance,
++			{ "MO IF Instance", "om2000.mo_if.instance",
++			  FT_UINT8, BASE_DEC, NULL, 0,
++			  NULL, HFILL }
++		},
 +		{ &hf_om2k_oip,
 +			{ "OIP (Operational Info)", "om2000.oip",
 +			  FT_UINT8, BASE_HEX, VALS(om2k_oip_vals), 0,
@@ -1174,10 +1344,16 @@
 +		},
 +
 +		{ &hf_om2k_unknown_tag,
-+			{ "Unknown Tag", "om2000.unknown_tag",
++			{ "Unknown Tag", "om2000.unknown.tag",
 +			  FT_UINT8, BASE_HEX, NULL, 0,
 +			  NULL, HFILL }
 +		},
++		{ &hf_om2k_unknown_val,
++			{ "Unknown Value", "om2000.unknown.val",
++			  FT_BYTES, BASE_NONE, NULL, 0,
++			  NULL, HFILL }
++		},
++
 +		{ &hf_om2k_file_rev,
 +			{ "File Revision", "om2000.file_rev",
 +			  FT_STRING, BASE_NONE, NULL, 0,
@@ -1213,9 +1389,77 @@
 +			  FT_UINT8, BASE_DEC, NULL, 0,
 +			  NULL, HFILL }
 +		},
++		{ &hf_om2k_isl,
++			{ "IS Connection List", "om2000.is_list",
++			  FT_BYTES, BASE_NONE, NULL, 0,
++			  NULL, HFILL }
++		},
++		{ &hf_om2k_isl_icp1,
++			{ "ICP1", "om2000.is_list.icp1",
++			  FT_UINT16, BASE_DEC, NULL, 0x7ff,
++			  NULL, HFILL }
++		},
++		{ &hf_om2k_isl_icp2,
++			{ "ICP2", "om2000.is_list.icp2",
++			  FT_UINT16, BASE_DEC, NULL, 0x7ff,
++			  NULL, HFILL }
++		},
++		{ &hf_om2k_isl_ci,
++			{ "Contiguity Index", "om2000.is_list.ci",
++			  FT_UINT8, BASE_DEC, NULL, 0,
++			  NULL, HFILL }
++		},
++		{ &hf_om2k_conl,
++			{ "Connection List", "om2000.con_list",
++			  FT_BYTES, BASE_NONE, NULL, 0,
++			  NULL, HFILL }
++		},
++		{ &hf_om2k_conl_nr_cgs,
++			{ "Number of CGs", "om2000.con_list.nr_cgs",
++			  FT_UINT8, BASE_DEC, NULL, 0x1f,
++			  "Number of Concentration Groups in the DE", HFILL }
++		},
++		{ &hf_om2k_conl_nr_cps_cg,
++			{ "Number of CPS in CG", "om2000.con_list.nr_cps_cg",
++			  FT_UINT8, BASE_DEC, NULL, 0x1f,
++			  "Number of CPS in Concentration Group", HFILL }
++		},
++		{ &hf_om2k_conl_ccp,
++			{ "CON Connection Point", "om2000.con_list.cpp",
++			  FT_UINT16, BASE_DEC, NULL, 0x3ff,
++			  NULL, HFILL }
++		},
++		{ &hf_om2k_conl_ci,
++			{ "Contiguity Index", "om2000.con_list.ci",
++			  FT_UINT8, BASE_DEC, NULL, 0x7,
++			  NULL, HFILL }
++		},
++		{ &hf_om2k_conl_tag,
++			{ "Tag", "om2000.con_list.tag",
++			  FT_UINT8, BASE_DEC, NULL, 0x1f,
++			  NULL, HFILL }
++		},
++		{ &hf_om2k_conl_tei,
++			{ "TEI", "om2000.con_list.tei",
++			  FT_UINT8, BASE_DEC, NULL, 0,
++			  NULL, HFILL }
++		},
++		{ &hf_om2k_tf_mode,
++			{ "TF Mode", "om2000.tf_mode",
++			  FT_UINT8, BASE_HEX, VALS(om2k_tf_mode_vals), 0,
++			  NULL, HFILL }
++		},
++		{ &hf_om2k_tf_fs_offset,
++			{ "TF FS Offset", "om2000.tf_fs_offset",
++			  FT_UINT64, BASE_DEC, NULL, 0,
++			  NULL, HFILL }
++		},
 +	};
 +	static gint *ett[] = {
 +		&ett_om2000,
++		&ett_om2k_mo,
++		&ett_om2k_isl,
++		&ett_om2k_conl,
 +	};
 +
 +	module_t *oml_module;
@@ -1328,7 +1572,7 @@
 ===================================================================
 --- /dev/null
 +++ wireshark/epan/dissectors/packet-ehdlc.c
-@@ -0,0 +1,301 @@
+@@ -0,0 +1,319 @@
 +/* packet-ehdlc.c
 + * Routines for packet dissection of Ericsson HDLC as used in A-bis over IP
 + * Copyright 2010 by Harald Welte <laforge@gnumonks.org>
@@ -1372,6 +1616,7 @@
 +static int hf_ehdlc_sapi = -1;
 +static int hf_ehdlc_c_r = -1;
 +
++static int hf_ehdlc_xid_payload = -1;
 +static int hf_ehdlc_control = -1;
 +
 +static int hf_ehdlc_p = -1;
@@ -1509,6 +1754,18 @@
 +				call_dissector(sub_handles[SUB_DATA], next_tvb, pinfo, tree);
 +				break;
 +			}
++		} else if (control == XDLC_U | XDLC_XID) {
++			/* XID is formatted like ISO 8885, typically we see
++ 			 * something like
++			 * 82		format identifier
++			 * 80		group identifier
++			 * 00 09 	length
++			 * 07 01 05 	Window Size Tx
++			 * 09 01 04	Ack Timer (msec)
++			 * 08 01 05	Window Size Rx */
++			proto_tree_add_item(ehdlc_tree, hf_ehdlc_xid_payload,
++					    tvb, offset+header_length,
++					    len-header_length, FALSE);
 +		}
 +
 +		offset += len;
@@ -1538,6 +1795,11 @@
 +		    FT_UINT8, BASE_HEX, NULL, 0x20,
 +		    NULL, HFILL }
 +		},
++		{ &hf_ehdlc_xid_payload,
++		  { "XID Payload", "ehdlc.xid_payload",
++		    FT_BYTES, BASE_NONE, NULL, 0,
++		    NULL, HFILL }
++		},
 +		{ &hf_ehdlc_control,
 +		  { "Control Field", "ehdlc.control",
 +		    FT_UINT16, BASE_HEX, NULL, 0,