]> The Tcpdump Group git mirrors - tcpdump/commitdiff
There's no link-layer header on Linux ARPHRD_ATM packets; there's
authorguy <guy>
Sun, 23 Sep 2001 21:52:38 +0000 (21:52 +0000)
committerguy <guy>
Sun, 23 Sep 2001 21:52:38 +0000 (21:52 +0000)
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.

print-cip.c
print-llc.c

index 55cd84187e1ca789c21f100e4a07b828dc829dc5..28102325aab5357e0b95886e6fa37459fa4d1961 100644 (file)
@@ -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:
index 280ea88a906a98606cd027d6c28c60d449cd47df..84dbca208d3c9f2df54a94222ea344da818188c3 100644 (file)
@@ -24,7 +24,7 @@
 
 #ifndef lint
 static const char rcsid[] =
-    "@(#) $Header: /tcpdump/master/tcpdump/print-llc.c,v 1.40 2001-07-21 23:14:23 guy Exp $";
+    "@(#) $Header: /tcpdump/master/tcpdump/print-llc.c,v 1.41 2001-09-23 21:52:39 guy Exp $";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -231,7 +231,7 @@ llc_print(const u_char *p, u_int length, u_int caplen,
        }
 
        if ((llc.ssap & ~LLC_GSAP) == llc.dsap) {
-               if (eflag)
+               if (eflag || esrc == NULL || edst == NULL)
                        (void)printf("%s ", llcsap_string(llc.dsap));
                else
                        (void)printf("%s > %s %s ",
@@ -239,7 +239,7 @@ llc_print(const u_char *p, u_int length, u_int caplen,
                                        etheraddr_string(edst),
                                        llcsap_string(llc.dsap));
        } else {
-               if (eflag)
+               if (eflag || esrc == NULL || edst == NULL)
                        (void)printf("%s > %s ",
                                llcsap_string(llc.ssap & ~LLC_GSAP),
                                llcsap_string(llc.dsap));