diff options
author | Guy Harris <guy@alum.mit.edu> | 2006-04-16 02:04:42 +0000 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2006-04-16 02:04:42 +0000 |
commit | 3a1b1fc8ff252ac9d7d5745ae2f107a44a42c282 (patch) | |
tree | 6af0cbf829383c2d53b21217195fd699ba32c1f5 /wiretap | |
parent | 749faec6a375f8d60e9b3f8859e0e98f90391809 (diff) | |
download | wireshark-3a1b1fc8ff252ac9d7d5745ae2f107a44a42c282.tar.gz wireshark-3a1b1fc8ff252ac9d7d5745ae2f107a44a42c282.tar.bz2 wireshark-3a1b1fc8ff252ac9d7d5745ae2f107a44a42c282.zip |
Add a loop to process TLVs in the file header.
Advertise nanosecond resolution.
svn path=/trunk/; revision=17871
Diffstat (limited to 'wiretap')
-rw-r--r-- | wiretap/network_instruments.c | 68 |
1 files changed, 52 insertions, 16 deletions
diff --git a/wiretap/network_instruments.c b/wiretap/network_instruments.c index c6c19bec36..086fe65af4 100644 --- a/wiretap/network_instruments.c +++ b/wiretap/network_instruments.c @@ -106,11 +106,15 @@ static gboolean observer_dump(wtap_dumper *wdh, const struct wtap_pkthdr *phdr, int network_instruments_open(wtap *wth, int *err, gchar **err_info) { int bytes_read; - + int offset; capture_file_header file_header; + guint i; + tlv_header tlvh; + int seek_increment; packet_entry_header packet_header; errno = WTAP_ERR_CANT_READ; + offset = 0; /* Read in the buffer file header */ bytes_read = file_read(&file_header, sizeof file_header, 1, wth->fh); @@ -120,6 +124,7 @@ int network_instruments_open(wtap *wth, int *err, gchar **err_info) return -1; return 0; } + offset += bytes_read; /* check the magic number */ if (memcmp(file_header.observer_version, network_instruments_magic, true_magic_length)!=0) { @@ -133,14 +138,48 @@ int network_instruments_open(wtap *wth, int *err, gchar **err_info) return -1; } + /* process extra information */ + for (i = 0; i < file_header.number_of_information_elements; i++) { + /* read the TLV header */ + bytes_read = file_read(&tlvh, sizeof tlvh, 1, wth->fh); + if (bytes_read != sizeof tlvh) { + *err = file_error(wth->fh); + if (*err == 0) + *err = WTAP_ERR_SHORT_READ; + return -1; + } + offset += bytes_read; + + tlvh.length = GUINT16_FROM_LE(tlvh.length); + if (tlvh.length < sizeof tlvh) { + *err = WTAP_ERR_BAD_RECORD; + *err_info = g_strdup_printf("Observer: bad record (TLV length %u < %lu)", + tlvh.length, (unsigned long)sizeof tlvh); + return -1; + } + + /* skip the TLV data */ + seek_increment = tlvh.length - sizeof tlvh; + if (seek_increment > 0) { + if (file_seek(wth->fh, seek_increment, SEEK_CUR, err) == -1) + return -1; + } + offset += seek_increment; + } + /* get to the first packet */ file_header.offset_to_first_packet = GUINT16_FROM_LE(file_header.offset_to_first_packet); - if (file_seek(wth->fh, file_header.offset_to_first_packet, SEEK_SET, - err) == -1) { - if (*err != 0) + if (file_header.offset_to_first_packet < offset) { + *err = WTAP_ERR_BAD_RECORD; + *err_info = g_strdup_printf("Observer: bad record (offset to first packet %d < %d)", + file_header.offset_to_first_packet, offset); + return FALSE; + } + seek_increment = file_header.offset_to_first_packet - offset; + if (seek_increment > 0) { + if (file_seek(wth->fh, seek_increment, SEEK_CUR, err) == -1) return -1; - return 0; } /* pull off the packet header */ @@ -175,16 +214,13 @@ int network_instruments_open(wtap *wth, int *err, gchar **err_info) wth->subtype_seek_read = observer_seek_read; wth->subtype_close = NULL; wth->subtype_sequential_close = NULL; - wth->snapshot_length = 0; - wth->tsprecision = WTAP_FILE_TSPREC_USEC; + wth->snapshot_length = 0; /* not available in header */ + wth->tsprecision = WTAP_FILE_TSPREC_NSEC; /* reset the pointer to the first packet */ if (file_seek(wth->fh, file_header.offset_to_first_packet, SEEK_SET, - err) == -1) { - if (*err != 0) - return -1; - return 0; - } + err) == -1) + return -1; wth->data_offset = file_header.offset_to_first_packet; init_time_offset(); @@ -356,7 +392,7 @@ read_packet_header(FILE_T fh, packet_entry_header *packet_header, int *err, /* skip the TLV data */ seek_increment = tlvh.length - sizeof tlvh; - if(seek_increment>0) { + if (seek_increment > 0) { if (file_seek(fh, seek_increment, SEEK_CUR, err) == -1) return -1; } @@ -378,12 +414,12 @@ read_packet_data(FILE_T fh, int offset_to_frame, int offset, guint8 *pd, /* get to the packet data */ if (offset_to_frame < offset) { *err = WTAP_ERR_BAD_RECORD; - *err_info = g_strdup_printf("Observer: bad record (offset to frame %d < %d)", + *err_info = g_strdup_printf("Observer: bad record (offset to packet data %d < %d)", offset_to_frame, offset); return FALSE; } seek_increment = offset_to_frame - offset; - if(seek_increment>0) { + if (seek_increment > 0) { if (file_seek(fh, seek_increment, SEEK_CUR, err) == -1) return FALSE; } @@ -406,7 +442,7 @@ skip_to_next_packet(wtap *wth, int offset, int offset_to_next_packet, int *err, return FALSE; } seek_increment = offset_to_next_packet - offset; - if(seek_increment>0) { + if (seek_increment > 0) { if (file_seek(wth->fh, seek_increment, SEEK_CUR, err) == -1) return FALSE; } |