mirror of
https://gitea.osmocom.org/cellular-infrastructure/osmo-mgw.git
synced 2025-11-02 21:13:44 +00:00
Add a short README mentioning the svn version they apply to, how to rebase them in the future, and what they do. The renaming is done to add a hint on in which order to apply them. The abis_oml patch has been updated to some value_string changes in epan, all patches now add the new files to the CMakeLists.txt of epan as well.
1930 lines
57 KiB
Diff
1930 lines
57 KiB
Diff
From 6254ee454147eab6f6a51792544716472e20073f Mon Sep 17 00:00:00 2001
|
|
From: Holger Hans Peter Freyther <zecke@selfish.org>
|
|
Date: Tue, 11 Jan 2011 15:09:18 +0100
|
|
Subject: [PATCH 2/4] ericsson_rbs2409
|
|
|
|
Add Ericsson RBS2409 dissector
|
|
---
|
|
epan/CMakeLists.txt | 2 +
|
|
epan/dissectors/Makefile.common | 2 +
|
|
epan/dissectors/packet-ehdlc.c | 319 +++++++
|
|
epan/dissectors/packet-gsm_abis_om2000.c | 1439 ++++++++++++++++++++++++++++++
|
|
epan/dissectors/packet-gsm_abis_oml.c | 21 +
|
|
epan/dissectors/packet-l2tp.c | 7 +
|
|
6 files changed, 1790 insertions(+), 0 deletions(-)
|
|
create mode 100644 epan/dissectors/packet-ehdlc.c
|
|
create mode 100644 epan/dissectors/packet-gsm_abis_om2000.c
|
|
|
|
diff --git a/epan/CMakeLists.txt b/epan/CMakeLists.txt
|
|
index 0b09335..9217ec0 100644
|
|
--- a/epan/CMakeLists.txt
|
|
+++ b/epan/CMakeLists.txt
|
|
@@ -184,6 +184,8 @@ set(DIRTY_PIDL_DISSECTOR_SRC
|
|
dissectors/packet-dcerpc-eventlog.c
|
|
dissectors/packet-dcerpc-lsa.c
|
|
dissectors/packet-dcerpc-winreg.c
|
|
+ dissectors/packet-ehdlc.c
|
|
+ dissectors/packet-gsm_abis_om2000.c
|
|
)
|
|
set(ASN1_DISSECTOR_SRC
|
|
dissectors/packet-acp133.c
|
|
diff --git a/epan/dissectors/Makefile.common b/epan/dissectors/Makefile.common
|
|
index 7ce83b6..4c7094b 100644
|
|
--- a/epan/dissectors/Makefile.common
|
|
+++ b/epan/dissectors/Makefile.common
|
|
@@ -67,6 +67,8 @@ DIRTY_PIDL_DISSECTOR_SRC = \
|
|
packet-dcerpc-dnsserver.c \
|
|
packet-dcerpc-eventlog.c \
|
|
packet-dcerpc-lsa.c \
|
|
+ packet-ehdlc.c \
|
|
+ packet-gsm_abis_om2000.c \
|
|
packet-dcerpc-winreg.c
|
|
|
|
#
|
|
diff --git a/epan/dissectors/packet-ehdlc.c b/epan/dissectors/packet-ehdlc.c
|
|
new file mode 100644
|
|
index 0000000..40bb3ab
|
|
--- /dev/null
|
|
+++ b/epan/dissectors/packet-ehdlc.c
|
|
@@ -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>
|
|
+ *
|
|
+ * $Id: packet-ehdlc.c 33767 2010-08-11 11:59:47Z etxrab $
|
|
+ *
|
|
+ * Wireshark - Network traffic analyzer
|
|
+ * By Gerald Combs <gerald@wireshark.org>
|
|
+ * Copyright 1998 Gerald Combs
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License
|
|
+ * as published by the Free Software Foundation; either version 2
|
|
+ * of the License, or (at your option) any later version.
|
|
+ *
|
|
+ * This program is distributed in the hope that it will be useful,
|
|
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
+ * GNU General Public License for more details.
|
|
+ *
|
|
+ * You should have received a copy of the GNU General Public License
|
|
+ * along with this program; if not, write to the Free Software
|
|
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
+ */
|
|
+
|
|
+#ifdef HAVE_CONFIG_H
|
|
+# include "config.h"
|
|
+#endif
|
|
+
|
|
+#include <glib.h>
|
|
+
|
|
+#include <epan/packet.h>
|
|
+#include <epan/ipproto.h>
|
|
+#include <epan/xdlc.h>
|
|
+
|
|
+/* Initialize the protocol and registered fields */
|
|
+static int proto_ehdlc = -1;
|
|
+
|
|
+static int hf_ehdlc_data_len = -1;
|
|
+static int hf_ehdlc_protocol = -1;
|
|
+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;
|
|
+static int hf_ehdlc_f = -1;
|
|
+static int hf_ehdlc_u_modifier_cmd = -1;
|
|
+static int hf_ehdlc_u_modifier_resp = -1;
|
|
+static int hf_ehdlc_ftype_s_u = -1;
|
|
+
|
|
+static int hf_ehdlc_n_r = -1;
|
|
+static int hf_ehdlc_n_s = -1;
|
|
+static int hf_ehdlc_p_ext = -1;
|
|
+static int hf_ehdlc_f_ext = -1;
|
|
+static int hf_ehdlc_s_ftype = -1;
|
|
+static int hf_ehdlc_ftype_i = -1;
|
|
+static int hf_ehdlc_ftype_s_u_ext = -1;
|
|
+
|
|
+/* Used only for U frames */
|
|
+static const xdlc_cf_items ehdlc_cf_items = {
|
|
+ NULL,
|
|
+ NULL,
|
|
+ &hf_ehdlc_p,
|
|
+ &hf_ehdlc_f,
|
|
+ NULL,
|
|
+ &hf_ehdlc_u_modifier_cmd,
|
|
+ &hf_ehdlc_u_modifier_resp,
|
|
+ NULL,
|
|
+ &hf_ehdlc_ftype_s_u
|
|
+};
|
|
+
|
|
+/* Used only for I and S frames */
|
|
+static const xdlc_cf_items ehdlc_cf_items_ext = {
|
|
+ &hf_ehdlc_n_r,
|
|
+ &hf_ehdlc_n_s,
|
|
+ &hf_ehdlc_p_ext,
|
|
+ &hf_ehdlc_f_ext,
|
|
+ &hf_ehdlc_s_ftype,
|
|
+ NULL,
|
|
+ NULL,
|
|
+ &hf_ehdlc_ftype_i,
|
|
+ &hf_ehdlc_ftype_s_u_ext,
|
|
+};
|
|
+
|
|
+/* Initialize the subtree pointers */
|
|
+static gint ett_ehdlc = -1;
|
|
+static gint ett_ehdlc_control = -1;
|
|
+
|
|
+static const value_string ehdlc_protocol_vals[] = {
|
|
+ { 0x20, "RSL" },
|
|
+ { 0xa0, "ACK" },
|
|
+ { 0xc0, "OML" },
|
|
+ { 0, NULL }
|
|
+};
|
|
+
|
|
+enum {
|
|
+ SUB_RSL,
|
|
+ SUB_OML,
|
|
+ SUB_DATA,
|
|
+
|
|
+ SUB_MAX
|
|
+};
|
|
+
|
|
+static dissector_handle_t sub_handles[SUB_MAX];
|
|
+
|
|
+/* Code to actually dissect the packets */
|
|
+static void
|
|
+dissect_ehdlc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
|
+{
|
|
+ gint remaining;
|
|
+ int offset = 4;
|
|
+
|
|
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "EHDLC");
|
|
+ col_clear(pinfo->cinfo, COL_INFO);
|
|
+
|
|
+ while ((remaining = tvb_reported_length_remaining(tvb, offset)) > 0) {
|
|
+ proto_item *ti = NULL;
|
|
+ proto_tree *ehdlc_tree = NULL;
|
|
+ guint16 len, msg_type;
|
|
+ tvbuff_t *next_tvb;
|
|
+ guint16 control;
|
|
+ gboolean is_response = 0, is_extended = TRUE;
|
|
+ gint header_length = 2; /* Address + Length field */
|
|
+
|
|
+ msg_type = tvb_get_guint8(tvb, offset);
|
|
+ len = tvb_get_guint8(tvb, offset+1);
|
|
+#if 0
|
|
+ col_append_fstr(pinfo->cinfo, COL_INFO, "%s ",
|
|
+ val_to_str(msg_type, ehdlc_protocol_vals,
|
|
+ "unknown 0x%02x"));
|
|
+#endif
|
|
+ if (tree) {
|
|
+ ti = proto_tree_add_protocol_format(tree, proto_ehdlc,
|
|
+ tvb, offset, len,
|
|
+ "Ericsson HDLC protocol, type: %s",
|
|
+ val_to_str(msg_type, ehdlc_protocol_vals,
|
|
+ "unknown 0x%02x"));
|
|
+ ehdlc_tree = proto_item_add_subtree(ti, ett_ehdlc);
|
|
+ proto_tree_add_item(ehdlc_tree, hf_ehdlc_protocol,
|
|
+ tvb, offset, 1, FALSE);
|
|
+#if 0
|
|
+ proto_tree_add_item(ehdlc_tree, hf_ehdlc_sapi,
|
|
+ tvb, offset, 1, FALSE);
|
|
+ proto_tree_add_item(ehdlc_tree, hf_ehdlc_c_r,
|
|
+ tvb, offset, 1, FALSE);
|
|
+#endif
|
|
+ proto_tree_add_item(ehdlc_tree, hf_ehdlc_data_len,
|
|
+ tvb, offset+1, 1, FALSE);
|
|
+ }
|
|
+
|
|
+ control = dissect_xdlc_control(tvb, offset+2, pinfo, ehdlc_tree, hf_ehdlc_control,
|
|
+ ett_ehdlc_control, &ehdlc_cf_items, &ehdlc_cf_items_ext,
|
|
+ NULL, NULL, is_response, is_extended, FALSE);
|
|
+ header_length += XDLC_CONTROL_LEN(control, is_extended);
|
|
+
|
|
+ if (XDLC_IS_INFORMATION(control)) {
|
|
+ next_tvb = tvb_new_subset(tvb, offset+header_length,
|
|
+ len-header_length, len);
|
|
+
|
|
+ switch (msg_type) {
|
|
+ case 0x20:
|
|
+ /* len == 4 seems to be some kind of ACK */
|
|
+ if (len <= 4)
|
|
+ break;
|
|
+ call_dissector(sub_handles[SUB_RSL], next_tvb, pinfo, tree);
|
|
+ break;
|
|
+ case 0xbc:
|
|
+ case 0xdc:
|
|
+ case 0xa0:
|
|
+ case 0xc0:
|
|
+ /* len == 4 seems to be some kind of ACK */
|
|
+ if (len <= 4)
|
|
+ break;
|
|
+ call_dissector(sub_handles[SUB_OML], next_tvb, pinfo, tree);
|
|
+ break;
|
|
+ default:
|
|
+ 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;
|
|
+ }
|
|
+}
|
|
+
|
|
+void proto_register_ehdlc(void)
|
|
+{
|
|
+ static hf_register_info hf[] = {
|
|
+ { &hf_ehdlc_data_len,
|
|
+ { "DataLen", "ehdlc.data_len",
|
|
+ FT_UINT8, BASE_DEC, NULL, 0x0,
|
|
+ "The length of the data (in bytes)", HFILL }
|
|
+ },
|
|
+ { &hf_ehdlc_protocol,
|
|
+ { "Protocol", "ehdlc.protocol",
|
|
+ FT_UINT8, BASE_HEX, VALS(ehdlc_protocol_vals), 0x0,
|
|
+ "The HDLC Sub-Protocol", HFILL }
|
|
+ },
|
|
+ { &hf_ehdlc_sapi,
|
|
+ { "SAPI", "ehdlc.sapi",
|
|
+ FT_UINT8, BASE_DEC, NULL, 0x1f,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_ehdlc_c_r,
|
|
+ { "C/R", "ehdlc.c_r",
|
|
+ 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,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_ehdlc_n_r,
|
|
+ { "N(R)", "ehdlc.control.n_r",
|
|
+ FT_UINT16, BASE_DEC, NULL, XDLC_N_R_EXT_MASK,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_ehdlc_n_s,
|
|
+ { "N(S)", "ehdlc.control.n_s",
|
|
+ FT_UINT16, BASE_DEC, NULL, XDLC_N_S_EXT_MASK,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_ehdlc_p,
|
|
+ { "Poll", "ehdlc.control.p",
|
|
+ FT_BOOLEAN, 8, TFS(&tfs_set_notset), XDLC_P_F,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_ehdlc_p_ext,
|
|
+ { "Poll", "ehdlc.control.p",
|
|
+ FT_BOOLEAN, 16, TFS(&tfs_set_notset), XDLC_P_F_EXT,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_ehdlc_f,
|
|
+ { "Final", "ehdlc.control.f",
|
|
+ FT_BOOLEAN, 8, TFS(&tfs_set_notset), XDLC_P_F,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_ehdlc_f_ext,
|
|
+ { "Final", "ehdlc.control.f",
|
|
+ FT_BOOLEAN, 16, TFS(&tfs_set_notset), XDLC_P_F_EXT,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_ehdlc_s_ftype,
|
|
+ { "Supervisory frame type", "ehdlc.control.s_ftype",
|
|
+ FT_UINT16, BASE_HEX, VALS(stype_vals), XDLC_S_FTYPE_MASK,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_ehdlc_u_modifier_cmd,
|
|
+ { "Command", "ehdlc.control.u_modifier_cmd",
|
|
+ FT_UINT8, BASE_HEX, VALS(modifier_vals_cmd), XDLC_U_MODIFIER_MASK,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_ehdlc_u_modifier_resp,
|
|
+ { "Response", "ehdlc.control.u_modifier_resp",
|
|
+ FT_UINT8, BASE_HEX, VALS(modifier_vals_resp), XDLC_U_MODIFIER_MASK,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_ehdlc_ftype_i,
|
|
+ { "Frame Type", "ehdlc.control.ftype",
|
|
+ FT_UINT16, BASE_HEX, VALS(ftype_vals), XDLC_I_MASK,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_ehdlc_ftype_s_u,
|
|
+ { "Frame Type", "ehdlc.control.ftype",
|
|
+ FT_UINT8, BASE_HEX, VALS(ftype_vals), XDLC_S_U_MASK,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_ehdlc_ftype_s_u_ext,
|
|
+ { "Frame Type", "ehdlc.control.ftype",
|
|
+ FT_UINT16, BASE_HEX, VALS(ftype_vals), XDLC_S_U_MASK,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ };
|
|
+
|
|
+ static gint *ett[] = {
|
|
+ &ett_ehdlc,
|
|
+ &ett_ehdlc_control,
|
|
+ };
|
|
+
|
|
+ proto_ehdlc =
|
|
+ proto_register_protocol("Ericsson HDLC",
|
|
+ "Ericsson HDLC as used in A-bis over IP", "ehdlc");
|
|
+
|
|
+ proto_register_field_array(proto_ehdlc, hf, array_length(hf));
|
|
+ proto_register_subtree_array(ett, array_length(ett));
|
|
+
|
|
+ register_dissector("ehdlc", dissect_ehdlc, proto_ehdlc);
|
|
+}
|
|
+
|
|
+void proto_reg_handoff_ehdlc(void)
|
|
+{
|
|
+ dissector_handle_t ehdlc_handle;
|
|
+
|
|
+ sub_handles[SUB_RSL] = find_dissector("gsm_abis_rsl");
|
|
+ sub_handles[SUB_OML] = find_dissector("gsm_abis_oml");
|
|
+ sub_handles[SUB_DATA] = find_dissector("data");
|
|
+
|
|
+ ehdlc_handle = create_dissector_handle(dissect_ehdlc, proto_ehdlc);
|
|
+}
|
|
diff --git a/epan/dissectors/packet-gsm_abis_om2000.c b/epan/dissectors/packet-gsm_abis_om2000.c
|
|
new file mode 100644
|
|
index 0000000..bf67aea
|
|
--- /dev/null
|
|
+++ b/epan/dissectors/packet-gsm_abis_om2000.c
|
|
@@ -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>
|
|
+ *
|
|
+ * $Id$
|
|
+ *
|
|
+ * Wireshark - Network traffic analyzer
|
|
+ * By Gerald Combs <gerald@wireshark.org>
|
|
+ * Copyright 1998 Gerald Combs
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License
|
|
+ * as published by the Free Software Foundation; either version 2
|
|
+ * of the License, or (at your option) any later version.
|
|
+ *
|
|
+ * This program is distributed in the hope that it will be useful,
|
|
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
+ * GNU General Public License for more details.
|
|
+ *
|
|
+ * You should have received a copy of the GNU General Public License
|
|
+ * along with this program; if not, write to the Free Software
|
|
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
+ */
|
|
+
|
|
+#ifdef HAVE_CONFIG_H
|
|
+# include "config.h"
|
|
+#endif
|
|
+
|
|
+#include <glib.h>
|
|
+
|
|
+#include <epan/packet.h>
|
|
+#include <epan/emem.h>
|
|
+#include <epan/lapd_sapi.h>
|
|
+#include <epan/prefs.h>
|
|
+
|
|
+#include "packet-gsm_abis_oml.h"
|
|
+#include "packet-gsm_a_common.h"
|
|
+
|
|
+#include <stdio.h>
|
|
+
|
|
+/* initialize the protocol and registered fields */
|
|
+static int proto_abis_om2000 = -1;
|
|
+
|
|
+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;
|
|
+static int hf_om2k_comb = -1;
|
|
+static int hf_om2k_ts = -1;
|
|
+static int hf_om2k_hsn = -1;
|
|
+static int hf_om2k_maio = -1;
|
|
+static int hf_om2k_bsic = -1;
|
|
+static int hf_om2k_diversity = -1;
|
|
+static int hf_om2k_fn_offs = -1;
|
|
+static int hf_om2k_ext_range = -1;
|
|
+static int hf_om2k_irc = -1;
|
|
+static int hf_om2k_bs_pa_mfrms = -1;
|
|
+static int hf_om2k_bs_ag_blks_res= -1;
|
|
+static int hf_om2k_drx_dev_max = -1;
|
|
+static int hf_om2k_cr = -1;
|
|
+static int hf_om2k_ipt3 = -1;
|
|
+static int hf_om2k_aop = -1;
|
|
+static int hf_om2k_t3105 = -1;
|
|
+static int hf_om2k_ny1 = -1;
|
|
+static int hf_om2k_cbi = -1;
|
|
+static int hf_om2k_tsc = -1;
|
|
+static int hf_om2k_icm = -1;
|
|
+static int hf_om2k_tta = -1;
|
|
+static int hf_om2k_icm_cr = -1;
|
|
+static int hf_om2k_lsc_fm = -1;
|
|
+static int hf_om2k_lsc_lsi = -1;
|
|
+static int hf_om2k_lsc_lsa = -1;
|
|
+static int hf_om2k_ls_ft = -1;
|
|
+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;
|
|
+static int hf_om2k_mo_state = -1;
|
|
+static int hf_om2k_la_state = -1;
|
|
+static int hf_om2k_tsn_state = -1;
|
|
+static int hf_om2k_bts_manuf = -1;
|
|
+static int hf_om2k_bts_gen = -1;
|
|
+static int hf_om2k_bts_rev = -1;
|
|
+static int hf_om2k_bts_var = -1;
|
|
+static int hf_om2k_brr = -1;
|
|
+static int hf_om2k_bfr = -1;
|
|
+static int hf_om2k_hwinfo_sig = -1;
|
|
+static int hf_om2k_capa_sig = -1;
|
|
+static int hf_om2k_file_rev = -1;
|
|
+static int hf_om2k_filerel_ilr = -1;
|
|
+static int hf_om2k_filerel_cur = -1;
|
|
+static int hf_om2k_filerel_other = -1;
|
|
+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;
|
|
+
|
|
+static const value_string om2k_msgcode_vals[] = {
|
|
+ { 0x0000, "Abort SP Command" },
|
|
+ { 0x0002, "Abort SP Complete" },
|
|
+ { 0x0004, "Alarm Report ACK" },
|
|
+ { 0x0005, "Alarm Report NACK" },
|
|
+ { 0x0006, "Alarm Report" },
|
|
+ { 0x0008, "Alarm Status Request" },
|
|
+ { 0x000a, "Alarm Status Request Accept" },
|
|
+ { 0x000b, "Alarm Status Request Reject" },
|
|
+ { 0x000c, "Alarm Status Result ACK" },
|
|
+ { 0x000d, "Alarm Status Result NACK" },
|
|
+ { 0x000e, "Alarm Status Result" },
|
|
+ { 0x0010, "Calendar Time Response" },
|
|
+ { 0x0011, "Calendar Time Reject" },
|
|
+ { 0x0012, "Calendar Time Request" },
|
|
+ { 0x0014, "CON Configuration Request" },
|
|
+ { 0x0016, "CON Configuration Request Accept" },
|
|
+ { 0x0017, "CON Configuration Request Reject" },
|
|
+ { 0x0018, "CON Configuration Result ACK" },
|
|
+ { 0x0019, "CON Configuration Result NACK" },
|
|
+ { 0x001a, "CON Configuration Result" },
|
|
+ { 0x001c, "Connect Command" },
|
|
+ { 0x001e, "Connect Complete" },
|
|
+ { 0x001f, "Connect Rejecte" },
|
|
+ { 0x0028, "Disable Request" },
|
|
+ { 0x002a, "Disable Request Accept" },
|
|
+ { 0x002b, "Disable Request Reject" },
|
|
+ { 0x002c, "Disable Result ACK" },
|
|
+ { 0x002d, "Disable Result NACK" },
|
|
+ { 0x002e, "Disable Result" },
|
|
+ { 0x0030, "Disconnect Command" },
|
|
+ { 0x0032, "Disconnect Complete" },
|
|
+ { 0x0033, "Disconnect Reject" },
|
|
+ { 0x0034, "Enable Request" },
|
|
+ { 0x0036, "Enable Request Accept" },
|
|
+ { 0x0037, "Enable Request Reject" },
|
|
+ { 0x0038, "Enable Result ACK" },
|
|
+ { 0x0039, "Enable Result NACK" },
|
|
+ { 0x003a, "Enable Result" },
|
|
+ { 0x003c, "Escape Downlink Normal" },
|
|
+ { 0x003d, "Escape Downlink NACK" },
|
|
+ { 0x003e, "Escape Uplink Normal" },
|
|
+ { 0x003f, "Escape Uplink NACK" },
|
|
+ { 0x0040, "Fault Report ACK" },
|
|
+ { 0x0041, "Fault Report NACK" },
|
|
+ { 0x0042, "Fault Report" },
|
|
+ { 0x0044, "File Package End Command" },
|
|
+ { 0x0046, "File Package End Result" },
|
|
+ { 0x0047, "File Package End Reject" },
|
|
+ { 0x0048, "File Relation Request" },
|
|
+ { 0x004a, "File Relation Response" },
|
|
+ { 0x004b, "File Relation Request Reject" },
|
|
+ { 0x004c, "File Segment Transfer" },
|
|
+ { 0x004e, "File Segment Transfer Complete" },
|
|
+ { 0x004f, "File Segment Transfer Reject" },
|
|
+ { 0x0050, "HW Information Request" },
|
|
+ { 0x0052, "HW Information Request Accept" },
|
|
+ { 0x0053, "HW Information Request Reject" },
|
|
+ { 0x0054, "HW Information Result ACK" },
|
|
+ { 0x0055, "HW Information Result NACK" },
|
|
+ { 0x0056, "HW Information Result" },
|
|
+ { 0x0060, "IS Configuration Request" },
|
|
+ { 0x0062, "IS Configuration Request Accept" },
|
|
+ { 0x0063, "IS Configuration Request Reject" },
|
|
+ { 0x0064, "IS Configuration Result ACK" },
|
|
+ { 0x0065, "IS Configuration Result NACK" },
|
|
+ { 0x0066, "IS Configuration Result" },
|
|
+ { 0x0068, "Load Data End" },
|
|
+ { 0x006a, "Load Data End Result" },
|
|
+ { 0x006b, "Load Data End Reject" },
|
|
+ { 0x006c, "Load Data Init" },
|
|
+ { 0x006e, "Load Data Init Accept" },
|
|
+ { 0x006f, "Load Data Init Reject" },
|
|
+ { 0x0070, "Loop Control Command" },
|
|
+ { 0x0072, "Loop Control Complete" },
|
|
+ { 0x0073, "Loop Control Reject" },
|
|
+ { 0x0074, "Operational Information" },
|
|
+ { 0x0076, "Operational Information Accept" },
|
|
+ { 0x0077, "Operational Information Reject" },
|
|
+ { 0x0078, "Reset Command" },
|
|
+ { 0x007a, "Reset Complete" },
|
|
+ { 0x007b, "Reset Reject" },
|
|
+ { 0x007c, "RX Configuration Request" },
|
|
+ { 0x007e, "RX Configuration Request Accept" },
|
|
+ { 0x007f, "RX Configuration Request Reject" },
|
|
+ { 0x0080, "RX Configuration Result ACK" },
|
|
+ { 0x0081, "RX Configuration Result NACK" },
|
|
+ { 0x0082, "RX Configuration Result" },
|
|
+ { 0x0084, "Start Request" },
|
|
+ { 0x0086, "Start Request Accept" },
|
|
+ { 0x0087, "Start Request Reject" },
|
|
+ { 0x0088, "Start Result ACK" },
|
|
+ { 0x0089, "Start Result NACK" },
|
|
+ { 0x008a, "Start Result" },
|
|
+ { 0x008c, "Status Request" },
|
|
+ { 0x008e, "Status Response" },
|
|
+ { 0x008f, "Status Reject" },
|
|
+ { 0x0094, "Test Request" },
|
|
+ { 0x0096, "Test Request Accept" },
|
|
+ { 0x0097, "Test Request Reject" },
|
|
+ { 0x0098, "Test Result ACK" },
|
|
+ { 0x0099, "Test Result NACK" },
|
|
+ { 0x009a, "Test Result" },
|
|
+ { 0x00a0, "TF Configuration Request" },
|
|
+ { 0x00a2, "TF Configuration Request Accept" },
|
|
+ { 0x00a3, "TF Configuration Request Reject" },
|
|
+ { 0x00a4, "TF Configuration Result ACK" },
|
|
+ { 0x00a5, "TF Configuration Result NACK" },
|
|
+ { 0x00a6, "TF Configuration Result" },
|
|
+ { 0x00a8, "TS Configuration Request" },
|
|
+ { 0x00aa, "TS Configuration Request Accept" },
|
|
+ { 0x00ab, "TS Configuration Request Reject" },
|
|
+ { 0x00ac, "TS Configuration Result ACK" },
|
|
+ { 0x00ad, "TS Configuration Result NACK" },
|
|
+ { 0x00ae, "TS Configuration Result" },
|
|
+ { 0x00b0, "TX Configuration Request" },
|
|
+ { 0x00b2, "TX Configuration Request Accept" },
|
|
+ { 0x00b3, "TX Configuration Request Reject" },
|
|
+ { 0x00b4, "TX Configuration Result ACK" },
|
|
+ { 0x00b5, "TX Configuration Result NACK" },
|
|
+ { 0x00b6, "TX Configuration Result" },
|
|
+ { 0x00bc, "DIP Alarm Report ACK" },
|
|
+ { 0x00bd, "DIP Alarm Report NACK" },
|
|
+ { 0x00be, "DIP Alarm Report" },
|
|
+ { 0x00c0, "DIP Alarm Status Request" },
|
|
+ { 0x00c2, "DIP Alarm Status Response" },
|
|
+ { 0x00c3, "DIP Alarm Status Reject" },
|
|
+ { 0x00c4, "DIP Quality Report I ACK" },
|
|
+ { 0x00c5, "DIP Quality Report I NACK" },
|
|
+ { 0x00c6, "DIP Quality Report I" },
|
|
+ { 0x00c8, "DIP Quality Report II ACK" },
|
|
+ { 0x00c9, "DIP Quality Report II NACK" },
|
|
+ { 0x00ca, "DIP Quality Report II" },
|
|
+ { 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" },
|
|
+ { 0x0108, "BTS Initiated Request ACK" },
|
|
+ { 0x0109, "BTS Initiated Request NACK" },
|
|
+ { 0x010a, "BTS Initiated Request" },
|
|
+ { 0x010c, "Radio Channels Release Command" },
|
|
+ { 0x010e, "Radio Channels Release Complete" },
|
|
+ { 0x010f, "Radio Channels Release Reject" },
|
|
+ { 0x0118, "Feature Control Command" },
|
|
+ { 0x011a, "Feature Control Complete" },
|
|
+ { 0x011b, "Feature Control Reject" },
|
|
+
|
|
+ { 0, NULL }
|
|
+};
|
|
+
|
|
+/* TS 12.21 Section 9.4: Attributes */
|
|
+static const value_string om2k_attr_vals[] = {
|
|
+ { 0x00, "Accordance indication" },
|
|
+ { 0x01, "Alarm Id" },
|
|
+ { 0x02, "Alarm Data" },
|
|
+ { 0x03, "Alarm Severity" },
|
|
+ { 0x04, "Alarm Status" },
|
|
+ { 0x05, "Alarm Status Type" },
|
|
+ { 0x06, "BCC" },
|
|
+ { 0x07, "BS_AG_BKS_RES" },
|
|
+ { 0x09, "BSIC" },
|
|
+ { 0x0a, "BA_PA_MFRMS" },
|
|
+ { 0x0b, "CBCH Indicator" },
|
|
+ { 0x0c, "CCCH Options" },
|
|
+ { 0x0d, "Calendar Time" },
|
|
+ { 0x0f, "Channel Combination" },
|
|
+ { 0x10, "CON Connection List" },
|
|
+ { 0x11, "Data End Indication" },
|
|
+ { 0x12, "DRX_DEV_MAX" },
|
|
+ { 0x13, "End List Number" },
|
|
+ { 0x14, "External Condition Map Class 1" },
|
|
+ { 0x15, "External Condition Map Class 2" },
|
|
+ { 0x16, "File Relation Indication" },
|
|
+ { 0x17, "File Revision" },
|
|
+ { 0x18, "File Segment Data" },
|
|
+ { 0x19, "File Segment Length" },
|
|
+ { 0x1a, "File Segment Sequence Number" },
|
|
+ { 0x1b, "File Size" },
|
|
+ { 0x1c, "Filling Marker" },
|
|
+ { 0x1d, "FN Offset" },
|
|
+ { 0x1e, "Frequency List" },
|
|
+ { 0x1f, "Frequency Specifier RX" },
|
|
+ { 0x20, "Frequency Specifier TX" },
|
|
+ { 0x21, "HSN" },
|
|
+ { 0x22, "ICM Indicator" },
|
|
+ { 0x23, "Internal Fault Map Class 1A" },
|
|
+ { 0x24, "Internal Fault Map Class 1B" },
|
|
+ { 0x25, "Internal Fault Map Class 2A" },
|
|
+ { 0x26, "Internal Fault Map Class 2A Extension" },
|
|
+ { 0x27, "IS Connection List" },
|
|
+ { 0x28, "List Number" },
|
|
+ { 0x29, "File Package State Indication" },
|
|
+ { 0x2a, "Local Access State" },
|
|
+ { 0x2b, "MAIO" },
|
|
+ { 0x2c, "MO State" },
|
|
+ { 0x2d, "Ny1" },
|
|
+ { 0x2e, "Operational Information" },
|
|
+ { 0x2f, "Power" },
|
|
+ { 0x30, "RU Position Data" },
|
|
+ { 0x31, "Protocol Error" },
|
|
+ { 0x32, "Reason Code" },
|
|
+ { 0x33, "Receiver Diversity" },
|
|
+ { 0x34, "Replacement Unit Map" },
|
|
+ { 0x35, "Result Code" },
|
|
+ { 0x36, "RU Revision Data" },
|
|
+ { 0x38, "T3105" },
|
|
+ { 0x39, "Test Loop Setting" },
|
|
+ { 0x3a, "TF Mode" },
|
|
+ { 0x3b, "TF Compensation Value" },
|
|
+ { 0x3c, "Time Slot Number" },
|
|
+ { 0x3d, "TSC" },
|
|
+ { 0x3e, "RU Logical Id" },
|
|
+ { 0x3f, "RU Serial Number Data" },
|
|
+ { 0x40, "BTS Version" },
|
|
+ { 0x41, "OML IWD Version" },
|
|
+ { 0x42, "RWL IWD Version" },
|
|
+ { 0x43, "OML Function Map 1" },
|
|
+ { 0x44, "OML Function Map 2" },
|
|
+ { 0x45, "RSL Function Map 1" },
|
|
+ { 0x46, "RSL Function Map 2" },
|
|
+ { 0x47, "Extended Range Indicator" },
|
|
+ { 0x48, "Request Indicators" },
|
|
+ { 0x49, "DIP Alarm Condition Map" },
|
|
+ { 0x4a, "ES Incoming" },
|
|
+ { 0x4b, "ES Outgoing" },
|
|
+ { 0x4e, "SES Incoming" },
|
|
+ { 0x4f, "SES Outgoing" },
|
|
+ { 0x50, "Replacement Unit Map Extension" },
|
|
+ { 0x52, "UAS Incoming" },
|
|
+ { 0x53, "UAS Outgoing" },
|
|
+ { 0x58, "DF Incoming" },
|
|
+ { 0x5a, "DF Outgoing" },
|
|
+ { 0x5c, "SF" },
|
|
+ { 0x60, "S Bits Setting" },
|
|
+ { 0x61, "CRC-4 Use Option" },
|
|
+ { 0x62, "T Parameter" },
|
|
+ { 0x63, "N Parameter" },
|
|
+ { 0x64, "N1 Parameter" },
|
|
+ { 0x65, "N3 Parameter" },
|
|
+ { 0x66, "N4 Parameter" },
|
|
+ { 0x67, "P Parameter" },
|
|
+ { 0x68, "Q Parameter" },
|
|
+ { 0x69, "BI_Q1" },
|
|
+ { 0x6a, "BI_Q2" },
|
|
+ { 0x74, "ICM Boundary Parameters" },
|
|
+ { 0x77, "AFT" },
|
|
+ { 0x78, "AFT RAI" },
|
|
+ { 0x79, "Link Supervision Control" },
|
|
+ { 0x7a, "Link Supervision Filtering Time" },
|
|
+ { 0x7b, "Call Supervision Time" },
|
|
+ { 0x7c, "Interval Length UAS Incoming" },
|
|
+ { 0x7d, "Interval Length UAS Outgoing" },
|
|
+ { 0x7e, "ICM Channel Rate" },
|
|
+ { 0x7f, "Attribute Identifier" },
|
|
+ { 0x80, "FM Frequency List" },
|
|
+ { 0x81, "FM Frequency Report" },
|
|
+ { 0x82, "FM Percentile" },
|
|
+ { 0x83, "FM Clear Indication" },
|
|
+ { 0x84, "HW Info Signature" },
|
|
+ { 0x85, "MO Record" },
|
|
+ { 0x86, "TF Synchronisation Source" },
|
|
+ { 0x87, "TTA" },
|
|
+ { 0x88, "End Segment Number" },
|
|
+ { 0x89, "Segment Number" },
|
|
+ { 0x8a, "Capabilities Signature" },
|
|
+ { 0x8c, "File Relation List" },
|
|
+ { 0x90, "Negotiation Record I" },
|
|
+ { 0x91, "Negotiation Record II" },
|
|
+ { 0x92, "Encryption Algorithm" },
|
|
+ { 0x94, "Interference Rejection Combining" },
|
|
+ { 0x95, "Dedication Information" },
|
|
+ { 0x97, "Feature Code" },
|
|
+ { 0x98, "FS Offset" },
|
|
+ { 0x99, "ESB Timeslot" },
|
|
+ { 0x9a, "Master TG Instance" },
|
|
+ { 0x9b, "Master TX Chain Delay" },
|
|
+ { 0x9c, "External Condition Class 2 Extension" },
|
|
+ { 0x9d, "TSs MO State" },
|
|
+ { 0, NULL }
|
|
+};
|
|
+
|
|
+static const value_string om2k_diversity_vals[] = {
|
|
+ { 0x01, "B receiver side" },
|
|
+ { 0x02, "A receiver side" },
|
|
+ { 0x03, "A+B receiver sides" },
|
|
+ { 0x04, "A+B+C+D receiver sides" },
|
|
+ { 0, NULL }
|
|
+};
|
|
+
|
|
+static const value_string om2k_oip_vals[] = {
|
|
+ { 0x00, "Not Operational" },
|
|
+ { 0x01, "Operational" },
|
|
+ { 0, NULL }
|
|
+};
|
|
+
|
|
+static const value_string om2k_aip_vals[] = {
|
|
+ { 0x00, "Data according to request" },
|
|
+ { 0x01, "Data not according to request" },
|
|
+ { 0x02, "Inconsistent MO data" },
|
|
+ { 0x03, "Capability constraint violation" },
|
|
+ { 0, NULL }
|
|
+};
|
|
+
|
|
+static const value_string om2k_comb_vals[] = {
|
|
+ { 0x03, "SDCCH/8 + SACCH/C8" },
|
|
+ { 0x04, "BCCH, non-combined" },
|
|
+ { 0x05, "BCCH, combined (SDCCH/4)" },
|
|
+ { 0x08, "TCH Type, unspecified" },
|
|
+ { 0, NULL }
|
|
+};
|
|
+
|
|
+static const value_string om2k_icmcr_vals[] = {
|
|
+ { 0x00, "ICM as per TCH/F" },
|
|
+ { 0x01, "ICM as per TCH/H(0 and 1)" },
|
|
+ { 0, NULL }
|
|
+};
|
|
+
|
|
+static const value_string om2k_ea_vals[] = {
|
|
+ { 0x00, "A5/1 and A5/2" },
|
|
+ { 0x01, "A5/2 only" },
|
|
+ { 0, NULL }
|
|
+};
|
|
+
|
|
+static const value_string om2k_fill_vals[] = {
|
|
+ { 0x00, "Filling" },
|
|
+ { 0x01, "No filling" },
|
|
+ { 0, NULL }
|
|
+};
|
|
+
|
|
+static const value_string om2k_mo_state_vals[] = {
|
|
+ { 0x00, "RESET" },
|
|
+ { 0x01, "STARTED" },
|
|
+ { 0x02, "ENABLED" },
|
|
+ { 0x03, "DISABLED" },
|
|
+ { 0, NULL }
|
|
+};
|
|
+
|
|
+static const value_string om2k_la_state_vals[] = {
|
|
+ { 0x00, "LOCALLY CONNECTED" },
|
|
+ { 0x01, "LOCALLY DISCONNECTED" },
|
|
+ { 0, NULL }
|
|
+};
|
|
+
|
|
+static const value_string filerel_state_vals[] = {
|
|
+ { 0x00, "Not known in current state (unknown file)" },
|
|
+ { 0x01, "alllowed, already loaded" },
|
|
+ { 0x02, "allowed, not loaded" },
|
|
+ { 0x03, "not allowed" },
|
|
+ { 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)" },
|
|
+ { 0x06, "CON (Concentrator)" },
|
|
+ { 0x0a, "CF (Central Function)" },
|
|
+ { 0x0b, "TX (Transmitter)" },
|
|
+ { 0x0c, "RX (Receiver)" },
|
|
+ { 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)
|
|
+{
|
|
+ guint8 tmp;
|
|
+ guint i = 0;
|
|
+
|
|
+ for (i = 0; i < 8; i+= 2) {
|
|
+ tmp = tvb_get_guint8(tvb, offset);
|
|
+ proto_tree_add_uint_format(tree, hf_om2k_tsn_state, tvb, offset, 1, tmp & 0xf,
|
|
+ "Timslot %u MO State: %s", i,
|
|
+ val_to_str(tmp & 0xf, om2k_mo_state_vals, "unknown (%02d)"));
|
|
+ proto_tree_add_uint_format(tree, hf_om2k_tsn_state, tvb, offset, 1, tmp >> 4,
|
|
+ "Timslot %u MO State: %s", i+1,
|
|
+ val_to_str(tmp >> 4, om2k_mo_state_vals, "unknown (%02d)"));
|
|
+ offset++;
|
|
+ }
|
|
+
|
|
+ return offset;
|
|
+}
|
|
+
|
|
+
|
|
+static gint
|
|
+dissect_om2k_time(tvbuff_t *tvb, gint offset, proto_tree *tree)
|
|
+{
|
|
+ nstime_t tmptime;
|
|
+ time_t tval;
|
|
+ struct tm _time;
|
|
+
|
|
+ _time.tm_year = 100 + tvb_get_guint8(tvb, offset++);
|
|
+ _time.tm_mon = tvb_get_guint8(tvb, offset++) -1;
|
|
+ _time.tm_mday = tvb_get_guint8(tvb, offset++);
|
|
+ _time.tm_hour = tvb_get_guint8(tvb, offset++);
|
|
+ _time.tm_min = tvb_get_guint8(tvb, offset++);
|
|
+ _time.tm_sec = tvb_get_guint8(tvb, offset++);
|
|
+ _time.tm_isdst = -1;
|
|
+
|
|
+ tval = mktime(&_time);
|
|
+ tmptime.secs = tval;
|
|
+ tmptime.nsecs = 0;
|
|
+
|
|
+ proto_tree_add_time(tree, hf_om2k_cal_time, tvb, offset, 6,
|
|
+ &tmptime);
|
|
+ return 6;
|
|
+}
|
|
+
|
|
+static gint
|
|
+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;
|
|
+
|
|
+ while (tvb_reported_length_remaining(tvb, offset) != 0) {
|
|
+ guint8 iei = tvb_get_guint8(tvb, offset++);
|
|
+ guint8 len, tmp;
|
|
+ switch (iei) {
|
|
+ case 0x00: /* Accordance Information */
|
|
+ proto_tree_add_item(tree, hf_om2k_aip, tvb,
|
|
+ offset++, 1, FALSE);
|
|
+ break;
|
|
+ case 0x06: /* BCC */
|
|
+ proto_tree_add_item(tree, hf_om2k_bcc, tvb,
|
|
+ offset++, 1, FALSE);
|
|
+ break;
|
|
+ case 0x07: /* BS_AG_BLKS_RES */
|
|
+ proto_tree_add_item(tree, hf_om2k_bs_ag_blks_res, tvb,
|
|
+ offset++, 1, FALSE);
|
|
+ break;
|
|
+ case 0x09: /* BSIC */
|
|
+ proto_tree_add_item(tree, hf_om2k_bsic, tvb,
|
|
+ offset++, 1, FALSE);
|
|
+ break;
|
|
+ case 0x0a: /* BS_PA_MFRMS */
|
|
+ proto_tree_add_item(tree, hf_om2k_bs_pa_mfrms, tvb,
|
|
+ offset++, 1, FALSE);
|
|
+ break;
|
|
+ case 0x0b: /* CBCH indicator */
|
|
+ proto_tree_add_item(tree, hf_om2k_cbi, tvb,
|
|
+ offset++, 1, FALSE);
|
|
+ break;
|
|
+ case 0x0c: /* CCCH Options */
|
|
+ tmp = tvb_get_guint8(tvb, offset);
|
|
+ proto_tree_add_item(tree, hf_om2k_cr, tvb,
|
|
+ offset, 1, FALSE);
|
|
+ proto_tree_add_item(tree, hf_om2k_ipt3, tvb,
|
|
+ offset, 1, FALSE);
|
|
+ proto_tree_add_uint(tree, hf_om2k_aop, tvb,
|
|
+ offset, 1, (tmp & 0x3f) >> 2);
|
|
+ offset++;
|
|
+ break;
|
|
+ case 0x0d: /* Calendar Time */
|
|
+ offset += dissect_om2k_time(tvb, offset, tree);
|
|
+ break;
|
|
+ case 0x0f: /* Combination */
|
|
+ proto_tree_add_item(tree, hf_om2k_comb, tvb,
|
|
+ offset++, 1, FALSE);
|
|
+ break;
|
|
+ case 0x10: /* CON Connection List */
|
|
+ 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,
|
|
+ offset++, 1, FALSE);
|
|
+ break;
|
|
+ case 0x13: /* End List Number */
|
|
+ proto_tree_add_item(tree, hf_om2k_list_nr_end, tvb,
|
|
+ offset++, 1, FALSE);
|
|
+ break;
|
|
+ case 0x14: /* External Condition Map Class 1 */
|
|
+ /* FIXME */
|
|
+ case 0x15: /* External Condition Map Class 2 */
|
|
+ /* FIXME */
|
|
+ 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,
|
|
+ offset, 1, FALSE);
|
|
+ proto_tree_add_item(tree, hf_om2k_filerel_cur, tvb,
|
|
+ offset, 1, FALSE);
|
|
+ offset++;
|
|
+ proto_tree_add_item(tree, hf_om2k_filerel_other, tvb,
|
|
+ offset, 1, FALSE);
|
|
+ offset++;
|
|
+ break;
|
|
+ case 0x17: /* File Revision */
|
|
+ proto_tree_add_item(tree, hf_om2k_file_rev, tvb,
|
|
+ offset, 8, FALSE);
|
|
+ offset += 8;
|
|
+ break;
|
|
+ case 0x1c: /* Filling Marker */
|
|
+ proto_tree_add_item(tree, hf_om2k_fill_mark, tvb,
|
|
+ offset++, 1, FALSE);
|
|
+ break;
|
|
+ case 0x1d: /* FN Offset */
|
|
+ proto_tree_add_item(tree, hf_om2k_fn_offs, tvb,
|
|
+ offset, 2, FALSE);
|
|
+ offset += 2;
|
|
+ break;
|
|
+ case 0x1e: /* Frequency List */
|
|
+ len = tvb_get_guint8(tvb, offset++);
|
|
+ /* FIXME */
|
|
+ offset += dissect_om2k_attr_unkn(tvb, offset, len, iei, tree);
|
|
+ break;
|
|
+ case 0x1f: /* Frequency Specifier Rx */
|
|
+ /* FIXME */
|
|
+ case 0x20: /* Frequency Specifier Rx */
|
|
+ /* FIXME */
|
|
+ offset += dissect_om2k_attr_unkn(tvb, offset, 2, iei, tree);
|
|
+ break;
|
|
+ case 0x21: /* HSN */
|
|
+ proto_tree_add_item(tree, hf_om2k_hsn, tvb,
|
|
+ offset++, 1, FALSE);
|
|
+ break;
|
|
+ case 0x22: /* ICM */
|
|
+ proto_tree_add_item(tree, hf_om2k_icm, tvb,
|
|
+ offset++, 1, FALSE);
|
|
+ break;
|
|
+ case 0x23: /* Internal Fault Map Class 1A */
|
|
+ /* FIXME */
|
|
+ case 0x24: /* Internal Fault Map Class 1B */
|
|
+ /* FIXME */
|
|
+ case 0x25: /* Internal Fault Map Class 2A */
|
|
+ /* FIXME */
|
|
+ case 0x26: /* Internal Fault Map Class 2A Ext */
|
|
+ /* FIXME */
|
|
+ offset += dissect_om2k_attr_unkn(tvb, offset, 6, iei, tree);
|
|
+ break;
|
|
+ case 0x27: /* IS Connection List */
|
|
+ offset += dissect_om2k_is_list(tvb, offset, tree);
|
|
+ break;
|
|
+ case 0x28: /* List Number */
|
|
+ proto_tree_add_item(tree, hf_om2k_list_nr, tvb,
|
|
+ offset++, 1, FALSE);
|
|
+ break;
|
|
+ case 0x2a: /* Local Access State */
|
|
+ proto_tree_add_item(tree, hf_om2k_la_state, tvb,
|
|
+ offset++, 1, FALSE);
|
|
+ break;
|
|
+ case 0x2b: /* MAIO */
|
|
+ proto_tree_add_item(tree, hf_om2k_maio, tvb,
|
|
+ offset++, 1, FALSE);
|
|
+ break;
|
|
+ case 0x2c: /* MO State */
|
|
+ proto_tree_add_item(tree, hf_om2k_mo_state, tvb,
|
|
+ offset++, 1, FALSE);
|
|
+ break;
|
|
+ case 0x2d: /* Ny1 */
|
|
+ proto_tree_add_item(tree, hf_om2k_ny1, tvb,
|
|
+ offset++, 1, FALSE);
|
|
+ break;
|
|
+ case 0x2e: /* Operational Information */
|
|
+ proto_tree_add_item(tree, hf_om2k_oip, tvb,
|
|
+ offset++, 1, FALSE);
|
|
+ break;
|
|
+ case 0x2f: /* Nominal Power */
|
|
+ proto_tree_add_item(tree, hf_om2k_nom_pwr, tvb,
|
|
+ offset++, 1, FALSE);
|
|
+ break;
|
|
+ case 0x33: /* Receiver Diversity */
|
|
+ proto_tree_add_item(tree, hf_om2k_diversity, tvb,
|
|
+ offset++, 1, FALSE);
|
|
+ break;
|
|
+ case 0x34: /* Replacement Unit Map */
|
|
+ /* FIXME */
|
|
+ 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);
|
|
+ break;
|
|
+ case 0x3d: /* TSC */
|
|
+ proto_tree_add_item(tree, hf_om2k_tsc, tvb,
|
|
+ offset++, 1, FALSE);
|
|
+ break;
|
|
+ case 0x40: /* BTS Version */
|
|
+ proto_tree_add_item(tree, hf_om2k_bts_manuf, tvb,
|
|
+ offset, 3, FALSE);
|
|
+ offset += 3;
|
|
+ proto_tree_add_item(tree, hf_om2k_bts_gen, tvb,
|
|
+ offset, 3, FALSE);
|
|
+ offset += 3;
|
|
+ proto_tree_add_item(tree, hf_om2k_bts_rev, tvb,
|
|
+ offset, 3, FALSE);
|
|
+ offset += 3;
|
|
+ proto_tree_add_item(tree, hf_om2k_bts_var, tvb,
|
|
+ offset, 3, FALSE);
|
|
+ offset += 3;
|
|
+ break;
|
|
+ case 0x43: /* OML Function Map 1 */
|
|
+ case 0x44: /* OML Function Map 2 */
|
|
+ case 0x45: /* RSL Function Map 1 */
|
|
+ case 0x46: /* RSL Function Map 2 */
|
|
+ len = tvb_get_guint8(tvb, offset++);
|
|
+ /* FIXME */
|
|
+ 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,
|
|
+ offset++, 1, FALSE);
|
|
+ break;
|
|
+ case 0x48: /* Request Indicators */
|
|
+ proto_tree_add_item(tree, hf_om2k_brr, tvb,
|
|
+ offset, 1, FALSE);
|
|
+ proto_tree_add_item(tree, hf_om2k_bfr, tvb,
|
|
+ offset, 1, FALSE);
|
|
+ offset++;
|
|
+ break;
|
|
+ case 0x50: /* Replacement Unit Map Extension */
|
|
+ /* FIXME */
|
|
+ offset += dissect_om2k_attr_unkn(tvb, offset, 6, iei, tree);
|
|
+ break;
|
|
+ case 0x74: /* ICM Boundary */
|
|
+ /* FIXME */
|
|
+ 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,
|
|
+ offset, 1, FALSE);
|
|
+ proto_tree_add_item(tree, hf_om2k_lsc_lsi, tvb,
|
|
+ offset, 1, FALSE);
|
|
+ proto_tree_add_item(tree, hf_om2k_lsc_lsa, tvb,
|
|
+ offset, 1, FALSE);
|
|
+ offset++;
|
|
+ break;
|
|
+ case 0x7a: /* Link Supervision Control */
|
|
+ proto_tree_add_item(tree, hf_om2k_ls_ft, tvb,
|
|
+ offset++, 1, FALSE);
|
|
+ break;
|
|
+ case 0x7b: /* Call Supervision Time */
|
|
+ proto_tree_add_item(tree, hf_om2k_cst, tvb,
|
|
+ offset++, 1, FALSE);
|
|
+ break;
|
|
+ case 0x7e: /* ICM Channel Rate */
|
|
+ proto_tree_add_item(tree, hf_om2k_icm_cr, tvb,
|
|
+ offset++, 1, FALSE);
|
|
+ break;
|
|
+ case 0x84: /* HW Info Signature */
|
|
+ proto_tree_add_item(tree, hf_om2k_hwinfo_sig, tvb,
|
|
+ offset, 2, FALSE);
|
|
+ offset += 2;
|
|
+ break;
|
|
+ case 0x87: /* TTA */
|
|
+ proto_tree_add_item(tree, hf_om2k_tta, tvb,
|
|
+ offset++, 1, FALSE);
|
|
+ break;
|
|
+ case 0x8a: /* Capabilities Signature */
|
|
+ proto_tree_add_item(tree, hf_om2k_capa_sig, tvb,
|
|
+ offset, 2, FALSE);
|
|
+ offset += 2;
|
|
+ break;
|
|
+ case 0x90: /* Negotiation Record I */
|
|
+ case 0x91: /* Negotiation Record II */
|
|
+ len = tvb_get_guint8(tvb, offset++);
|
|
+ /* FIXME */
|
|
+ offset += dissect_om2k_attr_unkn(tvb, offset, len, iei, tree);
|
|
+ break;
|
|
+ case 0x92: /* Encryption Algorithm */
|
|
+ proto_tree_add_item(tree, hf_om2k_ea, tvb,
|
|
+ offset++, 1, FALSE);
|
|
+ break;
|
|
+ case 0x94: /* Interference Rejection Combining */
|
|
+ proto_tree_add_item(tree, hf_om2k_irc, tvb,
|
|
+ offset++, 1, FALSE);
|
|
+ break;
|
|
+ case 0x95: /* Dedication information */
|
|
+ /* FIXME */
|
|
+ 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 += dissect_om2k_attr_unkn(tvb, offset, 4, iei, tree);
|
|
+ break;
|
|
+ case 0x9d: /* TSs MO State */
|
|
+ dissect_tss_mo_state(tvb, offset, pinfo, tree);
|
|
+ offset += 4;
|
|
+ break;
|
|
+ case 0x9e:
|
|
+ case 0x9f:
|
|
+ default:
|
|
+ tmp = tvb_get_guint8(tvb, offset);
|
|
+ proto_tree_add_uint_format(tree, hf_om2k_unknown_tag, tvb,
|
|
+ offset-1, 1, tmp, "Tag %s: 0x%02x",
|
|
+ val_to_str(iei, om2k_attr_vals, "0x%02x"), tmp);
|
|
+ offset++;
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ 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)
|
|
+{
|
|
+ proto_item *ti;
|
|
+ proto_tree *om2k_tree;
|
|
+
|
|
+ int offset = 0;
|
|
+
|
|
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "OM2000");
|
|
+
|
|
+ top_tree = tree;
|
|
+ if (tree) {
|
|
+ guint16 msg_code = tvb_get_ntohs(tvb, offset);
|
|
+ guint8 tmp;
|
|
+
|
|
+ ti = proto_tree_add_item(tree, proto_abis_om2000,
|
|
+ tvb, 0, -1, FALSE);
|
|
+ om2k_tree = proto_item_add_subtree(ti, ett_om2000);
|
|
+
|
|
+ proto_tree_add_item(om2k_tree, hf_om2k_msg_code, tvb, offset,
|
|
+ 2, FALSE);
|
|
+ offset += 2;
|
|
+
|
|
+ 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 */
|
|
+ tmp = tvb_get_guint8(tvb, offset+1);
|
|
+ proto_item_append_text(ti, ": %s",
|
|
+ val_to_str(tmp, om2k_oip_vals,
|
|
+ "unknown 0x%02x"));
|
|
+ break;
|
|
+ case 0x1A: /* CON Configuration Result */
|
|
+ case 0x66: /* IS Configuration Result */
|
|
+ case 0x82: /* RX Configuration Result */
|
|
+ case 0xA6: /* TF Configuration Result */
|
|
+ case 0xAE: /* TS Configuration Result */
|
|
+ case 0xB6: /* TX Configuration Result */
|
|
+ case 0xE2: /* DP Configuration Result */
|
|
+ case 0xF6: /* DP Configuration Result */
|
|
+ tmp = tvb_get_guint8(tvb, offset+1);
|
|
+ proto_item_append_text(ti, ": %s",
|
|
+ val_to_str(tmp, om2k_aip_vals,
|
|
+ "unknown 0x%02x"));
|
|
+ break;
|
|
+ default:
|
|
+ break;
|
|
+ }
|
|
+ dissect_om2k_attrs(tvb, offset, pinfo, om2k_tree);
|
|
+ }
|
|
+}
|
|
+
|
|
+void
|
|
+proto_reg_handoff_abis_om2000(void);
|
|
+
|
|
+void
|
|
+proto_register_abis_om2000(void)
|
|
+{
|
|
+ static hf_register_info hf[] = {
|
|
+ { &hf_om2k_msg_code,
|
|
+ { "Message Code", "om2000.msg_code",
|
|
+ FT_UINT16, BASE_HEX, VALS(om2k_msgcode_vals), 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_mo_if,
|
|
+ { "MO Interface", "om2000.mo_if",
|
|
+ FT_BYTES, BASE_NONE, NULL, 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_mo_class,
|
|
+ { "MO IF Class", "om2000.mo_if.class",
|
|
+ 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,
|
|
+ "Operational Information Parameter", HFILL }
|
|
+ },
|
|
+ { &hf_om2k_aip,
|
|
+ { "AIP (Accordance Info)", "om2000.aip",
|
|
+ FT_UINT8, BASE_HEX, VALS(om2k_aip_vals), 0,
|
|
+ "Accordance Information Parameter", HFILL }
|
|
+ },
|
|
+ { &hf_om2k_comb,
|
|
+ { "Channel Combination", "om2000.chan_comb",
|
|
+ FT_UINT8, BASE_DEC, VALS(om2k_comb_vals), 0,
|
|
+ "Logical Channel Combination", HFILL }
|
|
+ },
|
|
+ { &hf_om2k_ts,
|
|
+ { "Timeslot Number", "om2000.ts",
|
|
+ FT_UINT8, BASE_DEC, NULL, 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_hsn,
|
|
+ { "HSN", "om2000.hsn",
|
|
+ FT_UINT8, BASE_DEC, NULL, 0,
|
|
+ "Hopping Sequence Number", HFILL }
|
|
+ },
|
|
+ { &hf_om2k_maio,
|
|
+ { "MAIO", "om2000.maio",
|
|
+ FT_UINT8, BASE_DEC, NULL, 0,
|
|
+ "Mobile Allication Index Offset", HFILL }
|
|
+ },
|
|
+ { &hf_om2k_bsic,
|
|
+ { "BSIC", "om2000.bsic",
|
|
+ FT_UINT8, BASE_HEX, NULL, 0,
|
|
+ "Base Station Identity Code", HFILL }
|
|
+ },
|
|
+ { &hf_om2k_diversity,
|
|
+ { "Receiver Diversity", "om2000.diversity",
|
|
+ FT_UINT8, BASE_HEX, VALS(om2k_diversity_vals), 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_fn_offs,
|
|
+ { "FN Offset", "om2000.fn_offset",
|
|
+ FT_UINT16, BASE_DEC, NULL, 0,
|
|
+ "GSM Frame Number Offset", HFILL }
|
|
+ },
|
|
+ { &hf_om2k_ext_range,
|
|
+ { "Extended Range", "om2000.ext_range",
|
|
+ FT_BOOLEAN, 1, NULL, 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_irc,
|
|
+ { "Interference Rejection Combining", "om2000.irc",
|
|
+ FT_BOOLEAN, 1, NULL, 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_bs_pa_mfrms,
|
|
+ { "BS_PA_MFRMS", "om2000.bs_pa_mfrms",
|
|
+ FT_UINT8, BASE_DEC, NULL, 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_bs_ag_blks_res,
|
|
+ { "BS_AG_BLKS_RES", "om2000.bs_ag_blks_res",
|
|
+ FT_UINT8, BASE_DEC, NULL, 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_drx_dev_max,
|
|
+ { "DRX_DEV_MAX", "om2000.drx_dev_max",
|
|
+ FT_UINT8, BASE_DEC, NULL, 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_cr,
|
|
+ { "CCCH Repeat", "om2000.ccch_repeat",
|
|
+ FT_BOOLEAN, 1, NULL, 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_ipt3,
|
|
+ { "Inhibit Paging Request Type 3", "om2000.ipt3",
|
|
+ FT_BOOLEAN, 2, NULL, 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_aop,
|
|
+ { "Age Of Paging", "om2000.aop",
|
|
+ FT_UINT8, BASE_DEC, NULL, 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_t3105,
|
|
+ { "T3105 (in 10ms)", "om2000.t3105",
|
|
+ FT_UINT8, BASE_DEC, NULL, 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_ny1,
|
|
+ { "Ny1", "om2000.ny1",
|
|
+ FT_UINT8, BASE_DEC, NULL, 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_cbi,
|
|
+ { "CBCH Indicator", "om2000.ny1",
|
|
+ FT_BOOLEAN, 1, NULL, 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_tsc,
|
|
+ { "Training Sequence Code", "om2000.tsc",
|
|
+ FT_UINT8, BASE_DEC, NULL, 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_icm,
|
|
+ { "Idle Channel Measurement", "om2000.icm",
|
|
+ FT_BOOLEAN, 1, NULL, 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_tta,
|
|
+ { "Timer for Time Alignment", "om2000.tta",
|
|
+ FT_UINT8, BASE_DEC, NULL, 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_icm_cr,
|
|
+ { "ICM Channel Rate", "om2000.icm_cr",
|
|
+ FT_BOOLEAN, 1, VALS(om2k_icmcr_vals), 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_lsc_fm,
|
|
+ { "LSC Dummy Frequency Measurement", "om2000.lsc.fm",
|
|
+ FT_BOOLEAN, 0x80, NULL, 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_lsc_lsi,
|
|
+ { "LSC Idle Channels", "om2000.ls.lsi",
|
|
+ FT_BOOLEAN, 0x01, NULL, 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_lsc_lsa,
|
|
+ { "LSC Active Channels", "om2000.ls.lsa",
|
|
+ FT_BOOLEAN, 0x02, NULL, 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_ls_ft,
|
|
+ { "Link Supervision Filtering Time (100ms)", "om2000.ls_ft",
|
|
+ FT_UINT8, BASE_DEC, NULL, 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_cst,
|
|
+ { "Call Supervision Time (480ms)", "om2000.cst",
|
|
+ FT_UINT8, BASE_DEC, NULL, 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_ea,
|
|
+ { "Encryption Algorithm", "om2000.ea",
|
|
+ FT_UINT8, BASE_DEC, VALS(om2k_ea_vals), 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_nom_pwr,
|
|
+ { "Nominal Power (dBm)", "om2000.pwr",
|
|
+ FT_UINT8, BASE_DEC, NULL, 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_fill_mark,
|
|
+ { "Filling Marker", "om2000.filling",
|
|
+ FT_BOOLEAN, 0x01, VALS(om2k_fill_vals), 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_bcc,
|
|
+ { "BCC", "om2000.bcc",
|
|
+ FT_UINT8, BASE_DEC, NULL, 0,
|
|
+ "Base Station Color Code", HFILL }
|
|
+ },
|
|
+ { &hf_om2k_mo_state,
|
|
+ { "MO State", "om2000.mo_state",
|
|
+ FT_UINT8, BASE_DEC, VALS(om2k_mo_state_vals), 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_la_state,
|
|
+ { "Local Access State", "om2000.la_state",
|
|
+ FT_UINT8, BASE_DEC, VALS(om2k_la_state_vals), 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_tsn_state,
|
|
+ { "Time Slot N MO State", "om2000.tsn_mo_state",
|
|
+ FT_UINT8, BASE_DEC, VALS(om2k_mo_state_vals), 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_bts_manuf,
|
|
+ { "BTS Manufacturer ID", "om2000.bts_ver.manuf",
|
|
+ FT_STRING, BASE_NONE, NULL, 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_bts_gen,
|
|
+ { "BTS Generation", "om2000.bts_ver.gen",
|
|
+ FT_STRING, BASE_NONE, NULL, 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_bts_rev,
|
|
+ { "BTS Revision", "om2000.bts_ver.rev",
|
|
+ FT_STRING, BASE_NONE, NULL, 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_bts_var,
|
|
+ { "BTS Variant", "om2000.bts_ver.variant",
|
|
+ FT_STRING, BASE_NONE, NULL, 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_brr,
|
|
+ { "BTS Requested Restart", "om2000.brr",
|
|
+ FT_BOOLEAN, 0x01, NULL, 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_bfr,
|
|
+ { "BTS Requested File Relation", "om2000.bfr",
|
|
+ FT_BOOLEAN, 0x01, NULL, 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_hwinfo_sig,
|
|
+ { "HW Info Signature", "om2000.hwinfo_sig",
|
|
+ FT_UINT16, BASE_HEX, NULL, 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_capa_sig,
|
|
+ { "Capabilities Signature", "om2000.capa_sig",
|
|
+ FT_UINT16, BASE_HEX, NULL, 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+
|
|
+ { &hf_om2k_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,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_filerel_ilr,
|
|
+ { "Immediate Load Requested", "om2000.filerel.ilr",
|
|
+ FT_BOOLEAN, 0x08, NULL, 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_filerel_cur,
|
|
+ { "Current State", "om2000.filerel.cur",
|
|
+ FT_UINT8, BASE_HEX, VALS(filerel_state_vals), 0x07,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_filerel_other,
|
|
+ { "Other State", "om2000.filerel.other",
|
|
+ FT_UINT8, BASE_HEX, VALS(filerel_state_vals), 0x07,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_cal_time,
|
|
+ { "Calendar Time", "om2000.cal_time",
|
|
+ FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_list_nr,
|
|
+ { "List Number", "om2000.list_nr",
|
|
+ FT_UINT8, BASE_DEC, NULL, 0,
|
|
+ NULL, HFILL }
|
|
+ },
|
|
+ { &hf_om2k_list_nr_end,
|
|
+ { "End List Number", "om2000.list_nr_end",
|
|
+ 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;
|
|
+
|
|
+ proto_abis_om2000 = proto_register_protocol("Ericsson A-bis OML",
|
|
+ "Ericsson OML",
|
|
+ "gsm_abis_om2000");
|
|
+
|
|
+ proto_register_field_array(proto_abis_om2000, hf, array_length(hf));
|
|
+
|
|
+ proto_register_subtree_array(ett, array_length(ett));
|
|
+
|
|
+ register_dissector("gsm_abis_om2000", dissect_abis_om2000,
|
|
+ proto_abis_om2000);
|
|
+#if 0
|
|
+ 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",
|
|
+ "Use ipaccess nanoBTS specific definitions for OML",
|
|
+ &global_oml_use_nano_bts);
|
|
+#endif
|
|
+}
|
|
+
|
|
+/* This function is called once at startup and every time the user hits
|
|
+ * 'apply' in the preferences dialogue */
|
|
+void
|
|
+proto_reg_handoff_abis_om2000(void)
|
|
+{
|
|
+ static gboolean initialized = FALSE;
|
|
+
|
|
+ if (!initialized) {
|
|
+ dissector_handle_t abis_om2k_handle;
|
|
+
|
|
+ abis_om2k_handle = create_dissector_handle(dissect_abis_om2000,
|
|
+ proto_abis_om2000);
|
|
+ //dissector_add("lapd.gsm.sapi", LAPD_GSM_SAPI_OM_PROC, abis_oml_handle);
|
|
+ } else {
|
|
+ /* preferences have been changed */
|
|
+ }
|
|
+}
|
|
diff --git a/epan/dissectors/packet-gsm_abis_oml.c b/epan/dissectors/packet-gsm_abis_oml.c
|
|
index f0b69e7..46a9fad 100644
|
|
--- a/epan/dissectors/packet-gsm_abis_oml.c
|
|
+++ b/epan/dissectors/packet-gsm_abis_oml.c
|
|
@@ -119,9 +119,12 @@ static int ett_oml_fom_att = -1;
|
|
|
|
/* Decode things as nanoBTS traces */
|
|
static gboolean global_oml_use_nano_bts = TRUE;
|
|
+static gboolean global_oml_use_ericsson = TRUE;
|
|
|
|
static proto_tree *top_tree;
|
|
|
|
+static dissector_handle_t sub_om2000;
|
|
+
|
|
/* TS 12.21 Chapter 8.1 / TS 08.59 */
|
|
static const value_string oml_msg_disc_vals[] = {
|
|
{ ABIS_OM_MDISC_FOM, "Formatted O&M" },
|
|
@@ -1196,6 +1199,7 @@ dissect_abis_oml(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
|
top_tree = tree;
|
|
if (tree) {
|
|
u_int8_t msg_disc = tvb_get_guint8(tvb, offset);
|
|
+ u_int8_t len = tvb_get_guint8(tvb, offset+3);
|
|
|
|
ti = proto_tree_add_item(tree, proto_abis_oml, tvb, 0, -1, FALSE);
|
|
oml_tree = proto_item_add_subtree(ti, ett_oml);
|
|
@@ -1209,6 +1213,14 @@ dissect_abis_oml(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
|
proto_tree_add_item(oml_tree, hf_oml_length, tvb, offset++,
|
|
1, TRUE);
|
|
|
|
+ if (global_oml_use_ericsson == TRUE) {
|
|
+ tvbuff_t *subtvb;
|
|
+ subtvb = tvb_new_subset(tvb, offset, len, len);
|
|
+
|
|
+ if (sub_om2000)
|
|
+ call_dissector(sub_om2000, subtvb, pinfo, tree);
|
|
+ } else {
|
|
+
|
|
switch (msg_disc) {
|
|
case ABIS_OM_MDISC_FOM:
|
|
offset = dissect_oml_fom(tvb, pinfo, oml_tree,
|
|
@@ -1222,6 +1234,8 @@ dissect_abis_oml(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
|
default:
|
|
break;
|
|
}
|
|
+
|
|
+ }
|
|
}
|
|
}
|
|
|
|
@@ -1569,6 +1583,11 @@ proto_register_abis_oml(void)
|
|
"Use nanoBTS definitions",
|
|
"Use ipaccess nanoBTS specific definitions for OML",
|
|
&global_oml_use_nano_bts);
|
|
+
|
|
+ prefs_register_bool_preference(oml_module, "use_ericsson_oml",
|
|
+ "Use Ericsson definitions",
|
|
+ "Use Ericsson A-bis OML (OM2000) definitions for OML",
|
|
+ &global_oml_use_ericsson);
|
|
}
|
|
|
|
/* This function is called once at startup and every time the user hits
|
|
@@ -1605,4 +1624,6 @@ proto_reg_handoff_abis_oml(void)
|
|
oml_fom_attr_vse._vs_num_entries =
|
|
array_length(oml_fom_attr_vals_bs11)-1;
|
|
}
|
|
+
|
|
+ sub_om2000 = find_dissector("gsm_abis_om2000");
|
|
}
|
|
diff --git a/epan/dissectors/packet-l2tp.c b/epan/dissectors/packet-l2tp.c
|
|
index 4380bbc..0ebcd9d 100644
|
|
--- a/epan/dissectors/packet-l2tp.c
|
|
+++ b/epan/dissectors/packet-l2tp.c
|
|
@@ -148,6 +148,7 @@ static enum_val_t l2tpv3_cookies[] = {
|
|
#define L2TPv3_PROTOCOL_AAL5 6
|
|
#define L2TPv3_PROTOCOL_LAPD 7
|
|
#define L2TPv3_PROTOCOL_DOCSIS_DMPT 8
|
|
+#define L2TPv3_PROTOCOL_ERICSSON 9
|
|
|
|
static enum_val_t l2tpv3_protocols[] = {
|
|
{"eth", "Ethernet", L2TPv3_PROTOCOL_ETH},
|
|
@@ -159,6 +160,7 @@ static enum_val_t l2tpv3_protocols[] = {
|
|
{"aal5", "AAL5", L2TPv3_PROTOCOL_AAL5},
|
|
{"lapd", "LAPD", L2TPv3_PROTOCOL_LAPD},
|
|
{"docsis-dmpt", "DOCSIS-DMPT", L2TPv3_PROTOCOL_DOCSIS_DMPT},
|
|
+ {"ehdlc", "Ericsson HDLC", L2TPv3_PROTOCOL_ERICSSON},
|
|
{NULL, NULL, 0}
|
|
};
|
|
|
|
@@ -583,6 +585,7 @@ static dissector_handle_t atm_oam_handle;
|
|
static dissector_handle_t llc_handle;
|
|
static dissector_handle_t lapd_handle;
|
|
static dissector_handle_t mp2t_handle;
|
|
+static dissector_handle_t ehdlc_handle;
|
|
static dissector_handle_t data_handle;
|
|
|
|
/*
|
|
@@ -1498,6 +1501,9 @@ process_l2tpv3_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
|
|
case L2TPv3_PROTOCOL_LAPD:
|
|
call_dissector(lapd_handle, next_tvb, pinfo, tree);
|
|
break;
|
|
+ case L2TPv3_PROTOCOL_ERICSSON:
|
|
+ call_dissector(ehdlc_handle, next_tvb, pinfo, tree);
|
|
+ break;
|
|
default:
|
|
call_dissector(data_handle, next_tvb, pinfo, tree);
|
|
break;
|
|
@@ -2171,5 +2177,6 @@ proto_reg_handoff_l2tp(void)
|
|
llc_handle = find_dissector("llc");
|
|
lapd_handle = find_dissector("lapd");
|
|
mp2t_handle = find_dissector("mp2t");
|
|
+ ehdlc_handle = find_dissector("ehdlc");
|
|
data_handle = find_dissector("data");
|
|
}
|
|
--
|
|
1.7.3.4
|
|
|