summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsswsdev <sswsdev@gmail.com>2017-05-16 16:35:41 +0300
committerAnders Broman <a.broman58@gmail.com>2017-05-18 04:52:11 +0000
commitf16bc10dd36f8451458a44d7a5522134661378c2 (patch)
tree5a0ab1f132c0e9b489db8bf695d819ae863ccd10
parentc0d81f054adb967f7cfebb7a4c493a843bf95629 (diff)
downloadwireshark-f16bc10dd36f8451458a44d7a5522134661378c2.tar.gz
UMTS FP: Track Paging Indications in PCH
The dissector now carries the 'Paging Indication Bitmap' between subsequent PCH frames. The reason for this is any frame containing the bitmap 'wakes up' users to read the subsequence frame. This feature allows us to see which paging groups were called for each frame. Also refactored some Paging Indication related fields in the umts convoersation object and tree items. Change-Id: I5e55e916ec31b60bc93238b397e07a1260906736 Reviewed-on: https://code.wireshark.org/review/21686 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Anders Broman <a.broman58@gmail.com>
-rw-r--r--epan/dissectors/asn1/nbap/nbap.cnf6
-rw-r--r--epan/dissectors/packet-nbap.c104
-rw-r--r--epan/dissectors/packet-umts_fp.c99
-rw-r--r--epan/dissectors/packet-umts_fp.h26
4 files changed, 172 insertions, 63 deletions
diff --git a/epan/dissectors/asn1/nbap/nbap.cnf b/epan/dissectors/asn1/nbap/nbap.cnf
index 30bf5b8785..7918ba292e 100644
--- a/epan/dissectors/asn1/nbap/nbap.cnf
+++ b/epan/dissectors/asn1/nbap/nbap.cnf
@@ -846,6 +846,7 @@ guint32 PICH_Mode = 0;
address dst_addr, null_addr;
conversation_t *conversation;
+fp_pch_channel_info_t *fp_pch_channel_info;
umts_fp_conversation_info_t *umts_fp_conversation_info;
int i, j, num_tf;
@@ -887,9 +888,12 @@ num_items = 1;
umts_fp_conversation_info->ul_frame_number = actx->pinfo->num;
copy_address_wmem(wmem_file_scope(), &(umts_fp_conversation_info->crnc_address), &dst_addr);
umts_fp_conversation_info->crnc_port = BindingID_port;
- umts_fp_conversation_info->paging_indications = paging_indications;
umts_fp_conversation_info->rlc_mode = FP_RLC_MODE_UNKNOWN;
+ fp_pch_channel_info = wmem_new0(wmem_file_scope(), fp_pch_channel_info_t);
+ fp_pch_channel_info->paging_indications = paging_indications;
+ umts_fp_conversation_info->channel_specific_info = (void*)fp_pch_channel_info;
+
/* DCH's in this flow */
umts_fp_conversation_info->dch_crc_present = g_nbap_msg_info_for_fp.dch_crc_present;
/* Set data for First or single channel */
diff --git a/epan/dissectors/packet-nbap.c b/epan/dissectors/packet-nbap.c
index 9d0c974831..4e9e25fe5e 100644
--- a/epan/dissectors/packet-nbap.c
+++ b/epan/dissectors/packet-nbap.c
@@ -10074,7 +10074,7 @@ dissect_nbap_AddorDeleteIndicator(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t
static int
dissect_nbap_CFN(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 2186 "./asn1/nbap/nbap.cnf"
+#line 2190 "./asn1/nbap/nbap.cnf"
offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
0U, 255U, &cfn, FALSE);
@@ -10327,7 +10327,7 @@ dissect_nbap_AvailabilityStatus(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *a
static int
dissect_nbap_HSDSCH_RNTI(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 2151 "./asn1/nbap/nbap.cnf"
+#line 2155 "./asn1/nbap/nbap.cnf"
umts_fp_conversation_info_t *umts_fp_conversation_info = NULL;
address null_addr;
conversation_t *conversation = NULL;
@@ -11549,7 +11549,7 @@ dissect_nbap_Common_E_DCH_Resource_Combination_InfoList(tvbuff_t *tvb _U_, int o
static int
dissect_nbap_Common_MACFlow_ID(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 2010 "./asn1/nbap/nbap.cnf"
+#line 2014 "./asn1/nbap/nbap.cnf"
offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
0U, maxNrOfCommonMACFlows_1, &common_macdflow_id, FALSE);
@@ -11683,7 +11683,7 @@ dissect_nbap_E_DCH_MACdFlow_Multiplexing_List(tvbuff_t *tvb _U_, int offset _U_,
static int
dissect_nbap_LogicalChannelID(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1664 "./asn1/nbap/nbap.cnf"
+#line 1668 "./asn1/nbap/nbap.cnf"
/* Set logical channel id for this entry*/
offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
1U, 15U, &logical_channel_id, FALSE);
@@ -11701,7 +11701,7 @@ dissect_nbap_LogicalChannelID(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *act
static int
dissect_nbap_MAC_PDU_SizeExtended(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1766 "./asn1/nbap/nbap.cnf"
+#line 1770 "./asn1/nbap/nbap.cnf"
offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
1U, 1504U, NULL, TRUE);
@@ -12124,7 +12124,7 @@ static const per_sequence_t CommonMACFlow_Specific_InfoItem_sequence[] = {
static int
dissect_nbap_CommonMACFlow_Specific_InfoItem(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 2017 "./asn1/nbap/nbap.cnf"
+#line 2021 "./asn1/nbap/nbap.cnf"
address dst_addr;
transportLayerAddress_ipv4 = 0;
BindingID_port = 0;
@@ -12169,7 +12169,7 @@ dissect_nbap_CommonMACFlow_Specific_InfoList(tvbuff_t *tvb _U_, int offset _U_,
static int
dissect_nbap_MACdPDU_Size(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1654 "./asn1/nbap/nbap.cnf"
+#line 1658 "./asn1/nbap/nbap.cnf"
offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
1U, 5000U, &MACdPDU_Size, TRUE);
@@ -13390,7 +13390,7 @@ dissect_nbap_CriticalityDiagnostics(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_
static int
dissect_nbap_CRNC_CommunicationContextID(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 2125 "./asn1/nbap/nbap.cnf"
+#line 2129 "./asn1/nbap/nbap.cnf"
offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
0U, 1048575U, &com_context_id, FALSE);
@@ -14843,7 +14843,7 @@ dissect_nbap_T_dCH_ID(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, p
static int
dissect_nbap_TransportFormatSet_NrOfTransportBlocks(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1093 "./asn1/nbap/nbap.cnf"
+#line 1097 "./asn1/nbap/nbap.cnf"
guint32 NrOfTransportBlocks;
offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
@@ -14886,7 +14886,7 @@ guint32 NrOfTransportBlocks;
static int
dissect_nbap_TransportFormatSet_TransportBlockSize(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1125 "./asn1/nbap/nbap.cnf"
+#line 1129 "./asn1/nbap/nbap.cnf"
guint32 TransportBlockSize;
offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
@@ -15014,7 +15014,7 @@ static const per_sequence_t TransportFormatSet_DynamicPartList_item_sequence[] =
static int
dissect_nbap_TransportFormatSet_DynamicPartList_item(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1089 "./asn1/nbap/nbap.cnf"
+#line 1093 "./asn1/nbap/nbap.cnf"
num_items++;
@@ -15032,7 +15032,7 @@ static const per_sequence_t TransportFormatSet_DynamicPartList_sequence_of[1] =
static int
dissect_nbap_TransportFormatSet_DynamicPartList(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1086 "./asn1/nbap/nbap.cnf"
+#line 1090 "./asn1/nbap/nbap.cnf"
num_items = 0;
@@ -15203,7 +15203,7 @@ dissect_nbap_TransportFormatSet(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *a
static int
dissect_nbap_T_ul_TransportFormatSet(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1064 "./asn1/nbap/nbap.cnf"
+#line 1068 "./asn1/nbap/nbap.cnf"
transportFormatSet_type = NBAP_DCH_UL;
nbap_dch_chnl_info[dch_id].num_ul_chans = 0;
@@ -15217,7 +15217,7 @@ dissect_nbap_T_ul_TransportFormatSet(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx
static int
dissect_nbap_T_dl_TransportFormatSet(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1068 "./asn1/nbap/nbap.cnf"
+#line 1072 "./asn1/nbap/nbap.cnf"
transportFormatSet_type = NBAP_DCH_DL;
nbap_dch_chnl_info[dch_id].num_dl_chans = 0;
@@ -15267,14 +15267,14 @@ static const per_sequence_t DCH_Specific_FDD_Item_sequence[] = {
static int
dissect_nbap_DCH_Specific_FDD_Item(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1058 "./asn1/nbap/nbap.cnf"
+#line 1062 "./asn1/nbap/nbap.cnf"
g_num_dch_in_flow++;
offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
ett_nbap_DCH_Specific_FDD_Item, DCH_Specific_FDD_Item_sequence);
-#line 1061 "./asn1/nbap/nbap.cnf"
+#line 1065 "./asn1/nbap/nbap.cnf"
prev_dch_id = dch_id;
@@ -15288,7 +15288,7 @@ static const per_sequence_t DCH_Specific_FDD_InformationList_sequence_of[1] = {
static int
dissect_nbap_DCH_Specific_FDD_InformationList(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1054 "./asn1/nbap/nbap.cnf"
+#line 1058 "./asn1/nbap/nbap.cnf"
g_num_dch_in_flow = 0;
prev_dch_id = 0;
@@ -15582,7 +15582,7 @@ dissect_nbap_T_dCH_ID_01(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_
static int
dissect_nbap_T_ul_TransportFormatSet_01(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1072 "./asn1/nbap/nbap.cnf"
+#line 1076 "./asn1/nbap/nbap.cnf"
transportFormatSet_type = NBAP_DCH_UL;
nbap_dch_chnl_info[dch_id].num_ul_chans = 0;
@@ -15596,7 +15596,7 @@ dissect_nbap_T_ul_TransportFormatSet_01(tvbuff_t *tvb _U_, int offset _U_, asn1_
static int
dissect_nbap_T_dl_TransportFormatSet_01(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1076 "./asn1/nbap/nbap.cnf"
+#line 1080 "./asn1/nbap/nbap.cnf"
transportFormatSet_type = NBAP_DCH_DL;
nbap_dch_chnl_info[dch_id].num_dl_chans = 0;
@@ -15652,7 +15652,7 @@ static const per_sequence_t FDD_DCHs_to_ModifyItem_sequence[] = {
static int
dissect_nbap_FDD_DCHs_to_ModifyItem(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1152 "./asn1/nbap/nbap.cnf"
+#line 1156 "./asn1/nbap/nbap.cnf"
offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
ett_nbap_FDD_DCHs_to_ModifyItem, FDD_DCHs_to_ModifyItem_sequence);
@@ -18074,7 +18074,7 @@ dissect_nbap_E_DCH_HARQ_Combining_Capability(tvbuff_t *tvb _U_, int offset _U_,
static int
dissect_nbap_E_DCH_DDI_Value(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1643 "./asn1/nbap/nbap.cnf"
+#line 1647 "./asn1/nbap/nbap.cnf"
offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
0U, 62U, &e_dch_ddi_value, FALSE);
@@ -18209,7 +18209,7 @@ static const per_sequence_t E_DCH_LogicalChannelInformationItem_sequence[] = {
static int
dissect_nbap_E_DCH_LogicalChannelInformationItem(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1640 "./asn1/nbap/nbap.cnf"
+#line 1644 "./asn1/nbap/nbap.cnf"
num_items++;
@@ -18226,7 +18226,7 @@ static const per_sequence_t E_DCH_LogicalChannelInformation_sequence_of[1] = {
static int
dissect_nbap_E_DCH_LogicalChannelInformation(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1633 "./asn1/nbap/nbap.cnf"
+#line 1637 "./asn1/nbap/nbap.cnf"
num_items = 0;
offset = dissect_per_constrained_sequence_of(tvb, offset, actx, tree, hf_index,
@@ -18259,7 +18259,7 @@ static const per_sequence_t E_DCH_MACdFlow_Specific_InfoItem_sequence[] = {
static int
dissect_nbap_E_DCH_MACdFlow_Specific_InfoItem(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1390 "./asn1/nbap/nbap.cnf"
+#line 1394 "./asn1/nbap/nbap.cnf"
umts_fp_conversation_info_t *p_conv_data = NULL;
address null_addr;
conversation_t *p_conv;
@@ -18442,7 +18442,7 @@ static const per_sequence_t E_DCH_LogicalChannelToModifyItem_sequence[] = {
static int
dissect_nbap_E_DCH_LogicalChannelToModifyItem(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1628 "./asn1/nbap/nbap.cnf"
+#line 1632 "./asn1/nbap/nbap.cnf"
offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
ett_nbap_E_DCH_LogicalChannelToModifyItem, E_DCH_LogicalChannelToModifyItem_sequence);
@@ -18517,7 +18517,7 @@ static const per_sequence_t E_DCH_MACdFlow_Specific_InfoItem_to_Modify_sequence[
static int
dissect_nbap_E_DCH_MACdFlow_Specific_InfoItem_to_Modify(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1536 "./asn1/nbap/nbap.cnf"
+#line 1540 "./asn1/nbap/nbap.cnf"
guint32 no_ddi_entries, i;
address null_addr;
nbap_edch_port_info_t *old_info;
@@ -18659,7 +18659,7 @@ static const per_sequence_t E_DCH_FDD_Information_to_Modify_sequence[] = {
static int
dissect_nbap_E_DCH_FDD_Information_to_Modify(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1443 "./asn1/nbap/nbap.cnf"
+#line 1447 "./asn1/nbap/nbap.cnf"
address dst_addr, null_addr;
conversation_t *conversation,*old_conversation = NULL;
@@ -23356,7 +23356,7 @@ static const per_sequence_t HSDSCH_Common_System_InformationFDD_sequence[] = {
static int
dissect_nbap_HSDSCH_Common_System_InformationFDD(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 2037 "./asn1/nbap/nbap.cnf"
+#line 2041 "./asn1/nbap/nbap.cnf"
/*
* 5.1.6 High Speed Downlink Shared Channels
* The Data Transfer procedure is used to transfer a HS-DSCH DATA FRAME (TYPE 1, TYPE 2 [FDD and 1.28Mcps
@@ -23517,7 +23517,7 @@ static const per_sequence_t HSDSCH_MACdFlow_Specific_InfoItem_sequence[] = {
static int
dissect_nbap_HSDSCH_MACdFlow_Specific_InfoItem(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1744 "./asn1/nbap/nbap.cnf"
+#line 1748 "./asn1/nbap/nbap.cnf"
address dst_addr;
@@ -23620,7 +23620,7 @@ static const value_string nbap_RLC_Mode_vals[] = {
static int
dissect_nbap_RLC_Mode(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1671 "./asn1/nbap/nbap.cnf"
+#line 1675 "./asn1/nbap/nbap.cnf"
guint32 rlc_mode;
offset = dissect_per_enumerated(tvb, offset, actx, tree, hf_index,
@@ -23661,7 +23661,7 @@ static const per_sequence_t PriorityQueue_InfoItem_sequence[] = {
static int
dissect_nbap_PriorityQueue_InfoItem(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1735 "./asn1/nbap/nbap.cnf"
+#line 1739 "./asn1/nbap/nbap.cnf"
num_items++;
@@ -23695,7 +23695,7 @@ static const per_sequence_t HSDSCH_MACdFlows_Information_sequence[] = {
static int
dissect_nbap_HSDSCH_MACdFlows_Information(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1695 "./asn1/nbap/nbap.cnf"
+#line 1699 "./asn1/nbap/nbap.cnf"
int protocol_ie_id;
guint32 i;
@@ -23739,7 +23739,7 @@ dissect_nbap_HSDSCH_MACdFlows_Information(tvbuff_t *tvb _U_, int offset _U_, asn
static int
dissect_nbap_T_hSDSCH_Physical_Layer_Category(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1688 "./asn1/nbap/nbap.cnf"
+#line 1692 "./asn1/nbap/nbap.cnf"
guint32 hsdsch_physical_layer_category;
offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
@@ -23807,7 +23807,7 @@ static const per_sequence_t HSDSCH_FDD_Information_sequence[] = {
static int
dissect_nbap_HSDSCH_FDD_Information(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1796 "./asn1/nbap/nbap.cnf"
+#line 1800 "./asn1/nbap/nbap.cnf"
/*
* Collect the information about the HSDSCH MACdFlows set up conversation(s) and set the conversation data.
*/
@@ -23944,7 +23944,7 @@ static const per_sequence_t HSDSCH_MACdFlow_Specific_InfoItem_to_Modify_sequence
static int
dissect_nbap_HSDSCH_MACdFlow_Specific_InfoItem_to_Modify(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1885 "./asn1/nbap/nbap.cnf"
+#line 1889 "./asn1/nbap/nbap.cnf"
address dst_addr;
transportLayerAddress_ipv4 = 0;
BindingID_port = 0;
@@ -24002,7 +24002,7 @@ static const per_sequence_t PriorityQueue_InfoItem_to_Add_sequence[] = {
static int
dissect_nbap_PriorityQueue_InfoItem_to_Add(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1738 "./asn1/nbap/nbap.cnf"
+#line 1742 "./asn1/nbap/nbap.cnf"
num_items = 1;
@@ -24137,7 +24137,7 @@ static const per_sequence_t HSDSCH_Information_to_Modify_sequence[] = {
static int
dissect_nbap_HSDSCH_Information_to_Modify(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1905 "./asn1/nbap/nbap.cnf"
+#line 1909 "./asn1/nbap/nbap.cnf"
/*
* This is pretty much the same like if we setup a previous flow
*/
@@ -24259,7 +24259,7 @@ static const value_string nbap_HSDSCH_MACdPDUSizeFormat_vals[] = {
static int
dissect_nbap_HSDSCH_MACdPDUSizeFormat(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1773 "./asn1/nbap/nbap.cnf"
+#line 1777 "./asn1/nbap/nbap.cnf"
/*
* Removed 10 Aug. 2012, I'm not sure if this was right, it wrongfully
* set some packets as type 2 for HSDHCH modified items.
@@ -24370,7 +24370,7 @@ static const per_sequence_t HSDSCH_MACdFlow_Specific_InformationResp_Item_sequen
static int
dissect_nbap_HSDSCH_MACdFlow_Specific_InformationResp_Item(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1741 "./asn1/nbap/nbap.cnf"
+#line 1745 "./asn1/nbap/nbap.cnf"
num_items++;
@@ -24786,7 +24786,7 @@ static const per_sequence_t HSDSCH_Paging_System_InformationFDD_sequence[] = {
static int
dissect_nbap_HSDSCH_Paging_System_InformationFDD(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 2115 "./asn1/nbap/nbap.cnf"
+#line 2119 "./asn1/nbap/nbap.cnf"
/*
g_warning("HS-DSCH Type 3 NOT Implemented!");
*/
@@ -24980,7 +24980,7 @@ static const per_sequence_t HSDSCH_MACdFlows_to_Delete_Item_sequence[] = {
static int
dissect_nbap_HSDSCH_MACdFlows_to_Delete_Item(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1732 "./asn1/nbap/nbap.cnf"
+#line 1736 "./asn1/nbap/nbap.cnf"
num_items++;
@@ -24997,7 +24997,7 @@ static const per_sequence_t HSDSCH_MACdFlows_to_Delete_sequence_of[1] = {
static int
dissect_nbap_HSDSCH_MACdFlows_to_Delete(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1727 "./asn1/nbap/nbap.cnf"
+#line 1731 "./asn1/nbap/nbap.cnf"
num_items = 0;
@@ -28099,7 +28099,7 @@ dissect_nbap_NI_Information(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx
static int
dissect_nbap_NodeB_CommunicationContextID(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 2129 "./asn1/nbap/nbap.cnf"
+#line 2133 "./asn1/nbap/nbap.cnf"
/*Set up and map that maps Node-B ids to CRNC ids, since often you only have one of them present in nbap*/
nbap_com_context_id_t *cur_val;
@@ -28664,7 +28664,7 @@ dissect_nbap_RACH_SubChannelNumbers(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_
static int
dissect_nbap_T_dCH_id(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1158 "./asn1/nbap/nbap.cnf"
+#line 1162 "./asn1/nbap/nbap.cnf"
offset = dissect_nbap_DCH_ID(tvb, offset, actx, tree, hf_index);
@@ -28686,7 +28686,7 @@ static const per_sequence_t RL_Specific_DCH_Info_Item_sequence[] = {
static int
dissect_nbap_RL_Specific_DCH_Info_Item(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1163 "./asn1/nbap/nbap.cnf"
+#line 1167 "./asn1/nbap/nbap.cnf"
address dst_addr, null_addr;
conversation_t *conversation = NULL;
umts_fp_conversation_info_t *umts_fp_conversation_info;
@@ -28831,7 +28831,7 @@ static const per_sequence_t RL_Specific_E_DCH_Information_Item_sequence[] = {
static int
dissect_nbap_RL_Specific_E_DCH_Information_Item(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1278 "./asn1/nbap/nbap.cnf"
+#line 1282 "./asn1/nbap/nbap.cnf"
address dst_addr, null_addr;
conversation_t *conversation;
umts_fp_conversation_info_t *umts_fp_conversation_info = NULL;
@@ -32398,7 +32398,7 @@ static const per_sequence_t FACH_ParametersItem_CTCH_SetupRqstFDD_sequence[] = {
static int
dissect_nbap_FACH_ParametersItem_CTCH_SetupRqstFDD(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 956 "./asn1/nbap/nbap.cnf"
+#line 960 "./asn1/nbap/nbap.cnf"
address dst_addr, null_addr;
conversation_t *conversation;
@@ -32521,7 +32521,7 @@ dissect_nbap_FACH_ParametersListIE_CTCH_SetupRqstFDD(tvbuff_t *tvb _U_, int offs
static int
dissect_nbap_T_transportFormatSet(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1080 "./asn1/nbap/nbap.cnf"
+#line 1084 "./asn1/nbap/nbap.cnf"
transportFormatSet_type = NBAP_PCH;
nbap_dch_chnl_info[commontransportchannelid].num_dl_chans = 0;
nbap_dch_chnl_info[commontransportchannelid].num_ul_chans = 0;
@@ -32571,6 +32571,7 @@ dissect_nbap_PCH_ParametersItem_CTCH_SetupRqstFDD(tvbuff_t *tvb _U_, int offset
address dst_addr, null_addr;
conversation_t *conversation;
+fp_pch_channel_info_t *fp_pch_channel_info;
umts_fp_conversation_info_t *umts_fp_conversation_info;
int i, j, num_tf;
@@ -32614,9 +32615,12 @@ num_items = 1;
umts_fp_conversation_info->ul_frame_number = actx->pinfo->num;
copy_address_wmem(wmem_file_scope(), &(umts_fp_conversation_info->crnc_address), &dst_addr);
umts_fp_conversation_info->crnc_port = BindingID_port;
- umts_fp_conversation_info->paging_indications = paging_indications;
umts_fp_conversation_info->rlc_mode = FP_RLC_MODE_UNKNOWN;
+ fp_pch_channel_info = wmem_new0(wmem_file_scope(), fp_pch_channel_info_t);
+ fp_pch_channel_info->paging_indications = paging_indications;
+ umts_fp_conversation_info->channel_specific_info = (void*)fp_pch_channel_info;
+
/* DCH's in this flow */
umts_fp_conversation_info->dch_crc_present = g_nbap_msg_info_for_fp.dch_crc_present;
/* Set data for First or single channel */
@@ -41129,7 +41133,7 @@ col_set_str(actx->pinfo->cinfo, COL_INFO,"RadioLinkReconfigurationCommit ");
actx->pinfo->link_dir=P2P_DIR_DL;
-#line 2178 "./asn1/nbap/nbap.cnf"
+#line 2182 "./asn1/nbap/nbap.cnf"
/*
* Here we need to signal the CFN value, down to FP so
* that lowert layers know when a reconfiguration becomes active
diff --git a/epan/dissectors/packet-umts_fp.c b/epan/dissectors/packet-umts_fp.c
index 168f251f96..1b17a4a19c 100644
--- a/epan/dissectors/packet-umts_fp.c
+++ b/epan/dissectors/packet-umts_fp.c
@@ -94,6 +94,7 @@ static int hf_fp_pch_tfi = -1;
static int hf_fp_fach_tfi = -1;
static int hf_fp_transmit_power_level = -1;
static int hf_fp_paging_indication_bitmap = -1;
+static int hf_fp_relevant_paging_indication_bitmap = -1;
static int hf_fp_pdsch_set_id = -1;
static int hf_fp_rx_timing_deviation = -1;
static int hf_fp_dch_e_rucch_flag = -1;
@@ -200,6 +201,7 @@ static int hf_fp_extended_bits = -1;
static int hf_fp_spare_extension = -1;
static int hf_fp_ul_setup_frame = -1;
static int hf_fp_dl_setup_frame = -1;
+static int hf_fp_relevant_pi_frame = -1;
/* Subtrees. */
static int ett_fp = -1;
@@ -214,6 +216,7 @@ static int ett_fp_edch_macis_descriptors = -1;
static int ett_fp_hsdsch_new_ie_flags = -1;
static int ett_fp_rach_new_ie_flags = -1;
static int ett_fp_hsdsch_pdu_block_header = -1;
+static int ett_fp_pch_relevant_pi = -1;
static expert_field ei_fp_hsdsch_common_experimental_support = EI_INIT;
static expert_field ei_fp_hsdsch_common_t3_not_implemented = EI_INIT;
@@ -253,6 +256,7 @@ static gboolean preferences_call_mac_dissectors = TRUE;
static gboolean preferences_show_release_info = TRUE;
static gboolean preferences_payload_checksum = TRUE;
static gboolean preferences_header_checksum = TRUE;
+static gboolean preferences_track_paging_indications = TRUE;
#define UMTS_FP_USE_UAT 1
@@ -2045,8 +2049,38 @@ dissect_pch_channel_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
(p_fp_info->paging_indications+7) / 8,
ENC_NA);
proto_item_append_text(ti, " (%u bits)", p_fp_info->paging_indications);
+
+ if(preferences_track_paging_indications && !pinfo->fd->flags.visited){
+ paging_indications_info_t* current_pi_info;
+ current_pi_info = wmem_new0(wmem_file_scope(), paging_indications_info_t);
+ current_pi_info->frame_number = pinfo->num;
+ current_pi_info->paging_indications_bitmap = (guint8*)tvb_memdup(wmem_file_scope(), tvb, offset, (p_fp_info->paging_indications+7) / 8);
+ p_fp_info->current_paging_indications = current_pi_info;
+ }
+
offset += ((p_fp_info->paging_indications+7) / 8);
}
+ if(preferences_track_paging_indications && p_fp_info->relevant_paging_indications) {
+ /*If tracking PI is enabled and PI info (from the last packet) is attached, show on tree*/
+ proto_tree *relevant_pi_tree;
+ proto_item *ti;
+ tvbuff_t *pi_tvb;
+ pi_tvb = tvb_new_child_real_data(tvb,
+ p_fp_info->relevant_paging_indications->paging_indications_bitmap,
+ (p_fp_info->paging_indications+7) / 8,
+ (p_fp_info->paging_indications+7) / 8);
+ add_new_data_source(pinfo, pi_tvb, "Relevant Paging Indication");
+ ti = proto_tree_add_item(tree, hf_fp_relevant_paging_indication_bitmap, pi_tvb,
+ 0,
+ (p_fp_info->paging_indications+7) / 8,
+ ENC_NA);
+ proto_item_append_text(ti, " (%u bits)", p_fp_info->paging_indications);
+ PROTO_ITEM_SET_GENERATED(ti);
+ relevant_pi_tree = proto_item_add_subtree(ti, ett_fp_pch_relevant_pi);
+ ti = proto_tree_add_uint(relevant_pi_tree, hf_fp_relevant_pi_frame,
+ tvb, 0, 0, p_fp_info->relevant_paging_indications->frame_number);
+ PROTO_ITEM_SET_GENERATED(ti);
+ }
/* TB data */
offset = dissect_tb_data(tvb, pinfo, tree, offset, p_fp_info, &mac_fdd_pch_handle, data);
@@ -3942,6 +3976,7 @@ fill_pch_coversation_info_for_heur(umts_fp_conversation_info_t* umts_fp_conversa
umts_fp_conversation_info->num_dch_in_flow = 1;
umts_fp_conversation_info->fp_dch_channel_info[0].num_dl_chans = 1;
umts_fp_conversation_info->fp_dch_channel_info[0].dl_chan_num_tbs[1] = 1;
+ umts_fp_conversation_info->channel_specific_info = (void*)wmem_new0(wmem_file_scope(), fp_pch_channel_info_t);
}
/* Attaches conversation info to both the downlink and uplink 'conversations' (streams) */
/* (Required since only one of them is checked in every dissected FP packet) */
@@ -4325,6 +4360,7 @@ heur_dissect_fp_pch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *d
{
conversation_t *p_conv;
umts_fp_conversation_info_t* umts_fp_conversation_info = NULL;
+ fp_pch_channel_info_t* fp_pch_channel_info = NULL;
struct fp_info *p_fp_info;
int length;
guint8 frame_type;
@@ -4352,8 +4388,10 @@ heur_dissect_fp_pch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *d
/* Checking if the conversation was already framed */
umts_fp_conversation_info = (umts_fp_conversation_info_t *)conversation_get_proto_data(p_conv, proto_fp);
if (umts_fp_conversation_info) {
- if (umts_fp_conversation_info->channel == CHANNEL_PCH) {
- pi_length_found = umts_fp_conversation_info->paging_indications != 0;
+ fp_pch_channel_info = (fp_pch_channel_info_t*)umts_fp_conversation_info->channel_specific_info;
+ /* Making sure this conversation type is "PCH" and the PCH channel info is present */
+ if (umts_fp_conversation_info->channel == CHANNEL_PCH && fp_pch_channel_info != NULL) {
+ pi_length_found = fp_pch_channel_info->paging_indications != 0;
tb_size_found = umts_fp_conversation_info->fp_dch_channel_info[0].dl_chan_tf_size[1] != 0;
if (pi_length_found && tb_size_found) {
/* Stream already framed - contains both PI length and TB size */
@@ -4433,17 +4471,19 @@ heur_dissect_fp_pch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *d
if (!umts_fp_conversation_info) {
umts_fp_conversation_info = wmem_new0(wmem_file_scope(), umts_fp_conversation_info_t);
fill_pch_coversation_info_for_heur(umts_fp_conversation_info, pinfo);
+ fp_pch_channel_info = (fp_pch_channel_info_t*)umts_fp_conversation_info->channel_specific_info;
}
- umts_fp_conversation_info->paging_indications = pi_bit_length;
+ fp_pch_channel_info->paging_indications = pi_bit_length;
set_both_sides_umts_fp_conv_data(pinfo, umts_fp_conversation_info);
pi_length_found = TRUE;
}
else if (tfi == 0x01 && !tb_size_found && pi_length_found) {
/* TB present and PI bitmap length is known. Can calculate TB length.*/
- pi_byte_length = (umts_fp_conversation_info->paging_indications + 7) / 8;
+ pi_byte_length = (fp_pch_channel_info->paging_indications + 7) / 8;
if (!umts_fp_conversation_info) {
umts_fp_conversation_info = wmem_new0(wmem_file_scope(), umts_fp_conversation_info_t);
fill_pch_coversation_info_for_heur(umts_fp_conversation_info, pinfo);
+ fp_pch_channel_info = (fp_pch_channel_info_t*)umts_fp_conversation_info->channel_specific_info;
}
tb_byte_length = (length - (pi_byte_length + 6)) * 8; /* Removing header length (4), footer length (2) and PI bitmap length*/
/* Possible TB lengths for PCH is 10 or 30 bytes ( See 3GPP TR 25.944 / 4.1.1.2 ) */
@@ -4878,6 +4918,7 @@ fp_set_per_packet_inf_from_conv(conversation_t *p_conv,
guint8 fake_lchid=0;
gint *cur_val=NULL;
guint32 user_identity;
+ fp_pch_channel_info_t *fp_pch_channel_info;
fpi = wmem_new0(wmem_file_scope(), fp_info);
p_add_proto_data(wmem_file_scope(), pinfo, proto_fp, 0, fpi);
@@ -5002,14 +5043,18 @@ fp_set_per_packet_inf_from_conv(conversation_t *p_conv,
return fpi;
case CHANNEL_PCH:
- fpi->paging_indications = p_conv_data->paging_indications;
+ fp_pch_channel_info = (fp_pch_channel_info_t*)p_conv_data->channel_specific_info;
+ fpi->paging_indications = fp_pch_channel_info->paging_indications;
fpi->num_chans = p_conv_data->num_dch_in_flow;
- /* Set offset to point to first TFI
- */
+
if (is_control_frame) {
/* control frame, we're done */
return fpi;
}
+ /* Inesrting Paging Indication Info extracted from the previous packet */
+ fpi->relevant_paging_indications = fp_pch_channel_info->last_paging_indication_info;
+ fp_pch_channel_info->last_paging_indication_info = NULL;
+
/* Set offset to TFI */
offset = 3;
break;
@@ -5199,6 +5244,24 @@ fp_set_per_packet_inf_from_conv(conversation_t *p_conv,
return fpi;
}
+/* Updates the conversation info of a PCH stream based on information parsed in the current frame*/
+static void
+update_pch_coversation_info(umts_fp_conversation_info_t *p_conv_data, packet_info *pinfo, struct fp_info *p_fp_info)
+{
+ fp_pch_channel_info_t* fp_pch_channel_info;
+ /* The channel type MUST be set to PCH */
+ DISSECTOR_ASSERT(p_conv_data->channel == CHANNEL_PCH);
+
+ fp_pch_channel_info = (fp_pch_channel_info_t*)p_conv_data->channel_specific_info;
+ if(p_fp_info->current_paging_indications && !pinfo->fd->flags.visited)
+ {
+ /* Saving the PI info for the next packet to find */
+ fp_pch_channel_info->last_paging_indication_info = p_fp_info->current_paging_indications;
+ /* Resetting this field so we don't add it again to the conversation next time the packet is parsed */
+ p_fp_info->current_paging_indications = NULL;
+ }
+}
+
/*****************************/
/* Main dissection function. */
static int
@@ -5404,6 +5467,7 @@ dissect_fp_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *dat
case CHANNEL_PCH:
dissect_pch_channel_info(tvb, pinfo, fp_tree, offset, p_fp_info,
data);
+ update_pch_coversation_info(p_conv_data, pinfo, p_fp_info);
break;
case CHANNEL_CPCH:
dissect_cpch_channel_info(tvb, pinfo, fp_tree, offset, p_fp_info);
@@ -5856,10 +5920,16 @@ void proto_register_fp(void)
},
{ &hf_fp_paging_indication_bitmap,
{ "Paging Indications bitmap",
- "fp.pch.pi-bitmap", FT_NONE, BASE_NONE, NULL, 0x0,
+ "fp.pch.pi-bitmap", FT_BYTES , BASE_NONE, NULL, 0x0,
"Paging Indication bitmap", HFILL
}
},
+ { &hf_fp_relevant_paging_indication_bitmap,
+ { "Relevant Paging Indications bitmap",
+ "fp.pch.relevant-pi-bitmap", FT_BYTES , BASE_NONE, NULL, 0x0,
+ "The Paging Indication bitmap used to inform users about the current frame", HFILL
+ }
+ },
{ &hf_fp_rx_timing_deviation,
{ "Rx Timing Deviation",
"fp.common.control.rx-timing-deviation", FT_UINT8, BASE_DEC, 0, 0x0,
@@ -6520,6 +6590,13 @@ void proto_register_fp(void)
NULL, HFILL
}
},
+ { &hf_fp_relevant_pi_frame,
+ { "Paging Indications frame number",
+ "fp.pch.relevant-pi-frame", FT_FRAMENUM, BASE_NONE, NULL, 0x0,
+ "The frame where this Paging Indication bitmap was found",
+ HFILL
+ }
+ },
{ &hf_fp_hsdsch_physical_layer_category,
{ "HS-DSCH physical layer category",
"fp.hsdsch.physical_layer_category", FT_UINT8, BASE_DEC, NULL, 0x0,
@@ -6542,6 +6619,7 @@ void proto_register_fp(void)
&ett_fp_hsdsch_new_ie_flags,
&ett_fp_rach_new_ie_flags,
&ett_fp_hsdsch_pdu_block_header,
+ &ett_fp_pch_relevant_pi,
&ett_fp_release
};
@@ -6645,6 +6723,11 @@ void proto_register_fp(void)
"Validate FP header checksums",
&preferences_header_checksum);
/* Determines whether or not to validate FP header checksums */
+ prefs_register_bool_preference(fp_module, "track_paging_indications",
+ "Track Paging Indications in PCH channels",
+ "For each PCH data frame, Try to show the paging indications bitmap found in the previous frame",
+ &preferences_track_paging_indications);
+ /* Determines whether or not to validate FP header checksums */
prefs_register_obsolete_preference(fp_module, "udp_heur");
#ifdef UMTS_FP_USE_UAT
diff --git a/epan/dissectors/packet-umts_fp.h b/epan/dissectors/packet-umts_fp.h
index 7bac45bd51..551234da10 100644
--- a/epan/dissectors/packet-umts_fp.h
+++ b/epan/dissectors/packet-umts_fp.h
@@ -81,6 +81,14 @@ enum fp_rlc_mode {
FP_RLC_AM
};
+
+/* Information about the Paging Indication Bitmap seen in a specific PCH frame*/
+typedef struct paging_indications_info_t
+{
+ guint32 frame_number;
+ guint8* paging_indications_bitmap;
+} paging_indications_info_t;
+
/* Info attached to each FP packet */
typedef struct fp_info
{
@@ -92,7 +100,6 @@ typedef struct fp_info
gboolean is_uplink;
gint channel; /* see Channel types definitions above */
guint8 dch_crc_present; /* 0=No, 1=Yes, 2=Unknown */
- gint paging_indications;
gint num_chans;
#define MAX_FP_CHANS 64
gint chan_tf_size[MAX_FP_CHANS];
@@ -112,6 +119,12 @@ typedef struct fp_info
gint com_context_id; /* Identifies a single UE in the network */
guint16 srcport, destport;
+ /* PCH Related data*/
+ gint paging_indications;
+ paging_indications_info_t* relevant_paging_indications; /* Info from previous frame */
+ /* Info from the current frame. Used to carry information from this frame to the converstaion info */
+ paging_indications_info_t* current_paging_indications;
+
/* HSDSCH Related data */
enum fp_hsdsch_entity hsdsch_entity;
gint hsdsch_macflowd_id;
@@ -159,6 +172,14 @@ typedef struct fp_rach_channel_info_t
wmem_tree_t* crnti_to_urnti_map; /* Mapping between C-RNTIs and U-RNTIs using them in this RACH */
} fp_rach_channel_info_t;
+/* Used in the 'channel_specific_info' field for PCH channels */
+typedef struct fp_pch_channel_info_t
+{
+ /*Size of the Paging Indication field in this PCH*/
+ gint paging_indications;
+ /* Information from the previous frame in this field which contained the paging indication field*/
+ paging_indications_info_t* last_paging_indication_info;
+} fp_pch_channel_info_t;
typedef struct
{
@@ -174,9 +195,6 @@ typedef struct
void* channel_specific_info; /* Extended channel info based on the channel type */
- /* For PCH channel */
- gint paging_indications;
-
/* DCH's in this flow */
gint num_dch_in_flow;
gint dchs_in_flow_list[FP_maxNrOfTFs];