diff options
Diffstat (limited to 'wiretap')
-rw-r--r-- | wiretap/5views.c | 8 | ||||
-rw-r--r-- | wiretap/airopeek9.c | 4 | ||||
-rw-r--r-- | wiretap/ascend.c | 4 | ||||
-rw-r--r-- | wiretap/cosine.c | 4 | ||||
-rw-r--r-- | wiretap/csids.c | 4 | ||||
-rw-r--r-- | wiretap/dbs-etherwatch.c | 5 | ||||
-rw-r--r-- | wiretap/erf.c | 10 | ||||
-rw-r--r-- | wiretap/etherpeek.c | 10 | ||||
-rw-r--r-- | wiretap/eyesdn.c | 4 | ||||
-rw-r--r-- | wiretap/file_access.c | 1 | ||||
-rw-r--r-- | wiretap/hcidump.c | 4 | ||||
-rw-r--r-- | wiretap/i4btrace.c | 4 | ||||
-rw-r--r-- | wiretap/iptrace.c | 8 | ||||
-rw-r--r-- | wiretap/k12.c | 6 | ||||
-rw-r--r-- | wiretap/lanalyzer.c | 14 | ||||
-rw-r--r-- | wiretap/libpcap.c | 16 | ||||
-rw-r--r-- | wiretap/netmon.c | 16 | ||||
-rw-r--r-- | wiretap/nettl.c | 20 | ||||
-rw-r--r-- | wiretap/network_instruments.c | 14 | ||||
-rw-r--r-- | wiretap/netxray.c | 32 | ||||
-rw-r--r-- | wiretap/ngsniffer.c | 12 | ||||
-rw-r--r-- | wiretap/pppdump.c | 4 | ||||
-rw-r--r-- | wiretap/radcom.c | 4 | ||||
-rw-r--r-- | wiretap/snoop.c | 8 | ||||
-rw-r--r-- | wiretap/toshiba.c | 4 | ||||
-rw-r--r-- | wiretap/visual.c | 10 | ||||
-rw-r--r-- | wiretap/vms.c | 5 | ||||
-rw-r--r-- | wiretap/wtap-int.h | 6 | ||||
-rw-r--r-- | wiretap/wtap.c | 6 | ||||
-rw-r--r-- | wiretap/wtap.def | 1 | ||||
-rw-r--r-- | wiretap/wtap.h | 14 |
31 files changed, 145 insertions, 117 deletions
diff --git a/wiretap/5views.c b/wiretap/5views.c index c17101449d..38fc251ef9 100644 --- a/wiretap/5views.c +++ b/wiretap/5views.c @@ -251,8 +251,8 @@ _5views_read(wtap *wth, int *err, gchar **err_info _U_, long *data_offset) TimeStamped_Header.Utc = pletohl(&TimeStamped_Header.Utc); TimeStamped_Header.NanoSecondes = pletohl(&TimeStamped_Header.NanoSecondes); - wth->phdr.ts.tv_sec = TimeStamped_Header.Utc; - wth->phdr.ts.tv_usec = TimeStamped_Header.NanoSecondes/1000; + wth->phdr.ts.secs = TimeStamped_Header.Utc; + wth->phdr.ts.nsecs = TimeStamped_Header.NanoSecondes; wth->phdr.caplen = packet_size; wth->phdr.len = orig_size; @@ -414,8 +414,8 @@ static gboolean _5views_dump(wtap_dumper *wdh, HeaderFrame.RecNb = htolel(1); /* record-dependant fields */ - HeaderFrame.Utc = htolel(phdr->ts.tv_sec); - HeaderFrame.NanoSecondes = htolel(phdr->ts.tv_usec*1000); + HeaderFrame.Utc = htolel(phdr->ts.secs); + HeaderFrame.NanoSecondes = htolel(phdr->ts.nsecs); HeaderFrame.RecSize = htolel(phdr->len); HeaderFrame.RecInfo = htolel(0); diff --git a/wiretap/airopeek9.c b/wiretap/airopeek9.c index 8cc276f54a..2eee7f5f76 100644 --- a/wiretap/airopeek9.c +++ b/wiretap/airopeek9.c @@ -509,8 +509,8 @@ static gboolean airopeekv9_read(wtap *wth, int *err, gchar **err_info, t *= 1.0e-9; t -= TIME_FIXUP_CONSTANT; - wth->phdr.ts.tv_sec = (time_t) t; - wth->phdr.ts.tv_usec = (guint32) ((t - wth->phdr.ts.tv_sec)*1000000); + wth->phdr.ts.secs = (time_t) t; + wth->phdr.ts.nsecs = (guint32) ((t - wth->phdr.ts.secs)*1000000000); switch (wth->file_encap) { diff --git a/wiretap/ascend.c b/wiretap/ascend.c index 5c57279905..0145aec796 100644 --- a/wiretap/ascend.c +++ b/wiretap/ascend.c @@ -298,8 +298,8 @@ static gboolean ascend_read(wtap *wth, int *err, gchar **err_info, if (wth->capture.ascend->inittime > header.secs) wth->capture.ascend->inittime -= header.secs; } - wth->phdr.ts.tv_sec = header.secs + wth->capture.ascend->inittime; - wth->phdr.ts.tv_usec = header.usecs; + wth->phdr.ts.secs = header.secs + wth->capture.ascend->inittime; + wth->phdr.ts.nsecs = header.usecs * 1000; wth->phdr.caplen = header.caplen; wth->phdr.len = header.len; wth->data_offset = offset; diff --git a/wiretap/cosine.c b/wiretap/cosine.c index 2b8138910c..e185ea9f7f 100644 --- a/wiretap/cosine.c +++ b/wiretap/cosine.c @@ -418,8 +418,8 @@ parse_cosine_rec_hdr(wtap *wth, const char *line, tm.tm_min = min; tm.tm_sec = sec; tm.tm_isdst = -1; - wth->phdr.ts.tv_sec = mktime(&tm); - wth->phdr.ts.tv_usec = csec * 10000; + wth->phdr.ts.secs = mktime(&tm); + wth->phdr.ts.nsecs = csec * 10000000; wth->phdr.len = pkt_len; } /* XXX need to handle other encapsulations like Cisco HDLC, diff --git a/wiretap/csids.c b/wiretap/csids.c index 4312c3a4fa..ff7c55c687 100644 --- a/wiretap/csids.c +++ b/wiretap/csids.c @@ -180,8 +180,8 @@ static gboolean csids_read(wtap *wth, int *err, gchar **err_info _U_, wth->phdr.len = hdr.caplen; wth->phdr.caplen = hdr.caplen; - wth->phdr.ts.tv_sec = hdr.seconds; - wth->phdr.ts.tv_usec = 0; + wth->phdr.ts.secs = hdr.seconds; + wth->phdr.ts.nsecs = 0; if( wth->capture.csids->byteswapped == TRUE ) { guint16* swap = (guint16*)buf; diff --git a/wiretap/dbs-etherwatch.c b/wiretap/dbs-etherwatch.c index 7cd7ebc8e3..7331b694c1 100644 --- a/wiretap/dbs-etherwatch.c +++ b/wiretap/dbs-etherwatch.c @@ -474,9 +474,8 @@ parse_dbs_etherwatch_packet(wtap *wth, FILE_T fh, guint8* buf, int *err, tm.tm_year -= 1900; tm.tm_isdst = -1; - wth->phdr.ts.tv_sec = mktime(&tm); - - wth->phdr.ts.tv_usec = csec * 10000; + wth->phdr.ts.secs = mktime(&tm); + wth->phdr.ts.nsecs = csec * 10000000; wth->phdr.caplen = eth_hdr_len + pkt_len; wth->phdr.len = eth_hdr_len + pkt_len; } diff --git a/wiretap/erf.c b/wiretap/erf.c index cbde26704a..0937e9004b 100644 --- a/wiretap/erf.c +++ b/wiretap/erf.c @@ -330,13 +330,13 @@ static int erf_read_header( #ifdef G_HAVE_GINT64 guint64 ts = pletohll(&erf_header->ts); - phdr->ts.tv_sec = (long) (ts >> 32); + phdr->ts.secs = (long) (ts >> 32); ts = ((ts & 0xffffffff) * 1000 * 1000); ts += (ts & 0x80000000) << 1; /* rounding */ - phdr->ts.tv_usec = (long) (ts >> 32); - if (phdr->ts.tv_usec >= 1000000) { - phdr->ts.tv_usec -= 1000000; - phdr->ts.tv_sec += 1; + phdr->ts.nsecs = ((long) (ts >> 32)) * 1000; + if (phdr->ts.nsecs >= 1000000000) { + phdr->ts.nsecs -= 1000000000; + phdr->ts.secs += 1; } #else phdr->ts.tv_sec = pletohl(&erf_header->ts[1]); diff --git a/wiretap/etherpeek.c b/wiretap/etherpeek.c index 7967df2f90..afa8044f90 100644 --- a/wiretap/etherpeek.c +++ b/wiretap/etherpeek.c @@ -449,9 +449,9 @@ static gboolean etherpeek_read_v7(wtap *wth, int *err, gchar **err_info, t = (double) timestamp.lower + (double) timestamp.upper * 4294967296.0; t -= (double) mac2unix * 1000000.0; - wth->phdr.ts.tv_sec = (time_t) (t/1000000.0); - wth->phdr.ts.tv_usec = (guint32) (t - (double) wth->phdr.ts.tv_sec * - 1000000.0); + wth->phdr.ts.secs = (time_t) (t/1000000.0); + wth->phdr.ts.nsecs = (guint32) (t - (double) wth->phdr.ts.secs * + 1000000000.0); if (wth->file_encap == WTAP_ENCAP_IEEE_802_11_WITH_RADIO) { /* @@ -596,9 +596,9 @@ static gboolean etherpeek_read_v56(wtap *wth, int *err, gchar **err_info _U_, wth->phdr.len = length; wth->phdr.caplen = sliceLength; /* timestamp is in milliseconds since reference_time */ - wth->phdr.ts.tv_sec = wth->capture.etherpeek->reference_time.tv_sec + wth->phdr.ts.secs = wth->capture.etherpeek->reference_time.tv_sec + (timestamp / 1000); - wth->phdr.ts.tv_usec = 1000 * (timestamp % 1000); + wth->phdr.ts.nsecs = 1000 * (timestamp % 1000) * 1000; wth->phdr.pkt_encap = WTAP_ENCAP_UNKNOWN; for (i=0; i<NUM_ETHERPEEK_ENCAPS; i++) { diff --git a/wiretap/eyesdn.c b/wiretap/eyesdn.c index 73a964d374..277a4684ec 100644 --- a/wiretap/eyesdn.c +++ b/wiretap/eyesdn.c @@ -280,8 +280,8 @@ parse_eyesdn_rec_hdr(wtap *wth, FILE_T fh, } if (wth) { - wth->phdr.ts.tv_sec = secs; - wth->phdr.ts.tv_usec = usecs; + wth->phdr.ts.secs = secs; + wth->phdr.ts.nsecs = usecs * 1000; wth->phdr.caplen = pkt_len; wth->phdr.len = pkt_len; } diff --git a/wiretap/file_access.c b/wiretap/file_access.c index 1e9cf016d3..1881fc248a 100644 --- a/wiretap/file_access.c +++ b/wiretap/file_access.c @@ -279,6 +279,7 @@ wtap* wtap_open_offline(const char *filename, int *err, char **err_info, wth->data_offset = 0; wth->subtype_sequential_close = NULL; wth->subtype_close = NULL; + wth->tsprecision = WTAP_FILE_TSPREC_USEC; /* Try all file types */ for (i = 0; i < N_FILE_TYPES; i++) { diff --git a/wiretap/hcidump.c b/wiretap/hcidump.c index d9c5718999..ccca83ce8f 100644 --- a/wiretap/hcidump.c +++ b/wiretap/hcidump.c @@ -80,8 +80,8 @@ static gboolean hcidump_read(wtap *wth, int *err, gchar **err_info, } wth->data_offset += packet_size; - wth->phdr.ts.tv_sec = GUINT32_FROM_LE(dh.ts_sec); - wth->phdr.ts.tv_usec = GUINT32_FROM_LE(dh.ts_usec); + wth->phdr.ts.secs = GUINT32_FROM_LE(dh.ts_sec); + wth->phdr.ts.nsecs = GUINT32_FROM_LE(dh.ts_usec) * 1000; wth->phdr.caplen = packet_size; wth->phdr.len = packet_size; diff --git a/wiretap/i4btrace.c b/wiretap/i4btrace.c index 892e5fdb2b..11dc2cc2fd 100644 --- a/wiretap/i4btrace.c +++ b/wiretap/i4btrace.c @@ -142,8 +142,8 @@ static gboolean i4btrace_read(wtap *wth, int *err, gchar **err_info, wth->phdr.len = length; wth->phdr.caplen = length; - wth->phdr.ts.tv_sec = hdr.ts_sec; - wth->phdr.ts.tv_usec = hdr.ts_usec; + wth->phdr.ts.secs = hdr.ts_sec; + wth->phdr.ts.nsecs = hdr.ts_usec * 1000; /* * Read the packet data. diff --git a/wiretap/iptrace.c b/wiretap/iptrace.c index f427cff95b..9281b6b80c 100644 --- a/wiretap/iptrace.c +++ b/wiretap/iptrace.c @@ -179,8 +179,8 @@ static gboolean iptrace_read_1_0(wtap *wth, int *err, gchar **err_info _U_, wth->phdr.len = packet_size; wth->phdr.caplen = packet_size; - wth->phdr.ts.tv_sec = pntohl(&header[4]); - wth->phdr.ts.tv_usec = 0; + wth->phdr.ts.secs = pntohl(&header[4]); + wth->phdr.ts.nsecs = 0; if (wth->phdr.pkt_encap == WTAP_ENCAP_UNKNOWN) { *err = WTAP_ERR_UNSUPPORTED_ENCAP; @@ -362,8 +362,8 @@ static gboolean iptrace_read_2_0(wtap *wth, int *err, gchar **err_info _U_, wth->phdr.len = packet_size; wth->phdr.caplen = packet_size; - wth->phdr.ts.tv_sec = pntohl(&header[32]); - wth->phdr.ts.tv_usec = pntohl(&header[36]) / 1000; + wth->phdr.ts.secs = pntohl(&header[32]); + wth->phdr.ts.nsecs = pntohl(&header[36]); if (wth->phdr.pkt_encap == WTAP_ENCAP_UNKNOWN) { *err = WTAP_ERR_UNSUPPORTED_ENCAP; diff --git a/wiretap/k12.c b/wiretap/k12.c index 42e90f7205..ecd9b75185 100644 --- a/wiretap/k12.c +++ b/wiretap/k12.c @@ -212,8 +212,8 @@ static gboolean k12_read(wtap *wth, int *err, gchar **err_info _U_, long *data_o ts = pntohll(buffer + K12_PACKET_TIMESTAMP); - wth->phdr.ts.tv_usec = (guint32) ( (ts % 2000000) / 2); - wth->phdr.ts.tv_sec = (guint32) ((ts / 2000000) + 631152000); + wth->phdr.ts.secs = (guint32) ( (ts % 2000000) / 2); + wth->phdr.ts.nsecs = (guint32) ((ts / 2000000) + 631152000) * 1000; wth->phdr.len = wth->phdr.caplen = pntohl(buffer + K12_RECORD_FRAME_LEN) & 0x00001FFF; @@ -597,7 +597,7 @@ static gboolean k12_dump(wtap_dumper *wdh, const struct wtap_pkthdr *phdr, obj.record.frame_len = g_htonl(phdr->len); obj.record.input = g_htonl(pseudo_header->k12.input); - obj.record.ts = GUINT64_TO_BE((((guint64)phdr->ts.tv_sec - 631152000) * 2000000) + (phdr->ts.tv_usec * 2)); + obj.record.ts = GUINT64_TO_BE((((guint64)phdr->ts.secs - 631152000) * 2000000) + (phdr->ts.nsecs / 1000 * 2)); memcpy(obj.record.frame,pd,phdr->len); diff --git a/wiretap/lanalyzer.c b/wiretap/lanalyzer.c index 00679a94fb..a6553ecc60 100644 --- a/wiretap/lanalyzer.c +++ b/wiretap/lanalyzer.c @@ -370,9 +370,9 @@ static gboolean lanalyzer_read(wtap *wth, int *err, gchar **err_info, t = t/1000000.0 * 0.5; /* t = # of secs */ t += wth->capture.lanalyzer->start; - wth->phdr.ts.tv_sec = (long)t; - wth->phdr.ts.tv_usec = (unsigned long)((t-(double)(wth->phdr.ts.tv_sec)) - *1.0e6); + wth->phdr.ts.secs = (long)t; + wth->phdr.ts.nsecs = (unsigned long)((t-(double)(wth->phdr.ts.secs)) + *1.0e9); if (true_size - 4 >= packet_size) { /* @@ -556,6 +556,7 @@ static gboolean lanalyzer_dump(wtap_dumper *wdh, double x; int i; int len; + struct timeval tv; LA_TmpInfo *itmp = (LA_TmpInfo*)(wdh->dump.opaque); struct timeval td; @@ -576,19 +577,22 @@ static gboolean lanalyzer_dump(wtap_dumper *wdh, if (*err) return FALSE; + tv.tv_sec = phdr->ts.secs; + tv.tv_usec = phdr->ts.nsecs / 1000; if (!itmp->init) { /* collect some information for the * finally written header */ - itmp->start = phdr->ts; + /* XXX - this conversion could probably improved, if the start uses ns */ + itmp->start = tv; itmp->pkts = 0; itmp->init = TRUE; itmp->encap = wdh->encap; itmp->lastlen = 0; } - my_timersub(&(phdr->ts),&(itmp->start),&td); + my_timersub(&(tv),&(itmp->start),&td); x = (double) td.tv_usec; x += (double) td.tv_sec * 1000000; diff --git a/wiretap/libpcap.c b/wiretap/libpcap.c index a7738c4af2..86bf798a6f 100644 --- a/wiretap/libpcap.c +++ b/wiretap/libpcap.c @@ -601,6 +601,10 @@ int libpcap_open(wtap *wth, int *err, gchar **err_info) gboolean aix; int file_encap; + + /* XXX - this must be done depending on the magic number */ + /*wth->tsrecision = WTAP_FILE_TSPREC_NSEC;*/ + /* Read in the number that should be at the start of a "libpcap" file */ errno = WTAP_ERR_CANT_READ; bytes_read = file_read(&magic, 1, sizeof magic, wth->fh); @@ -1267,8 +1271,8 @@ static gboolean libpcap_read(wtap *wth, int *err, gchar **err_info, return FALSE; /* Read error */ wth->data_offset += packet_size; - wth->phdr.ts.tv_sec = hdr.hdr.ts_sec; - wth->phdr.ts.tv_usec = hdr.hdr.ts_usec; + wth->phdr.ts.secs = hdr.hdr.ts_sec; + wth->phdr.ts.nsecs = hdr.hdr.ts_usec * 1000; wth->phdr.caplen = packet_size; wth->phdr.len = orig_size; @@ -1819,8 +1823,8 @@ wtap_process_pcap_packet(gint linktype, const struct pcap_pkthdr *phdr, be a "struct bpf_timeval", with member sizes wired to 32 bits - and we may go that way ourselves in the future, so copy the members individually. */ - whdr->ts.tv_sec = phdr->ts.tv_sec; - whdr->ts.tv_usec = phdr->ts.tv_usec; + whdr->ts.secs = phdr->ts.tv_sec; + whdr->ts.nsecs = phdr->ts.tv_usec * 1000; whdr->caplen = phdr->caplen; whdr->len = phdr->len; whdr->pkt_encap = linktype; @@ -2017,8 +2021,8 @@ static gboolean libpcap_dump(wtap_dumper *wdh, else hdrsize = 0; - rec_hdr.hdr.ts_sec = phdr->ts.tv_sec; - rec_hdr.hdr.ts_usec = phdr->ts.tv_usec; + rec_hdr.hdr.ts_sec = phdr->ts.secs; + rec_hdr.hdr.ts_usec = phdr->ts.nsecs / 1000; rec_hdr.hdr.incl_len = phdr->caplen + hdrsize; rec_hdr.hdr.orig_len = phdr->len + hdrsize; switch (wdh->file_type) { diff --git a/wiretap/netmon.c b/wiretap/netmon.c index bc10056510..c3c552d2d0 100644 --- a/wiretap/netmon.c +++ b/wiretap/netmon.c @@ -452,8 +452,8 @@ static gboolean netmon_read(wtap *wth, int *err, gchar **err_info, } secs = (time_t)(t/1000000); usecs = (guint32)(t - (double)secs*1000000); - wth->phdr.ts.tv_sec = netmon->start_secs + secs; - wth->phdr.ts.tv_usec = usecs; + wth->phdr.ts.secs = netmon->start_secs + secs; + wth->phdr.ts.nsecs = usecs * 1000; wth->phdr.caplen = packet_size; wth->phdr.len = orig_size; @@ -681,8 +681,8 @@ static gboolean netmon_dump(wtap_dumper *wdh, const struct wtap_pkthdr *phdr, case WTAP_FILE_NETMON_1_x: rec_1_x_hdr.ts_delta = htolel( - (phdr->ts.tv_sec - netmon->first_record_time.tv_sec)*1000 - + (phdr->ts.tv_usec - netmon->first_record_time.tv_usec + 500)/1000); + (phdr->ts.secs - netmon->first_record_time.secs)*1000 + + (phdr->ts.nsecs - netmon->first_record_time.nsecs + 500000)/1000000); rec_1_x_hdr.orig_len = htoles(phdr->len + atm_hdrsize); rec_1_x_hdr.incl_len = htoles(phdr->caplen + atm_hdrsize); hdrp = (char *)&rec_1_x_hdr; @@ -696,8 +696,8 @@ static gboolean netmon_dump(wtap_dumper *wdh, const struct wtap_pkthdr *phdr, * (even on 32-bit processors), so we do it in floating * point. */ - t = (phdr->ts.tv_sec - netmon->first_record_time.tv_sec)*1000000.0 - + (phdr->ts.tv_usec - netmon->first_record_time.tv_usec); + t = (phdr->ts.secs - netmon->first_record_time.secs)*1000000.0 + + (phdr->ts.nsecs - netmon->first_record_time.nsecs) / 1000; time_high = (guint32) (t/4294967296.0); time_low = (guint32) (t - (time_high*4294967296.0)); rec_2_x_hdr.ts_delta_lo = htolel(time_low); @@ -848,7 +848,7 @@ static gboolean netmon_dump_close(wtap_dumper *wdh, int *err) } file_hdr.network = htoles(wtap_encap[wdh->encap]); - tm = localtime(&netmon->first_record_time.tv_sec); + tm = localtime(&netmon->first_record_time.secs); if (tm != NULL) { file_hdr.ts_year = htoles(1900 + tm->tm_year); file_hdr.ts_month = htoles(tm->tm_mon + 1); @@ -866,7 +866,7 @@ static gboolean netmon_dump_close(wtap_dumper *wdh, int *err) file_hdr.ts_min = htoles(0); file_hdr.ts_sec = htoles(0); } - file_hdr.ts_msec = htoles(netmon->first_record_time.tv_usec/1000); + file_hdr.ts_msec = htoles(netmon->first_record_time.nsecs/1000000); /* XXX - what about rounding? */ file_hdr.frametableoffset = htolel(netmon->frame_table_offset); file_hdr.frametablelength = diff --git a/wiretap/nettl.c b/wiretap/nettl.c index 22d54d5148..75ffb9e1ca 100644 --- a/wiretap/nettl.c +++ b/wiretap/nettl.c @@ -501,8 +501,8 @@ nettl_read_rec_header(wtap *wth, FILE_T fh, struct wtap_pkthdr *phdr, phdr->caplen = pntohl(&ip_hdr.caplen); } - phdr->ts.tv_sec = pntohl(&ip_hdr.sec); - phdr->ts.tv_usec = pntohl(&ip_hdr.usec); + phdr->ts.secs = pntohl(&ip_hdr.sec); + phdr->ts.nsecs = pntohl(&ip_hdr.usec) * 1000; break; case NETTL_SUBSYS_NS_LS_DRIVER : @@ -546,8 +546,8 @@ nettl_read_rec_header(wtap *wth, FILE_T fh, struct wtap_pkthdr *phdr, phdr->len = length; phdr->caplen = pntohs(&drv_eth_hdr.caplen); - phdr->ts.tv_sec = pntohl(&ip_hdr.sec); - phdr->ts.tv_usec = pntohl(&ip_hdr.usec); + phdr->ts.secs = pntohl(&ip_hdr.sec); + phdr->ts.nsecs = pntohl(&ip_hdr.usec) * 1000; break; case NETTL_SUBSYS_SX25L2: @@ -567,8 +567,8 @@ nettl_read_rec_header(wtap *wth, FILE_T fh, struct wtap_pkthdr *phdr, if (length <= 0) return 0; phdr->len = length - 24; phdr->caplen = pntohl(&ip_hdr.caplen) - 24; - phdr->ts.tv_sec = pntohl(&ip_hdr.sec); - phdr->ts.tv_usec = pntohl(&ip_hdr.usec); + phdr->ts.secs = pntohl(&ip_hdr.sec); + phdr->ts.nsecs = pntohl(&ip_hdr.usec) * 1000; if (wth->capture.nettl->is_hpux_11) padlen = 28; else @@ -596,8 +596,8 @@ nettl_read_rec_header(wtap *wth, FILE_T fh, struct wtap_pkthdr *phdr, if (length <= 0) return 0; phdr->len = length; phdr->caplen = pntohl(&ip_hdr.caplen); - phdr->ts.tv_sec = pntohl(&ip_hdr.sec); - phdr->ts.tv_usec = pntohl(&ip_hdr.usec); + phdr->ts.secs = pntohl(&ip_hdr.sec); + phdr->ts.nsecs = pntohl(&ip_hdr.usec) * 1000; if (wth->capture.nettl->is_hpux_11) { if (file_seek(fh, 4, SEEK_CUR, err) == -1) return -1; offset += 4; @@ -737,8 +737,8 @@ static gboolean nettl_dump(wtap_dumper *wdh, memset(&rec_hdr,0,sizeof(rec_hdr)); rec_hdr.hdr_len = g_htons(sizeof(rec_hdr)); rec_hdr.hdr.kind = g_htonl(NETTL_HDR_PDUIN); - rec_hdr.hdr.sec = g_htonl(phdr->ts.tv_sec); - rec_hdr.hdr.usec = g_htonl(phdr->ts.tv_usec); + rec_hdr.hdr.sec = g_htonl(phdr->ts.secs); + rec_hdr.hdr.usec = g_htonl(phdr->ts.nsecs/1000); rec_hdr.hdr.caplen = g_htonl(phdr->caplen); rec_hdr.hdr.length = g_htonl(phdr->len); rec_hdr.hdr.devid = -1; diff --git a/wiretap/network_instruments.c b/wiretap/network_instruments.c index b5d7416e14..0e226e6e48 100644 --- a/wiretap/network_instruments.c +++ b/wiretap/network_instruments.c @@ -240,8 +240,8 @@ static gboolean observer_read(wtap *wth, int *err, gchar **err_info, wth->phdr.pkt_encap = observer_encap[packet_header.network_type]; wth->phdr.len = packet_header.network_size-4; /* neglect frame markers for wiretap */ wth->phdr.caplen = MIN(packet_header.captured_size, wth->phdr.len); - wth->phdr.ts.tv_sec = seconds; - wth->phdr.ts.tv_usec = useconds; + wth->phdr.ts.secs = seconds; + wth->phdr.ts.nsecs = useconds * 1000; /* get to the frame data */ packet_header.offset_to_frame = @@ -430,14 +430,14 @@ static gboolean observer_dump(wtap_dumper *wdh, const struct wtap_pkthdr *phdr, size_t nwritten; guint64 capture_nanoseconds = 0; - if(phdr->ts.tv_sec<(long)seconds1970to2000) { - if(phdr->ts.tv_sec<0) + if(phdr->ts.secs<(long)seconds1970to2000) { + if(phdr->ts.secs<0) capture_nanoseconds = 0; else - capture_nanoseconds = phdr->ts.tv_sec; + capture_nanoseconds = phdr->ts.secs; } else - capture_nanoseconds = phdr->ts.tv_sec - seconds1970to2000; - capture_nanoseconds = ((capture_nanoseconds*1000000) + (guint64)phdr->ts.tv_usec)*1000; + capture_nanoseconds = phdr->ts.secs - seconds1970to2000; + capture_nanoseconds = ((capture_nanoseconds*1000000) + (guint64)phdr->ts.nsecs); memset(&packet_header, 0x00, sizeof(packet_entry_header)); packet_header.packet_magic = GUINT32_TO_LE(observer_packet_magic); diff --git a/wiretap/netxray.c b/wiretap/netxray.c index 93a5ef9bca..f5164a0615 100644 --- a/wiretap/netxray.c +++ b/wiretap/netxray.c @@ -808,9 +808,9 @@ reread: + (double)pletohl(&hdr.old_hdr.timehi)*4294967296.0; t /= wth->capture.netxray->timeunit; t -= wth->capture.netxray->start_timestamp; - wth->phdr.ts.tv_sec = wth->capture.netxray->start_time + (long)t; - wth->phdr.ts.tv_usec = (unsigned long)((t-(double)(unsigned long)(t)) - *1.0e6); + wth->phdr.ts.secs = wth->capture.netxray->start_time + (long)t; + wth->phdr.ts.nsecs = (unsigned long)((t-(double)(unsigned long)(t)) + *1.0e9); /* * We subtract the padding from the packet size, so our caller * doesn't see it. @@ -822,9 +822,9 @@ reread: + (double)pletohl(&hdr.hdr_1_x.timehi)*4294967296.0; t /= wth->capture.netxray->timeunit; t -= wth->capture.netxray->start_timestamp; - wth->phdr.ts.tv_sec = wth->capture.netxray->start_time + (long)t; - wth->phdr.ts.tv_usec = (unsigned long)((t-(double)(unsigned long)(t)) - *1.0e6); + wth->phdr.ts.secs = wth->capture.netxray->start_time + (long)t; + wth->phdr.ts.nsecs = (unsigned long)((t-(double)(unsigned long)(t)) + *1.0e9); /* * We subtract the padding from the packet size, so our caller * doesn't see it. @@ -1302,8 +1302,8 @@ gboolean netxray_dump_open_1_1(wtap_dumper *wdh, gboolean cant_seek, int *err) wdh->dump.netxray = g_malloc(sizeof(netxray_dump_t)); wdh->dump.netxray->first_frame = TRUE; - wdh->dump.netxray->start.tv_sec = 0; - wdh->dump.netxray->start.tv_usec = 0; + wdh->dump.netxray->start.secs = 0; + wdh->dump.netxray->start.nsecs = 0; wdh->dump.netxray->nframes = 0; return TRUE; @@ -1338,8 +1338,8 @@ static gboolean netxray_dump_1_1(wtap_dumper *wdh, /* build the header for each packet */ memset(&rec_hdr, '\0', sizeof(rec_hdr)); - timestamp = (phdr->ts.tv_sec - netxray->start.tv_sec)*1000000 + - phdr->ts.tv_usec; + timestamp = (phdr->ts.secs - netxray->start.secs)*1000000 + + phdr->ts.nsecs / 1000; rec_hdr.timelo = htolel(timestamp); rec_hdr.timehi = htolel(0); rec_hdr.orig_len = htoles(phdr->len); @@ -1399,7 +1399,7 @@ static gboolean netxray_dump_close_1_1(wtap_dumper *wdh, int *err) /* "sniffer" version ? */ memset(&file_hdr, '\0', sizeof file_hdr); memcpy(file_hdr.version, vers_1_1, sizeof vers_1_1); - file_hdr.start_time = htolel(netxray->start.tv_sec); + file_hdr.start_time = htolel(netxray->start.secs); file_hdr.nframes = htolel(netxray->nframes); file_hdr.start_offset = htolel(CAPTUREFILE_HEADER_SIZE); file_hdr.end_offset = htolel(filelen); @@ -1491,8 +1491,8 @@ gboolean netxray_dump_open_2_0(wtap_dumper *wdh, gboolean cant_seek, int *err) wdh->dump.netxray = g_malloc(sizeof(netxray_dump_t)); wdh->dump.netxray->first_frame = TRUE; - wdh->dump.netxray->start.tv_sec = 0; - wdh->dump.netxray->start.tv_usec = 0; + wdh->dump.netxray->start.secs = 0; + wdh->dump.netxray->start.nsecs = 0; wdh->dump.netxray->nframes = 0; return TRUE; @@ -1527,8 +1527,8 @@ static gboolean netxray_dump_2_0(wtap_dumper *wdh, /* build the header for each packet */ memset(&rec_hdr, '\0', sizeof(rec_hdr)); - timestamp = (phdr->ts.tv_sec - netxray->start.tv_sec)*1000000 + - phdr->ts.tv_usec; + timestamp = (phdr->ts.secs - netxray->start.secs)*1000000 + + phdr->ts.nsecs/1000; rec_hdr.timelo = htolel(timestamp); rec_hdr.timehi = htolel(0); rec_hdr.orig_len = htoles(phdr->len); @@ -1606,7 +1606,7 @@ static gboolean netxray_dump_close_2_0(wtap_dumper *wdh, int *err) /* "sniffer" version ? */ memset(&file_hdr, '\0', sizeof file_hdr); memcpy(file_hdr.version, vers_2_001, sizeof vers_2_001); - file_hdr.start_time = htolel(netxray->start.tv_sec); + file_hdr.start_time = htolel(netxray->start.secs); file_hdr.nframes = htolel(netxray->nframes); file_hdr.start_offset = htolel(CAPTUREFILE_HEADER_SIZE); file_hdr.end_offset = htolel(filelen); diff --git a/wiretap/ngsniffer.c b/wiretap/ngsniffer.c index 1d7768250d..04bcb78e89 100644 --- a/wiretap/ngsniffer.c +++ b/wiretap/ngsniffer.c @@ -1073,9 +1073,9 @@ found: t = t/1000000.0 * wth->capture.ngsniffer->timeunit; /* t = # of secs */ t += wth->capture.ngsniffer->start; - wth->phdr.ts.tv_sec = (long)t; - wth->phdr.ts.tv_usec = (unsigned long)((t-(double)(wth->phdr.ts.tv_sec)) - *1.0e6); + wth->phdr.ts.secs = (long)t; + wth->phdr.ts.nsecs = (unsigned long)((t-(double)(wth->phdr.ts.secs)) + *1.0e9); return TRUE; } @@ -1917,13 +1917,13 @@ static gboolean ngsniffer_dump(wtap_dumper *wdh, const struct wtap_pkthdr *phdr, date. */ if (priv->first_frame) { priv->first_frame=FALSE; - tm = localtime(&phdr->ts.tv_sec); + tm = localtime(&phdr->ts.secs); if (tm != NULL) { start_date = (tm->tm_year - (1980 - 1900)) << 9; start_date |= (tm->tm_mon + 1) << 5; start_date |= tm->tm_mday; /* record the start date, not the start time */ - priv->start = phdr->ts.tv_sec - (3600*tm->tm_hour + 60*tm->tm_min + tm->tm_sec); + priv->start = phdr->ts.secs - (3600*tm->tm_hour + 60*tm->tm_min + tm->tm_sec); } else { start_date = 0; priv->start = 0; @@ -1968,7 +1968,7 @@ static gboolean ngsniffer_dump(wtap_dumper *wdh, const struct wtap_pkthdr *phdr, *err = WTAP_ERR_SHORT_WRITE; return FALSE; } - t = (double)phdr->ts.tv_sec + (double)phdr->ts.tv_usec/1.0e6; /* # of secs */ + t = (double)phdr->ts.secs + (double)phdr->ts.nsecs/1.0e9; /* # of secs */ t = (t - priv->start)*1.0e6 / Usec[1]; /* timeunit = 1 */ t_low = (guint16)(t-(double)((guint32)(t/65536.0))*65536.0); t_med = (guint16)((guint32)(t/65536.0) % 65536); diff --git a/wiretap/pppdump.c b/wiretap/pppdump.c index 72061bdcd9..8913cd8c4a 100644 --- a/wiretap/pppdump.c +++ b/wiretap/pppdump.c @@ -355,8 +355,8 @@ pppdump_read(wtap *wth, int *err, gchar **err_info, long *data_offset) wth->phdr.len = num_bytes; wth->phdr.caplen = num_bytes; - wth->phdr.ts.tv_sec = state->timestamp; - wth->phdr.ts.tv_usec = state->tenths * 100000; + wth->phdr.ts.secs = state->timestamp; + wth->phdr.ts.nsecs = state->tenths * 100000000; wth->phdr.pkt_encap = WTAP_ENCAP_PPP_WITH_PHDR; wth->pseudo_header.p2p.sent = (direction == DIRECTION_SENT ? TRUE : FALSE); diff --git a/wiretap/radcom.c b/wiretap/radcom.c index 08524b23a3..9c3934504a 100644 --- a/wiretap/radcom.c +++ b/wiretap/radcom.c @@ -314,8 +314,8 @@ static gboolean radcom_read(wtap *wth, int *err, gchar **err_info _U_, tm.tm_min = (sec%3600)/60; tm.tm_sec = sec%60; tm.tm_isdst = -1; - wth->phdr.ts.tv_sec = mktime(&tm); - wth->phdr.ts.tv_usec = pletohl(&hdr.date.usec); + wth->phdr.ts.secs = mktime(&tm); + wth->phdr.ts.nsecs = pletohl(&hdr.date.usec) * 1000; switch (wth->file_encap) { diff --git a/wiretap/snoop.c b/wiretap/snoop.c index a19e4cd532..5dc0c2a27d 100644 --- a/wiretap/snoop.c +++ b/wiretap/snoop.c @@ -501,8 +501,8 @@ static gboolean snoop_read(wtap *wth, int *err, gchar **err_info, return FALSE; /* Read error */ wth->data_offset += packet_size; - wth->phdr.ts.tv_sec = g_ntohl(hdr.ts_sec); - wth->phdr.ts.tv_usec = g_ntohl(hdr.ts_usec); + wth->phdr.ts.secs = g_ntohl(hdr.ts_sec); + wth->phdr.ts.nsecs = g_ntohl(hdr.ts_usec) * 1000; wth->phdr.caplen = packet_size; wth->phdr.len = orig_size; @@ -808,8 +808,8 @@ static gboolean snoop_dump(wtap_dumper *wdh, rec_hdr.incl_len = g_htonl(phdr->caplen + atm_hdrsize); rec_hdr.rec_len = g_htonl(reclen); rec_hdr.cum_drops = 0; - rec_hdr.ts_sec = g_htonl(phdr->ts.tv_sec); - rec_hdr.ts_usec = g_htonl(phdr->ts.tv_usec); + rec_hdr.ts_sec = g_htonl(phdr->ts.secs); + rec_hdr.ts_usec = g_htonl(phdr->ts.nsecs) / 1000; nwritten = fwrite(&rec_hdr, 1, sizeof rec_hdr, wdh->fh); if (nwritten != sizeof rec_hdr) { if (nwritten == 0 && ferror(wdh->fh)) diff --git a/wiretap/toshiba.c b/wiretap/toshiba.c index 086ed50be8..a9cc44d503 100644 --- a/wiretap/toshiba.c +++ b/wiretap/toshiba.c @@ -353,8 +353,8 @@ parse_toshiba_rec_hdr(wtap *wth, FILE_T fh, } if (wth) { - wth->phdr.ts.tv_sec = hr * 3600 + min * 60 + sec; - wth->phdr.ts.tv_usec = csec * 10000; + wth->phdr.ts.secs = hr * 3600 + min * 60 + sec; + wth->phdr.ts.nsecs = csec * 10000000; wth->phdr.caplen = pkt_len; wth->phdr.len = pkt_len; } diff --git a/wiretap/visual.c b/wiretap/visual.c index 5725aa9375..b270d508fa 100644 --- a/wiretap/visual.c +++ b/wiretap/visual.c @@ -298,8 +298,8 @@ static gboolean visual_read(wtap *wth, int *err, gchar **err_info, t += ((double)pletohl(&vpkt_hdr.ts_delta))*1000; secs = (time_t)(t/1000000); usecs = (guint32)(t - secs*1000000); - wth->phdr.ts.tv_sec = secs; - wth->phdr.ts.tv_usec = usecs; + wth->phdr.ts.secs = secs; + wth->phdr.ts.nsecs = usecs * 1000; wth->phdr.caplen = packet_size; wth->phdr.len = pletohs(&vpkt_hdr.orig_len); @@ -489,7 +489,7 @@ static gboolean visual_dump(wtap_dumper *wdh, const struct wtap_pkthdr *phdr, if (visual->index_table_index == 0) { /* This is the first packet. Save its start time as the file time. */ - visual->start_time = phdr->ts.tv_sec; + visual->start_time = phdr->ts.secs; /* Initialize the index table */ visual->index_table = g_malloc(1024 * sizeof *visual->index_table); @@ -497,8 +497,8 @@ static gboolean visual_dump(wtap_dumper *wdh, const struct wtap_pkthdr *phdr, } /* Calculate milliseconds since capture start. */ - delta_msec = phdr->ts.tv_usec / 1000; - delta_msec += (phdr->ts.tv_sec - visual->start_time) * 1000; + delta_msec = phdr->ts.nsecs / 1000000; + delta_msec += (phdr->ts.secs - visual->start_time) * 1000; vpkt_hdr.ts_delta = htolel(delta_msec); /* Fill in the length fields. */ diff --git a/wiretap/vms.c b/wiretap/vms.c index fccd4b1c13..02d0e6cc8a 100644 --- a/wiretap/vms.c +++ b/wiretap/vms.c @@ -439,9 +439,8 @@ parse_vms_rec_hdr(wtap *wth, FILE_T fh, int *err, gchar **err_info) tm.tm_year -= 1900; tm.tm_isdst = -1; - wth->phdr.ts.tv_sec = mktime(&tm); - - wth->phdr.ts.tv_usec = csec * 10000; + wth->phdr.ts.secs = mktime(&tm); + wth->phdr.ts.nsecs = csec * 10000000; wth->phdr.caplen = pkt_len; wth->phdr.len = pkt_len; } diff --git a/wiretap/wtap-int.h b/wiretap/wtap-int.h index fbbe89ef12..91a7456a84 100644 --- a/wiretap/wtap-int.h +++ b/wiretap/wtap-int.h @@ -176,6 +176,8 @@ struct wtap { file formats that have per-file encapsulation types */ + int tsprecision; /* timestamp precision of the lower 32bits + * 6 is microseconds, 9 is nanoseconds */ }; struct wtap_dumper; @@ -192,13 +194,13 @@ typedef struct { typedef struct { gboolean first_frame; - struct timeval start; + struct wtap_nstime start; guint32 nframes; } netxray_dump_t; typedef struct { gboolean got_first_record_time; - struct timeval first_record_time; + struct wtap_nstime first_record_time; guint32 frame_table_offset; guint32 *frame_table; guint frame_table_index; diff --git a/wiretap/wtap.c b/wiretap/wtap.c index b1e981b1d1..cb12f65ba9 100644 --- a/wiretap/wtap.c +++ b/wiretap/wtap.c @@ -84,6 +84,12 @@ wtap_file_encap(wtap *wth) return wth->file_encap; } +int +wtap_file_tsprecision(wtap *wth) +{ + return wth->tsprecision; +} + /* Table of the encapsulation types we know about. */ static const struct encap_type_info { const char *name; diff --git a/wiretap/wtap.def b/wiretap/wtap.def index 1e314db475..74d11b8cb1 100644 --- a/wiretap/wtap.def +++ b/wiretap/wtap.def @@ -12,6 +12,7 @@ wtap_encap_short_string wtap_encap_string wtap_file_encap wtap_file_size +wtap_file_tsprecision wtap_file_type wtap_file_type_short_string wtap_file_type_string diff --git a/wiretap/wtap.h b/wiretap/wtap.h index b828a7e4b6..44da7e5c6a 100644 --- a/wiretap/wtap.h +++ b/wiretap/wtap.h @@ -33,6 +33,7 @@ #include <glib.h> #include <stdio.h> +#include <time.h> /* Encapsulation types. Choose names that truly reflect * what is contained in the packet trace file. @@ -223,6 +224,10 @@ /* last WTAP_FILE_ value + 1 */ #define WTAP_NUM_FILE_TYPES 41 +/* timestamp accuracy (currently only these values are supported) */ +#define WTAP_FILE_TSPREC_USEC 6 +#define WTAP_FILE_TSPREC_NSEC 9 + /* * Maximum packet size we'll support. * It must be at least 65535. @@ -492,8 +497,14 @@ union wtap_pseudo_header { struct k12_phdr k12; }; +struct wtap_nstime { + time_t secs; + int nsecs; +}; + + struct wtap_pkthdr { - struct timeval ts; + struct wtap_nstime ts; guint32 caplen; guint32 len; int pkt_encap; @@ -537,6 +548,7 @@ gint64 wtap_file_size(wtap *wth, int *err); int wtap_snapshot_length(wtap *wth); /* per file */ int wtap_file_type(wtap *wth); int wtap_file_encap(wtap *wth); +int wtap_file_tsprecision(wtap *wth); const char *wtap_file_type_string(int filetype); const char *wtap_file_type_short_string(int filetype); |