diff options
author | Michael Tüxen <tuexen@fh-muenster.de> | 2009-06-27 17:33:23 +0000 |
---|---|---|
committer | Michael Tüxen <tuexen@fh-muenster.de> | 2009-06-27 17:33:23 +0000 |
commit | 1297ec0d61866bee544f90d14b8ed89fdfed5367 (patch) | |
tree | b110d7cf665aa802fe2f50b4b21a6b73c238d30a /wiretap/pcapng.c | |
parent | dce1889fd7e70809fefd85cccbf4ee426fd77106 (diff) |
Another cleanup. We are now back to Ulf's original
model of data handling.
svn path=/trunk/; revision=28864
Diffstat (limited to 'wiretap/pcapng.c')
-rw-r--r-- | wiretap/pcapng.c | 70 |
1 files changed, 42 insertions, 28 deletions
diff --git a/wiretap/pcapng.c b/wiretap/pcapng.c index 0bd5eadb94..0cd6a127be 100644 --- a/wiretap/pcapng.c +++ b/wiretap/pcapng.c @@ -199,6 +199,7 @@ typedef struct wtapng_packet_s { /* pack_hash */ guint32 pseudo_header_len; + int wtap_encap; /* XXX - put the packet data / pseudo_header here as well? */ } wtapng_packet_t; @@ -208,6 +209,7 @@ typedef struct wtapng_simple_packet_s { guint32 cap_len; /* data length in the file */ guint32 packet_len; /* data length on the wire */ guint32 pseudo_header_len; + int wtap_encap; /* XXX - put the packet data / pseudo_header here as well? */ } wtapng_simple_packet_t; @@ -252,8 +254,9 @@ typedef struct wtapng_block_s { /* XXX - currently don't know how to handle these! */ const union wtap_pseudo_header *pseudo_header; + struct wtap_pkthdr *packet_header; const guchar *frame_buffer; - int encap; + int *file_encap; } wtapng_block_t; typedef struct interface_data_s { @@ -483,7 +486,7 @@ pcapng_read_section_header_block(FILE_T fh, pcapng_block_header_t *bh, /* "Interface Description Block" */ static int -pcapng_read_if_descr_block(wtap *wth, FILE_T fh, pcapng_block_header_t *bh, pcapng_t *pn, +pcapng_read_if_descr_block(FILE_T fh, pcapng_block_header_t *bh, pcapng_t *pn, wtapng_block_t *wblock, int *err, gchar **err_info _U_) { guint64 time_units_per_second; @@ -667,11 +670,11 @@ pcapng_read_if_descr_block(wtap *wth, FILE_T fh, pcapng_block_header_t *bh, pcap } encap = wtap_pcap_encap_to_wtap_encap(wblock->data.if_descr.link_type); - if (wth->file_encap == WTAP_ENCAP_UNKNOWN) { - wth->file_encap = encap; + if (*wblock->file_encap == WTAP_ENCAP_UNKNOWN) { + *wblock->file_encap = encap; } else { - if (wth->file_encap != encap) { - wth->file_encap = WTAP_ENCAP_PER_PACKET; + if (*wblock->file_encap != encap) { + *wblock->file_encap = WTAP_ENCAP_PER_PACKET; } } @@ -684,7 +687,7 @@ pcapng_read_if_descr_block(wtap *wth, FILE_T fh, pcapng_block_header_t *bh, pcap static int -pcapng_read_packet_block(wtap *wth, FILE_T fh, pcapng_block_header_t *bh, pcapng_t *pn, wtapng_block_t *wblock, int *err, gchar **err_info _U_, gboolean enhanced) +pcapng_read_packet_block(FILE_T fh, pcapng_block_header_t *bh, pcapng_t *pn, wtapng_block_t *wblock, int *err, gchar **err_info _U_, gboolean enhanced) { int bytes_read; int block_read; @@ -779,7 +782,7 @@ pcapng_read_packet_block(wtap *wth, FILE_T fh, pcapng_block_header_t *bh, pcapng pn->byte_swapped, wblock->data.packet.cap_len, TRUE, - &wth->phdr, + wblock->packet_header, (union wtap_pseudo_header *)wblock->pseudo_header, err, err_info); @@ -887,7 +890,7 @@ pcapng_read_packet_block(wtap *wth, FILE_T fh, pcapng_block_header_t *bh, pcapng static int -pcapng_read_simple_packet_block(wtap *wth, FILE_T fh, pcapng_block_header_t *bh, pcapng_t *pn, wtapng_block_t *wblock,int *err, gchar **err_info _U_) +pcapng_read_simple_packet_block(FILE_T fh, pcapng_block_header_t *bh, pcapng_t *pn, wtapng_block_t *wblock, int *err, gchar **err_info _U_) { int bytes_read; int block_read; @@ -937,7 +940,7 @@ pcapng_read_simple_packet_block(wtap *wth, FILE_T fh, pcapng_block_header_t *bh, pn->byte_swapped, wblock->data.simple_packet.cap_len, TRUE, - &wth->phdr, + wblock->packet_header, (union wtap_pseudo_header *)wblock->pseudo_header, err, err_info); @@ -1120,9 +1123,9 @@ pcapng_read_unknown_block(FILE_T fh, pcapng_block_header_t *bh, pcapng_t *pn _U_ return block_read; } -/* XXX Can we get rid of wth again? */ + static int -pcapng_read_block(wtap *wth, FILE_T fh, pcapng_t *pn, wtapng_block_t *wblock, int *err, gchar **err_info) +pcapng_read_block(FILE_T fh, pcapng_t *pn, wtapng_block_t *wblock, int *err, gchar **err_info) { int block_read; int bytes_read; @@ -1156,16 +1159,16 @@ pcapng_read_block(wtap *wth, FILE_T fh, pcapng_t *pn, wtapng_block_t *wblock, in bytes_read = pcapng_read_section_header_block(fh, &bh, pn, wblock, err, err_info); break; case(BLOCK_TYPE_IDB): - bytes_read = pcapng_read_if_descr_block(wth, fh, &bh, pn, wblock, err, err_info); + bytes_read = pcapng_read_if_descr_block(fh, &bh, pn, wblock, err, err_info); break; case(BLOCK_TYPE_PB): - bytes_read = pcapng_read_packet_block(wth, fh, &bh, pn, wblock, err, err_info, FALSE); + bytes_read = pcapng_read_packet_block(fh, &bh, pn, wblock, err, err_info, FALSE); break; case(BLOCK_TYPE_SPB): - bytes_read = pcapng_read_simple_packet_block(wth, fh, &bh, pn, wblock, err, err_info); + bytes_read = pcapng_read_simple_packet_block(fh, &bh, pn, wblock, err, err_info); break; case(BLOCK_TYPE_EPB): - bytes_read = pcapng_read_packet_block(wth, fh, &bh, pn, wblock, err, err_info, TRUE); + bytes_read = pcapng_read_packet_block(fh, &bh, pn, wblock, err, err_info, TRUE); break; case(BLOCK_TYPE_ISB): bytes_read = pcapng_read_interface_statistics_block(fh, &bh, pn, wblock, err, err_info); @@ -1225,10 +1228,12 @@ pcapng_open(wtap *wth, int *err, gchar **err_info) /* we don't expect any packet blocks yet */ wblock.frame_buffer = NULL; wblock.pseudo_header = NULL; + wblock.packet_header = NULL; + wblock.file_encap = &wth->file_encap; pcapng_debug0("pcapng_open: opening file"); /* read first block */ - bytes_read = pcapng_read_block(wth, wth->fh, &pn, &wblock, err, err_info); + bytes_read = pcapng_read_block(wth->fh, &pn, &wblock, err, err_info); if (bytes_read <= 0) { pcapng_debug0("pcapng_open: couldn't read first SHB"); *err = file_error(wth->fh); @@ -1285,12 +1290,14 @@ pcapng_read(wtap *wth, int *err, gchar **err_info, gint64 *data_offset) buffer_assure_space(wth->frame_buffer, WTAP_MAX_PACKET_SIZE); } - wblock.frame_buffer = buffer_start_ptr(wth->frame_buffer); + wblock.frame_buffer = buffer_start_ptr(wth->frame_buffer); wblock.pseudo_header = &wth->pseudo_header; + wblock.packet_header = &wth->phdr; + wblock.file_encap = &wth->file_encap; /* read next block */ while (1) { - bytes_read = pcapng_read_block(wth, wth->fh, wth->capture.pcapng, &wblock, err, err_info); + bytes_read = pcapng_read_block(wth->fh, wth->capture.pcapng, &wblock, err, err_info); if (bytes_read <= 0) { pcapng_debug0("pcapng_read: couldn't read packet block"); return FALSE; @@ -1359,9 +1366,11 @@ pcapng_seek_read(wtap *wth, gint64 seek_off, wblock.frame_buffer = pd; wblock.pseudo_header = pseudo_header; + wblock.packet_header = &wth->phdr; + wblock.file_encap = &wth->file_encap; /* read the block */ - bytes_read = pcapng_read_block(wth, wth->random_fh, wth->capture.pcapng, &wblock, err, err_info); + bytes_read = pcapng_read_block(wth->random_fh, wth->capture.pcapng, &wblock, err, err_info); if (bytes_read <= 0) { *err = file_error(wth->fh); pcapng_debug0("pcapng_seek_read: couldn't read packet block"); @@ -1522,7 +1531,7 @@ pcapng_write_packet_block(wtap_dumper *wdh, wtapng_block_t *wblock, int *err) guint32 pad_len; guint32 phdr_len; - phdr_len = (guint32)pcap_get_phdr_size(wblock->encap, wblock->pseudo_header); + phdr_len = (guint32)pcap_get_phdr_size(wblock->data.packet.wtap_encap, wblock->pseudo_header); if ((phdr_len + wblock->data.packet.cap_len) % 4) { pad_len = 4 - ((phdr_len + wblock->data.packet.cap_len) % 4); } else { @@ -1561,7 +1570,7 @@ pcapng_write_packet_block(wtap_dumper *wdh, wtapng_block_t *wblock, int *err) wdh->bytes_dumped += sizeof epb; /* write pseudo header */ - if (!pcap_write_phdr(wdh, wblock->encap, wblock->pseudo_header, err)) { + if (!pcap_write_phdr(wdh, wblock->data.packet.wtap_encap, wblock->pseudo_header, err)) { return FALSE; } wdh->bytes_dumped += phdr_len; @@ -1660,8 +1669,10 @@ static gboolean pcapng_dump(wtap_dumper *wdh, interface_id = pcapng_lookup_interface_id_by_encap(phdr->pkt_encap, wdh); if (interface_id == G_MAXUINT32) { /* write the interface description block */ - wblock.frame_buffer = NULL; - wblock.pseudo_header = NULL; + wblock.frame_buffer = NULL; + wblock.pseudo_header = NULL; + wblock.packet_header = NULL; + wblock.file_encap = NULL; wblock.type = BLOCK_TYPE_IDB; wblock.data.if_descr.link_type = wtap_wtap_encap_to_pcap_encap(phdr->pkt_encap); wblock.data.if_descr.snap_len = wdh->snaplen; /* XXX */ @@ -1690,7 +1701,8 @@ static gboolean pcapng_dump(wtap_dumper *wdh, wblock.frame_buffer = pd; wblock.pseudo_header = pseudo_header; - wblock.encap = phdr->pkt_encap; + wblock.packet_header = NULL; + wblock.file_encap = NULL; /* write the (enhanced) packet block */ wblock.type = BLOCK_TYPE_EPB; @@ -1705,7 +1717,8 @@ static gboolean pcapng_dump(wtap_dumper *wdh, wblock.data.packet.cap_len = phdr->caplen; wblock.data.packet.packet_len = phdr->len; wblock.data.packet.interface_id = interface_id; - + wblock.data.packet.wtap_encap = phdr->pkt_encap; + /* currently unused */ wblock.data.packet.drop_count = -1; wblock.data.packet.opt_comment = NULL; @@ -1736,9 +1749,10 @@ pcapng_dump_open(wtap_dumper *wdh, gboolean cant_seek _U_, int *err) { wtapng_block_t wblock; - wblock.frame_buffer = NULL; + wblock.frame_buffer = NULL; wblock.pseudo_header = NULL; - + wblock.packet_header = NULL; + wblock.file_encap = NULL; pcapng_debug0("pcapng_dump_open"); /* This is a pcapng file */ |