When doing sequence analysis, allow for the first SN to be seen not to be 0.
authormartinm <martinm@f5534014-38df-0310-8fa8-9805f1628bb7>
Mon, 28 Feb 2011 12:26:26 +0000 (12:26 +0000)
committermartinm <martinm@f5534014-38df-0310-8fa8-9805f1628bb7>
Mon, 28 Feb 2011 12:26:26 +0000 (12:26 +0000)
This will happen if the capture doesn't include the start of this channel.

git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@36091 f5534014-38df-0310-8fa8-9805f1628bb7

epan/dissectors/packet-rlc-lte.c

index e8ad4142cc652037087becf5ff50ee0b48260bbe..dd60bc3fe63a0051ce6ddcaf827efdf0486dc3a9 100644 (file)
@@ -941,14 +941,20 @@ static void checkChannelSequenceInfo(packet_info *pinfo, tvbuff_t *tvb,
 
                 /* Frames are not missing if we get an earlier sequence number again */
                 else if (((snLimit + expectedSequenceNumber - sequenceNumber) % snLimit) > 40) {
-                    p_report_in_frame->state = SN_Missing;
-                    tap_info->missingSNs = (snLimit + sequenceNumber - expectedSequenceNumber) % snLimit;
-                    p_report_in_frame->firstSN = expectedSequenceNumber;
-                    p_report_in_frame->lastSN = (snLimit + sequenceNumber - 1) % snLimit;
-
-                    p_report_in_frame->sequenceExpected = expectedSequenceNumber;
-                    p_report_in_frame->previousFrameNum = p_channel_status->previousFrameNum;
-                    p_report_in_frame->previousSegmentIncomplete = p_channel_status->previousSegmentIncomplete;
+                    if (!createdChannel) {
+                        p_report_in_frame->state = SN_Missing;
+                        tap_info->missingSNs = (snLimit + sequenceNumber - expectedSequenceNumber) % snLimit;
+                        p_report_in_frame->firstSN = expectedSequenceNumber;
+                        p_report_in_frame->lastSN = (snLimit + sequenceNumber - 1) % snLimit;
+
+                        p_report_in_frame->sequenceExpected = expectedSequenceNumber;
+                        p_report_in_frame->previousFrameNum = p_channel_status->previousFrameNum;
+                        p_report_in_frame->previousSegmentIncomplete = p_channel_status->previousSegmentIncomplete;
+                    }
+                    else {
+                        /* The log may not contain the very first SNs for this channel, so be forgiving... */
+                        p_report_in_frame->state = SN_OK;
+                    }
 
                     /* Update channel status to remember *this* frame */
                     p_channel_status->previousFrameNum = pinfo->fd->num;
@@ -1049,11 +1055,17 @@ static void checkChannelSequenceInfo(packet_info *pinfo, tvbuff_t *tvb,
                 }
 
                 else {
-                    /* Ahead of expected SN. Assume frames have been missed */
-                    p_report_in_frame->state = SN_Missing;
-
-                    p_report_in_frame->firstSN = expectedSequenceNumber;
-                    p_report_in_frame->lastSN = (1024 + sequenceNumber-1) % 1024;
+                    if (!createdChannel) {
+                        /* Ahead of expected SN. Assume frames have been missed */
+                        p_report_in_frame->state = SN_Missing;
+    
+                        p_report_in_frame->firstSN = expectedSequenceNumber;
+                        p_report_in_frame->lastSN = (1024 + sequenceNumber-1) % 1024;
+                    }
+                    else {
+                        /* The log may not contain the very first SNs for this channel, so be forgiving... */
+                        p_report_in_frame->state = SN_OK;
+                    }
 
                     /* Update channel state - forget about missed SNs */
                     p_report_in_frame->sequenceExpected = expectedSequenceNumber;