Put "atm_llc_print()" back - we want to handle the case of the Ethernet

type not being known, *and* have to pass in a non-null
"extracted_ethertype" pointer (otherwise "llc_print()" dumps core), and
we should pass in non-null pointers for the source and destination
addresses.  However, we can get rid of the "ether_type" variable.

Fix up the test for non-LLC packets to test for the first 3 bytes *not*
matching the header of an LLC/SNAP packet, not for them matching.  Add
in a check for RFC 2684 routed NLPID-formatted PDUs.
This commit is contained in:
guy 2002-12-09 05:12:25 +00:00
parent 9ba918dd2d
commit 955792f128

View File

@ -20,7 +20,7 @@
*/
#ifndef lint
static const char rcsid[] =
"@(#) $Header: /tcpdump/master/tcpdump/print-atm.c,v 1.27 2002-12-04 19:12:39 hannes Exp $ (LBL)";
"@(#) $Header: /tcpdump/master/tcpdump/print-atm.c,v 1.28 2002-12-09 05:12:25 guy Exp $ (LBL)";
#endif
#ifdef HAVE_CONFIG_H
@ -42,6 +42,44 @@ static const char rcsid[] =
#include "ether.h"
/*
* Print an RFC 1483 LLC-encapsulated ATM frame.
*/
static void
atm_llc_print(const u_char *p, int length, int caplen)
{
struct ether_header ehdr;
u_short extracted_ethertype;
/*
* Fake up an Ethernet header for the benefit of printers that
* insist on "packetp" pointing to an Ethernet header.
*/
memset(&ehdr, '\0', sizeof ehdr);
/*
* Some printers want to get back at the ethernet addresses.
* Rather than pass it all the way down, we set this global.
*
* Actually, the only printers that use packetp are print-arp.c
* and print-bootp.c, and they assume that packetp points to an
* Ethernet header. The right thing to do is to fix them to know
* which link type is in use when they excavate. XXX
*/
packetp = (u_char *)&ehdr;
if (!llc_print(p, length, caplen, ESRC(&ehdr), EDST(&ehdr),
&extracted_ethertype)) {
/* ether_type not known, print raw packet */
if (extracted_ethertype) {
printf("(LLC %s) ",
etherproto_string(htons(extracted_ethertype)));
}
if (!xflag && !qflag)
default_print(p, caplen);
}
}
/*
* This is the top level routine of the printer. 'p' points
* to the LLC/SNAP header of the packet, 'h->ts' is the timestamp,
@ -53,6 +91,7 @@ atm_if_print(u_char *user _U_, const struct pcap_pkthdr *h, const u_char *p)
{
u_int caplen = h->caplen;
u_int length = h->len;
u_int32_t llchdr;
++infodelay;
ts_print(&h->ts);
@ -69,12 +108,16 @@ atm_if_print(u_char *user _U_, const struct pcap_pkthdr *h, const u_char *p)
*/
snapend = p + caplen;
if (EXTRACT_24BITS(p) == 0xaaaa03) {
/*
* Extract the presumed LLC header into a variable, for quick
* testing.
* Then check for a header that's neither a header for a SNAP
* packet nor an RFC 2684 routed NLPID-formatted PDU.
*/
llchdr = EXTRACT_24BITS(p);
if (llchdr != 0xaaaa03 && llchdr != 0xfefe03) {
/*
* XXX - assume 802.6 MAC header from Fore driver.
* XXX - should we also assume it's not a MAC header
* if it begins with 0xfe 0xfe 0x03, for RFC 2684
* routed NLPID-formatted PDUs?
*/
if (eflag)
printf("%08x%08x %08x%08x ",
@ -86,10 +129,7 @@ atm_if_print(u_char *user _U_, const struct pcap_pkthdr *h, const u_char *p)
length -= 20;
caplen -= 20;
}
/* lets call into the generic LLC handler */
llc_print(p, length, caplen, NULL, NULL, NULL);
atm_llc_print(p, length, caplen);
if (xflag)
default_print(p, caplen);
out: