Ethereal-dev: Re: [Ethereal-dev] mergecap patch: dissimilar frame encapsulation types
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Scott Renfro <scott@xxxxxxxxxx>
Date: Sat, 14 Jul 2001 00:10:35 -0700
On Fri, Jul 13, 2001 at 02:49:02PM -0700, Scott Renfro wrote: > On Fri, Jul 13, 2001 at 11:22:14AM -0700, Guy Harris wrote: > > > > As such, just changing the code so that WTAP_ENCAP_PER_PACKET is chosen > > if not all files have the same frame encapsulation type should be > > sufficient - if the output type can handle that, you win, otherwise > > "wtap_dump_open()" will fail and mergecap will print the right error > > message. > > Ah, great. Thanks for the clear feedback. I'll implement this logic > and resubmit the patch. Here's the updated patch to mergecap. One thing I noticed in testing it: for file types that have an XXX_dump_can_write_encap(), XXX_dump_can_write_encap always appears to return unsupported when the type is per-packet. cheers, --Scott -- Scott Renfro <scott@xxxxxxxxxx> +1 650 862 4206
Index: mergecap.c
===================================================================
RCS file: /cvsroot/ethereal/mergecap.c,v
retrieving revision 1.2
diff -u -r1.2 mergecap.c
--- mergecap.c 2001/07/13 08:16:15 1.2
+++ mergecap.c 2001/07/14 06:57:09
@@ -184,6 +184,52 @@
/*
+ * Select an output frame type based on the input files
+ * From Guy: If all files have the same frame type, then use that.
+ * Otherwise select WTAP_ENCAP_PER_PACKET. If the selected
+ * output file type doesn't support per packet frame types,
+ * then the wtap_dump_open call will fail with a reasonable
+ * error condition.
+ */
+static int
+select_frame_type(int count, in_file_t files[])
+{
+ int i;
+ int selected_frame_type;
+
+ selected_frame_type = wtap_file_encap(files[0].wth);
+
+ for (i = 1; i < count; i++) {
+ int this_frame_type = wtap_file_encap(files[i].wth);
+ if (selected_frame_type != this_frame_type) {
+ selected_frame_type = WTAP_ENCAP_PER_PACKET;
+ if (verbose) {
+ fprintf(stderr, "mergecap: multiple frame encapsulation types detected\n");
+ fprintf(stderr, " defaulting to WTAP_ENCAP_PER_PACKET\n");
+ fprintf(stderr, " %s had type %s (%s)\n",
+ files[0].filename,
+ wtap_encap_string(selected_frame_type),
+ wtap_encap_short_string(selected_frame_type));
+ fprintf(stderr, " %s had type %s (%s)\n",
+ files[i].filename,
+ wtap_encap_string(this_frame_type),
+ wtap_encap_short_string(this_frame_type));
+ }
+ break;
+ }
+ }
+
+ if (verbose) {
+ fprintf(stderr, "mergecap: selected frame_type %s (%s)\n",
+ wtap_encap_string(selected_frame_type),
+ wtap_encap_short_string(selected_frame_type));
+ }
+
+ return selected_frame_type;
+}
+
+
+/*
* Close the output file
*/
static void
@@ -215,8 +261,8 @@
out_file->pdh = wtap_dump_open(out_file->filename, out_file->file_type,
out_file->frame_type, snapshot_len, &err);
if (!out_file->pdh) {
- fprintf(stderr, "mergecap: Can't open/create %s: %s\n",
- out_file->filename, wtap_strerror(err));
+ fprintf(stderr, "mergecap: Can't open/create %s:\n", out_file->filename);
+ fprintf(stderr, " %s\n", wtap_strerror(err));
return FALSE;
}
return TRUE;
@@ -285,7 +331,7 @@
wtap_strerror(err));
} else {
if (verbose) {
- fprintf(stderr, "File %s is a %s capture file.\n", argv[i],
+ fprintf(stderr, "mergecap: %s is type %s.\n", argv[i],
wtap_file_type_string(wtap_file_type(files[count].wth)));
}
count++;
@@ -308,7 +354,7 @@
int i;
const char *string;
- fprintf(stderr, "Usage: mergecap [-h] [-v] [-a] [-s <snaplen>] [-T <encap type>]\n");
+ fprintf(stderr, "Usage: mergecap [-hva] [-s <snaplen>] [-T <encap type>]\n");
fprintf(stderr, " [-F <capture type>] -w <outfile> <infile> [...]\n\n");
fprintf(stderr, " where\t-h produces this help listing.\n");
fprintf(stderr, " \t-v verbose operation, default is silent\n");
@@ -356,7 +402,7 @@
out_file.count = 1; /* frames output */
/* Process the options first */
- while ((opt = getopt(argc, argv, "w:aT:F:vs:h")) != EOF) {
+ while ((opt = getopt(argc, argv, "hvas:T:F:w:")) != EOF) {
switch (opt) {
case 'w':
@@ -432,7 +478,7 @@
/* set the outfile frame type */
if (out_file.frame_type == -2)
- out_file.frame_type = wtap_file_encap(in_files[0].wth);
+ out_file.frame_type = select_frame_type(in_file_count, in_files);
/* open the outfile */
if (!open_outfile(&out_file, max_snapshot_length(in_file_count, in_files))) {
Index: doc/mergecap.pod
===================================================================
RCS file: /cvsroot/ethereal/doc/mergecap.pod,v
retrieving revision 1.2
diff -u -r1.2 mergecap.pod
--- mergecap.pod 2001/07/13 08:16:16 1.2
+++ mergecap.pod 2001/07/14 06:57:10
@@ -6,12 +6,10 @@
=head1 SYNOPSYS
B<mergecap>
+S<[ B<-hva> ]>
+S<[ B<-s> I<snaplen> ]>
S<[ B<-F> I<file format> ]>
S<[ B<-T> I<encapsulation type> ]>
-S<[ B<-a> ]>
-S<[ B<-v> ]>
-S<[ B<-s> I<snaplen> ]>
-S<[ B<-h> ]>
S<B<-w> I<outfile>>
I<infile>
I<...>
@@ -59,11 +57,18 @@
appear to reject Ethernet frames larger than the standard Ethernet MTU,
making them incapable of handling gigabit Ethernet captures if jumbo
frames were used).
+
+The output file frame encapsulation type is set to the type of the input
+files, if all input files have the same type. If not all of the input
+files have the same frame encapsulation type, the output file type is
+set to WTAP_ENCAP_PER_PACKET. Note that some capture file formats, most
+notably B<libpcap>, do not currently support WTAP_ENCAP_PER_PACKET.
+This combination will cause the output file creation to fail.
-If the B<-T> flag is used to specify an encapsulation type, the
+If the B<-T> flag is used to specify a frame encapsulation type, the
encapsulation type of the output capture file will be forced to the
specified type, rather than being the type appropriate to the
-encapsulation type of the input capture file. Note that this merely
+encapsulation type of the input capture files. Note that this merely
forces the encapsulation type of the output file to be the specified
type; the packet headers of the packets will not be translated from the
encapsulation type of the input capture file to the specified
- Follow-Ups:
- References:
- [Ethereal-dev] mergecap patch: dissimilar frame encapsulation types
- From: Scott Renfro
- Re: [Ethereal-dev] mergecap patch: dissimilar frame encapsulation types
- From: Guy Harris
- Re: [Ethereal-dev] mergecap patch: dissimilar frame encapsulation types
- From: Scott Renfro
- [Ethereal-dev] mergecap patch: dissimilar frame encapsulation types
- Prev by Date: Re: [Ethereal-dev] smb-browse
- Next by Date: Re: [Ethereal-dev] ethereal 1.0 features?
- Previous by thread: Re: [Ethereal-dev] mergecap patch: dissimilar frame encapsulation types
- Next by thread: Re: [Ethereal-dev] mergecap patch: dissimilar frame encapsulation types
- Index(es):