ANNOUNCEMENT: Live Wireshark University & Allegro Packets online APAC Wireshark Training Session
April 17th, 2024 | 14:30-16:00 SGT (UTC+8) | Online

Wireshark-dev: [Wireshark-dev] iSeries wiretap patch

From: Martin Warnes <martin@xxxxxxxxxxxxxxxxx>
Date: Wed, 13 Sep 2006 16:27:03 +0100
Hi/

Attached is a patch that addresses issues with higher precision packet
timings on top end iSeries hardware and should enable the iseries
wiretap to handle timings in both micro and nano seconds.

Regards .. Martin
Index: iseries.c
===================================================================
--- iseries.c	(revision 19226)
+++ iseries.c	(working copy)
@@ -159,9 +159,9 @@
   /* UNICODE identification */
   char unicodemagic[ISERIES_HDR_MAGIC_LEN] =
     { '\xFF', '\xFE', '\x20', '\x00', '\x43', '\x00', '\x4F', '\x00', '\x4D',
-      '\x00', '\x4D', '\x00', '\x55', '\x00', '\x4E', '\x00', '\x49', '\x00',
-      '\x43', '\x00', '\x41'
-    };
+    '\x00', '\x4D', '\x00', '\x55', '\x00', '\x4E', '\x00', '\x49', '\x00',
+    '\x43', '\x00', '\x41'
+  };
 
   /*
    * Check that file starts with a valid iSeries COMMS TRACE header
@@ -536,8 +536,8 @@
    * If we have Wiretap Header then populate it here
    *
    * XXX - Timer resolution on the iSeries is hardware dependant, the value for csec may be
-   * different on other platforms though all the traces I've seen seem so show resolution
-   * to 5 digits (i.e HH:MM:SS.nnnnn) so hopefully this will not require special handling
+   * different on other platforms though all the traces I've seen seem to show resolution
+   * to 5 digits (i.e HH:MM:SS.nnnnn) or 6 digits (i.e HH:MM:SS.nnnnnn)
    */
   if (wth->capture.iseries->sdate)
     {
@@ -551,7 +551,16 @@
       tm.tm_sec = sec;
       tm.tm_isdst = -1;
       wth->phdr.ts.secs = mktime (&tm);
-      wth->phdr.ts.nsecs = csec * 10000;
+      /* Handle 6 decimal digit precision for timer */
+      if (csec > 99999)
+	{
+	  wth->phdr.ts.nsecs = csec * 1000;
+	}
+      /* Handle 5 decimal digit precision for timer */
+      else
+	{
+	  wth->phdr.ts.nsecs = csec * 10000;
+	}
       wth->phdr.caplen = cap_len;
       wth->phdr.pkt_encap = WTAP_ENCAP_ETHERNET;
       pseudo_header->eth.fcs_len = -1;
@@ -594,7 +603,7 @@
 	    }
 	}
 
-      /* Convert UNICODE data to ASCII and determine line length*/
+      /* Convert UNICODE data to ASCII and determine line length */
       if (wth->capture.iseries->format == ISERIES_FORMAT_UNICODE)
 	{
 	  buflen = iseries_UNICODE_to_ASCII (data, ISERIES_LINE_LENGTH);