summaryrefslogtreecommitdiffstats
path: root/usr.sbin/tcpdump
diff options
context:
space:
mode:
authorwollman <wollman@FreeBSD.org>1994-10-04 22:31:44 +0000
committerwollman <wollman@FreeBSD.org>1994-10-04 22:31:44 +0000
commitbfc217688d97be157834a82e81f98ffccd1ffa5c (patch)
tree4540bbb44501a84cdab9b0efadd1e8abc3cf5897 /usr.sbin/tcpdump
parentff7b200770876c0d9812237ebebb6f4e48ea2c23 (diff)
downloadFreeBSD-src-bfc217688d97be157834a82e81f98ffccd1ffa5c.zip
FreeBSD-src-bfc217688d97be157834a82e81f98ffccd1ffa5c.tar.gz
Print out SNAP frames reasonably, including Apple's bogus Ethertalk
pseudo-SNAP encapsulation. Still needs some work, by someone who has a listing of 802.2 LSAPs.
Diffstat (limited to 'usr.sbin/tcpdump')
-rw-r--r--usr.sbin/tcpdump/tcpdump/print-ether.c127
1 files changed, 126 insertions, 1 deletions
diff --git a/usr.sbin/tcpdump/tcpdump/print-ether.c b/usr.sbin/tcpdump/tcpdump/print-ether.c
index 2d01c17..563a506 100644
--- a/usr.sbin/tcpdump/tcpdump/print-ether.c
+++ b/usr.sbin/tcpdump/tcpdump/print-ether.c
@@ -20,13 +20,14 @@
*/
#ifndef lint
static char rcsid[] =
- "@(#) $Header: print-ether.c,v 1.22 91/10/07 20:18:28 leres Exp $ (LBL)";
+ "@(#) $Header: /home/ncvs/src/usr.sbin/tcpdump/tcpdump/print-ether.c,v 1.1.1.1 1993/06/12 14:42:09 rgrimes Exp $ (LBL)";
#endif
#include <sys/param.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <net/if.h>
+#include <net/if_llc.h>
#include <netinet/in.h>
#include <netinet/if_ether.h>
#include <netinet/in_systm.h>
@@ -39,6 +40,7 @@ static char rcsid[] =
#include "interface.h"
#include "addrtoname.h"
+#include "appletalk.h"
u_char *packetp;
u_char *snapend;
@@ -61,6 +63,123 @@ ether_print(ep, length)
length);
}
+static inline void
+eight02_print(ep, lp, length)
+ register struct ether_header *ep;
+ struct llc *lp;
+ int length;
+{
+ if(eflag || length < LLC_UFRAMELEN) {
+ (void)printf("%s %s %d: ",
+ etheraddr_string(ESRC(ep)),
+ etheraddr_string(EDST(ep)),
+ length);
+ }
+
+ if(length < LLC_UFRAMELEN) {
+ printf("[|llc]");
+ return;
+ }
+
+ if(eflag && lp->llc_dsap != LLC_SNAP_LSAP) {
+ switch(lp->llc_control) {
+ case LLC_UI: printf("ui "); break;
+ case LLC_UI_P: printf("ui-p "); break;
+ case LLC_DISC: printf("disc "); break;
+ case LLC_DISC_P: printf("disc-p "); break;
+ case LLC_UA: printf("ua "); break;
+ case LLC_UA_P: printf("ua-p "); break;
+ case LLC_TEST: printf("test "); break;
+ case LLC_TEST_P: printf("test-p "); break;
+ case LLC_FRMR: printf("frmr "); break;
+ case LLC_FRMR_P: printf("frmr-p "); break;
+ case LLC_DM: printf("dm "); break;
+ case LLC_DM_P: printf("dm-p "); break;
+ case LLC_XID: printf("xid "); break;
+ case LLC_XID_P: printf("xid-p "); break;
+ case LLC_SABME: printf("sabme "); break;
+ case LLC_SABME_P: printf("sabme-p "); break;
+ case LLC_RR: printf("rr "); break;
+ case LLC_RNR: printf("rnr "); break;
+ case LLC_REJ: printf("rej "); break;
+ case LLC_INFO: printf("info "); break;
+
+ default:
+ printf("[control %d] ", lp->llc_control);
+ break;
+ }
+ }
+ switch(lp->llc_dsap) {
+ case LLC_SNAP_LSAP:
+ if(length < 6) {
+ printf(" [|snap]");
+ return;
+ }
+
+#define llc_snap_oui llc_un.type_snap.org_code
+#define llc_snap_type llc_un.type_snap.ether_type
+ if(lp->llc_snap_oui[0] == 0x08
+ && lp->llc_snap_oui[1] == 0x00
+ && lp->llc_snap_oui[2] == 0x07) {
+ printf("[ethertalk] ");
+ ddp_print((struct atDDP *)((char *)lp + 6),
+ length - 6);
+ } else {
+ if(!eflag) {
+ (void)printf("%s %s %d: ",
+ etheraddr_string(ESRC(ep)),
+ etheraddr_string(EDST(ep)),
+ length);
+ }
+ printf("snap %02x-%02x-%02x type %04x ",
+ lp->llc_snap_oui[0], lp->llc_snap_oui[1],
+ lp->llc_snap_oui[2], lp->llc_snap_type);
+ }
+ break;
+
+ default:
+ if(!eflag) {
+ (void)printf("%s %s %d: ",
+ etheraddr_string(ESRC(ep)),
+ etheraddr_string(EDST(ep)),
+ length);
+ switch(lp->llc_control) {
+ case LLC_UI: printf("ui "); break;
+ case LLC_UI_P: printf("ui-p "); break;
+ case LLC_DISC: printf("disc "); break;
+ case LLC_DISC_P: printf("disc-p "); break;
+ case LLC_UA: printf("ua "); break;
+ case LLC_UA_P: printf("ua-p "); break;
+ case LLC_TEST: printf("test "); break;
+ case LLC_TEST_P: printf("test-p "); break;
+ case LLC_FRMR: printf("frmr "); break;
+ case LLC_FRMR_P: printf("frmr-p "); break;
+ case LLC_DM: printf("dm "); break;
+ case LLC_DM_P: printf("dm-p "); break;
+ case LLC_XID: printf("xid "); break;
+ case LLC_XID_P: printf("xid-p "); break;
+ case LLC_SABME: printf("sabme "); break;
+ case LLC_SABME_P: printf("sabme-p "); break;
+ case LLC_RR: printf("rr "); break;
+ case LLC_RNR: printf("rnr "); break;
+ case LLC_REJ: printf("rej "); break;
+ case LLC_INFO: printf("info "); break;
+
+ default:
+ printf("[control %d] ", lp->llc_control);
+ break;
+ }
+ }
+
+ printf("[dsap %d] [ssap %d] ",
+ lp->llc_dsap, lp->llc_ssap);
+ break;
+ }
+
+ if (xflag)
+ default_print((u_short *)lp, length);
+}
+
/*
* This is the top level routine of the printer. 'p' is the points
* to the ether header of the packet, 'tvp' is the timestamp,
@@ -110,8 +229,14 @@ ether_if_print(p, tvp, length, caplen)
break;
default:
+ if (ntohs(ep->ether_type) < 1500) {
+ eight02_print(ep, (struct llc *)p,
+ caplen - sizeof(*ep));
+ goto out;
+ }
if (!eflag)
ether_print(ep, length);
+
if (!xflag && !qflag)
default_print((u_short *)p, caplen - sizeof(*ep));
break;
OpenPOWER on IntegriCloud