summaryrefslogtreecommitdiff
path: root/print-cip.c
diff options
context:
space:
mode:
authorguy <guy>2001-09-23 21:52:38 +0000
committerguy <guy>2001-09-23 21:52:38 +0000
commitc23f7b7dcf9c014cf531d75c22cc254c7ca35e55 (patch)
tree26bb436b7abcef7c39988f4fe7a618da77fe4faf /print-cip.c
parentc78c9612210bbe0d104e66258246ed47551d9969 (diff)
downloadtcpdump-c23f7b7dcf9c014cf531d75c22cc254c7ca35e55.tar.gz
There's no link-layer header on Linux ARPHRD_ATM packets; there's
apparently (as per the previous version of this code) either an 802.2 LLC header (as per RFC 1483 and RFC 2225), or there's no header at all, and just an IP packet. As such, no link-layer header should be printed. In addition, for packets with an LLC header, we should call the LLC printer, rather than assuming that it's SNAP-encapsulated (RFC 1483 says they're not always SNAP-encapsulated) and printing the header ourselves. For packets without an LLC header, we should just call the IP print routine. This means that the LLC print routine may be called with null source and destination MAC addresses; make it handle them.
Diffstat (limited to 'print-cip.c')
-rw-r--r--print-cip.c65
1 files changed, 17 insertions, 48 deletions
diff --git a/print-cip.c b/print-cip.c
index 55cd8418..28102325 100644
--- a/print-cip.c
+++ b/print-cip.c
@@ -22,7 +22,7 @@
#ifndef lint
static const char rcsid[] =
- "@(#) $Header: /tcpdump/master/tcpdump/print-cip.c,v 1.15 2001-09-17 21:57:58 fenner Exp $ (LBL)";
+ "@(#) $Header: /tcpdump/master/tcpdump/print-cip.c,v 1.16 2001-09-23 21:52:38 guy Exp $ (LBL)";
#endif
#ifdef HAVE_CONFIG_H
@@ -60,25 +60,10 @@ static unsigned char rfcllc[] = {
static inline void
cip_print(register const u_char *bp, int length)
{
- int i;
-
- if (memcmp(rfcllc, bp, sizeof(rfcllc))) {
- if (qflag) {
- for (i = 0;i < RFC1483LLC_LEN; i++)
- (void)printf("%2.2x ",bp[i]);
- } else {
- for (i = 0;i < RFC1483LLC_LEN - 2; i++)
- (void)printf("%2.2x ",bp[i]);
- etherproto_string(((const u_short *)bp)[3]);
- }
- } else {
- if (qflag)
- (void)printf("(null encapsulation)");
- else {
- (void)printf("(null encap)");
- etherproto_string(ETHERTYPE_IP);
- }
- }
+ /*
+ * There is no MAC-layer header, so just print the length.
+ */
+ printf("%d: ", length);
}
/*
@@ -92,9 +77,7 @@ cip_if_print(u_char *user, const struct pcap_pkthdr *h, const u_char *p)
{
u_int caplen = h->caplen;
u_int length = h->len;
- u_short ether_type;
u_short extracted_ethertype;
- const u_short *bp;
++infodelay;
ts_print(&h->ts);
@@ -115,28 +98,15 @@ cip_if_print(u_char *user, const struct pcap_pkthdr *h, const u_char *p)
packetp = p;
snapend = p + caplen;
- if (memcmp(rfcllc, p, sizeof(rfcllc))==0) {
- length -= RFC1483LLC_LEN;
- caplen -= RFC1483LLC_LEN;
- bp = (const u_short *)p;
- p += RFC1483LLC_LEN;
- ether_type = ntohs(bp[3]);
- } else {
- ether_type = ETHERTYPE_IP;
- bp = (const u_short *)p;
- }
-
- /*
- * Is it (gag) an 802.3 encapsulation?
- */
- extracted_ethertype = 0;
- if (ether_type < ETHERMTU) {
- /* Try to print the LLC-layer header & higher layers */
+ if (memcmp(rfcllc, p, sizeof(rfcllc)) == 0) {
+ /*
+ * LLC header is present. Try to print it & higher layers.
+ */
if (llc_print(p, length, caplen, NULL, NULL,
- &extracted_ethertype)==0) {
+ &extracted_ethertype) == 0) {
/* ether_type not known, print raw packet */
if (!eflag)
- cip_print((u_char *)bp, length + RFC1483LLC_LEN);
+ cip_print(p, length);
if (extracted_ethertype) {
printf("(LLC %s) ",
etherproto_string(htons(extracted_ethertype)));
@@ -144,14 +114,13 @@ cip_if_print(u_char *user, const struct pcap_pkthdr *h, const u_char *p)
if (!xflag && !qflag)
default_print(p, caplen);
}
- } else if (ether_encap_print(ether_type, p, length, caplen,
- &extracted_ethertype) == 0) {
- /* ether_type not known, print raw packet */
- if (!eflag)
- cip_print((u_char *)bp, length + RFC1483LLC_LEN);
- if (!xflag && !qflag)
- default_print(p, caplen);
+ } else {
+ /*
+ * LLC header is absent; treat it as just IP.
+ */
+ ip_print(p, length);
}
+
if (xflag)
default_print(p, caplen);
out: