aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Willmann <dwillmann@sysmocom.de>2016-07-12 20:25:35 +0200
committerDaniel Willmann <daniel@totalueberwachung.de>2016-07-13 10:37:56 +0200
commit62d66df57ce65e6515ad9fa41381b2a6b916b6e8 (patch)
treedcacc643477c79cb2cdb26520751c67e2354ac21
parent67ad1a276d038aa32b331b8b3ad52e3d3f74378c (diff)
Add OSMux dissector
-rw-r--r--epan/dissectors/CMakeLists.txt1
-rw-r--r--epan/dissectors/Makefile.am1
-rw-r--r--epan/dissectors/packet-osmux.c236
3 files changed, 238 insertions, 0 deletions
diff --git a/epan/dissectors/CMakeLists.txt b/epan/dissectors/CMakeLists.txt
index 38e2149ba1..0d7cc94628 100644
--- a/epan/dissectors/CMakeLists.txt
+++ b/epan/dissectors/CMakeLists.txt
@@ -639,6 +639,7 @@ set(DISSECTOR_SRC
packet-gsm_bssmap_le.c
packet-gsm_cbch.c
packet-gsm_ipa.c
+ packet-osmux.c
packet-gsm_rlcmac.c
packet-gsm_sim.c
packet-gsm_sms.c
diff --git a/epan/dissectors/Makefile.am b/epan/dissectors/Makefile.am
index 70edc66e62..39efa155e4 100644
--- a/epan/dissectors/Makefile.am
+++ b/epan/dissectors/Makefile.am
@@ -668,6 +668,7 @@ DISSECTOR_SRC = \
packet-gsm_bssmap_le.c \
packet-gsm_cbch.c \
packet-gsm_ipa.c \
+ packet-osmux.c \
packet-gsm_rlcmac.c \
packet-gsm_sim.c \
packet-gsm_sms.c \
diff --git a/epan/dissectors/packet-osmux.c b/epan/dissectors/packet-osmux.c
new file mode 100644
index 0000000000..13221490ac
--- /dev/null
+++ b/epan/dissectors/packet-osmux.c
@@ -0,0 +1,236 @@
+/* packet-osmux.c
+ * Routines for packet dissection of OSmux voice/signalling multiplex protocol
+ *
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include "config.h"
+
+#include <epan/packet.h>
+#include <epan/prefs.h>
+
+void proto_register_osmux(void);
+void proto_reg_handoff_osmux(void);
+
+/*
+ * FIXME: Link to OSmux docs here
+ */
+
+static const value_string osmux_ft_vals[] =
+{
+ {0x00, "Signalling"},
+ {0x01, "AMR"},
+ {0x02, "Dummy"},
+ {0, NULL}
+};
+
+/* Initialize the protocol and registered fields */
+static int proto_osmux = -1;
+
+static int hf_osmux_ft_ctr = -1;
+static int hf_osmux_ft = -1;
+static int hf_osmux_ctr = -1;
+static int hf_osmux_amr_f = -1;
+static int hf_osmux_amr_q = -1;
+static int hf_osmux_seq = -1;
+static int hf_osmux_circuit_id = -1;
+static int hf_osmux_amr_ft_cmr = -1;
+static int hf_osmux_amr_ft = -1;
+static int hf_osmux_amr_cmr = -1;
+
+/* Initialize the subtree pointers */
+static gint ett_osmux = -1;
+static gint ett_osmux_ft_ctr = -1;
+static gint ett_osmux_amr_ft_cmr = -1;
+
+enum {
+ SUB_RSL,
+ SUB_AMR,
+ SUB_DUMMY,
+
+ SUB_MAX
+};
+
+
+/* Code to actually dissect the packets */
+static gint
+dissect_osmux(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
+{
+ int offset = 0;
+
+ proto_item *ti;
+ proto_tree *osmux_tree = NULL;
+ guint8 ft_ctr, ft;
+ //, ctr, seq, circuit_id, amr_ft_cdr;
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "OSmux");
+ col_clear(pinfo->cinfo, COL_INFO);
+
+ ft_ctr = tvb_get_guint8(tvb, offset);
+
+ ft = ft_ctr >> 5;
+// ctr = (ft_ctr >> 2) & 0x7;
+
+// seq = tvb_get_guint8(tvb, offset+1);
+// circuit_id = tvb_get_guint8(tvb, offset+2);
+// amr_ft_cdr = tvb_get_guint8(tvb, offset+3);
+
+ col_append_fstr(pinfo->cinfo, COL_INFO, "OSMux ");
+
+ ti = proto_tree_add_protocol_format(tree, proto_osmux,
+ tvb, offset, -1,
+ "OSmux type %s frame",
+ val_to_str(ft, osmux_ft_vals,
+ "unknown 0x%02x"));
+ osmux_tree = proto_item_add_subtree(ti, ett_osmux);
+
+ /* Two-byte dummy packets for firewalls */
+ if (ft_ctr == 0x23 && tvb_reported_length(tvb) == 2) {
+ col_append_fstr(pinfo->cinfo, COL_INFO, "Dummy frame");
+ proto_tree_add_item(osmux_tree, hf_osmux_circuit_id, tvb, offset+1, 1, ENC_BIG_ENDIAN);
+ return 2;
+ }
+
+ col_append_fstr(pinfo->cinfo, COL_INFO, "%s ",
+ val_to_str(ft, osmux_ft_vals,
+ "unknown 0x%02x"));
+
+ {
+ static const gint *ft_ctr_fields[] = {
+ &hf_osmux_ft,
+ &hf_osmux_ctr,
+ &hf_osmux_amr_f,
+ &hf_osmux_amr_q,
+ NULL
+ };
+ proto_tree_add_bitmask(osmux_tree, tvb, offset, hf_osmux_ft_ctr,
+ ett_osmux_ft_ctr, ft_ctr_fields, ENC_BIG_ENDIAN);
+ offset++;
+ }
+ proto_tree_add_item(osmux_tree, hf_osmux_seq, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset++;
+ proto_tree_add_item(osmux_tree, hf_osmux_circuit_id, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset++;
+
+ {
+ static const gint *amr_ft_cmr_fields[] = {
+ &hf_osmux_amr_ft,
+ &hf_osmux_amr_cmr,
+ NULL
+ };
+ proto_tree_add_bitmask(osmux_tree, tvb, offset, hf_osmux_amr_ft_cmr,
+ ett_osmux_amr_ft_cmr, amr_ft_cmr_fields, ENC_BIG_ENDIAN);
+ offset++;
+ }
+
+ return offset;
+}
+
+void proto_register_osmux(void)
+{
+ static hf_register_info hf[] = {
+ {&hf_osmux_ft_ctr,
+ {"FTCTRByte", "osmux.ft_ctr",
+ FT_UINT8, BASE_DEC, NULL, 0x00,
+ "Byte with Fieldtype, Counter", HFILL}
+ },
+ {&hf_osmux_ft,
+ {"FieldType", "osmux.ft",
+ FT_UINT8, BASE_DEC, VALS(osmux_ft_vals), 0xe0,
+ "Type of data in packet", HFILL}
+ },
+ {&hf_osmux_ctr,
+ {"CTR", "osmux.ctr",
+ FT_UINT8, BASE_HEX, NULL, 0x1c,
+ "Number of AMR packets inside", HFILL}
+ },
+ {&hf_osmux_amr_q,
+ {"AMR f", "osmux.amr_f",
+ FT_UINT8, BASE_HEX, NULL, 0x02,
+ "AMR f parameter", HFILL}
+ },
+ {&hf_osmux_amr_f,
+ {"AMR q", "osmux.amr_q",
+ FT_UINT8, BASE_HEX, NULL, 0x01,
+ "AMR q parameter", HFILL}
+ },
+ {&hf_osmux_seq,
+ {"Seq", "osmux.seq",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
+ "Sequence number", HFILL}
+ },
+ {&hf_osmux_circuit_id,
+ {"Circuit ID", "osmux.circuit_id",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
+ "Circuit ID", HFILL}
+ },
+ {&hf_osmux_amr_ft_cmr,
+ {"FourthByte", "osmux.amr_ft_cmr",
+ FT_UINT8, BASE_DEC, NULL, 0x00,
+ "Byte with AMR params ft and cmr", HFILL}
+ },
+ {&hf_osmux_amr_ft,
+ {"AMR ft", "osmux.amr_ft",
+ FT_UINT8, BASE_HEX, NULL, 0xf0,
+ "AMR parameter ft", HFILL}
+ },
+ {&hf_osmux_amr_cmr,
+ {"AMR cmr", "osmux.amr_cmr",
+ FT_UINT8, BASE_HEX, NULL, 0x0f,
+ "AMR parameter cmr", HFILL}
+ },
+ };
+
+ static gint *ett[] = {
+ &ett_osmux,
+ &ett_osmux_ft_ctr,
+ &ett_osmux_amr_ft_cmr,
+ };
+
+ proto_osmux = proto_register_protocol("GSM multiplexing for AMR", "GSM OSmux", "osmux");
+
+ proto_register_field_array(proto_osmux, hf, array_length(hf));
+ proto_register_subtree_array(ett, array_length(ett));
+}
+
+
+void proto_reg_handoff_osmux(void)
+{
+ static gboolean osmux_initialized = FALSE;
+ static dissector_handle_t osmux_handle;
+
+ if (!osmux_initialized) {
+ osmux_handle = create_dissector_handle(dissect_osmux, proto_osmux);
+ dissector_add_uint("udp.port", 1984, osmux_handle);
+ osmux_initialized = TRUE;
+ }
+}
+
+/*
+ * Editor modelines - http://www.wireshark.org/tools/modelines.html
+ *
+ * Local variables:
+ * c-basic-offset: 8
+ * tab-width: 8
+ * indent-tabs-mode: t
+ * End:
+ *
+ * vi: set shiftwidth=8 tabstop=8 noexpandtab:
+ * :indentSize=8:tabSize=8:noTabs=false:
+ */