The time in Observer files is in nanoseconds since midnight, January 1,

2000, 00:00:00 *local* time.  The amount to add to that is just the UNIX
time stamp value for that point in time; get it with "mktime()".

svn path=/trunk/; revision=8854
This commit is contained in:
Guy Harris 2003-11-01 03:38:10 +00:00
parent b70a7d7f1c
commit 1cfad682cb
2 changed files with 46 additions and 18 deletions

View File

@ -1,5 +1,5 @@
/*
* $Id: network_instruments.c,v 1.2 2003/10/31 08:06:24 guy Exp $
* $Id: network_instruments.c,v 1.3 2003/11/01 03:38:09 guy Exp $
*/
/***************************************************************************
@ -36,12 +36,27 @@ static const int true_magic_length = 17;
static const guint32 observer_packet_magic = 0x88888888;
static const int observer_encap[] = {
WTAP_ENCAP_ETHERNET,
WTAP_ENCAP_TOKEN_RING
};
static const int observer_encap[] = {
WTAP_ENCAP_ETHERNET,
WTAP_ENCAP_TOKEN_RING
};
#define NUM_OBSERVER_ENCAPS (sizeof observer_encap / sizeof observer_encap[0])
/*
* The time in Observer files is in nanoseconds since midnight, January 1,
* 2000, 00:00:00 local time.
*
* We want the seconds portion to be seconds since midnight, January 1,
* 1970, 00:00:00 GMT.
*
* To do that, we add the number of seconds between midnight, January 1,
* 2000, 00:00:00 local time and midnight, January 1, 1970, 00:00:00 GMT.
* (That gets the wrong answer if the time zone is being read in a different
* time zone, but there's not much we can do about that.)
*/
static gboolean have_time_offset;
static time_t seconds1970to2000;
static gboolean fill_time_struct(guint64 ns_since2000, observer_time* time_conversion);
static gboolean observer_read(wtap *wth, int *err, long *data_offset);
static gboolean observer_seek_read(wtap *wth, long seek_off,
@ -55,6 +70,31 @@ int network_instruments_open(wtap *wth, int *err)
capture_file_header file_header;
packet_entry_header packet_header;
/*
* We need the offset between midnight, January 1, 2000 UTC
* and midnight, January 1, 2000 local time, as the time stamps
* are in the form of nanoseconds since midnight, January 1,
* 2000 local time.
*/
if (!have_time_offset) {
struct tm midnight_2000_01_01;
/*
* Get the number of seconds between midnight, January 1,
* 2000, 00:00:00 local time - that's just the UNIX
* time stamp for 2000-01-01 00:00:00 local time.
*/
midnight_2000_01_01.tm_year = 2000 - 1900;
midnight_2000_01_01.tm_mon = 0;
midnight_2000_01_01.tm_mday = 1;
midnight_2000_01_01.tm_hour = 0;
midnight_2000_01_01.tm_min = 0;
midnight_2000_01_01.tm_sec = 0;
midnight_2000_01_01.tm_isdst = -1;
seconds1970to2000 = mktime(&midnight_2000_01_01);
have_time_offset = TRUE;
}
errno = WTAP_ERR_CANT_READ;
/* Read in the buffer file header */
@ -172,11 +212,7 @@ static gboolean observer_read(wtap *wth, int *err, long *data_offset)
GUINT64_FROM_LE(packet_header.nano_seconds_since_2000);
fill_time_struct(packet_header.nano_seconds_since_2000, &packet_time);
useconds = (long)(packet_time.useconds_from_1970 - ((guint64)packet_time.seconds_from_1970)*1000000);
#if 0
seconds = (long)packet_time.seconds_from_1970 - packet_time.time_stamp.tm_gmtoff;
#else
seconds = (long)packet_time.seconds_from_1970;
#endif
/* set-up the packet header */
packet_header.network_size =
@ -275,7 +311,6 @@ static gboolean observer_seek_read(wtap *wth, long seek_off,
return TRUE;
}
static guint32 seconds1970to2000 = (((30*365)+7)*24*60*60); /* 7 leap years */
gboolean fill_time_struct(guint64 ns_since2000, observer_time* time_conversion)
{
time_conversion->ns_since2000 = ns_since2000;
@ -285,10 +320,6 @@ gboolean fill_time_struct(guint64 ns_since2000, observer_time* time_conversion)
time_conversion->seconds_from_1970 = seconds1970to2000 + time_conversion->sec_since2000;
time_conversion->useconds_from_1970 = ((guint64)seconds1970to2000*1000000)+time_conversion->us_since2000;
#if 0
time_conversion->time_stamp = *localtime(&time_conversion->seconds_from_1970);
#endif
return TRUE;
}

View File

@ -1,5 +1,5 @@
/*
* $Id: network_instruments.h,v 1.2 2003/10/31 08:06:25 guy Exp $
* $Id: network_instruments.h,v 1.3 2003/11/01 03:38:10 guy Exp $
*/
/***************************************************************************
@ -72,9 +72,6 @@ typedef struct tlv_user_commnent
typedef struct observer_time
{
guint64 ns_since2000; /* given in packet_entry_header */
#if 0
struct tm time_stamp;
#endif
guint64 us_since2000; /* Micro-Seconds since 1-1-2000 */
guint64 sec_since2000; /* Seconds since 1-1-2000 */