Ethereal-dev: [Ethereal-dev] Dumping PDUs of reassembled protocols
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Loïc Minier <lool+ethereal@xxxxxxxxxx>
Date: Mon, 4 Aug 2003 16:46:42 +0200
Hello list, As I hoped to find a PDU dumper in ethereal but did not find one, I met other people interested in the same functionality in ethereal-users. Here's a draft of a patch slightly modifying packet-wtp.c, packet-ip.c, and Makefile.am. It shows the use of two new files, dump-pdu.c and .h. I currently can save all WSP packets (or ICMP packet) of a pcap file with a single command line: ./tethereal -o 'ip.defragment:true wap_wsp_wtp.dump_wsp:true wap_wsp_wtp.dump_wsp_pathname:wsp-packet' -r ../traces/trace.o -x -V > /dev/null And this can also work in real time. However, I understand some things might not match the usual syntax in ethereal's code. Additionnally, a lot of features are missing: - user format strings to specify output file (for example '%f-%p-%t-%i.pdu' could be a format string expressing the frame number, protocol short name, type of packet, and index, ie '12-wsp-connect-0.pdu'). - support of never fragmented protocols - on-demand dump via ethereal's gui - ... I hope you'll be interested in this dumper as I am, and I am awaiting your comments, Best regards, -- Loïc Minier <lool@xxxxxxxx>
Index: Makefile.am =================================================================== RCS file: /cvsroot/ethereal/Makefile.am,v retrieving revision 1.605 diff -u -b -r1.605 Makefile.am --- Makefile.am 4 Aug 2003 00:17:55 -0000 1.605 +++ Makefile.am 4 Aug 2003 14:32:50 -0000 @@ -709,6 +709,8 @@ crypt-md5.h \ crypt-rc4.c \ crypt-rc4.h \ + dump-pdu.c \ + dump-pdu.h \ packet-dcerpc-nt.c \ etypes.h \ file.h \ Index: packet-ip.c =================================================================== RCS file: /cvsroot/ethereal/packet-ip.c,v retrieving revision 1.194 diff -u -b -r1.194 packet-ip.c --- packet-ip.c 11 Jul 2003 09:30:48 -0000 1.194 +++ packet-ip.c 4 Aug 2003 14:32:51 -0000 @@ -40,6 +40,7 @@ #include "ip_opts.h" #include "prefs.h" #include "reassemble.h" +#include "dump-pdu.h" #include "etypes.h" #include "greproto.h" #include "ppptypes.h" @@ -62,6 +63,11 @@ /* Defragment fragmented IP datagrams */ static gboolean ip_defragment = FALSE; +/* Dump ICMP PDUs to files */ +static gboolean ip_dump_icmp = FALSE; +/* name of these files */ +static gchar *ip_dump_icmp_pathname = "icmp-dump"; + /* Place IP summary in proto tree */ static gboolean ip_summary_in_tree = TRUE; @@ -1502,6 +1508,11 @@ original datagram. */ next_tvb = tvb_new_subset(tvb, 8, -1, -1); call_dissector(ip_handle, next_tvb, pinfo, icmp_tree); + if (ip_dump_icmp) { + dump( tvb_new_subset(tvb, 8, -1, -1), + ip_dump_icmp_pathname, + FALSE ); + } /* Restore the "we're inside an error packet" flag. */ pinfo->in_error_pkt = save_in_error_pkt; @@ -1511,6 +1522,11 @@ case ICMP_ECHO: call_dissector(data_handle, tvb_new_subset(tvb, 8, -1, -1), pinfo, icmp_tree); + if (ip_dump_icmp) { + dump( tvb_new_subset(tvb, 8, -1, -1), + ip_dump_icmp_pathname, + FALSE ); + } break; case ICMP_RTRADVERT: @@ -1727,6 +1743,14 @@ "Reassemble fragmented IP datagrams", "Whether fragmented IP datagrams should be reassembled", &ip_defragment); + prefs_register_bool_preference(ip_module, "dump_icmp", + "dump ICMP packets to a file", + "Whether ICMP PDUs should be dumped to a file", + &ip_dump_icmp); + prefs_register_string_preference(ip_module, "dump_icmp_pathname", + "ICMP PDUs dumps pathname", + "Sets the name of dumped ICMP PDUs", + &ip_dump_icmp_pathname); prefs_register_bool_preference(ip_module, "summary_in_tree", "Show IP summary in protocol tree", "Whether the IP summary line should be shown in the protocol tree", Index: packet-wsp.c =================================================================== RCS file: /cvsroot/ethereal/packet-wtp.c,v retrieving revision 1.51 diff -u -b -r1.51 packet-wtp.c --- packet-wtp.c 29 Jul 2003 22:10:18 -0000 1.51 +++ packet-wtp.c 4 Aug 2003 14:32:55 -0000 @@ -42,6 +42,8 @@ #include <glib.h> #include <epan/packet.h> #include "reassemble.h" +#include "prefs.h" +#include "dump-pdu.h" #include "packet-wap.h" #include "packet-wtp.h" #include "packet-wsp.h" @@ -225,6 +227,12 @@ */ static GHashTable *wtp_fragment_table = NULL; +/* Dump WSP PDUs to files */ +static gboolean wtp_dump_wsp = FALSE; +/* name of these files */ +static gchar *wtp_dump_wsp_pathname = "wsp-dump"; + + static void wtp_defragment_init(void) { @@ -628,6 +636,9 @@ wtp_tree, pinfo, wsp_tvb); call_dissector(wsp_handle, wsp_tvb, pinfo, tree); + if (wtp_dump_wsp) { + dump( wsp_tvb, wtp_dump_wsp_pathname, FALSE ); + } } else { @@ -664,6 +675,9 @@ } else { wsp_tvb = tvb_new_subset(tvb, dataOffset, -1, -1); call_dissector(wsp_handle, wsp_tvb, pinfo, tree); + if (wtp_dump_wsp) { + dump( wsp_tvb, wtp_dump_wsp_pathname, FALSE ); + } } } } @@ -948,12 +962,13 @@ &ett_wsp_fragments, &ett_wtp_fragment, }; + module_t *wtp_module; /* Register the protocol name and description */ proto_wtp = proto_register_protocol( "Wireless Transaction Protocol", /* protocol name for use by ethereal */ "WTP", /* short version of name */ - "wap-wsp-wtp" /* Abbreviated protocol name, should Match IANA + "wap_wsp_wtp" /* Abbreviated protocol name, should Match IANA < URL:http://www.isi.edu/in-notes/iana/assignments/port-numbers/ > */ ); @@ -965,6 +980,17 @@ register_dissector("wtp", dissect_wtp_fromwap, proto_wtp); register_dissector("wtp-udp", dissect_wtp_fromudp, proto_wtp); register_init_routine(wtp_defragment_init); + + /* Register configuration options */ + wtp_module = prefs_register_protocol(proto_wtp, NULL); + prefs_register_bool_preference(wtp_module, "dump_wsp", + "dump WSP packets to a file", + "Whether WSP PDUs should be dumped to a file", + &wtp_dump_wsp); + prefs_register_string_preference(wtp_module, "dump_wsp_pathname", + "WSP PDUs dumps pathname", + "Sets the name of dumped WSP PDUs", + &wtp_dump_wsp_pathname); }; void
/* dump-pdu.c * Routines to dump reassembled PDU * * $Id:$ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@xxxxxxxxxxxx> * Copyright 1998 Gerald Combs * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> #include <unistd.h> #include <glib.h> #include <epan/packet.h> #include "dump-pdu.h" /* local functions */ static int open_file(const char *pathname, gboolean append); static int search_filename_open(const char *base_pathname, gboolean append); static int open_file(const char *pathname, gboolean append) { int flags = O_WRONLY | O_CREAT | O_EXCL; if (append == TRUE) { flags |= O_APPEND; } else { flags |= O_EXCL; } return open(pathname, flags); } static int search_filename_open(const char *base_pathname, gboolean append) { int file; /* file descriptor */ size_t size; /* size of the filename */ int i; char *pathname; if (base_pathname == NULL) { /* use default name if none is given */ base_pathname = DEFAULT_DUMP_PDU_PATHNAME; } if ((file = open_file(base_pathname, append)) >= 0) { /* try to open */ return file; } /* search sequentially a name of the form "base_name.xxx" */ size = strlen(base_pathname) + 4 + 1; /* name.".999"."\0" */ pathname = malloc(size); if (pathname == NULL) { return -1; } for (i = 0; i < 1000; i++ ) { snprintf(pathname, size, "%s.%i", base_pathname, i); if ((file = open_file(pathname, append)) >= 0) { return file; } } return -1; } int dump(tvbuff_t *tvb, const char *base_pathname, gboolean append) { int file; guint length; file = search_filename_open(base_pathname, append); if (file < 0) { return file; } length = tvb_length(tvb); write(file, tvb_get_ptr(tvb, 0, length), length); return close(file); }
/* dump-pdu.h * Declaration of routines to dump reassembled PDU * * $Id:$ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@xxxxxxxxxxxx> * Copyright 1998 Gerald Combs * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ extern int dump(tvbuff_t* tvb, const char *base_pathname, gboolean append); #define DEFAULT_DUMP_PDU_PATHNAME "dumped-pdu"
- Prev by Date: Re: [Ethereal-dev] Problems compiling on Win32 using Glib2 and GTK for Glib2
- Next by Date: [Ethereal-dev] On Vacation
- Previous by thread: Re: [Ethereal-dev] WAP-WSP-WTP protocol name
- Next by thread: [Ethereal-dev] On Vacation
- Index(es):