More handling of missing time stamps.
authorGuy Harris <guy@alum.mit.edu>
Fri, 23 May 2014 23:40:56 +0000 (16:40 -0700)
committerGuy Harris <guy@alum.mit.edu>
Fri, 23 May 2014 23:41:21 +0000 (23:41 +0000)
Make nstime_cmp() handle "unset" time stamps (they're equal to other
"unset" time stamps, and less than all other time stamps), use it in
reordercap, and "unset" the time stamp if it's absent.

Also, nstime_cmp() does not modify its argument, so make it const.

Change-Id: I016dab5fefaf4696e78cbd8c6dd3395808e54369
Reviewed-on: https://code.wireshark.org/review/1769
Reviewed-by: Guy Harris <guy@alum.mit.edu>
reordercap.c
wsutil/nstime.c
wsutil/nstime.h

index 4b363b84b149b7329d0c47c86e956514ba9a279e..ace835293c859149ffb05b10f9c11f58cb5275dc 100644 (file)
@@ -135,9 +135,9 @@ frame_write(FrameRecord_t *frame, wtap *wth, wtap_dumper *pdh, Buffer *buf,
 }
 
 /* Comparing timestamps between 2 frames.
-   -1 if (t1 < t2)
-   0  if (t1 == t2)
-    if (t1 > t2)
+   negative if (t1 < t2)
+   zero     if (t1 == t2)
+   positive if (t1 > t2)
 */
 static int
 frames_compare(gconstpointer a, gconstpointer b)
@@ -148,24 +148,7 @@ frames_compare(gconstpointer a, gconstpointer b)
     const nstime_t *time1 = &frame1->time;
     const nstime_t *time2 = &frame2->time;
 
-    if (time1->secs > time2->secs)
-        return 1;
-    if (time1->secs < time2->secs)
-        return -1;
-
-    /* time1->secs == time2->secs */
-    if (time1->nsecs > time2->nsecs)
-        return 1;
-    if (time1->nsecs < time2->nsecs)
-        return -1;
-
-    /* time1->nsecs == time2->nsecs */
-
-    if (frame1->num > frame2->num)
-        return 1;
-    if (frame1->num < frame2->num)
-        return -1;
-    return 0;
+    return nstime_cmp(time1, time2);
 }
 
 
@@ -269,7 +252,11 @@ int main(int argc, char *argv[])
         newFrameRecord = g_slice_new(FrameRecord_t);
         newFrameRecord->num = frames->len + 1;
         newFrameRecord->offset = data_offset;
-        newFrameRecord->time = phdr->ts;
+        if (phdr->presence_flags & WTAP_HAS_TS) {
+            newFrameRecord->time = phdr->ts;
+        } else {
+            nstime_set_unset(&newFrameRecord->time);
+        }
 
         if (prevFrame && frames_compare(&newFrameRecord, &prevFrame) < 0) {
            wrong_order_count++;
index c53e67fffd2214289ddb3c629413ff19905b7ee3..bb4ba5e6f6b68a471531c972a1674037c3d722ae 100644 (file)
@@ -59,7 +59,7 @@ void nstime_set_unset(nstime_t *nstime)
 }
 
 /* is the given nstime_t currently (0,maxint)? */
-gboolean nstime_is_unset(nstime_t *nstime)
+gboolean nstime_is_unset(const nstime_t *nstime)
 {
     if(nstime->secs == 0 && nstime->nsecs == G_MAXINT) {
         return TRUE;
@@ -148,6 +148,17 @@ void nstime_sum(nstime_t *sum, const nstime_t *a, const nstime_t *b)
 
 int nstime_cmp (const nstime_t *a, const nstime_t *b )
 {
+    if (G_UNLIKELY(nstime_is_unset(a))) {
+        if (G_UNLIKELY(nstime_is_unset(b))) {
+            return 0;    /* "no time stamp" is "equal" to "no time stamp" */
+        } else {
+            return -1;   /* and is less than all time stamps */
+        }
+    } else {
+       if (G_UNLIKELY(nstime_is_unset(b))) {
+           return 1;
+       }
+    }
     if (a->secs == b->secs) {
         return a->nsecs - b->nsecs;
     } else {
index 3222ed18baa2d501e970ad06ed406ffab3f91a61..a74457c8b6a269a5f791d63b91efed88ee3d4067 100644 (file)
@@ -56,7 +56,7 @@ WS_DLL_PUBLIC gboolean nstime_is_zero(nstime_t *nstime);
 WS_DLL_PUBLIC void nstime_set_unset(nstime_t *nstime);
 
 /* is the given nstime_t currently (0,maxint)? */
-WS_DLL_PUBLIC gboolean nstime_is_unset(nstime_t *nstime);
+WS_DLL_PUBLIC gboolean nstime_is_unset(const nstime_t *nstime);
 
 /** duplicate the current time
  *