mirror of
https://gitea.osmocom.org/cellular-infrastructure/osmo-mgw.git
synced 2025-11-03 13:33:29 +00:00
now it correctly names some of the IEs like DSP/FPGA version, and also automatically marks the UDP streams as RTP depending on what it has seen in the RSL CONNECT TRAU message.
274 lines
8.5 KiB
Diff
274 lines
8.5 KiB
Diff
Index: wireshark/epan/dissectors/packet-rsl.c
|
|
===================================================================
|
|
--- wireshark.orig/epan/dissectors/packet-rsl.c 2011-01-13 12:51:02.000000000 +0100
|
|
+++ wireshark/epan/dissectors/packet-rsl.c 2011-01-15 18:05:20.000000000 +0100
|
|
@@ -2,7 +2,7 @@
|
|
* Routines for Radio Signalling Link (RSL) dissection.
|
|
*
|
|
* Copyright 2007, Anders Broman <anders.broman@ericsson.com>
|
|
- * Copyright 2009, Harald Welte <laforge@gnumonks.org>
|
|
+ * Copyright 2009-2011, Harald Welte <laforge@gnumonks.org>
|
|
*
|
|
* $Id: packet-rsl.c 35224 2010-12-20 05:35:29Z guy $
|
|
*
|
|
@@ -137,6 +137,14 @@
|
|
static int hf_rsl_cstat_lost_pkts = -1;
|
|
static int hf_rsl_cstat_ia_jitter = -1;
|
|
static int hf_rsl_cstat_avg_tx_dly = -1;
|
|
+/* HSL */
|
|
+static int hf_rsl_hsl_bts_serno = -1;
|
|
+static int hf_rsl_hsl_bts_ver = -1;
|
|
+static int hf_rsl_hsl_dsp_ver = -1;
|
|
+static int hf_rsl_hsl_fpga_ver = -1;
|
|
+static int hf_rsl_hsl_trau_remote_port = -1;
|
|
+static int hf_rsl_hsl_trau_remote_ip = -1;
|
|
+static int hf_rsl_hsl_tx_power = -1;
|
|
|
|
/* Initialize the subtree pointers */
|
|
static int ett_rsl = -1;
|
|
@@ -207,6 +215,7 @@
|
|
static proto_tree *top_tree;
|
|
static dissector_handle_t gsm_a_ccch_handle;
|
|
static dissector_handle_t gsm_a_dtap_handle;
|
|
+static dissector_handle_t bssgp_handle;
|
|
|
|
static gboolean is_si2q = FALSE;
|
|
|
|
@@ -239,9 +248,11 @@
|
|
{ 0x08, "TRX Management messages" },
|
|
{ 0x16, "Location Services messages" },
|
|
{ 0x3f, "ip.access Vendor Specific messages" },
|
|
+ { 0x80, "HSL Vendor Specific messages" },
|
|
{ 0, NULL }
|
|
};
|
|
#define RSL_MSGDISC_IPACCESS 0x3f
|
|
+#define RSL_MSGDISC_HSL 0x40
|
|
|
|
/*
|
|
* 9.2 MESSAGE TYPE
|
|
@@ -353,6 +364,22 @@
|
|
#define RSL_IE_IPAC_RTP_MPLEX 0xfd
|
|
#define RSL_IE_IPAC_RTP_MPLEX_ID 0xfe
|
|
|
|
+/* Vendor-Specific messages of HSL femtocell. There is no public documentation
|
|
+ * about those extensions, all information in this dissector is based on lawful
|
|
+ * protocol reverse enginering by Harald Welte <laforge@gnumonks.org> */
|
|
+#define RSL_MSG_TYPE_HSL_IDENTIFY 0x80
|
|
+#define RSL_MSG_TYPE_HSL_CONN_TRAU 0x81
|
|
+#define RSL_MSG_TYPE_HSL_BSSGP 0x82
|
|
+#define RSL_MSG_TYPE_HSL_GPRS_TS_ALLOC 0x83
|
|
+#define RSL_MSG_TYPE_HSL_L1_PRIM 0x8a
|
|
+
|
|
+#define RSL_IE_HSL_BTS_SERNO 0xc0
|
|
+#define RSL_IE_HSL_TRAU_PARAMS 0xc1
|
|
+#define RSL_IE_HSL_TX_POWER 0xc4
|
|
+#define RSL_IE_HSL_BTS_VERSION 0xc5
|
|
+#define RSL_IE_HSL_DSP_VERSION 0xc6
|
|
+#define RSL_IE_HSL_FPGA_VERSION 0xc7
|
|
+
|
|
static const value_string rsl_msg_type_vals[] = {
|
|
/* 0 0 0 0 - - - - Radio Link Layer Management messages: */
|
|
{ 0x01, "DATA REQuest" }, /* 8.3.1 */
|
|
@@ -434,6 +461,12 @@
|
|
{ 0x77, "ip.access DLCX" },
|
|
{ 0x78, "ip.access DLCX ACK" },
|
|
{ 0x79, "ip.access DLCX NACK" },
|
|
+ /* HSL */
|
|
+ { 0x80, "HSL IDENTIFY" },
|
|
+ { 0x81, "HSL CONNECT TRAU" },
|
|
+ { 0x82, "HSL BSSGP" },
|
|
+ { 0x83, "HSL GPRS TS ALLOC" },
|
|
+ { 0x8a, "HSL TX SET POWER" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
@@ -573,6 +606,7 @@
|
|
Not used
|
|
|
|
*/
|
|
+ /* ip.access */
|
|
{ 0xe0, "SRTP Configuration" },
|
|
{ 0xe1, "BSC Proxy UDP Port" },
|
|
{ 0xe2, "BSC Multiplex Timeout" },
|
|
@@ -591,6 +625,13 @@
|
|
{ 0xfc, "RTP Payload Type 2" },
|
|
{ 0xfd, "RTP Multiplex" },
|
|
{ 0xfe, "RTP Multiplex Identifier" },
|
|
+ /* HSL */
|
|
+ { 0xc0, "HSL Serial Number" },
|
|
+ { 0xc1, "HSL TRAU Parameters" },
|
|
+ { 0xc4, "HSL TX Power (dBm)" },
|
|
+ { 0xc5, "HSL BTS SW Version" },
|
|
+ { 0xc6, "HSL DSP SW Version" },
|
|
+ { 0xc7, "HSL FPGA SW Version" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
@@ -714,6 +755,13 @@
|
|
[RSL_IE_IPAC_SPEECH_MODE] = { TLV_TYPE_TV, 0 },
|
|
[RSL_IE_IPAC_CONN_ID] = { TLV_TYPE_FIXED, 2 },
|
|
[RSL_IE_IPAC_RTP_PAYLOAD2] = { TLV_TYPE_TV, 0 },
|
|
+ /* HSL */
|
|
+ [RSL_IE_HSL_BTS_SERNO] = { TLV_TYPE_TLV,0 },
|
|
+ [RSL_IE_HSL_TRAU_PARAMS] = { TLV_TYPE_TLV,0 },
|
|
+ [RSL_IE_HSL_TX_POWER] = { TLV_TYPE_TV, 0 },
|
|
+ [RSL_IE_HSL_BTS_VERSION] = { TLV_TYPE_TLV, 0 },
|
|
+ [RSL_IE_HSL_DSP_VERSION] = { TLV_TYPE_TLV, 0 },
|
|
+ [RSL_IE_HSL_FPGA_VERSION] = { TLV_TYPE_TLV, 0 },
|
|
},
|
|
};
|
|
|
|
@@ -3118,9 +3166,10 @@
|
|
guint8 msg_type;
|
|
guint32 local_addr = 0;
|
|
guint16 local_port = 0;
|
|
+ int old_visited;
|
|
address src_addr;
|
|
|
|
- msg_type = tvb_get_guint8(tvb, offset)&0x7f;
|
|
+ msg_type = tvb_get_guint8(tvb, offset)&0xff;
|
|
offset++;
|
|
|
|
#if 0
|
|
@@ -3259,20 +3308,62 @@
|
|
proto_tree_add_item(ie_tree, hf_rsl_cstat_avg_tx_dly, tvb,
|
|
offset+24, 4, FALSE);
|
|
break;
|
|
+ /* HSL */
|
|
+ case RSL_IE_HSL_BTS_SERNO:
|
|
+ proto_tree_add_item(ie_tree, hf_rsl_hsl_bts_serno, tvb,
|
|
+ offset, len, FALSE);
|
|
+ col_append_fstr(pinfo->cinfo, COL_INFO, "SerNo %s ",
|
|
+ tvb_get_string(tvb, offset, len));
|
|
+ break;
|
|
+ case RSL_IE_HSL_TRAU_PARAMS:
|
|
+ proto_tree_add_item(tree, hf_rsl_hsl_trau_remote_port, tvb,
|
|
+ offset+2, 2, TRUE);
|
|
+ local_port = tvb_get_letohs(tvb, offset+2);
|
|
+ proto_tree_add_item(tree, hf_rsl_hsl_trau_remote_ip, tvb,
|
|
+ offset+4, 4, FALSE);
|
|
+ local_addr = tvb_get_ipv4(tvb, offset+4);
|
|
+ break;
|
|
+ case RSL_IE_HSL_TX_POWER:
|
|
+ proto_tree_add_item(ie_tree, hf_rsl_hsl_tx_power, tvb,
|
|
+ offset, len, FALSE);
|
|
+ break;
|
|
+ case RSL_IE_HSL_BTS_VERSION:
|
|
+ proto_tree_add_item(ie_tree, hf_rsl_hsl_bts_ver, tvb,
|
|
+ offset, len, FALSE);
|
|
+ break;
|
|
+ case RSL_IE_HSL_DSP_VERSION:
|
|
+ proto_tree_add_item(ie_tree, hf_rsl_hsl_dsp_ver, tvb,
|
|
+ offset, len, FALSE);
|
|
+ break;
|
|
+ case RSL_IE_HSL_FPGA_VERSION:
|
|
+ proto_tree_add_item(ie_tree, hf_rsl_hsl_fpga_ver, tvb,
|
|
+ offset, len, FALSE);
|
|
+ break;
|
|
+ case RSL_IE_L3_INF:
|
|
+ if (msg_type == RSL_MSG_TYPE_HSL_BSSGP) {
|
|
+ tvbuff_t *next_tvb;
|
|
+ next_tvb = tvb_new_subset(tvb, offset, -1, len);
|
|
+ call_dissector(bssgp_handle, next_tvb, pinfo, tree);
|
|
+ }
|
|
+ break;
|
|
}
|
|
offset += len;
|
|
}
|
|
|
|
switch (msg_type) {
|
|
case RSL_MSG_TYPE_IPAC_CRCX_ACK:
|
|
+ case RSL_MSG_TYPE_HSL_CONN_TRAU:
|
|
/* Notify the RTP and RTCP dissectors about a new RTP stream */
|
|
src_addr.type = AT_IPv4;
|
|
src_addr.len = 4;
|
|
src_addr.data = (guint8 *)&local_addr;
|
|
+ old_visited = pinfo->fd->flags.visited;
|
|
+ pinfo->fd->flags.visited = 0;
|
|
rtp_add_address(pinfo, &src_addr, local_port, 0,
|
|
"GSM A-bis/IP", pinfo->fd->num, 0, NULL);
|
|
rtcp_add_address(pinfo, &src_addr, local_port+1, 0,
|
|
"GSM A-bis/IP", pinfo->fd->num);
|
|
+ pinfo->fd->flags.visited = old_visited;
|
|
break;
|
|
}
|
|
return offset;
|
|
@@ -3284,10 +3375,12 @@
|
|
guint8 msg_disc, msg_type;
|
|
|
|
msg_disc = tvb_get_guint8(tvb, offset++) >> 1;
|
|
- msg_type = tvb_get_guint8(tvb,offset)&0x7f;
|
|
+ msg_type = tvb_get_guint8(tvb,offset)&0xff;
|
|
proto_tree_add_item(tree, hf_rsl_msg_type, tvb, offset, 1, FALSE);
|
|
|
|
- if (msg_disc == RSL_MSGDISC_IPACCESS) {
|
|
+ switch (msg_disc) {
|
|
+ case RSL_MSGDISC_HSL:
|
|
+ case RSL_MSGDISC_IPACCESS:
|
|
offset = dissct_rsl_ipaccess_msg(tvb, pinfo, tree, offset);
|
|
return offset;
|
|
}
|
|
@@ -3924,7 +4017,7 @@
|
|
col_set_str(pinfo->cinfo, COL_PROTOCOL, "RSL");
|
|
col_clear(pinfo->cinfo, COL_INFO);
|
|
|
|
- msg_type = tvb_get_guint8(tvb,offset+1)&0x7f;
|
|
+ msg_type = tvb_get_guint8(tvb,offset+1)&0xff;
|
|
|
|
if (check_col(pinfo->cinfo, COL_INFO)){
|
|
col_append_fstr(pinfo->cinfo, COL_INFO, "%s ",val_to_str(msg_type, rsl_msg_type_vals,"unknown %u"));
|
|
@@ -3955,6 +4048,7 @@
|
|
|
|
gsm_a_ccch_handle = find_dissector("gsm_a_ccch");
|
|
gsm_a_dtap_handle = find_dissector("gsm_a_dtap");
|
|
+ bssgp_handle = find_dissector("bssgp");
|
|
}
|
|
|
|
/* Register the protocol with Wireshark */
|
|
@@ -3975,7 +4069,7 @@
|
|
},
|
|
{ &hf_rsl_msg_type,
|
|
{ "Message type", "rsl.msg_type",
|
|
- FT_UINT8, BASE_HEX_DEC, VALS(rsl_msg_type_vals), 0x7f,
|
|
+ FT_UINT8, BASE_HEX_DEC, VALS(rsl_msg_type_vals), 0xff,
|
|
NULL, HFILL }
|
|
},
|
|
{ &hf_rsl_ie_id,
|
|
@@ -4392,6 +4486,36 @@
|
|
{ "Average Tx Delay", "rsl.ipacc.cstat.avg_tx_delay",
|
|
FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }
|
|
},
|
|
+ /* HSL */
|
|
+ { &hf_rsl_hsl_bts_serno,
|
|
+ { "BTS Serial Number", "rsl.hsl.bts_serno",
|
|
+ FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }
|
|
+ },
|
|
+ { &hf_rsl_hsl_tx_power,
|
|
+ { "Transmit Power", "rsl.hsl.tx_power",
|
|
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }
|
|
+ },
|
|
+ { &hf_rsl_hsl_bts_ver,
|
|
+ { "BTS Version Number", "rsl.hsl.bts_ver",
|
|
+ FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }
|
|
+ },
|
|
+ { &hf_rsl_hsl_dsp_ver,
|
|
+ { "DSP Version Number", "rsl.hsl.dsp_ver",
|
|
+ FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }
|
|
+ },
|
|
+ { &hf_rsl_hsl_fpga_ver,
|
|
+ { "FPGA Version Number", "rsl.hsl.fpga_ver",
|
|
+ FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }
|
|
+ },
|
|
+ { &hf_rsl_hsl_trau_remote_port,
|
|
+ { "HSL TRAU Remote RTP Port", "rsl.hsl.trau.remote_port",
|
|
+ FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL },
|
|
+ },
|
|
+ { &hf_rsl_hsl_trau_remote_ip,
|
|
+ { "HSL TRAU Remote IP Address", "rsl.hsl.trau.remote_ip",
|
|
+ FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL },
|
|
+ },
|
|
+
|
|
};
|
|
static gint *ett[] = {
|
|
&ett_rsl,
|