Wireshark-dev: [Wireshark-dev] [PATCH] packet-gsmtap.c: handling LTE RRC and MAC messages
From: altaf sk <altaf329@xxxxxxxxx>
Date: Mon, 19 Jan 2015 11:04:46 +0100
Hello
Here is a patch to the packet-gsmtap.c that1. can handle LTE RRC messages and call respective dissectors
2.
can handle LTE MAC frames, fill in the struct mac_lte_info and then
call the mac-lte dissector. Following the GSMTAP header, there is a 15
byte mac_info which is needed to fill the struct mac_lte_info. Following this mac_info is the MAC payload (frame).
The corresponding gsmtap.h file is patched on the libosmocore directory.
Altaf
From b415a41a8a39f8271234d4d4c7f9c896e0575b5d Mon Sep 17 00:00:00 2001
From: altaf <altaf329@xxxxxxxxx>
Date: Mon, 12 Jan 2015 14:38:01 +0100
Subject: [PATCH] dissector handles for LTE RRC messages and LTE MAC frames
formatting
formatting
format
---
epan/dissectors/packet-gsmtap.c | 76 +++++++++++++++++++++++++++++++++++++++--
1 file changed, 73 insertions(+), 3 deletions(-)
diff --git a/epan/dissectors/packet-gsmtap.c b/epan/dissectors/packet-gsmtap.c
index 19e34d9..62a9076 100644
--- a/epan/dissectors/packet-gsmtap.c
+++ b/epan/dissectors/packet-gsmtap.c
@@ -43,6 +43,7 @@
#include <epan/packet.h>
#include "packet-tetra.h"
+#include "packet-mac-lte.h"
void proto_register_gsmtap(void);
void proto_reg_handoff_gsmtap(void);
@@ -72,6 +73,8 @@ void proto_reg_handoff_gsmtap(void);
#define GSMTAP_TYPE_GMR1_UM 0x0a /* GMR-1 L2 packets */
#define GSMTAP_TYPE_UMTS_RLC_MAC 0x0b
#define GSMTAP_TYPE_UMTS_RRC 0x0c
+#define GSMTAP_TYPE_LTE_RRC 0x0d /* LTE interface */
+#define GSMTAP_TYPE_LTE_MAC 0x0e /* LTE interface */
/* ====== DO NOT MAKE UNAPPROVED MODIFICATIONS HERE ===== */
#define GSMTAP_BURST_UNKNOWN 0x00
@@ -229,6 +232,9 @@ enum {
/* UMTS */
GSMTAP_SUB_UMTS_RLC_MAC,
GSMTAP_SUB_UMTS_RRC,
+ /* LTE*/
+ GSMTAP_SUB_LTE_RRC,
+ GSMTAP_SUB_LTE_MAC,
GSMTAP_SUB_MAX
};
@@ -299,9 +305,23 @@ enum {
GSMTAP_RRC_SUB_MAX
};
+/* LTE RRC message types */
+enum {
+ GSMTAP_LTE_RRC_SUB_DL_CCCH_Message = 0,
+ GSMTAP_LTE_RRC_SUB_DL_DCCH_Message,
+ GSMTAP_LTE_RRC_SUB_UL_CCCH_Message,
+ GSMTAP_LTE_RRC_SUB_UL_DCCH_Message,
+ GSMTAP_LTE_RRC_SUB_BCCH_BCH_Message,
+ GSMTAP_LTE_RRC_SUB_BCCH_DL_SCH_Message,
+ GSMTAP_LTE_RRC_SUB_PCCH_Message,
+ GSMTAP_LTE_RRC_SUB_MCCH_Message,
+
+ GSMTAP_LTE_RRC_SUB_MAX
+};
static dissector_handle_t sub_handles[GSMTAP_SUB_MAX];
static dissector_handle_t rrc_sub_handles[GSMTAP_RRC_SUB_MAX];
+static dissector_handle_t lte_rrc_sub_handles[GSMTAP_LTE_RRC_SUB_MAX];
static dissector_table_t gsmtap_dissector_table;
@@ -421,6 +441,8 @@ static const value_string gsmtap_types[] = {
{ GSMTAP_TYPE_GMR1_UM, "GMR-1 air interfeace (MES-MS<->GTS)" },
{ GSMTAP_TYPE_UMTS_RLC_MAC, "UMTS RLC/MAC" },
{ GSMTAP_TYPE_UMTS_RRC, "UMTS RRC" },
+ { GSMTAP_TYPE_UMTS_RRC, "LTE RRC" },
+ { GSMTAP_TYPE_UMTS_RRC, "LTE MAC" },
{ 0, NULL },
};
@@ -463,15 +485,35 @@ handle_tetra(int channel _U_, tvbuff_t *payload_tvb _U_, packet_info *pinfo _U_,
tetra_dissect_pdu(tetra_chan, TETRA_DOWNLINK, payload_tvb, tree, pinfo);
}
+static void
+attach_mac_lte_info(tvbuff_t *lte_mac_info_tvb, int len, guint8 gsmtap_hdr_len, packet_info *pinfo)
+{
+ struct mac_lte_info *p_mac_lte_info;
+ guint8 lte_mac_info_len = 15;
+ int offset = 0;
+
+ p_mac_lte_info = get_mac_lte_proto_data(pinfo);
+ p_mac_lte_info = wmem_new0(wmem_file_scope(), struct mac_lte_info);
+ p_mac_lte_info->radioType = tvb_get_guint8(lte_mac_info_tvb, offset);
+ p_mac_lte_info->direction = tvb_get_guint8(lte_mac_info_tvb, offset+1);
+ p_mac_lte_info->rntiType = tvb_get_guint8(lte_mac_info_tvb, offset+2);
+ p_mac_lte_info->rnti = tvb_get_ntohs(lte_mac_info_tvb, offset+4);
+ p_mac_lte_info->ueid = tvb_get_ntohs(lte_mac_info_tvb, offset+7);
+ p_mac_lte_info->subframeNumber = tvb_get_ntohs(lte_mac_info_tvb, offset+10);
+ p_mac_lte_info->length = len - (gsmtap_hdr_len + lte_mac_info_len);
+
+ set_mac_lte_proto_data(pinfo, p_mac_lte_info);
+}
+
/* dissect a GSMTAP header and hand payload off to respective dissector */
static void
dissect_gsmtap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
- int sub_handle, rrc_sub_handle = 0, len, offset = 0;
+ int sub_handle, rrc_sub_handle = 0, lte_rrc_sub_handle = 0, len, offset = 0;
proto_item *ti;
proto_tree *gsmtap_tree = NULL;
- tvbuff_t *payload_tvb, *l1h_tvb = NULL;
- guint8 hdr_len, type, sub_type, timeslot, subslot;
+ tvbuff_t *payload_tvb, *l1h_tvb = NULL, *lte_mac_info_tvb=NULL;
+ guint8 hdr_len, type, sub_type, timeslot, subslot, lte_mac_info_len = 15;
guint16 arfcn;
len = tvb_reported_length(tvb);
@@ -489,6 +531,9 @@ dissect_gsmtap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
sub_type & GSMTAP_CHANNEL_ACCH) {
l1h_tvb = tvb_new_subset_length(tvb, hdr_len, 2);
payload_tvb = tvb_new_subset_length(tvb, hdr_len+2, len-(hdr_len+2));
+ } else if (type == GSMTAP_TYPE_LTE_MAC) {
+ lte_mac_info_tvb = tvb_new_subset_length(tvb, hdr_len, lte_mac_info_len);
+ payload_tvb = tvb_new_subset_length(tvb, hdr_len+lte_mac_info_len, len - (hdr_len + lte_mac_info_len));
} else {
payload_tvb = tvb_new_subset_length(tvb, hdr_len, len-hdr_len);
}
@@ -604,6 +649,18 @@ dissect_gsmtap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
* sub-dissector */
col_set_str(pinfo->cinfo, COL_PROTOCOL, "RRC");
break;
+ case GSMTAP_TYPE_LTE_RRC:
+ sub_handle = GSMTAP_SUB_LTE_RRC;
+ lte_rrc_sub_handle = sub_type;
+ if (lte_rrc_sub_handle >= GSMTAP_LTE_RRC_SUB_MAX) {
+ sub_handle = GSMTAP_SUB_DATA;
+ }
+ /*Directly call the respective lte rrc message dissector */
+ break;
+ case GSMTAP_TYPE_LTE_MAC:
+ attach_mac_lte_info(lte_mac_info_tvb, len, hdr_len, pinfo);
+ sub_handle=GSMTAP_SUB_LTE_MAC;
+ break;
case GSMTAP_TYPE_UM:
if (l1h_tvb)
dissect_sacch_l1h(l1h_tvb, tree);
@@ -712,6 +769,9 @@ dissect_gsmtap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
if (sub_handle == GSMTAP_SUB_UMTS_RRC)
call_dissector(rrc_sub_handles[rrc_sub_handle], payload_tvb,
pinfo, tree);
+ else if (sub_handle == GSMTAP_SUB_LTE_RRC)
+ call_dissector(lte_rrc_sub_handles[lte_rrc_sub_handle], payload_tvb,
+ pinfo, tree);
else if (sub_handles[sub_handle] != NULL)
call_dissector(sub_handles[sub_handle], payload_tvb, pinfo, tree);
/* TODO: warn user that the WiMAX plugin must be enabled for some types */
@@ -803,6 +863,7 @@ proto_reg_handoff_gsmtap(void)
sub_handles[GSMTAP_SUB_GMR1_LAPSAT] = find_dissector("lapsat");
sub_handles[GSMTAP_SUB_GMR1_RACH] = find_dissector("gmr1_rach");
sub_handles[GSMTAP_SUB_UMTS_RRC] = find_dissector("rrc");
+ sub_handles[GSMTAP_SUB_LTE_MAC] = find_dissector("mac-lte");
rrc_sub_handles[GSMTAP_RRC_SUB_DL_DCCH_Message] = find_dissector("rrc.dl.dcch");
rrc_sub_handles[GSMTAP_RRC_SUB_UL_DCCH_Message] = find_dissector("rrc.ul.dcch");
@@ -867,6 +928,15 @@ proto_reg_handoff_gsmtap(void)
rrc_sub_handles[GSMTAP_RRC_SUB_ToTargetRNC_Container] = find_dissector("rrc.s_to_trnc_cont");
rrc_sub_handles[GSMTAP_RRC_SUB_TargetRNC_ToSourceRNC_Container] = find_dissector("rrc.t_to_srnc_cont");
+ lte_rrc_sub_handles[GSMTAP_LTE_RRC_SUB_DL_CCCH_Message] = find_dissector("lte_rrc.dl_ccch");
+ lte_rrc_sub_handles[GSMTAP_LTE_RRC_SUB_DL_DCCH_Message] = find_dissector("lte_rrc.dl_dcch");
+ lte_rrc_sub_handles[GSMTAP_LTE_RRC_SUB_UL_CCCH_Message] = find_dissector("lte_rrc.ul_ccch");
+ lte_rrc_sub_handles[GSMTAP_LTE_RRC_SUB_UL_DCCH_Message] = find_dissector("lte_rrc.ul_dcch");
+ lte_rrc_sub_handles[GSMTAP_LTE_RRC_SUB_BCCH_BCH_Message] = find_dissector("lte_rrc.bcch_bch");
+ lte_rrc_sub_handles[GSMTAP_LTE_RRC_SUB_BCCH_DL_SCH_Message] = find_dissector("lte_rrc.bcch_dl_sch");
+ lte_rrc_sub_handles[GSMTAP_LTE_RRC_SUB_PCCH_Message] = find_dissector("lte_rrc.pcch");
+ lte_rrc_sub_handles[GSMTAP_LTE_RRC_SUB_MCCH_Message] = find_dissector("lte_rrc.mcch");
+
gsmtap_handle = create_dissector_handle(dissect_gsmtap, proto_gsmtap);
dissector_add_uint("udp.port", GSMTAP_UDP_PORT, gsmtap_handle);
}
--
1.9.1
- Follow-Ups:
- Re: [Wireshark-dev] [PATCH] packet-gsmtap.c: handling LTE RRC and MAC messages
- From: Pascal Quantin
- Re: [Wireshark-dev] [PATCH] packet-gsmtap.c: handling LTE RRC and MAC messages
- Prev by Date: [Wireshark-dev] Status of Emem Removal
- Next by Date: Re: [Wireshark-dev] [PATCH] packet-gsmtap.c: handling LTE RRC and MAC messages
- Previous by thread: Re: [Wireshark-dev] Status of Emem Removal
- Next by thread: Re: [Wireshark-dev] [PATCH] packet-gsmtap.c: handling LTE RRC and MAC messages
- Index(es):