forked from osmocom/wireshark
Add dissector for OsmoTRX protocol
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). Osmocom inherited this when forking OsmoTRX off the OpenBTS "Transceiver" program. Change-Id: I31f5071d08eff1731f1d602886e204c87eed107c
This commit is contained in:
parent
7580784d4b
commit
66a26f2569
|
@ -67,6 +67,8 @@ TPM 2.0 protocol
|
||||||
--
|
--
|
||||||
GSM-R protocol (User-to-User Information Element usage)
|
GSM-R protocol (User-to-User Information Element usage)
|
||||||
--
|
--
|
||||||
|
OsmoTRX Protocol (raw GSM burst data between osmo-trx and osmo-bts-trx)
|
||||||
|
--
|
||||||
|
|
||||||
=== Updated Protocol Support
|
=== Updated Protocol Support
|
||||||
|
|
||||||
|
|
|
@ -1460,6 +1460,7 @@ set(DISSECTOR_SRC
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/packet-osi-options.c
|
${CMAKE_CURRENT_SOURCE_DIR}/packet-osi-options.c
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/packet-osi.c
|
${CMAKE_CURRENT_SOURCE_DIR}/packet-osi.c
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/packet-ositp.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-ospf.c
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/packet-ossp.c
|
${CMAKE_CURRENT_SOURCE_DIR}/packet-ossp.c
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/packet-ouch.c
|
${CMAKE_CURRENT_SOURCE_DIR}/packet-ouch.c
|
||||||
|
|
|
@ -0,0 +1,264 @@
|
||||||
|
/* packet-osmo_trx.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
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*/
|
||||||
|
|
||||||
|
#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). Osmocom
|
||||||
|
* inherited this when forking OsmoTRX off the OpenBTS "Transceiver" program.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* 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;
|
||||||
|
guint8 ts, rssi;
|
||||||
|
guint32 fn;
|
||||||
|
gint16 toa;
|
||||||
|
|
||||||
|
col_set_str(pinfo->cinfo, COL_PROTOCOL, "ORX-B-Rx");
|
||||||
|
col_clear(pinfo->cinfo, COL_INFO);
|
||||||
|
|
||||||
|
len = tvb_reported_length(tvb);
|
||||||
|
|
||||||
|
ts = tvb_get_guint8(tvb, 0);
|
||||||
|
fn = tvb_get_ntohl(tvb, 1);
|
||||||
|
rssi = tvb_get_guint8(tvb, 5);
|
||||||
|
toa = tvb_get_ntohs(tvb, 6);
|
||||||
|
|
||||||
|
col_add_fstr(pinfo->cinfo, COL_INFO, "Rx TS=%u, FN=%u, RSSI=%u, ToA=%d", ts, fn, rssi, toa);
|
||||||
|
|
||||||
|
if (tree) {
|
||||||
|
ti = proto_tree_add_protocol_format(tree, proto_otrx_b_tx, tvb, 0, len,
|
||||||
|
"OsmoTRX Tx Burst (TS=%d, FN=%u, RSSI=%u, ToA=%d)",
|
||||||
|
ts, fn, rssi, toa);
|
||||||
|
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, (guint)(chr-pos),
|
||||||
|
ENC_ASCII|ENC_NA);
|
||||||
|
offset += (gint) (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, (guint)(chr-pos),
|
||||||
|
ENC_ASCII|ENC_NA);
|
||||||
|
offset += (gint) (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:
|
||||||
|
*/
|
Loading…
Reference in New Issue