]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-sll.c
Fix some "unsigned int" vs. "size_t" issues (they're not necessarily the
[tcpdump] / print-sll.c
index ccb94fb53cc850a4a19ac3a1d08c0b13f28b46d8..d96b3de29ee208da72a24fb6bf70e9c12e5d4ecf 100644 (file)
@@ -19,8 +19,8 @@
  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 #ifndef lint
-static const char rcsid[] =
-    "@(#) $Header: /tcpdump/master/tcpdump/print-sll.c,v 1.11 2002-12-18 09:41:18 guy Exp $ (LBL)";
+static const char rcsid[] _U_ =
+    "@(#) $Header: /tcpdump/master/tcpdump/print-sll.c,v 1.19 2005-11-13 12:12:43 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -36,76 +36,90 @@ static const char rcsid[] =
 #include "interface.h"
 #include "addrtoname.h"
 #include "ethertype.h"
+#include "extract.h"
 
 #include "ether.h"
 #include "sll.h"
 
+const struct tok sll_pkttype_values[] = {
+    { LINUX_SLL_HOST, "In" },
+    { LINUX_SLL_BROADCAST, "B" },
+    { LINUX_SLL_MULTICAST, "M" },
+    { LINUX_SLL_OTHERHOST, "P" },
+    { LINUX_SLL_OUTGOING, "Out" },
+    { 0, NULL}
+};
+
 static inline void
 sll_print(register const struct sll_header *sllp, u_int length)
 {
-       u_short halen;
-
-       switch (ntohs(sllp->sll_pkttype)) {
-
-       case LINUX_SLL_HOST:
-               (void)printf("< ");
-               break;
-
-       case LINUX_SLL_BROADCAST:
-               (void)printf("B ");
-               break;
-
-       case LINUX_SLL_MULTICAST:
-               (void)printf("M ");
-               break;
-
-       case LINUX_SLL_OTHERHOST:
-               (void)printf("P ");
-               break;
-
-       case LINUX_SLL_OUTGOING:
-               (void)printf("> ");
-               break;
+       u_short ether_type;
 
-       default:
-               (void)printf("? ");
-               break;
-       }
+        printf("%3s ",tok2str(sll_pkttype_values,"?",EXTRACT_16BITS(&sllp->sll_pkttype)));
 
        /*
         * XXX - check the link-layer address type value?
         * For now, we just assume 6 means Ethernet.
         * XXX - print others as strings of hex?
         */
-       halen = ntohs(sllp->sll_halen);
-       if (halen == 6)
+       if (EXTRACT_16BITS(&sllp->sll_halen) == 6)
                (void)printf("%s ", etheraddr_string(sllp->sll_addr));
 
-       if (!qflag)
-               (void)printf("%s ", etherproto_string(sllp->sll_protocol));
-       (void)printf("%d: ", length);
+       if (!qflag) {
+               ether_type = EXTRACT_16BITS(&sllp->sll_protocol);
+       
+               if (ether_type <= ETHERMTU) {
+                       /*
+                        * Not an Ethernet type; what type is it?
+                        */
+                       switch (ether_type) {
+
+                       case LINUX_SLL_P_802_3:
+                               /*
+                                * Ethernet_802.3 IPX frame.
+                                */
+                               (void)printf("802.3");
+                               break;
+
+                       case LINUX_SLL_P_802_2:
+                               /*
+                                * 802.2.
+                                */
+                               (void)printf("802.3");
+                               break;
+
+                       default:
+                               /*
+                                * What is it?
+                                */
+                               (void)printf("ethertype Unknown (0x%04x)",
+                                   ether_type);
+                               break;
+                       }
+               } else {
+                       (void)printf("ethertype %s (0x%04x)",
+                           tok2str(ethertype_values, "Unknown", ether_type),
+                           ether_type);
+               }
+               (void)printf(", length %u: ", length);
+       }
 }
 
 /*
  * This is the top level routine of the printer.  'p' points to the
  * Linux "cooked capture" header of the packet, 'h->ts' is the timestamp,
- * 'h->length' is the length of the packet off the wire, and 'h->caplen'
+ * 'h->len' is the length of the packet off the wire, and 'h->caplen'
  * is the number of bytes actually captured.
  */
-void
-sll_if_print(u_char *user _U_, const struct pcap_pkthdr *h, const u_char *p)
+u_int
+sll_if_print(const struct pcap_pkthdr *h, const u_char *p)
 {
        u_int caplen = h->caplen;
        u_int length = h->len;
-       const u_char *orig_p;
-       u_int orig_caplen;
        register const struct sll_header *sllp;
        u_short ether_type;
        u_short extracted_ethertype;
 
-       ++infodelay;
-       ts_print(&h->ts);
-
        if (caplen < SLL_HDR_LEN) {
                /*
                 * XXX - this "can't happen" because "pcap-linux.c" always
@@ -113,7 +127,7 @@ sll_if_print(u_char *user _U_, const struct pcap_pkthdr *h, const u_char *p)
                 * cooked socket capture.
                 */
                printf("[|sll]");
-               goto out;
+               return (caplen);
        }
 
        sllp = (const struct sll_header *)p;
@@ -121,20 +135,6 @@ sll_if_print(u_char *user _U_, const struct pcap_pkthdr *h, const u_char *p)
        if (eflag)
                sll_print(sllp, length);
 
-       /*
-        * Some printers want to check that they're not walking off the
-        * end of the packet.
-        * Rather than pass it all the way down, we set this global.
-        */
-       snapend = p + caplen;
-
-       /*
-        * Save the information for the full packet, so we can print
-        * everything if "-e" and "-x" are both specified.
-        */
-       orig_p = p;
-       orig_caplen = caplen;
-
        /*
         * Go past the cooked-mode header.
         */
@@ -148,7 +148,6 @@ sll_if_print(u_char *user _U_, const struct pcap_pkthdr *h, const u_char *p)
         * Is it (gag) an 802.3 encapsulation, or some non-Ethernet
         * packet type?
         */
-       extracted_ethertype = 0;
        if (ether_type <= ETHERMTU) {
                /*
                 * Yes - what type is it?
@@ -173,6 +172,9 @@ sll_if_print(u_char *user _U_, const struct pcap_pkthdr *h, const u_char *p)
                        break;
 
                default:
+                       extracted_ethertype = 0;
+                       /*FALLTHROUGH*/
+
                unknown:
                        /* ether_type not known, print raw packet */
                        if (!eflag)
@@ -181,7 +183,7 @@ sll_if_print(u_char *user _U_, const struct pcap_pkthdr *h, const u_char *p)
                                printf("(LLC %s) ",
                               etherproto_string(htons(extracted_ethertype)));
                        }
-                       if (!xflag && !qflag)
+                       if (!suppress_default_print)
                                default_print(p, caplen);
                        break;
                }
@@ -190,14 +192,9 @@ sll_if_print(u_char *user _U_, const struct pcap_pkthdr *h, const u_char *p)
                /* ether_type not known, print raw packet */
                if (!eflag)
                        sll_print(sllp, length + SLL_HDR_LEN);
-               if (!xflag && !qflag)
+               if (!suppress_default_print)
                        default_print(p, caplen);
        }
-       if (xflag)
-               default_print_packet(orig_p, orig_caplen, SLL_HDR_LEN);
- out:
-       putchar('\n');
-       --infodelay;
-       if (infoprint)
-               info(0);
+
+       return (SLL_HDR_LEN);
 }