From 132d6ec70bd9e17e124e4f94537c903bd4b286d7 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Thu, 20 Aug 2020 19:11:58 +0200 Subject: [PATCH] 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 Petri-Dish: Anders Broman Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman --- epan/dissectors/packet-gsmtap.c | 33 +++++++++++++++++++++++++++++++++ epan/dissectors/packet-gsmtap.h | 9 +++++++++ 2 files changed, 42 insertions(+) diff --git a/epan/dissectors/packet-gsmtap.c b/epan/dissectors/packet-gsmtap.c index 048731c4dd..5fe6ee01a5 100644 --- a/epan/dissectors/packet-gsmtap.c +++ b/epan/dissectors/packet-gsmtap.c @@ -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); diff --git a/epan/dissectors/packet-gsmtap.h b/epan/dissectors/packet-gsmtap.h index 7744257510..c097d114ee 100644 --- a/epan/dissectors/packet-gsmtap.h +++ b/epan/dissectors/packet-gsmtap.h @@ -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