Ethereal-users: Re: [Ethereal-users] pcap: network type 15 unknown or unsupported
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Guy Harris <gharris@xxxxxxxxx>
Date: Tue, 26 Jul 2005 02:19:40 -0700
Guy Harris wrote:
The current heuristics for detecting Nokia files in Ethereal only check if the link-layer type value is 13, which they use for ATM; I tried adding a check for 15, but apparently the heuristics succeed for the first two packets, which is all Ethereal currently tries - perhaps it should try 3 packets, which it appears should be enough to tell the difference between the two file types.
I think that's too risky.Instead, I wrote a program called "denokify", that reads a Nokia pcap file and turns it into a standard pcap file. It doesn't do any heuristics; it assumes the file supplied to it is a Nokia pcap file, although it does some minimal sanity checking.
It worked on your file, and some other files I had; I've attached it to this mail. I'll probably put it into tcpdump or libpcap at some point, and put it into Ethereal as well.
/*
* Some structure definitions come from libpcap:
*
* Copyright (c) 1993, 1994, 1995, 1996, 1997
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the Computer Systems
* Engineering Group at Lawrence Berkeley Laboratory.
* 4. Neither the name of the University nor of the Laboratory may be used
* to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <arpa/inet.h>
typedef unsigned int uint32;
typedef int int32;
typedef unsigned short uint16;
typedef unsigned char uint8;
struct pcap_file_header {
uint32 magic;
uint16 version_major;
uint16 version_minor;
int32 thiszone; /* gmt to local correction */
uint32 sigfigs; /* accuracy of timestamps */
uint32 snaplen; /* max length saved portion of each pkt */
uint32 linktype; /* data link type (LINKTYPE_*) */
};
#define TCPDUMP_MAGIC 0xa1b2c3d4
struct pcap_timeval {
int32 tv_sec; /* seconds */
int32 tv_usec; /* microseconds */
};
struct pcap_sf_pkthdr {
struct pcap_timeval ts; /* time stamp */
uint32 caplen; /* length of portion present */
uint32 len; /* length this packet (off wire) */
};
struct pcap_nokia_pkthdr {
struct pcap_sf_pkthdr hdr; /* regular header */
uint8 extra[4]; /* extra stuff */
};
struct atm_phdr {
uint8 flags;
uint8 vpi;
uint16 vci;
};
#define SWAPLONG(y) \
((((y)&0xff)<<24) | (((y)&0xff00)<<8) | (((y)&0xff0000)>>8) | (((y)>>24)&0xff))
#define SWAPSHORT(y) \
( (((y)&0xff)<<8) | ((uint16)((y)&0xff00)>>8) )
#define PKTLEN_MAX 65535
int
main(int argc, char **argv)
{
FILE *in, *out;
struct pcap_file_header hdr;
size_t bytes_read;
int byte_swapped;
uint32 linktype;
struct pcap_nokia_pkthdr pkthdr;
uint32 len, caplen;
struct atm_phdr atm_phdr;
uint16 vci;
uint8 buf[PKTLEN_MAX];
if (argc != 3) {
fprintf(stderr, "Usage: denokify <infile> <outfile>\n");
return 1;
};
in = fopen(argv[1], "r");
if (in == NULL) {
fprintf(stderr, "denokify: Can't open %s: %s\n", argv[1],
strerror(errno));
return 2;
}
if (fread(&hdr, sizeof hdr, 1, in) != 1) {
if (ferror(in)) {
fprintf(stderr, "denokify: Error reading %s: %s\n",
argv[1], strerror(errno));
} else {
fprintf(stderr, "denokify: File %s was cut short\n",
argv[1]);
}
return 2;
}
if (hdr.magic == TCPDUMP_MAGIC)
byte_swapped = 0;
else if (hdr.magic == SWAPLONG(TCPDUMP_MAGIC))
byte_swapped = 1;
else {
fprintf(stderr, "denokify: File %s is not a libpcap file\n",
argv[1]);
return 2;
}
if (byte_swapped)
hdr.linktype = SWAPLONG(hdr.linktype);
switch (hdr.linktype) {
case 1:
linktype = 1; /* Ethernet (DLT_EN10MB) */
break;
case 13:
linktype = 123; /* SunATM (DLT_SUNATM) */
break;
case 15:
linktype = 104; /* Cisco HDLC (DLT_C_HDLC) */
break;
default:
fprintf(stderr, "denokify: File %s is not a Nokia ATM or Cisco HDLC capture file (type %u)\n",
argv[1], hdr.linktype);
return 2;
}
if (byte_swapped)
hdr.linktype = SWAPLONG(linktype);
else
hdr.linktype = linktype;
out = fopen(argv[2], "w");
if (out == NULL) {
fprintf(stderr, "denokify: Can't create %s: %s\n", argv[2],
strerror(errno));
return 2;
}
if (fwrite(&hdr, sizeof hdr, 1, out) != 1) {
if (ferror(out)) {
fprintf(stderr, "denokify: Error writing %s: %s\n",
argv[2], strerror(errno));
} else {
fprintf(stderr, "denokify: Short write on %s\n",
argv[2]);
}
return 2;
}
while (fread(&pkthdr, sizeof pkthdr, 1, in) == 1) {
if (byte_swapped) {
caplen = SWAPLONG(pkthdr.hdr.caplen);
len = SWAPLONG(pkthdr.hdr.len);
} else {
caplen = pkthdr.hdr.caplen;
len = pkthdr.hdr.len;
}
if (len > PKTLEN_MAX || caplen > PKTLEN_MAX) {
fprintf(stderr,
"denokify: %s isn't a valid Nokia capture file\n",
argv[1]);
return 2;
}
if (fwrite(&pkthdr.hdr, sizeof pkthdr.hdr, 1, out) != 1) {
if (ferror(out)) {
fprintf(stderr,
"denokify: Error writing %s: %s\n",
argv[2], strerror(errno));
} else {
fprintf(stderr,
"denokify: Short write on %s\n",
argv[2]);
}
return 2;
}
if (linktype == 123) {
/*
* Read the Nokia ATM header.
*/
if (caplen < 4 || len < 4) {
/*
* There *isn't* a pseudo-header, or
* this isn't a Nokia file.
*/
fprintf(stderr,
"denokify: %s isn't a valid Nokia ATM file\n",
argv[1]);
return 2;
}
bytes_read = fread(&atm_phdr, 1, sizeof atm_phdr, in);
if (bytes_read == 0 && !ferror(in))
break; /* end of file */
if (bytes_read != sizeof atm_phdr) {
if (ferror(in)) {
fprintf(stderr,
"denokify: Error reading %s: %s\n",
argv[1], strerror(errno));
} else {
fprintf(stderr,
"denokify: File %s was cut short\n",
argv[1]);
}
return 2;
}
caplen -= 4;
len -= 4;
}
bytes_read = fread(buf, 1, caplen, in);
if (bytes_read != caplen) {
if (ferror(in)) {
fprintf(stderr,
"denokify: Error reading %s: %s\n",
argv[1], strerror(errno));
} else {
fprintf(stderr,
"denokify: File %s was cut short\n",
argv[1]);
}
return 2;
}
if (linktype == 123) {
/*
* Tranform the Nokia ATM header into a
* SunATM ATM header.
*
* Try to guess the traffic type.
*/
atm_phdr.flags &= 0x7F; /* type is initially unknown */
vci = ntohs(atm_phdr.vci);
if (atm_phdr.vpi == 0) {
switch (vci) {
case 5:
atm_phdr.flags |= 0x06; /* Q.2931 */
break;
case 16:
atm_phdr.flags |= 0x05; /* ILMI */
break;
}
}
if ((atm_phdr.flags & 0x7F) == 0) {
if (caplen >= 3) {
if (buf[0] == 0xaa && buf[1] == 0xaa &&
buf[2] == 0x03) {
/*
* Looks like a SNAP header;
* assume it's LLC-multiplexed
* RFC 1483.
*/
atm_phdr.flags |= 0x02;
} else {
/*
* Assume it's LANE.
*/
atm_phdr.flags |= 0x01;
}
}
}
if (fwrite(&atm_phdr, sizeof atm_phdr, 1, out) != 1) {
if (ferror(out)) {
fprintf(stderr,
"denokify: Error writing %s: %s\n",
argv[2], strerror(errno));
} else {
fprintf(stderr,
"denokify: Short write on %s\n",
argv[2]);
}
return 2;
}
}
if (fwrite(buf, 1, caplen, out) != caplen) {
if (ferror(out)) {
fprintf(stderr,
"denokify: Error writing %s: %s\n",
argv[2], strerror(errno));
} else {
fprintf(stderr,
"denokify: Short write on %s\n",
argv[2]);
}
return 2;
}
}
if (fclose(out) == EOF) {
fprintf(stderr, "denokify: Error writing %s: %s\n",
argv[2], strerror(errno));
return 2;
}
return 0;
}
- References:
- Prev by Date: [Ethereal-users] Re: Do I undertand it right that ethereal/libpcap still do not support multiple interfaces?
- Next by Date: [Ethereal-users] Re: Do I undertand it right that ethereal/libpcap still do not support multiple interfaces?
- Previous by thread: Re: [Ethereal-users] pcap: network type 15 unknown or unsupported
- Next by thread: [Ethereal-users] Re: pcap: network type 15 unknown or unsupported
- Index(es):