gsmtap: Add support for E1/T1 traces

GSMTAP has recently gained support for wrapping E1/T1 protocol traces.
This is very useful as contrary to pcap/wtap file based protocol traces,
GSMTAP can be streamed in real-time.

The GSMTAP pseudo-header encodes information such as
* the E1/T1 timeslot number
* the E1/T1 subeslot number (if I.460 is used)
* the E1/T1 line/span number (somewhat awkwardly as 'antenna number')
* the payload (LAPD, Frame Relay, TRAU, ...)

In this first implementation in wireshark, only FR and LAPD
sub-dissectors are added. The other payloads (TRAU) do not have any
wireshark dissectors so far.

Change-Id: Ib699e9231ef7b9e6c5053e6b920954b3e7b0a4a4
Reviewed-on: https://code.wireshark.org/review/38213
Reviewed-by: Vadim Yanitskiy <vyanitskiy@sysmocom.de>
Petri-Dish: Anders Broman <a.broman58@gmail.com>
Tested-by: Petri Dish Buildbot
Reviewed-by: Anders Broman <a.broman58@gmail.com>
This commit is contained in:
Harald Welte 2020-08-20 19:11:58 +02:00 committed by Anders Broman
parent 4dac9c2c53
commit 132d6ec70b
2 changed files with 42 additions and 0 deletions

View File

@ -62,6 +62,7 @@ static int hf_gsmtap_channel_type = -1;
static int hf_gsmtap_tetra_channel_type = -1;
static int hf_gsmtap_gmr1_channel_type = -1;
static int hf_gsmtap_rrc_sub_type = -1;
static int hf_gsmtap_e1t1_sub_type = -1;
static int hf_gsmtap_antenna = -1;
static int hf_sacch_l1h_power_lev = -1;
@ -106,6 +107,8 @@ enum {
/* LTE*/
GSMTAP_SUB_LTE_RRC,
GSMTAP_SUB_LTE_NAS,
GSMTAP_SUB_LAPD,
GSMTAP_SUB_FR,
GSMTAP_SUB_MAX
};
@ -434,6 +437,7 @@ static const value_string gsmtap_types[] = {
{ GSMTAP_TYPE_OSMOCORE_LOG, "libosmocore logging" },
{ GSMTAP_TYPE_QC_DIAG, "Qualcomm DIAG" },
{ GSMTAP_TYPE_LTE_NAS, "LTE NAS" },
{ GSMTAP_TYPE_E1T1, "E1/T1" },
{ 0, NULL },
};
@ -454,6 +458,15 @@ static const value_string gsmtap_um_voice_types[] = {
{ 0, NULL },
};
static const value_string gsmtap_um_e1t1_types[] = {
{ GSMTAP_E1T1_LAPD, "LAPD" }, /* ISDN LAPD Q.921 */
{ GSMTAP_E1T1_FR, "FR" }, /* Frame Relay */
{ GSMTAP_E1T1_RAW, "RAW" }, /* RAW/transparent B-channels */
{ GSMTAP_E1T1_TRAU16, "TRAU 16k" }, /* 16k/s sub-channels (I.460) with GSM TRAU frames */
{ GSMTAP_E1T1_TRAU8, "TRAU 8k" }, /* 8k/s sub-channels (I.460) with GSM TRAU frames */
{ 0, NULL },
};
/* dissect a SACCH L1 header which is included in the first 2 bytes
* of every SACCH frame (according to TS 04.04) */
static void
@ -896,6 +909,9 @@ dissect_gsmtap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _
else if (type == GSMTAP_TYPE_UMTS_RRC)
proto_tree_add_item(gsmtap_tree, hf_gsmtap_rrc_sub_type,
tvb, offset+12, 1, ENC_BIG_ENDIAN);
else if (type == GSMTAP_TYPE_E1T1)
proto_tree_add_item(gsmtap_tree, hf_gsmtap_e1t1_sub_type,
tvb, offset+12, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(gsmtap_tree, hf_gsmtap_antenna,
tvb, offset+13, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(gsmtap_tree, hf_gsmtap_subslot,
@ -1050,6 +1066,19 @@ dissect_gsmtap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _
break;
}
break;
case GSMTAP_TYPE_E1T1:
switch (sub_type) {
case GSMTAP_E1T1_LAPD:
sub_handle = GSMTAP_SUB_LAPD;
break;
case GSMTAP_E1T1_FR:
sub_handle = GSMTAP_SUB_FR;
break;
default:
sub_handle = GSMTAP_SUB_DATA;
break;
}
break;
case GSMTAP_TYPE_UM_BURST:
default:
sub_handle = GSMTAP_SUB_DATA;
@ -1116,6 +1145,8 @@ proto_register_gsmtap(void)
FT_UINT8, BASE_DEC, VALS(gsmtap_gmr1_channels), 0, NULL, HFILL }},
{ &hf_gsmtap_rrc_sub_type, { "Message Type", "gsmtap.rrc_sub_type",
FT_UINT8, BASE_DEC, VALS(rrc_sub_types), 0, NULL, HFILL }},
{ &hf_gsmtap_e1t1_sub_type, { "Channel Type", "gsmtap.e1t1_sub_type",
FT_UINT8, BASE_DEC, VALS(gsmtap_um_e1t1_types), 0, NULL, HFILL }},
{ &hf_gsmtap_antenna, { "Antenna Number", "gsmtap.antenna",
FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL } },
{ &hf_gsmtap_subslot, { "Sub-Slot", "gsmtap.sub_slot",
@ -1179,6 +1210,8 @@ proto_reg_handoff_gsmtap(void)
sub_handles[GSMTAP_SUB_GMR1_LAPSAT] = find_dissector_add_dependency("lapsat", proto_gsmtap);
sub_handles[GSMTAP_SUB_GMR1_RACH] = find_dissector_add_dependency("gmr1_rach", proto_gsmtap);
sub_handles[GSMTAP_SUB_UMTS_RRC] = find_dissector_add_dependency("rrc", proto_gsmtap);
sub_handles[GSMTAP_SUB_LAPD] = find_dissector_add_dependency("lapd", proto_gsmtap);
sub_handles[GSMTAP_SUB_FR] = find_dissector_add_dependency("fr", proto_gsmtap);
rrc_sub_handles[GSMTAP_RRC_SUB_DL_DCCH_Message] = find_dissector_add_dependency("rrc.dl.dcch", proto_gsmtap);
rrc_sub_handles[GSMTAP_RRC_SUB_UL_DCCH_Message] = find_dissector_add_dependency("rrc.ul.dcch", proto_gsmtap);

View File

@ -40,6 +40,7 @@
#define GSMTAP_TYPE_OSMOCORE_LOG 0x10 /* libosmocore logging */
#define GSMTAP_TYPE_QC_DIAG 0x11 /* Qualcomm DIAG frame */
#define GSMTAP_TYPE_LTE_NAS 0x12 /* LTE Non-Access Stratum */
#define GSMTAP_TYPE_E1T1 0x13 /* E1/T1 line traces */
/* ====== DO NOT MAKE UNAPPROVED MODIFICATIONS HERE ===== */
#define GSMTAP_BURST_UNKNOWN 0x00
@ -122,6 +123,14 @@
#define GSMTAP_GMR1_TCH6 0x14
#define GSMTAP_GMR1_TCH9 0x18
/* ====== DO NOT MAKE UNAPPROVED MODIFICATIONS HERE ===== */
/* sub-types for TYPE_E1T1 */
#define GSMTAP_E1T1_LAPD 0x01 /* Q.921 LAPD */
#define GSMTAP_E1T1_FR 0x02 /* Frame Relay */
#define GSMTAP_E1T1_RAW 0x03 /* raw/transparent B-channel */
#define GSMTAP_E1T1_TRAU16 0x04 /* 16k TRAU frames; sub-slot 0-3 */
#define GSMTAP_E1T1_TRAU8 0x05 /* 8k TRAU frames; sub-slot 0-7 */
#define GSMTAP_ARFCN_F_PCS 0x8000
#define GSMTAP_ARFCN_F_UPLINK 0x4000
#define GSMTAP_ARFCN_MASK 0x3fff