diff options
author | Guy Harris <guy@alum.mit.edu> | 2006-04-14 10:22:29 +0000 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2006-04-14 10:22:29 +0000 |
commit | 44aa78fe5e3dd8b7c0f70c3941af28c48ebdd4c7 (patch) | |
tree | d7206392bf8a45a2db3f86e5ecc3ba76ca8536b5 /wiretap | |
parent | f8e8ccac5c1661feb7bfedcc4bf33639aa049791 (diff) |
Skip non-data records. Fixes bug 767.
svn path=/trunk/; revision=17861
Diffstat (limited to 'wiretap')
-rw-r--r-- | wiretap/network_instruments.c | 64 | ||||
-rw-r--r-- | wiretap/network_instruments.h | 17 |
2 files changed, 63 insertions, 18 deletions
diff --git a/wiretap/network_instruments.c b/wiretap/network_instruments.c index 7a3ac43b36..726c1b7d05 100644 --- a/wiretap/network_instruments.c +++ b/wiretap/network_instruments.c @@ -206,24 +206,52 @@ static gboolean observer_read(wtap *wth, int *err, gchar **err_info, observer_time packet_time; - *data_offset = wth->data_offset; - - /* pull off the packet header */ - bytes_read = file_read(&packet_header, sizeof packet_header, 1, wth->fh); - if (bytes_read != sizeof packet_header) { - *err = file_error(wth->fh); - if (*err != 0) - return -1; - return 0; - } - wth->data_offset += bytes_read; - - /* check the packet's magic number; the magic number is all 8's, - so the byte order doesn't matter */ - if (packet_header.packet_magic != observer_packet_magic) { - *err = WTAP_ERR_BAD_RECORD; - *err_info = g_strdup("Observer: bad record"); - return FALSE; + /* + * Skip records other than data records. + */ + for (;;) { + *data_offset = wth->data_offset; + + /* pull off the packet header */ + bytes_read = file_read(&packet_header, sizeof packet_header, 1, wth->fh); + if (bytes_read != sizeof packet_header) { + *err = file_error(wth->fh); + if (*err != 0) + return -1; + return 0; + } + wth->data_offset += bytes_read; + + /* check the packet's magic number; the magic number is all 8's, + so the byte order doesn't matter */ + if (packet_header.packet_magic != observer_packet_magic) { + *err = WTAP_ERR_BAD_RECORD; + *err_info = g_strdup_printf("Observer: bad record: Invalid magic number 0x%08x", + GUINT32_FROM_LE(packet_header.packet_magic)); + return FALSE; + } + + /* check the packet's record type, and skip non-data + packets */ + if (packet_header.packet_type == TYPE_DATA_PACKET) + break; + + /* skip to next packet */ + packet_header.offset_to_next_packet = + GUINT16_FROM_LE(packet_header.offset_to_next_packet); + if (packet_header.offset_to_next_packet < sizeof(packet_header)) { + *err = WTAP_ERR_BAD_RECORD; + *err_info = g_strdup_printf("Observer: bad record (offset to next packet %u < %lu)", + packet_header.offset_to_next_packet, + (unsigned long)sizeof(packet_header)); + return FALSE; + } + seek_increment = packet_header.offset_to_next_packet - sizeof(packet_header); + if(seek_increment>0) { + if (file_seek(wth->fh, seek_increment, SEEK_CUR, err) == -1) + return FALSE; + } + wth->data_offset += seek_increment; } /* convert from observer time to wiretap time */ diff --git a/wiretap/network_instruments.h b/wiretap/network_instruments.h index 8c6a8bbb21..3d847d6d38 100644 --- a/wiretap/network_instruments.h +++ b/wiretap/network_instruments.h @@ -34,6 +34,23 @@ typedef struct capture_file_header char extra_information_present; } capture_file_header; +#define TYPE_DATA_PACKET 0 +#define TYPE_EXPERT_INFORMATION_PACKET 1 + +/* + * The Observer document indicates that the types of expert information + * packets are: + * + * Network Load (markers used by Expert Time Interval and What If + * analysis modes) + * + * Start/Stop Packet Capture marker frames (with time stamps when + * captures start and stop) + * + * Wireless Channel Change (markers showing what channel was being + * currently listened to) + */ + typedef struct packet_entry_header { guint32 packet_magic; |