]> The Tcpdump Group git mirrors - tcpdump/commitdiff
Updates from Bruce Simpson:
authorguy <guy>
Fri, 12 Sep 2003 22:05:56 +0000 (22:05 +0000)
committerguy <guy>
Fri, 12 Sep 2003 22:05:56 +0000 (22:05 +0000)
Fix numerous bugs in my AODV submission, red faces all round,
mainly due to misunderstanding of EXTRACT_STRING() macro
arguments (because these are macros, type checking didn't
happen).

AODV HELLO extensions are now correctly printed.

The code is closer to FreeBSD's style guidelines.

Don't use "u_char" and "u_long", use "u_int8_t" and "u_int32_t".
"u_long" is definitely wrong as it's 64 bits on some platforms; "u_char"
is safe, but the official tcpdump style uses "u_int8_t".

At least according to the (long-since-expired) draft-perkins-aodv6-01,
the V6 AODV messages have different message type values from the V4 ones
in draft-ietf-manet-aodv-13.  However, draft-ietf-manet-aodv-13 says
that the only differences are in the addresses; we support both.

Clean up the way we tell the AODV6 dissector that we're running atop
IPv6 a bit.

Use "udpipaddr_print()" if we're printing AODV packets as a result of
saying "anything that matches this filter is AODV", rather than doing it
ourselves under the assumption that it's running over IPv4.

aodv.h
interface.h
print-aodv.c
print-udp.c

diff --git a/aodv.h b/aodv.h
index bffb8141884dc61944a44a4fca211d07724c2c54..6b8315b6e3083d9797450ab946f84a2e93b78f8a 100644 (file)
--- a/aodv.h
+++ b/aodv.h
@@ -1,4 +1,4 @@
-/* @(#) $Header: /tcpdump/master/tcpdump/aodv.h,v 1.1 2003-08-06 06:49:39 guy Exp $ (LBL) */
+/* @(#) $Header: /tcpdump/master/tcpdump/aodv.h,v 1.2 2003-09-12 22:05:56 guy Exp $ (LBL) */
 /*
  * Copyright (c) 2003 Bruce M. Simpson <[email protected]>
  * All rights reserved.
 #define _AODV_H_
 
 struct aodv_rreq {
-       u_char          rreq_type;      /* AODV message type (1) */
-       u_char          rreq_flags;     /* various flags */
-       u_char          rreq_zero0;     /* reserved, set to zero */
-       u_char          rreq_hops;      /* number of hops from originator */
-       u_long          rreq_id;        /* request ID */
-       u_long          rreq_da;        /* destination IPv4 address */
-       u_long          rreq_ds;        /* destination sequence number */
-       u_long          rreq_oa;        /* originator IPv4 address */
-       u_long          rreq_os;        /* originator sequence number */
+       u_int8_t        rreq_type;      /* AODV message type (1) */
+       u_int8_t        rreq_flags;     /* various flags */
+       u_int8_t        rreq_zero0;     /* reserved, set to zero */
+       u_int8_t        rreq_hops;      /* number of hops from originator */
+       u_int32_t       rreq_id;        /* request ID */
+       u_int32_t       rreq_da;        /* destination IPv4 address */
+       u_int32_t       rreq_ds;        /* destination sequence number */
+       u_int32_t       rreq_oa;        /* originator IPv4 address */
+       u_int32_t       rreq_os;        /* originator sequence number */
 };
 #ifdef INET6
 struct aodv_rreq6 {
-       u_char          rreq_type;      /* AODV message type (1) */
-       u_char          rreq_flags;     /* various flags */
-       u_char          rreq_zero0;     /* reserved, set to zero */
-       u_char          rreq_hops;      /* number of hops from originator */
-       u_long          rreq_id;        /* request ID */
+       u_int8_t        rreq_type;      /* AODV message type (1) */
+       u_int8_t        rreq_flags;     /* various flags */
+       u_int8_t        rreq_zero0;     /* reserved, set to zero */
+       u_int8_t        rreq_hops;      /* number of hops from originator */
+       u_int32_t       rreq_id;        /* request ID */
        struct in6_addr rreq_da;        /* destination IPv6 address */
-       u_long          rreq_ds;        /* destination sequence number */
+       u_int32_t       rreq_ds;        /* destination sequence number */
        struct in6_addr rreq_oa;        /* originator IPv6 address */
-       u_long          rreq_os;        /* originator sequence number */
+       u_int32_t       rreq_os;        /* originator sequence number */
 };
 #endif
 
@@ -66,25 +66,25 @@ struct aodv_rreq6 {
 #define        RREQ_FLAGS_MASK 0xF8            /* mask for rreq_flags */
 
 struct aodv_rrep {
-       u_char          rrep_type;      /* AODV message type (2) */
-       u_char          rrep_flags;     /* various flags */
-       u_char          rrep_ps;        /* prefix size */
-       u_char          rrep_hops;      /* number of hops from o to d */
-       u_long          rrep_da;        /* destination IPv4 address */
-       u_long          rrep_ds;        /* destination sequence number */
-       u_long          rrep_oa;        /* originator IPv4 address */
-       u_long          rrep_life;      /* lifetime of this route */
+       u_int8_t        rrep_type;      /* AODV message type (2) */
+       u_int8_t        rrep_flags;     /* various flags */
+       u_int8_t        rrep_ps;        /* prefix size */
+       u_int8_t        rrep_hops;      /* number of hops from o to d */
+       u_int32_t       rrep_da;        /* destination IPv4 address */
+       u_int32_t       rrep_ds;        /* destination sequence number */
+       u_int32_t       rrep_oa;        /* originator IPv4 address */
+       u_int32_t       rrep_life;      /* lifetime of this route */
 };
 #ifdef INET6
 struct aodv_rrep6 {
-       u_char          rrep_type;      /* AODV message type (2) */
-       u_char          rrep_flags;     /* various flags */
-       u_char          rrep_ps;        /* prefix size */
-       u_char          rrep_hops;      /* number of hops from o to d */
+       u_int8_t        rrep_type;      /* AODV message type (2) */
+       u_int8_t        rrep_flags;     /* various flags */
+       u_int8_t        rrep_ps;        /* prefix size */
+       u_int8_t        rrep_hops;      /* number of hops from o to d */
        struct in6_addr rrep_da;        /* destination IPv6 address */
-       u_long          rrep_ds;        /* destination sequence number */
+       u_int32_t       rrep_ds;        /* destination sequence number */
        struct in6_addr rrep_oa;        /* originator IPv6 address */
-       u_long          rrep_life;      /* lifetime of this route */
+       u_int32_t       rrep_life;      /* lifetime of this route */
 };
 #endif
 
@@ -94,21 +94,21 @@ struct aodv_rrep6 {
 #define        RREP_PREFIX_MASK        0x1F    /* mask for prefix size */
 
 struct rerr_unreach {
-       u_long          u_da;   /* IPv4 address */
-       u_long          u_ds;   /* sequence number */
+       u_int32_t       u_da;   /* IPv4 address */
+       u_int32_t       u_ds;   /* sequence number */
 };
 #ifdef INET6
 struct rerr_unreach6 {
        struct in6_addr u_da;   /* IPv6 address */
-       u_long          u_ds;   /* sequence number */
+       u_int32_t       u_ds;   /* sequence number */
 };
 #endif
 
 struct aodv_rerr {
-       u_char          rerr_type;      /* AODV message type (3) */
-       u_char          rerr_flags;     /* various flags */
-       u_char          rerr_zero0;     /* reserved, set to zero */
-       u_char          rerr_dc;        /* destination count */
+       u_int8_t        rerr_type;      /* AODV message type (3) */
+       u_int8_t        rerr_flags;     /* various flags */
+       u_int8_t        rerr_zero0;     /* reserved, set to zero */
+       u_int8_t        rerr_dc;        /* destination count */
        union {
                struct  rerr_unreach dest[1];
 #ifdef INET6
@@ -121,8 +121,8 @@ struct aodv_rerr {
 #define RERR_FLAGS_MASK                0x80    /* mask for rerr_flags */
 
 struct aodv_rrep_ack {
-       u_char          ra_type;
-       u_char          ra_zero0;
+       u_int8_t        ra_type;
+       u_int8_t        ra_zero0;
 };
 
 union aodv {
@@ -141,14 +141,19 @@ union aodv {
 #define        AODV_RERR               3       /* error report */
 #define        AODV_RREP_ACK           4       /* route response acknowledgement */
 
+#define AODV_V6_RREQ           16      /* IPv6 route request */
+#define AODV_V6_RREP           17      /* IPv6 route response */
+#define AODV_V6_RERR           18      /* IPv6 error report */
+#define AODV_V6_RREP_ACK       19      /* IPV6 route response acknowledgment */
+
 struct aodv_ext {
-       u_char  type;                   /* extension type */
-       u_char  length;                 /* extension length */
+       u_int8_t        type;           /* extension type */
+       u_int8_t        length;         /* extension length */
 };
 
 struct aodv_hello {
        struct  aodv_ext        eh;             /* extension header */
-       u_long                  interval;       /* expect my next hello in
+       u_int32_t               interval;       /* expect my next hello in
                                                 * (n) ms */
 };
 
index 33930b6730dc430b527676e83f313a172e787318..85bdb9a736ac23a38021b2fe56bf790ec9c671f7 100644 (file)
@@ -18,7 +18,7 @@
  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- * @(#) $Header: /tcpdump/master/tcpdump/interface.h,v 1.214 2003-08-06 06:49:40 guy Exp $ (LBL)
+ * @(#) $Header: /tcpdump/master/tcpdump/interface.h,v 1.215 2003-09-12 22:05:56 guy Exp $ (LBL)
  */
 
 #ifndef tcpdump_interface_h
@@ -204,7 +204,7 @@ extern int llc_print(const u_char *, u_int, u_int, const u_char *,
 extern int snap_print(const u_char *, u_int, u_int, u_short *, u_int32_t,
        u_short, u_int);
 extern void aarp_print(const u_char *, u_int);
-extern void aodv_print(const u_char *, u_int, void *);
+extern void aodv_print(const u_char *, u_int, int);
 extern void arp_print(const u_char *, u_int, u_int);
 extern void atalk_print(const u_char *, u_int);
 extern void atm_print(u_int, u_int, u_int, const u_char *, u_int, u_int);
index 92d21859c501be67c3b34697209d97fa52135414..92a964580267760760a5edc14dd2f7b87014c5b3 100644 (file)
@@ -32,7 +32,7 @@
 
 #ifndef lint
 static const char rcsid[] =
-    "@(#) $Header: /tcpdump/master/tcpdump/print-aodv.c,v 1.4 2003-09-06 22:16:56 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/tcpdump/print-aodv.c,v 1.5 2003-09-12 22:05:57 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -53,10 +53,10 @@ static const char rcsid[] =
 #include "aodv.h"
 
 static void
-aodv_extension(struct aodv_ext *ep, u_int length)
+aodv_extension(const struct aodv_ext *ep, u_int length)
 {
        u_int i;
-       struct aodv_hello *ah;
+       const struct aodv_hello *ah;
 
        switch (ep->type) {
        case AODV_EXT_HELLO:
@@ -64,15 +64,14 @@ aodv_extension(struct aodv_ext *ep, u_int length)
                        printf(" [|hello]");
                        return;
                }
-               i = min(length, (u_int)(snapend - (u_char *) ep));
+               i = min(length, (u_int)(snapend - (u_char *)ep));
                if (i < sizeof(struct aodv_hello)) {
                        printf(" [|hello]");
                        return;
                }
                i -= sizeof(struct aodv_hello);
-               ah = (void *) ep;
-               printf("\n\text HELLO %d ms",
-                       EXTRACT_32BITS(ah->interval));
+               ah = (void *)ep;
+               printf("\n\text HELLO %d ms", EXTRACT_32BITS(&ah->interval));
                break;
 
        default:
@@ -82,11 +81,7 @@ aodv_extension(struct aodv_ext *ep, u_int length)
 }
 
 static void
-aodv_rreq(union aodv *ap, const u_char *dat, u_int length, void *ip6
-#ifndef INET6
-       _U_
-#endif
-       )
+aodv_rreq(const union aodv *ap, const u_char *dat, u_int length)
 {
        u_int i;
 
@@ -100,54 +95,25 @@ aodv_rreq(union aodv *ap, const u_char *dat, u_int length, void *ip6
                return;
        }
        i -= sizeof(ap->rreq);
-#ifdef INET6
-       if (ip6 != NULL) {
-               printf(" rreq %d %s%s%s%s%shops %d id 0x%08lx\n"
-                       "\tdst %s seq %ld src %s seq %ld", length,
-                       ap->rreq6.rreq_type & RREQ_JOIN ? "[J]" : "",
-                       ap->rreq6.rreq_type & RREQ_REPAIR ? "[R]" : "",
-                       ap->rreq6.rreq_type & RREQ_GRAT ? "[G]" : "",
-                       ap->rreq6.rreq_type & RREQ_DEST ? "[D]" : "",
-                       ap->rreq6.rreq_type & RREQ_UNKNOWN ? "[U] " : " ",
-                       ap->rreq6.rreq_hops,
-                       (unsigned long)EXTRACT_32BITS(ap->rreq6.rreq_id),
-                       ip6addr_string(&ap->rreq6.rreq_da),
-                       (unsigned long)EXTRACT_32BITS(ap->rreq6.rreq_ds),
-                       ip6addr_string(&ap->rreq6.rreq_oa),
-                       (unsigned long)EXTRACT_32BITS(ap->rreq6.rreq_os));
-               if (i >= sizeof(ap->rreq6) + sizeof(struct aodv_ext)) {
-                       aodv_extension((void *) (&ap->rreq6 + 1),
-                                       length - sizeof(ap->rreq6));
-               }
-               } else
-#endif
-       {
-               printf(" rreq %d %s%s%s%s%shops %d id 0x%08x\n"
-                       "\tdst %s seq %d src %s seq %d", length,
-                       ap->rreq.rreq_type & RREQ_JOIN ? "[J]" : "",
-                       ap->rreq.rreq_type & RREQ_REPAIR ? "[R]" : "",
-                       ap->rreq.rreq_type & RREQ_GRAT ? "[G]" : "",
-                       ap->rreq.rreq_type & RREQ_DEST ? "[D]" : "",
-                       ap->rreq.rreq_type & RREQ_UNKNOWN ? "[U] " : " ",
-                       ap->rreq.rreq_hops,
-                       EXTRACT_32BITS(ap->rreq.rreq_id),
-                       ipaddr_string(ap->rreq.rreq_da),
-                       EXTRACT_32BITS(ap->rreq.rreq_ds),
-                       ipaddr_string(ap->rreq.rreq_oa),
-                       EXTRACT_32BITS(ap->rreq.rreq_os));
-               if (i >= sizeof(ap->rreq) + sizeof(struct aodv_ext)) {
-                       aodv_extension((void *) (&ap->rreq + 1),
-                                       length - sizeof(ap->rreq));
-               }
-       }
+       printf(" rreq %d %s%s%s%s%shops %d id 0x%08x\n"
+           "\tdst %s seq %d src %s seq %d", length,
+           ap->rreq.rreq_type & RREQ_JOIN ? "[J]" : "",
+           ap->rreq.rreq_type & RREQ_REPAIR ? "[R]" : "",
+           ap->rreq.rreq_type & RREQ_GRAT ? "[G]" : "",
+           ap->rreq.rreq_type & RREQ_DEST ? "[D]" : "",
+           ap->rreq.rreq_type & RREQ_UNKNOWN ? "[U] " : " ",
+           ap->rreq.rreq_hops,
+           EXTRACT_32BITS(&ap->rreq.rreq_id),
+           ipaddr_string(&ap->rreq.rreq_da),
+           EXTRACT_32BITS(&ap->rreq.rreq_ds),
+           ipaddr_string(&ap->rreq.rreq_oa),
+           EXTRACT_32BITS(&ap->rreq.rreq_os));
+       if (i >= sizeof(struct aodv_ext))
+               aodv_extension((void *)(&ap->rreq + 1), i);
 }
 
 static void
-aodv_rrep(union aodv *ap, const u_char *dat, u_int length, void *ip6
-#ifndef INET6
-       _U_
-#endif
-       )
+aodv_rrep(const union aodv *ap, const u_char *dat, u_int length)
 {
        u_int i;
 
@@ -161,93 +127,153 @@ aodv_rrep(union aodv *ap, const u_char *dat, u_int length, void *ip6
                return;
        }
        i -= sizeof(ap->rrep);
+       printf(" rrep %d %s%sprefix %d hops %d\n"
+           "\tdst %s dseq %d src %s %d ms", length,
+           ap->rrep.rrep_type & RREP_REPAIR ? "[R]" : "",
+           ap->rrep.rrep_type & RREP_ACK ? "[A] " : " ",
+           ap->rrep.rrep_ps & RREP_PREFIX_MASK,
+           ap->rrep.rrep_hops,
+           ipaddr_string(&ap->rrep.rrep_da),
+           EXTRACT_32BITS(&ap->rrep.rrep_ds),
+           ipaddr_string(&ap->rrep.rrep_oa),
+           EXTRACT_32BITS(&ap->rrep.rrep_life));
+       if (i >= sizeof(struct aodv_ext))
+               aodv_extension((void *)(&ap->rrep + 1), i);
+}
+
+static void
+aodv_rerr(const union aodv *ap, u_int length)
+{
+       const struct rerr_unreach *dp = NULL;
+       int i, j, n, trunc;
+
+       i = length - offsetof(struct aodv_rerr, r);
+       j = sizeof(ap->rerr.r.dest[0]);
+       dp = &ap->rerr.r.dest[0];
+       n = ap->rerr.rerr_dc * j;
+       printf(" rerr %s [items %d] [%d]:",
+           ap->rerr.rerr_flags & RERR_NODELETE ? "[D]" : "",
+           ap->rerr.rerr_dc, length);
+       trunc = n - (i/j);
+       for (; i -= j >= 0; ++dp) {
+               printf(" {%s}(%d)", ipaddr_string(&dp->u_da),
+                   EXTRACT_32BITS(&dp->u_ds));
+       }
+       if (trunc)
+               printf("[|rerr]");
+}
+
+static void
 #ifdef INET6
-       if (ip6 != NULL) {
-               printf(" rrep %d %s%sprefix %d hops %d\n"
-                      "\tdst %s dseq %d src %s %d ms", length,
-                       ap->rrep6.rrep_type & RREP_REPAIR ? "[R]" : "",
-                       ap->rrep6.rrep_type & RREP_ACK ? "[A] " : " ",
-                       ap->rrep6.rrep_ps & RREP_PREFIX_MASK,
-                       ap->rrep6.rrep_hops,
-                       ip6addr_string(&ap->rrep6.rrep_da),
-                       EXTRACT_32BITS(ap->rrep6.rrep_ds),
-                       ip6addr_string(&ap->rrep6.rrep_oa),
-                       EXTRACT_32BITS(ap->rrep6.rrep_life));
-               if (i >= sizeof(ap->rrep6) + sizeof(struct aodv_ext)) {
-                       aodv_extension((void *) (&ap->rrep6 + 1),
-                                       length - sizeof(ap->rrep6));
-               }
-       } else
+aodv_v6_rreq(const union aodv *ap, const u_char *dat, u_int length)
+#else
+aodv_v6_rreq(const union aodv *ap _U_, const u_char *dat _U_, u_int length)
 #endif
-       {
-               printf(" rrep %d %s%sprefix %d hops %d\n"
-                      "\tdst %s dseq %d src %s %d ms", length,
-                       ap->rrep.rrep_type & RREP_REPAIR ? "[R]" : "",
-                       ap->rrep.rrep_type & RREP_ACK ? "[A] " : " ",
-                       ap->rrep.rrep_ps & RREP_PREFIX_MASK,
-                       ap->rrep.rrep_hops,
-                       ipaddr_string(ap->rrep.rrep_da),
-                       EXTRACT_32BITS(ap->rrep.rrep_ds),
-                       ipaddr_string(ap->rrep.rrep_oa),
-                       EXTRACT_32BITS(ap->rrep.rrep_life));
-               if (i >= sizeof(ap->rrep) + sizeof(struct aodv_ext)) {
-                       aodv_extension((void *) (&ap->rrep + 1),
-                                       length - sizeof(ap->rrep));
-               }
+{
+#ifdef INET6
+       u_int i;
+
+       if (snapend < dat) {
+               printf(" [|aodv]");
+               return;
        }
+       i = min(length, (u_int)(snapend - dat));
+       if (i < sizeof(ap->rreq6)) {
+               printf(" [|rreq6]");
+               return;
+       }
+       i -= sizeof(ap->rreq6);
+       printf(" v6 rreq %d %s%s%s%s%shops %d id 0x%08x\n"
+           "\tdst %s seq %d src %s seq %d", length,
+           ap->rreq6.rreq_type & RREQ_JOIN ? "[J]" : "",
+           ap->rreq6.rreq_type & RREQ_REPAIR ? "[R]" : "",
+           ap->rreq6.rreq_type & RREQ_GRAT ? "[G]" : "",
+           ap->rreq6.rreq_type & RREQ_DEST ? "[D]" : "",
+           ap->rreq6.rreq_type & RREQ_UNKNOWN ? "[U] " : " ",
+           ap->rreq6.rreq_hops,
+           EXTRACT_32BITS(&ap->rreq6.rreq_id),
+           ip6addr_string(&ap->rreq6.rreq_da),
+           EXTRACT_32BITS(&ap->rreq6.rreq_ds),
+           ip6addr_string(&ap->rreq6.rreq_oa),
+           EXTRACT_32BITS(&ap->rreq6.rreq_os));
+       if (i >= sizeof(struct aodv_ext))
+               aodv_extension((void *)(&ap->rreq6 + 1), i);
+#else
+       printf(" v6 rreq %d", length);
+#endif
 }
 
 static void
-aodv_rerr(union aodv *ap, u_int length, void *ip6
-#ifndef INET6
-       _U_
+#ifdef INET6
+aodv_v6_rrep(const union aodv *ap, const u_char *dat, u_int length)
+#else
+aodv_v6_rrep(const union aodv *ap _U_, const u_char *dat _U_, u_int length)
 #endif
-       )
 {
-       int i, j, n, trunc;
-       struct rerr_unreach *dp = NULL;
 #ifdef INET6
-       struct rerr_unreach6 *dp6 = NULL;
+       u_int i;
+
+       if (snapend < dat) {
+               printf(" [|aodv]");
+               return;
+       }
+       i = min(length, (u_int)(snapend - dat));
+       if (i < sizeof(ap->rrep6)) {
+               printf(" [|rrep6]");
+               return;
+       }
+       i -= sizeof(ap->rrep6);
+       printf(" rrep %d %s%sprefix %d hops %d\n"
+          "\tdst %s dseq %d src %s %d ms", length,
+           ap->rrep6.rrep_type & RREP_REPAIR ? "[R]" : "",
+           ap->rrep6.rrep_type & RREP_ACK ? "[A] " : " ",
+           ap->rrep6.rrep_ps & RREP_PREFIX_MASK,
+           ap->rrep6.rrep_hops,
+           ip6addr_string(&ap->rrep6.rrep_da),
+           EXTRACT_32BITS(&ap->rrep6.rrep_ds),
+           ip6addr_string(&ap->rrep6.rrep_oa),
+           EXTRACT_32BITS(&ap->rrep6.rrep_life));
+       if (i >= sizeof(struct aodv_ext))
+               aodv_extension((void *)(&ap->rrep6 + 1), i);
+#else
+       printf(" v6 rrep %d", length);
 #endif
+}
 
-       i = length - offsetof(struct aodv_rerr, r);
+static void
 #ifdef INET6
-       if (ip6 != NULL) {
-               j = sizeof(ap->rerr.r.dest6[0]);
-               dp6 = &ap->rerr.r.dest6[0];
-       } else
+aodv_v6_rerr(const union aodv *ap, u_int length)
+#else
+aodv_v6_rerr(const union aodv *ap _U_, u_int length)
 #endif
-       {
-               j = sizeof(ap->rerr.r.dest[0]);
-               dp = &ap->rerr.r.dest[0];
-       }
+{
+#ifdef INET6
+       const struct rerr_unreach6 *dp6 = NULL;
+       int i, j, n, trunc;
+
+       i = length - offsetof(struct aodv_rerr, r);
+       j = sizeof(ap->rerr.r.dest6[0]);
+       dp6 = &ap->rerr.r.dest6[0];
        n = ap->rerr.rerr_dc * j;
        printf(" rerr %s [items %d] [%d]:",
-               ap->rerr.rerr_flags & RERR_NODELETE ? "[D]" : "",
-               ap->rerr.rerr_dc, length);
+           ap->rerr.rerr_flags & RERR_NODELETE ? "[D]" : "",
+           ap->rerr.rerr_dc, length);
        trunc = n - (i/j);
-#ifdef INET6
-       if (ip6 != NULL) {
-               for (; i -= j >= 0; ++dp6) {
-                       printf(" {%s}(%d)", ip6addr_string(&dp6->u_da),
-                               EXTRACT_32BITS(dp6->u_ds));
-               }
-       } else
-#endif
-       {
-               for (; i -= j >= 0; ++dp) {
-                       printf(" {%s}(%d)", ipaddr_string(dp->u_da),
-                               EXTRACT_32BITS(dp->u_ds));
-               }
+       for (; i -= j >= 0; ++dp6) {
+               printf(" {%s}(%d)", ip6addr_string(&dp6->u_da),
+                   EXTRACT_32BITS(&dp6->u_ds));
        }
        if (trunc)
                printf("[|rerr]");
+#else
+       printf(" v6 rerr %d", length);
+#endif
 }
 
 void
-aodv_print(const u_char *dat, u_int length, void *ip6)
+aodv_print(const u_char *dat, u_int length, int is_ip6)
 {
-       union aodv *ap;
+       const union aodv *ap;
 
        ap = (union aodv *)dat;
        if (snapend < dat) {
@@ -261,17 +287,46 @@ aodv_print(const u_char *dat, u_int length, void *ip6)
        printf(" aodv");
 
        switch (ap->rerr.rerr_type) {
+
        case AODV_RREQ:
-               aodv_rreq(ap, dat, length, ip6);
+               if (is_ip6)
+                       aodv_v6_rreq(ap, dat, length);
+               else
+                       aodv_rreq(ap, dat, length);
                break;
+
        case AODV_RREP:
-               aodv_rrep(ap, dat, length, ip6);
+               if (is_ip6)
+                       aodv_v6_rrep(ap, dat, length);
+               else
+                       aodv_rrep(ap, dat, length);
                break;
+
        case AODV_RERR:
-               aodv_rerr(ap, length, ip6);
+               if (is_ip6)
+                       aodv_v6_rerr(ap, length);
+               else
+                       aodv_rerr(ap, length);
                break;
+
        case AODV_RREP_ACK:
-               printf(" rrep-ack %d", ap->rrep_ack.ra_type);
+               printf(" rrep-ack %d", length);
+               break;
+
+       case AODV_V6_RREQ:
+               aodv_v6_rreq(ap, dat, length);
+               break;
+
+       case AODV_V6_RREP:
+               aodv_v6_rrep(ap, dat, length);
+               break;
+
+       case AODV_V6_RERR:
+               aodv_v6_rerr(ap, length);
+               break;
+
+       case AODV_V6_RREP_ACK:
+               printf(" v6 rrep-ack %d", length);
                break;
 
        default:
index 46f66e9ecea2ad829fa17cf886fb414ce97b31fa..e289be615e008ab40f0ce3f125e0db08dda3b5e5 100644 (file)
@@ -21,7 +21,7 @@
 
 #ifndef lint
 static const char rcsid[] =
-    "@(#) $Header: /tcpdump/master/tcpdump/print-udp.c,v 1.120 2003-08-06 06:49:40 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/tcpdump/print-udp.c,v 1.121 2003-09-12 22:05:57 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -562,15 +562,12 @@ udp_print(register const u_char *bp, u_int length,
                        break;
 
                case PT_AODV:
-                       (void)printf("%s.%s > %s.%s: ",
-                               ipaddr_string(&ip->ip_src),
-                               udpport_string(sport),
-                               ipaddr_string(&ip->ip_dst),
-                               udpport_string(dport));
+                       udpipaddr_print(ip, sport, dport);
+                       aodv_print((const u_char *)(up + 1), length,
 #ifdef INET6
-                       aodv_print((void *)(up + 1), length, (void *) ip6);
+                           ip6 != NULL);
 #else
-                       aodv_print((void *)(up + 1), length, NULL);
+                           FALSE);
 #endif
                        break;
                }
@@ -651,10 +648,11 @@ udp_print(register const u_char *bp, u_int length,
                else if (ISPORT(RIP_PORT))
                        rip_print((const u_char *)(up + 1), length);
                else if (ISPORT(AODV_PORT))
+                       aodv_print((const u_char *)(up + 1), length,
 #ifdef INET6
-                       aodv_print((const u_char *)(up + 1), length, (void *) ip6);
+                           ip6 != NULL);
 #else
-                       aodv_print((const u_char *)(up + 1), length, NULL);
+                           FALSE);
 #endif
                else if (ISPORT(ISAKMP_PORT))
                        isakmp_print((const u_char *)(up + 1), length, bp2);