From be2736adcf8ac583c2d56e37db9ef01f391913f9 Mon Sep 17 00:00:00 2001 From: Guy Harris Date: Wed, 1 Oct 2003 07:11:49 +0000 Subject: Have a pseudo-header for Ethernet packets, giving the size of the FCS - 0 means "there is no FCS in the packet data", 4 means "there is an FCS in the packet data", -1 means "I don't know whether there's an FCS in the packet data, guess based on the packet size". Assume that Ethernet encapsulated inside other protocols has no FCS, by having the "eth" dissector assume that (and not check for an Ethernet pseudo-header). Have "ethertype()" take an argument giving the FCS size; pass 0 when appropriate. Fix up Wiretap routines to set the pseudo-header. This means we no longer use the "generic" seek-and-read routine, so get rid of it. svn path=/trunk/; revision=8574 --- wiretap/lanalyzer.c | 44 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) (limited to 'wiretap/lanalyzer.c') diff --git a/wiretap/lanalyzer.c b/wiretap/lanalyzer.c index 0675da026d..6b27df5b18 100644 --- a/wiretap/lanalyzer.c +++ b/wiretap/lanalyzer.c @@ -1,6 +1,6 @@ /* lanalyzer.c * - * $Id: lanalyzer.c,v 1.39 2003/07/29 20:30:00 guy Exp $ + * $Id: lanalyzer.c,v 1.40 2003/10/01 07:11:47 guy Exp $ * * Wiretap Library * Copyright (c) 1998 by Gilbert Ramirez @@ -118,6 +118,8 @@ static const gint8 LA_CyclicInformationFake[] = { }; static gboolean lanalyzer_read(wtap *wth, int *err, long *data_offset); +static gboolean lanalyzer_seek_read(wtap *wth, long seek_off, + union wtap_pseudo_header *pseudo_header, guchar *pd, int length, int *err); static void lanalyzer_close(wtap *wth); static gboolean lanalyzer_dump_close(wtap_dumper *wdh, int *err); @@ -155,7 +157,7 @@ int lanalyzer_open(wtap *wth, int *err) wth->file_type = WTAP_FILE_LANALYZER; wth->capture.lanalyzer = g_malloc(sizeof(lanalyzer_t)); wth->subtype_read = lanalyzer_read; - wth->subtype_seek_read = wtap_def_seek_read; + wth->subtype_seek_read = lanalyzer_seek_read; wth->subtype_close = lanalyzer_close; wth->snapshot_length = 0; @@ -384,6 +386,44 @@ static gboolean lanalyzer_read(wtap *wth, int *err, long *data_offset) wth->phdr.caplen = packet_size; wth->phdr.pkt_encap = wth->file_encap; + switch (wth->file_encap) { + + case WTAP_ENCAP_ETHERNET: + /* We assume there's no FCS in this frame. */ + wth->pseudo_header.eth.fcs_len = 0; + break; + } + + return TRUE; +} + +static gboolean lanalyzer_seek_read(wtap *wth, long seek_off, + union wtap_pseudo_header *pseudo_header, guchar *pd, int length, int *err) +{ + int bytes_read; + + if (file_seek(wth->random_fh, seek_off, SEEK_SET, err) == -1) + return FALSE; + + /* + * Read the packet data. + */ + bytes_read = file_read(pd, sizeof(guint8), length, wth->random_fh); + if (bytes_read != length) { + *err = file_error(wth->random_fh); + if (*err == 0) + *err = WTAP_ERR_SHORT_READ; + return FALSE; + } + + switch (wth->file_encap) { + + case WTAP_ENCAP_ETHERNET: + /* We assume there's no FCS in this frame. */ + pseudo_header->eth.fcs_len = 0; + break; + } + return TRUE; } -- cgit v1.2.3