Report accurate NACK count in stats (although not all values stored in array in tap).

svn path=/trunk/; revision=32117
This commit is contained in:
Martin Mathieson 2010-03-04 20:58:54 +00:00
parent b2c9e92823
commit 5e8b6b21b2
1 changed files with 14 additions and 10 deletions

View File

@ -337,14 +337,14 @@ static GHashTable *rlc_lte_frame_sequence_analysis_report_hash = NULL;
/* Conversation-type status for repeated NACK checking on channel */
typedef struct
{
guint8 noOfNACKs;
guint16 noOfNACKs;
guint16 NACKs[MAX_NACKs];
} rlc_channel_repeated_nack_status;
static GHashTable *rlc_lte_repeated_nack_channel_hash = NULL;
typedef struct {
guint8 noOfNACKsRepeated;
guint16 noOfNACKsRepeated;
guint16 repeatedNACKs[MAX_NACKs];
} rlc_channel_repeated_nack_report_in_frame;
@ -960,7 +960,7 @@ static void checkChannelRepeatedNACKInfo(packet_info *pinfo,
rlc_channel_repeated_nack_status *p_channel_status;
rlc_channel_repeated_nack_report_in_frame *p_report_in_frame = NULL;
guint8 noOfNACKsRepeated = 0;
guint16 noOfNACKsRepeated = 0;
guint16 repeatedNACKs[MAX_NACKs];
gint n, i, j;
@ -1004,10 +1004,10 @@ static void checkChannelRepeatedNACKInfo(packet_info *pinfo,
g_hash_table_insert(rlc_lte_repeated_nack_channel_hash, p_channel_key, p_channel_status);
}
/* Compare NACKs in status with NACKs in tap_info.
/* Compare NACKs in channel status with NACKs in tap_info.
Note any that are repeated */
for (i=0; i < p_channel_status->noOfNACKs; i++) {
for (j=0; j < tap_info->noOfNACKs; j++) {
for (j=0; j < MIN(tap_info->noOfNACKs, MAX_NACKs); j++) {
if (tap_info->NACKs[j] == p_channel_status->NACKs[i]) {
repeatedNACKs[noOfNACKsRepeated++] = p_channel_status->NACKs[i];
}
@ -1015,9 +1015,9 @@ static void checkChannelRepeatedNACKInfo(packet_info *pinfo,
}
/* Copy NACKs from tap_info into channel status for next time! */
p_channel_status->noOfNACKs = tap_info->noOfNACKs;
for (n=0; n < tap_info->noOfNACKs; n++) {
p_channel_status->NACKs[n] = tap_info->NACKs[n];
p_channel_status->noOfNACKs = 0;
for (n=0; n < MIN(tap_info->noOfNACKs, MAX_NACKs); n++) {
p_channel_status->NACKs[p_channel_status->noOfNACKs++] = tap_info->NACKs[n];
}
if (noOfNACKsRepeated >= 1) {
@ -1025,7 +1025,7 @@ static void checkChannelRepeatedNACKInfo(packet_info *pinfo,
p_report_in_frame = se_alloc(sizeof(rlc_channel_repeated_nack_report_in_frame));
/* Copy in found duplicates */
for (n=0; n < tap_info->noOfNACKs; n++) {
for (n=0; n < MIN(tap_info->noOfNACKs, MAX_NACKs); n++) {
p_report_in_frame->repeatedNACKs[n] = repeatedNACKs[n];
}
p_report_in_frame->noOfNACKsRepeated = noOfNACKsRepeated;
@ -1277,7 +1277,7 @@ static void dissect_rlc_lte_am_status_pdu(tvbuff_t *tvb,
{
guint8 cpt;
guint64 ack_sn, nack_sn;
guint8 nack_count = 0;
guint16 nack_count = 0;
guint64 e1 = 0, e2 = 0;
guint64 so_start, so_end;
int bit_offset = offset * 8;
@ -1333,6 +1333,10 @@ static void dissect_rlc_lte_am_status_pdu(tvbuff_t *tvb,
if (nack_count < MAX_NACKs) {
tap_info->NACKs[nack_count++] = (guint16)nack_sn;
}
else {
/* Let it get bigger than the array for accurate stats... */
nack_count++;
}
/* E1 */
proto_tree_add_bits_ret_val(tree, hf_rlc_lte_am_e1, tvb,