]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-arp.c
Use "len", not "payload_len", as we step through the packet; use
[tcpdump] / print-arp.c
index a06c1901a7c492e86d1cc1a92107ecd9d5eb6c03..3393c7167895b7bc54d5e15400bacc9dd46c1581 100644 (file)
@@ -20,8 +20,8 @@
  */
 
 #ifndef lint
-static const char rcsid[] =
-    "@(#) $Header: /tcpdump/master/tcpdump/print-arp.c,v 1.57 2002-09-04 11:22:13 guy Exp $ (LBL)";
+static const char rcsid[] _U_ =
+    "@(#) $Header: /tcpdump/master/tcpdump/print-arp.c,v 1.63 2003-11-16 09:36:12 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -85,11 +85,11 @@ struct      arp_pkthdr {
 
 #define ARP_HDRLEN     8
 
-#define HRD(ap) ((ap)->ar_hrd)
+#define HRD(ap) EXTRACT_16BITS(&(ap)->ar_hrd)
 #define HLN(ap) ((ap)->ar_hln)
 #define PLN(ap) ((ap)->ar_pln)
-#define OP(ap)  ((ap)->ar_op)
-#define PRO(ap) ((ap)->ar_pro)
+#define OP(ap)  EXTRACT_16BITS(&(ap)->ar_op)
+#define PRO(ap) EXTRACT_16BITS(&(ap)->ar_pro)
 #define SHA(ap) (ar_sha(ap))
 #define SPA(ap) (ar_spa(ap))
 #define THA(ap) (ar_tha(ap))
@@ -131,12 +131,12 @@ struct    atmarp_pkthdr {
        u_char  aar_tpa[];      /* target protocol address */
 #endif
 
-#define ATMHRD(ap)  ((ap)->aar_hrd)
+#define ATMHRD(ap)  EXTRACT_16BITS(&(ap)->aar_hrd)
 #define ATMSHLN(ap) ((ap)->aar_shtl & ATMARP_LEN_MASK)
 #define ATMSSLN(ap) ((ap)->aar_sstl & ATMARP_LEN_MASK)
 #define ATMSPLN(ap) ((ap)->aar_spln)
-#define ATMOP(ap)   ((ap)->aar_op)
-#define ATMPRO(ap)  ((ap)->aar_pro)
+#define ATMOP(ap)   EXTRACT_16BITS(&(ap)->aar_op)
+#define ATMPRO(ap)  EXTRACT_16BITS(&(ap)->aar_pro)
 #define ATMTHLN(ap) ((ap)->aar_thtl & ATMARP_LEN_MASK)
 #define ATMTSLN(ap) ((ap)->aar_tstl & ATMARP_LEN_MASK)
 #define ATMTPLN(ap) ((ap)->aar_tpln)
@@ -158,12 +158,16 @@ struct    atmarp_pkthdr {
 static u_char ezero[6];
 
 static void
-atmarp_addr_print(const u_char *ha, u_int ha_len, const u_char *sa,
-    u_int sa_len)
+atmarp_addr_print(const u_char *ha, u_int ha_len, const u_char *srca,
+    u_int srca_len)
 {
-       (void)printf("%s", linkaddr_string(ha, ha_len));
-       if (sa_len != 0)
-               (void)printf(",%s", linkaddr_string(sa, sa_len));
+       if (ha_len == 0)
+               (void)printf("<No address>");
+       else {
+               (void)printf("%s", linkaddr_string(ha, ha_len));
+               if (srca_len != 0)
+                       (void)printf(",%s", linkaddr_string(srca, srca_len));
+       }
 }
 
 static void
@@ -175,9 +179,9 @@ atmarp_print(const u_char *bp, u_int length, u_int caplen)
        ap = (const struct atmarp_pkthdr *)bp;
        TCHECK(*ap);
 
-       hrd = EXTRACT_16BITS(&ATMHRD(ap));
-       pro = EXTRACT_16BITS(&ATMPRO(ap));
-       op = EXTRACT_16BITS(&ATMOP(ap));
+       hrd = ATMHRD(ap);
+       pro = ATMPRO(ap);
+       op = ATMOP(ap);
 
        if (!TTEST2(*aar_tpa(ap), ATMTPLN(ap))) {
                (void)printf("truncated-atmarp");
@@ -209,35 +213,23 @@ atmarp_print(const u_char *bp, u_int length, u_int caplen)
        case ARPOP_REPLY:
                (void)printf("arp reply %s", ipaddr_string(ATMSPA(ap)));
                (void)printf(" is-at ");
-               if (ATMSHLN(ap) != 0)
-                       atmarp_addr_print(ATMSHA(ap), ATMSHLN(ap),
-                           ATMSSA(ap), ATMSSLN(ap));
-               else
-                       (void)printf("<No address>");
+               atmarp_addr_print(ATMSHA(ap), ATMSHLN(ap), ATMSSA(ap),
+                   ATMSSLN(ap));
                break;
 
        case ARPOP_INVREQUEST:
                (void)printf("invarp who-is ");
-               if (ATMTHLN(ap) != 0)
-                       atmarp_addr_print(ATMTHA(ap), ATMTHLN(ap),
-                           ATMTSA(ap), ATMTSLN(ap));
-               else
-                       (void)printf("<No address>");
+               atmarp_addr_print(ATMTHA(ap), ATMTHLN(ap), ATMTSA(ap),
+                   ATMTSLN(ap));
                (void)printf(" tell ");
-               if (ATMSHLN(ap) != 0)
-                       atmarp_addr_print(ATMSHA(ap), ATMSHLN(ap),
-                           ATMSSA(ap), ATMSSLN(ap));
-               else
-                       (void)printf("<No address>");
+               atmarp_addr_print(ATMSHA(ap), ATMSHLN(ap), ATMSSA(ap),
+                   ATMSSLN(ap));
                break;
 
        case ARPOP_INVREPLY:
                (void)printf("invarp reply ");
-               if (ATMSHLN(ap) != 0)
-                       atmarp_addr_print(ATMSHA(ap), ATMSHLN(ap),
-                           ATMSSA(ap), ATMSSLN(ap));
-               else
-                       (void)printf("<No address>");
+               atmarp_addr_print(ATMSHA(ap), ATMSHLN(ap), ATMSSA(ap),
+                   ATMSSLN(ap));
                (void)printf(" at %s", ipaddr_string(ATMSPA(ap)));
                break;
 
@@ -264,13 +256,13 @@ arp_print(const u_char *bp, u_int length, u_int caplen)
 
        ap = (const struct arp_pkthdr *)bp;
        TCHECK(*ap);
-       hrd = EXTRACT_16BITS(&HRD(ap));
+       hrd = HRD(ap);
        if (hrd == ARPHRD_ATM2225) {
                atmarp_print(bp, length, caplen);
                return;
        }
-       pro = EXTRACT_16BITS(&PRO(ap));
-       op = EXTRACT_16BITS(&OP(ap));
+       pro = PRO(ap);
+       op = OP(ap);
 
        if (!TTEST2(*ar_tpa(ap), PLN(ap))) {
                (void)printf("truncated-arp");