aboutsummaryrefslogtreecommitdiffstats
path: root/wiretap
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2006-04-14 10:22:29 +0000
committerGuy Harris <guy@alum.mit.edu>2006-04-14 10:22:29 +0000
commit44aa78fe5e3dd8b7c0f70c3941af28c48ebdd4c7 (patch)
treed7206392bf8a45a2db3f86e5ecc3ba76ca8536b5 /wiretap
parentf8e8ccac5c1661feb7bfedcc4bf33639aa049791 (diff)
Skip non-data records. Fixes bug 767.
svn path=/trunk/; revision=17861
Diffstat (limited to 'wiretap')
-rw-r--r--wiretap/network_instruments.c64
-rw-r--r--wiretap/network_instruments.h17
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;