aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2018-02-22 21:50:13 +0100
committerHarald Welte <laforge@gnumonks.org>2018-03-12 11:31:19 +0100
commit1ed88ce36dd9a7e0dc07d04cb2836f9b8ea4a304 (patch)
tree38ae2437d9e71d4ffb57b492d34ca6766e9adced
parent5b13126fd99b8917d6e6c59a6807cdd8fbf4a54e (diff)
Add dissector for OsmoTRX protocol
-rw-r--r--epan/dissectors/CMakeLists.txt1
-rw-r--r--epan/dissectors/Makefile.am1
-rw-r--r--epan/dissectors/packet-osmo_trx.c264
3 files changed, 266 insertions, 0 deletions
diff --git a/epan/dissectors/CMakeLists.txt b/epan/dissectors/CMakeLists.txt
index 9971d2a808..e42f40e2bb 100644
--- a/epan/dissectors/CMakeLists.txt
+++ b/epan/dissectors/CMakeLists.txt
@@ -1447,6 +1447,7 @@ set(DISSECTOR_SRC
${CMAKE_CURRENT_SOURCE_DIR}/packet-osi-options.c
${CMAKE_CURRENT_SOURCE_DIR}/packet-osi.c
${CMAKE_CURRENT_SOURCE_DIR}/packet-ositp.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/packet-osmo_trx.c
${CMAKE_CURRENT_SOURCE_DIR}/packet-ospf.c
${CMAKE_CURRENT_SOURCE_DIR}/packet-ossp.c
${CMAKE_CURRENT_SOURCE_DIR}/packet-ouch.c
diff --git a/epan/dissectors/Makefile.am b/epan/dissectors/Makefile.am
index a98bdf9f41..7c72575292 100644
--- a/epan/dissectors/Makefile.am
+++ b/epan/dissectors/Makefile.am
@@ -1068,6 +1068,7 @@ DISSECTOR_SRC = \
packet-osi-options.c \
packet-osi.c \
packet-ositp.c \
+ packet-osmo_trx.c \
packet-ospf.c \
packet-ossp.c \
packet-ouch.c \
diff --git a/epan/dissectors/packet-osmo_trx.c b/epan/dissectors/packet-osmo_trx.c
new file mode 100644
index 0000000000..aa632d8880
--- /dev/null
+++ b/epan/dissectors/packet-osmo_trx.c
@@ -0,0 +1,264 @@
+/* packet-osmo_trx_burst.c
+ * Dissector for Osmocom TRX Protocol (between osmo-trx and osmo-bts-trx)
+ *
+ * (C) 2018 by Harald Welte <laforge@gnumonks.org>
+ *
+ * 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/conversation.h>
+
+#include "packet-e164.h"
+#include "packet-e212.h"
+#include "packet-dns.h"
+
+/* This protocol is a non-standard, ad-hoc protocol to pass baseband GSM bursts
+ * between the modem (osmo-trx) and the encoder/decoder (osmo-bts-trx).
+ */
+
+/* the TRX-side control interface for C(N) is on port P=B+2N+1;
+ * the corresponding core-side interface for every socket is at P+100
+ * Give a base port B (5700), the master clock interface is at port P=B */
+#define OTRXC_UDP_PORTS "5701,5703,5800,5801,5803"
+
+/* the data interface is on an odd numbered port P=B+2N+2 */
+#define OTRXB_TX_UDP_PORTS "5702,5704"
+/* the corresponding core-side interface for every socket is at P+100 */
+#define OTRXB_RX_UDP_PORTS "5802,5804"
+
+static int proto_otrx_b_tx = -1;
+static int proto_otrx_b_rx = -1;
+static int proto_otrx_c = -1;
+
+static int hf_otrxb_timeslot = -1;
+static int hf_otrxb_frame_nr = -1;
+static int hf_otrxb_rssi = -1;
+static int hf_otrxb_timing_offset = -1;
+static int hf_otrxb_soft_symbols = -1;
+static int hf_otrxb_tx_att = -1;
+static int hf_otrxb_hard_symbols = -1;
+
+static int hf_otrxc_type = -1;
+static int hf_otrxc_verb = -1;
+static int hf_otrxc_params = -1;
+static int hf_otrxc_status = -1;
+
+static gint ett_otrxb = -1;
+
+/* Burst data in Receive direction */
+static int dissect_otrx_b_rx(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
+{
+ int len, offset = 0;
+ proto_item *ti;
+ proto_tree *otrxb_tree = NULL;
+ const char *str;
+
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "ORX-B-Rx");
+ col_clear(pinfo->cinfo, COL_INFO);
+
+ len = tvb_reported_length(tvb);
+
+
+ if (tree) {
+ str = "FOO";
+ ti = proto_tree_add_protocol_format(tree, proto_otrx_b_tx, tvb, 0, len,
+ "OsmoTRX Tx Burst %s", str);
+ otrxb_tree = proto_item_add_subtree(ti, ett_otrxb);
+
+ proto_tree_add_item(otrxb_tree, hf_otrxb_timeslot, tvb, offset, 1, ENC_NA);
+ offset++;
+
+ proto_tree_add_item(otrxb_tree, hf_otrxb_frame_nr, tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset += 4;
+
+ proto_tree_add_item(otrxb_tree, hf_otrxb_rssi, tvb, offset, 1, ENC_NA);
+ offset++;
+
+ proto_tree_add_item(otrxb_tree, hf_otrxb_timing_offset, tvb, offset, 2, ENC_BIG_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_item(otrxb_tree, hf_otrxb_soft_symbols, tvb, offset, 148, ENC_NA);
+ }
+
+ return tvb_captured_length(tvb);
+}
+
+/* Burst data in Transmit direction */
+static int dissect_otrx_b_tx(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
+{
+ int len, offset = 0;
+ proto_item *ti;
+ proto_tree *otrxb_tree = NULL;
+ guint8 ts;
+ guint32 fn;
+ guint8 tx_att;
+
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "OTRX-B-Tx");
+ col_clear(pinfo->cinfo, COL_INFO);
+
+ len = tvb_reported_length(tvb);
+
+ ts = tvb_get_guint8(tvb, 0);
+ fn = tvb_get_ntohl(tvb, 1);
+ tx_att = tvb_get_guint8(tvb, 5);
+
+ col_add_fstr(pinfo->cinfo, COL_INFO, "Tx TS=%d, FN=%u, TX_ATT=%u", ts, fn, tx_att);
+
+ if (tree) {
+ ti = proto_tree_add_protocol_format(tree, proto_otrx_b_rx, tvb, 0, len,
+ "OsmoTRX Rx Burst (TS=%d, FN=%u, TX_ATT=%u)",
+ ts, fn, tx_att);
+ otrxb_tree = proto_item_add_subtree(ti, ett_otrxb);
+
+ proto_tree_add_item(otrxb_tree, hf_otrxb_timeslot, tvb, offset, 1, ENC_NA);
+ offset++;
+
+ proto_tree_add_item(otrxb_tree, hf_otrxb_frame_nr, tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset += 4;
+
+ proto_tree_add_item(otrxb_tree, hf_otrxb_tx_att, tvb, offset, 1, ENC_NA);
+ offset++;
+
+ proto_tree_add_item(otrxb_tree, hf_otrxb_hard_symbols, tvb, offset, 148, ENC_NA);
+ }
+
+ return tvb_captured_length(tvb);
+}
+
+/* Burst data in Transmit direction */
+static int dissect_otrx_c(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
+{
+ int offset = 0, len;
+ proto_item *ti;
+ proto_tree *otrxc_tree = NULL;
+ const char *str, *chr, *pos, *type;
+
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "OTRX-C");
+ col_clear(pinfo->cinfo, COL_INFO);
+
+ len = tvb_reported_length(tvb);
+ str = tvb_get_string_enc(wmem_packet_scope(), tvb, 0, len, ENC_ASCII);
+
+ col_set_str(pinfo->cinfo, COL_INFO, str);
+ if (tree) {
+ ti = proto_tree_add_protocol_format(tree, proto_otrx_c, tvb, 0, len,
+ "OsmoTRX Control: %s", str);
+ otrxc_tree = proto_item_add_subtree(ti, ett_otrxb);
+
+ proto_tree_add_item(otrxc_tree, hf_otrxc_type, tvb, offset, 3, ENC_ASCII|ENC_NA);
+ type = str + offset;
+ offset += 3 + 1;
+
+ pos = str+offset;
+ chr = strchr(pos, ' ');
+ if (!chr)
+ goto out;
+ proto_tree_add_item(otrxc_tree, hf_otrxc_verb, tvb, offset, chr-pos, ENC_ASCII|ENC_NA);
+ offset += chr-pos + 1;
+
+ if (offset >= len)
+ goto out;
+
+ if (!strncmp(type, "RSP", 3)) {
+ pos = str+offset;
+ chr = strchr(pos, ' ');
+ if (!chr)
+ goto out;
+ proto_tree_add_item(otrxc_tree, hf_otrxc_status, tvb, offset, chr-pos, ENC_ASCII|ENC_NA);
+ offset += chr-pos + 1;
+ }
+
+ if (offset >= len)
+ goto out;
+
+ proto_tree_add_item(otrxc_tree, hf_otrxc_params, tvb, offset, len-offset, ENC_ASCII|ENC_NA);
+ }
+out:
+ return tvb_captured_length(tvb);
+}
+
+void
+proto_register_otrxb(void)
+{
+ static hf_register_info hf[] = {
+ { &hf_otrxb_timeslot, { "Timeslot", "osmo_trx.burst.timeslot",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL } },
+ { &hf_otrxb_frame_nr, { "GSM Frame Number", "osmo_trx.burst.frame_nr",
+ FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL } },
+ { &hf_otrxb_rssi, { "RSSI (-dBm)", "osmo_trx.burst.rssi",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL } },
+ { &hf_otrxb_timing_offset, { "Correlator Timing Offset (1/256 symbols)", "osmo_trx.burst.timing_offset",
+ FT_INT16, BASE_DEC, NULL, 0, NULL, HFILL } },
+ { &hf_otrxb_soft_symbols, { "Soft Symbols", "osmo_trx.burst.soft-symbols",
+ FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } },
+
+ { &hf_otrxb_tx_att, { "Tx Attenuation (dB)", "osmo_trx.burst.tx-atten",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL } },
+ { &hf_otrxb_hard_symbols, { "Hard Symbols", "osmo_trx.burst.hard-symbols",
+ FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL } },
+
+ { &hf_otrxc_type, { "Type", "osmo_trx.ctrl.type",
+ FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL } },
+ { &hf_otrxc_verb, { "Verb", "osmo_trx.ctrl.verb",
+ FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL } },
+ { &hf_otrxc_params, { "Parameters", "osmo_trx.ctrl.params",
+ FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL } },
+ { &hf_otrxc_status, { "Status", "osmo_trx.ctrl.status",
+ FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL } },
+ };
+ static gint *ett[] = {
+ &ett_otrxb,
+ };
+
+ proto_otrx_b_tx = proto_register_protocol("Osmocom TRX Burst Protocol (Tx)",
+ "otrx_b_tx", "otrx_b_tx");
+ proto_otrx_b_rx = proto_register_protocol("Osmocom TRX Burst Protocol (Rx)",
+ "otrx_b_rx", "otrx_b_rx");
+ proto_otrx_c = proto_register_protocol("Osmocom TRX Control Protocol", "otrx_c", "otrx_c");
+ proto_register_field_array(proto_otrx_c, hf, array_length(hf));
+ proto_register_subtree_array(ett, array_length(ett));
+}
+
+void
+proto_reg_handoff_otrxb(void)
+{
+ dissector_handle_t otrxb_tx_handle, otrxb_rx_handle, otrxc_handle;
+ otrxb_tx_handle = create_dissector_handle(dissect_otrx_b_tx, proto_otrx_b_tx);
+ otrxb_rx_handle = create_dissector_handle(dissect_otrx_b_rx, proto_otrx_b_rx);
+ otrxc_handle = create_dissector_handle(dissect_otrx_c, proto_otrx_c);
+ dissector_add_uint_range_with_preference("udp.port", OTRXB_TX_UDP_PORTS, otrxb_tx_handle);
+ dissector_add_uint_range_with_preference("udp.port", OTRXB_RX_UDP_PORTS, otrxb_rx_handle);
+ dissector_add_uint_range_with_preference("udp.port", OTRXC_UDP_PORTS, otrxc_handle);
+}
+
+/*
+ * 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:
+ */