From d1fec1b9853da1458a2c806ad0f400a2b1112036 Mon Sep 17 00:00:00 2001 From: Martin Mathieson Date: Tue, 24 Mar 2009 17:28:30 +0000 Subject: Only report CRC Status when we know it to be valid. svn path=/trunk/; revision=27841 --- epan/dissectors/packet-catapult-dct2000.c | 16 +++++++++++++--- epan/dissectors/packet-mac-lte.c | 23 +++++++++++++---------- epan/dissectors/packet-mac-lte.h | 6 ++++-- gtk/mac_lte_stat_dlg.c | 10 +++++----- 4 files changed, 35 insertions(+), 20 deletions(-) diff --git a/epan/dissectors/packet-catapult-dct2000.c b/epan/dissectors/packet-catapult-dct2000.c index 37cc2718de..610dbb3b3b 100644 --- a/epan/dissectors/packet-catapult-dct2000.c +++ b/epan/dissectors/packet-catapult-dct2000.c @@ -1326,7 +1326,7 @@ static void attach_mac_lte_info(packet_info *pinfo) } /* Populate the struct from outhdr values */ - p_mac_lte_info->crcStatus = TRUE; + p_mac_lte_info->crcStatusValid = FALSE; p_mac_lte_info->radioType = outhdr_values[i++]; p_mac_lte_info->rntiType = outhdr_values[i++]; @@ -1340,10 +1340,20 @@ static void attach_mac_lte_info(packet_info *pinfo) p_mac_lte_info->reTxCount = outhdr_values[i++]; } if (outhdr_values_found > 9) { - p_mac_lte_info->crcStatus = outhdr_values[i++]; + /* CRC only valid for DL-SCH */ + if ((p_mac_lte_info->direction == DIRECTION_DOWNLINK) && + ((p_mac_lte_info->rntiType == C_RNTI) || + (p_mac_lte_info->rntiType == SI_RNTI) || + (p_mac_lte_info->rntiType == P_RNTI))) { + + p_mac_lte_info->crcStatusValid = TRUE; + p_mac_lte_info->crcStatus = outhdr_values[i++]; + } + else { + i++; + } } - /* Store info in packet */ p_add_proto_data(pinfo->fd, proto_mac_lte, p_mac_lte_info); } diff --git a/epan/dissectors/packet-mac-lte.c b/epan/dissectors/packet-mac-lte.c index 2200cc218a..631edeb3c9 100644 --- a/epan/dissectors/packet-mac-lte.c +++ b/epan/dissectors/packet-mac-lte.c @@ -1066,23 +1066,26 @@ void dissect_mac_lte(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) } } - ti = proto_tree_add_uint(mac_lte_tree, hf_mac_lte_context_crc_status, - tvb, 0, 0, p_mac_lte_info->crcStatus); - PROTO_ITEM_SET_GENERATED(ti); - if (p_mac_lte_info->crcStatus != TRUE) { - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "Frame has CRC error"); - if (check_col(pinfo->cinfo, COL_INFO)) { - col_append_fstr(pinfo->cinfo, COL_INFO, ""); + if (p_mac_lte_info->crcStatusValid) { + ti = proto_tree_add_uint(mac_lte_tree, hf_mac_lte_context_crc_status, + tvb, 0, 0, p_mac_lte_info->crcStatus); + PROTO_ITEM_SET_GENERATED(ti); + if (p_mac_lte_info->crcStatus != TRUE) { + expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, + "Frame has CRC error"); + if (check_col(pinfo->cinfo, COL_INFO)) { + col_append_fstr(pinfo->cinfo, COL_INFO, ""); + } } } /* Set context-info parts of tap struct */ tap_info.rnti = p_mac_lte_info->rnti; - tap_info.rnti_type = p_mac_lte_info->rntiType; - tap_info.is_predefined_data = p_mac_lte_info->isPredefinedData; + tap_info.rntiType = p_mac_lte_info->rntiType; + tap_info.isPredefinedData = p_mac_lte_info->isPredefinedData; tap_info.reTxCount = p_mac_lte_info->reTxCount; + tap_info.crcStatusValid = p_mac_lte_info->crcStatusValid; tap_info.crcStatus = p_mac_lte_info->crcStatus; tap_info.direction = p_mac_lte_info->direction; diff --git a/epan/dissectors/packet-mac-lte.h b/epan/dissectors/packet-mac-lte.h index 56df48b67f..21d807ee04 100644 --- a/epan/dissectors/packet-mac-lte.h +++ b/epan/dissectors/packet-mac-lte.h @@ -53,6 +53,7 @@ typedef struct mac_lte_info guint8 isPredefinedData; guint16 length; guint8 reTxCount; + guint8 crcStatusValid; guint8 crcStatus; } mac_lte_info; @@ -60,9 +61,10 @@ typedef struct mac_lte_info typedef struct mac_lte_tap_info { /* Info from context */ guint16 rnti; - guint8 rnti_type; - guint8 is_predefined_data; + guint8 rntiType; + guint8 isPredefinedData; guint8 reTxCount; + guint8 crcStatusValid; guint8 crcStatus; guint8 direction; diff --git a/gtk/mac_lte_stat_dlg.c b/gtk/mac_lte_stat_dlg.c index 65e9121d2a..7ce31e2288 100644 --- a/gtk/mac_lte_stat_dlg.c +++ b/gtk/mac_lte_stat_dlg.c @@ -289,7 +289,7 @@ mac_lte_stat_packet(void *phs, packet_info *pinfo, epan_dissect_t *edt _U_, hs->number_of_packets++; /* For common channels, just update global counters */ - switch (si->rnti_type) { + switch (si->rntiType) { case P_RNTI: common_stats.pch_frames++; common_stats.pch_bytes += si->single_number_of_bytes; @@ -336,8 +336,8 @@ mac_lte_stat_packet(void *phs, packet_info *pinfo, epan_dissect_t *edt _U_, /* Update entry with details from si */ te->number_of_packets++; te->stats.rnti = si->rnti; - te->stats.is_predefined_data = si->is_predefined_data; - if (!si->crcStatus) { + te->stats.is_predefined_data = si->isPredefinedData; + if (si->crcStatusValid && !si->crcStatus) { if (si->direction == DIRECTION_UPLINK) { te->stats.UL_CRC_errors++; return 1; @@ -356,7 +356,7 @@ mac_lte_stat_packet(void *phs, packet_info *pinfo, epan_dissect_t *edt _U_, } te->stats.UL_frames++; - if (si->is_predefined_data) { + if (si->isPredefinedData) { te->stats.UL_total_bytes += si->single_number_of_bytes; } else { @@ -379,7 +379,7 @@ mac_lte_stat_packet(void *phs, packet_info *pinfo, epan_dissect_t *edt _U_, te->stats.DL_frames++; - if (si->is_predefined_data) { + if (si->isPredefinedData) { te->stats.DL_total_bytes += si->single_number_of_bytes; } else { -- cgit v1.2.3