diff options
author | Harald Welte <laforge@gnumonks.org> | 2018-02-22 21:50:13 +0100 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2018-03-12 11:31:19 +0100 |
commit | 1ed88ce36dd9a7e0dc07d04cb2836f9b8ea4a304 (patch) | |
tree | 38ae2437d9e71d4ffb57b492d34ca6766e9adced | |
parent | 5b13126fd99b8917d6e6c59a6807cdd8fbf4a54e (diff) |
Add dissector for OsmoTRX protocol
Change-Id: I31f5071d08eff1731f1d602886e204c87eed107c
-rw-r--r-- | epan/dissectors/CMakeLists.txt | 1 | ||||
-rw-r--r-- | epan/dissectors/Makefile.am | 1 | ||||
-rw-r--r-- | epan/dissectors/packet-osmo_trx.c | 264 |
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: + */ |