Ethereal-dev: Re: [ethereal-dev] 64-bit pcap timestamp problems
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: John Heffner <heffner@xxxxxxx>
Date: Mon, 30 Aug 1999 12:03:14 -0400 (EDT)
On Mon, 30 Aug 1999, Guy Harris wrote:
> > > This makes sense; however, every application that uses libpcap must be
> > > careful to define its own timeval structure that has 32-bit ints, instead
> > > of using the one defined in the system headers.
> >
> > ...or "libpcap" needs to be changed not to use "struct timeval" in
> > "pcap_pkthdr", and to use instead, say, "bpf_u_int32 ts_sec" and
> > "bpf_u_int32 ts_usec", and the applications need to refer to "ts_sec"
> > and "ts_usec" rather than "ts.tv_sec" and "ts.tv_usec".
>
> ...which won't fix the problem.
>
> Unfortunately, as you note, having the "libpcap" packet header start
> with anything other than a "struct timeval" breaks "libpcap" programs -
> "tcpdump", for example, prints timestamps with
>
> ts_print(&h->ts);
>
> where "h" is a "const struct pcap_pkthdr *".
>
> How does "pcap.h" define "struct pcap_pkthdr" on RedHat 5.2 and 6.0 on
> Alpha? (Does it define it any differently on other platforms?)
AFAIK, libpcap sources are exactly the same for Linux/Alpha as for
Linux/i386.
> In your original mail, you said:
>
> > I'm running linux-2.2.10, redhat-5.2 on an alpha. With the 2.2-series
> > kernel on alpha, the seconds and microseconds are stored as 64-bit
> > integers instead of 32-bit integers. This is a nasty little problem I ran
> > into with the stock tcpdump/libpcap in the stock redhat-5.2/alpha (glibc
> > 2.0). The headers that come with redhat define a timestamp as two 32-bit
> > ints, and this causes all sorts of nastyness. I got it to work by
> > building libpcap/tcpdump after changing the struct timeval in timebits.h
> > to look like the one in the kernel. I beleive RedHat have made this same
> > change as of 6.0 (glibc 2.1).
>
> What is "timebits.h"? A generic header used in userland (e.g., included
> by <sys/time.h>), or something specific to 'libpcap"?
timebits.h is indeed a generic header in userland included by
<sys/time.h>.
> If 6.0 (and other 64-bit Linux distributions with 2.2-series kernels)
> declare a "struct pcap_pkthdr" as
>
> struct pcap_pkthdr {
> struct timeval ts; /* time stamp */
> bpf_u_int32 caplen; /* length of portion present */
> bpf_u_int32 len; /* length this packet (off wire) */
> };
>
> with "struct timeval" having 64-bit "tv_sec" and "tv_usec", we probably
> need to do the same in Wiretap.
>
> > struct pcaprec_hdr maybe should be changed to use a struct timeval
> > as defined in timebits.h, like libpcap does. There's a big problem with
> > this, though -- traces on 64-bit machines won't be viewable on 32-bit
> > machines and vica versa. This seems like a problem with libpcap.
>
> Actually, if the "if" right above this is true, we *can* arrange to read
> traces from 64-bit machines on 32-bit machines, and *vice versa*....
>
> A 32-bit-time-stamp "libpcap" packet header looks like (all lines
> represent 32-bit quantities):
>
> tv_sec
> tv_usec
> caplen
> len
>
> A 64-bit-time-stamp big-endian "libpcap" packet header looks like:
>
> upper 32 bits of "tv_sec" (probably 0)
> lower 32 bits of "tv_sec"
> upper 32 bits of "tv_usec", which should be 0 (tv_usec < 1000000)
> lower 32 bits of "tv_usec"
> caplen
> len
>
> A 64-bit-time-stamp little-endian header looks like:
>
> lower 32 bits of "tv_sec"
> upper 32 bits of "tv_sec" (probably 0)
> lower 32 bits of "tv_usec"
> upper 32 bits of "tv_usec", which should be 0 (tv_usec < 1000000)
> caplen
> len
>
> If you read the first 4 32-bit words of the packet header, and it's from
> a machine with 32-bit time stamps, the third and fourth 32-bit words
> should be non-zero, as one is the captured length and one is the
> on-the-wire length.
>
> If it's from a big-endian machine with 64-bit time stamps, however, the
> third word should be zero, as "tv_usec" should be less than 1 000 000,
> and thus should fit in 32 bits. If it's from a little-endian machine
> with 64-bit time stamps, the fourth word should be zero, for the same
> reason.
>
> So, if we keep a flag saying "32-bit timestamps, 64-bit timestamps, or
> as-yet-unknown time stamp size", start it out as "as yet unknown", and:
>
> if it's "as yet unknown", read the first 4 32-bit words of the
> header into a structure with 32-bit time stamps and check
> whether either "len" or "caplen" are zero - if so, flag it as
> "64-bit", copy those 4 words to a structure with 64-bit time
> stamps, and read the next 2 32-bit words into the fifth and
> sixth words of that structure;
>
> if it's "32 bits", read 4 32-bit words into a 32-bit time stamp
> structure;
>
> if it's "64 bits", read 6 32-bit words into a 64-bit time stamp
> structure;
>
> and then process the appropriate structure, we can handle either time
> stamp size on both 32-bit and 64-bit machines.
>
> A similar hack could be put into "libpcap" itself, so that, at least if
> you have such a hacked "libpcap", programs using "libpcap" to read
> capture files could read capture files both from machines with 32-bit
> time stamps and from machines with 64-bit time stamps.
>
> (When reading a *live* capture, it'd treat it as having the native time
> stamp type.)
Well, as pointed out before, any change to the libpcap file format would
break lots of stuff. I don't know how possible backwards compatibility
would be. This seems like an issue for the LBL folks.
-John
- References:
- Re: [ethereal-dev] 64-bit pcap timestamp problems
- From: Guy Harris
- Re: [ethereal-dev] 64-bit pcap timestamp problems
- Prev by Date: [ethereal-dev] bug in proto_tree
- Next by Date: [gram@xxxxxxxxxx: [ethereal-dev] bug in proto_tree]
- Previous by thread: Re: [ethereal-dev] 64-bit pcap timestamp problems
- Next by thread: Re: [ethereal-dev] 64-bit pcap timestamp problems
- Index(es):





