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):