]> The Tcpdump Group git mirrors - tcpdump/commitdiff
From Bruce M. Simpson <[email protected]>: RFC 3561 AODV support.
authorguy <guy>
Wed, 6 Aug 2003 06:49:38 +0000 (06:49 +0000)
committerguy <guy>
Wed, 6 Aug 2003 06:49:38 +0000 (06:49 +0000)
CREDITS
FILES
INSTALL
Makefile.in
aodv.h [new file with mode: 0644]
interface.h
print-aodv.c [new file with mode: 0644]
print-udp.c
tcpdump.1
tcpdump.c

diff --git a/CREDITS b/CREDITS
index e9841302b6ed70d8ee7d9c9f32a2b2f893ef47e2..dc79dd08f6ffba502ea3fedf05ea4ae5a3dd7d84 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -24,6 +24,7 @@ Additional people who have contributed patches:
        Atsushi Onoe                    <[email protected]>
        Ben Smithurst                   <[email protected]>
        Brent L. Bates                  <[email protected]>
+       Bruce M. Simpson                <[email protected]>
        Charlie Lenahan                 <[email protected]>
        Charles M. Hannum               <[email protected]>
        Chris G. Demetriou              <[email protected]>
diff --git a/FILES b/FILES
index 85bb22f777a1b4123828644621a0ced309047d49..8d1ac7d8130b79d316f3e699640bad840dd38cf7 100644 (file)
--- a/FILES
+++ b/FILES
@@ -11,6 +11,7 @@ aclocal.m4
 addrtoname.c
 addrtoname.h
 ah.h
+aodv.h
 appletalk.h
 arcnet.h
 atime.awk
@@ -91,6 +92,7 @@ pcap-missing.h
 ppp.h
 print-802_11.c
 print-ah.c
+print-aodv.c
 print-arcnet.c
 print-arp.c
 print-ascii.c
diff --git a/INSTALL b/INSTALL
index 40b66b217e6d79ed9ceb9cfb7a2386eff020df38..7993aa08969adb8be814213b00f71097f12e6d6a 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -1,4 +1,4 @@
-@(#) $Header: /tcpdump/master/tcpdump/Attic/INSTALL,v 1.55 2003-06-09 23:28:08 guy Exp $ (LBL)
+@(#) $Header: /tcpdump/master/tcpdump/Attic/INSTALL,v 1.56 2003-08-06 06:49:39 guy Exp $ (LBL)
 
 If you have not built libpcap, do so first.  See the README
 file in this directory for the ftp location.
@@ -52,6 +52,7 @@ aclocal.m4    - autoconf macros
 addrtoname.c   - address to hostname routines
 addrtoname.h   - address to hostname definitions
 ah.h           - IPSEC Authentication Header definitions
+aodv.h         - AODV definitions
 appletalk.h    - AppleTalk definitions
 arcnet.h       - ARCNET definitions
 atime.awk      - TCP ack awk script
@@ -113,6 +114,7 @@ pcap-missing.h      - declarations of functions possibly missing from libpcap
 ppp.h          - Point to Point Protocol definitions
 print-802_11.c - IEEE 802.11 printer routines
 print-ah.c     - IPSEC Authentication Header printer routines
+print-aodv.c   - AODV printer routines
 print-arcnet.c - ARCNET printer routines
 print-arp.c    - Address Resolution Protocol printer routines
 print-ascii.c  - ASCII packet dump routines
index 373044955736b8d54db255d8d0a7c6e5cf3412e7..f99cc1997c38e481929816c836c581078911641f 100644 (file)
@@ -17,7 +17,7 @@
 #  WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
 #  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 #
-# @(#) $Header: /tcpdump/master/tcpdump/Makefile.in,v 1.274 2003-06-09 23:28:08 guy Exp $ (LBL)
+# @(#) $Header: /tcpdump/master/tcpdump/Makefile.in,v 1.275 2003-08-06 06:49:39 guy Exp $ (LBL)
 
 #
 # Various configurable paths (remember to edit Makefile.in, not Makefile)
@@ -66,25 +66,25 @@ INSTALL_DATA = @INSTALL_DATA@
        $(CC) $(CFLAGS) -c $(srcdir)/$*.c
 
 CSRC = addrtoname.c gmpls.c gmt2local.c machdep.c parsenfsfh.c \
-       print-802_11.c print-ah.c print-arcnet.c print-arp.c \
-       print-ascii.c print-atalk.c print-atm.c print-beep.c \
-       print-bgp.c print-bootp.c print-cdp.c print-chdlc.c \
-       print-cip.c print-cnfp.c print-decnet.c print-domain.c \
-       print-dvmrp.c print-enc.c print-egp.c print-esp.c \
-       print-ether.c print-fddi.c print-fr.c print-gre.c \
-       print-hsrp.c print-icmp.c print-igmp.c print-igrp.c \
-       print-ip.c print-ipcomp.c print-ipfc.c print-ipx.c \
-       print-isakmp.c print-isoclns.c print-krb.c print-l2tp.c \
-       print-lane.c print-ldp.c print-llc.c print-lwres.c \
-       print-mobile.c print-mpls.c print-msdp.c print-nfs.c \
-       print-ntp.c print-null.c print-ospf.c print-pflog.c \
-       print-pim.c print-ppp.c print-pppoe.c print-pptp.c \
-       print-radius.c print-raw.c print-rip.c print-rsvp.c \
-       print-rx.c print-sctp.c print-sl.c print-sll.c print-snmp.c \
-       print-stp.c print-sunatm.c print-sunrpc.c print-tcp.c \
-       print-telnet.c print-tftp.c print-timed.c print-token.c \
-       print-udp.c print-vjc.c print-vrrp.c print-wb.c \
-       print-zephyr.c setsignal.c tcpdump.c util.c
+       print-802_11.c print-ah.c print-arcnet.c print-aodv.c \
+       print-arp.c print-ascii.c print-atalk.c print-atm.c \
+       print-beep.c print-bgp.c print-bootp.c print-cdp.c \
+       print-chdlc.c print-cip.c print-cnfp.c print-decnet.c \
+       print-domain.c print-dvmrp.c print-enc.c print-egp.c \
+       print-esp.c print-ether.c print-fddi.c print-fr.c \
+       print-gre.c print-hsrp.c print-icmp.c print-igmp.c \
+       print-igrp.c print-ip.c print-ipcomp.c print-ipfc.c \
+       print-ipx.c print-isakmp.c print-isoclns.c print-krb.c \
+       print-l2tp.c print-lane.c print-ldp.c print-llc.c \
+       print-lwres.c print-mobile.c print-mpls.c print-msdp.c \
+       print-nfs.c print-ntp.c print-null.c print-ospf.c \
+       print-pflog.c print-pim.c print-ppp.c print-pppoe.c \
+       print-pptp.c print-radius.c print-raw.c print-rip.c \
+       print-rsvp.c print-rx.c print-sctp.c print-sl.c print-sll.c \
+       print-snmp.c print-stp.c print-sunatm.c print-sunrpc.c \
+       print-tcp.c print-telnet.c print-tftp.c print-timed.c \
+       print-token.c print-udp.c print-vjc.c print-vrrp.c \
+       print-wb.c print-zephyr.c setsignal.c tcpdump.c util.c
 
 LOCALSRC = @LOCALSRC@
 GENSRC = version.c
diff --git a/aodv.h b/aodv.h
new file mode 100644 (file)
index 0000000..bffb814
--- /dev/null
+++ b/aodv.h
@@ -0,0 +1,157 @@
+/* @(#) $Header: /tcpdump/master/tcpdump/aodv.h,v 1.1 2003-08-06 06:49:39 guy Exp $ (LBL) */
+/*
+ * Copyright (c) 2003 Bruce M. Simpson <[email protected]>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *        This product includes software developed by Bruce M. Simpson.
+ * 4. Neither the name of Bruce M. Simpson nor the names of co-
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Bruce M. Simpson AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL Bruce M. Simpson OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef _AODV_H_
+#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 */
+};
+#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 */
+       struct in6_addr rreq_da;        /* destination IPv6 address */
+       u_long          rreq_ds;        /* destination sequence number */
+       struct in6_addr rreq_oa;        /* originator IPv6 address */
+       u_long          rreq_os;        /* originator sequence number */
+};
+#endif
+
+#define        RREQ_JOIN       0x80            /* join (reserved for multicast */
+#define        RREQ_REPAIR     0x40            /* repair (reserved for multicast */
+#define        RREQ_GRAT       0x20            /* gratuitous RREP */
+#define        RREQ_DEST       0x10            /* destination only */
+#define        RREQ_UNKNOWN    0x08            /* unknown destination sequence num */
+#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 */
+};
+#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 */
+       struct in6_addr rrep_da;        /* destination IPv6 address */
+       u_long          rrep_ds;        /* destination sequence number */
+       struct in6_addr rrep_oa;        /* originator IPv6 address */
+       u_long          rrep_life;      /* lifetime of this route */
+};
+#endif
+
+#define        RREP_REPAIR             0x80    /* repair (reserved for multicast */
+#define        RREP_ACK                0x40    /* acknowledgement required */
+#define        RREP_FLAGS_MASK         0xC0    /* mask for rrep_flags */
+#define        RREP_PREFIX_MASK        0x1F    /* mask for prefix size */
+
+struct rerr_unreach {
+       u_long          u_da;   /* IPv4 address */
+       u_long          u_ds;   /* sequence number */
+};
+#ifdef INET6
+struct rerr_unreach6 {
+       struct in6_addr u_da;   /* IPv6 address */
+       u_long          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 */
+       union {
+               struct  rerr_unreach dest[1];
+#ifdef INET6
+               struct  rerr_unreach6 dest6[1];
+#endif
+       } r;
+};
+
+#define RERR_NODELETE          0x80    /* don't delete the link */
+#define RERR_FLAGS_MASK                0x80    /* mask for rerr_flags */
+
+struct aodv_rrep_ack {
+       u_char          ra_type;
+       u_char          ra_zero0;
+};
+
+union aodv {
+       struct aodv_rreq rreq;
+       struct aodv_rrep rrep;
+       struct aodv_rerr rerr;
+       struct aodv_rrep_ack rrep_ack;
+#ifdef INET6
+       struct aodv_rreq6 rreq6;
+       struct aodv_rrep6 rrep6;
+#endif
+};
+
+#define        AODV_RREQ               1       /* route request */
+#define        AODV_RREP               2       /* route response */
+#define        AODV_RERR               3       /* error report */
+#define        AODV_RREP_ACK           4       /* route response acknowledgement */
+
+struct aodv_ext {
+       u_char  type;                   /* extension type */
+       u_char  length;                 /* extension length */
+};
+
+struct aodv_hello {
+       struct  aodv_ext        eh;             /* extension header */
+       u_long                  interval;       /* expect my next hello in
+                                                * (n) ms */
+};
+
+#define        AODV_EXT_HELLO  1
+
+#endif /* _AODV_H_ */
index 6ab0d2b26f35fdcd58682ea6058b5750ec32cdb0..33930b6730dc430b527676e83f313a172e787318 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.213 2003-05-25 16:23:08 hannes Exp $ (LBL)
+ * @(#) $Header: /tcpdump/master/tcpdump/interface.h,v 1.214 2003-08-06 06:49:40 guy Exp $ (LBL)
  */
 
 #ifndef tcpdump_interface_h
@@ -95,6 +95,7 @@ extern int packettype;                /* as specified by -T */
 #define PT_SNMP                6       /* Simple Network Management Protocol */
 #define PT_CNFP                7       /* Cisco NetFlow protocol */
 #define PT_TFTP                8       /* trivial file transfer protocol */
+#define PT_AODV                9       /* Ad-hoc On-demand Distance Vector Protocol */
 
 #ifndef min
 #define min(a,b) ((a)>(b)?(b):(a))
@@ -203,6 +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 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);
diff --git a/print-aodv.c b/print-aodv.c
new file mode 100644 (file)
index 0000000..c621ea3
--- /dev/null
@@ -0,0 +1,284 @@
+/*
+ * Copyright (c) 2003 Bruce M. Simpson <[email protected]>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *        This product includes software developed by Bruce M. Simpson.
+ * 4. Neither the name of Bruce M. Simpson nor the names of co-
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Bruce M. Simpson AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL Bruce M. Simpson OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef lint
+static const char rcsid[] =
+    "@(#) $Header: /tcpdump/master/tcpdump/print-aodv.c,v 1.1 2003-08-06 06:49:40 guy Exp $ (LBL)";
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/param.h>
+#include <sys/time.h>
+#include <sys/socket.h>
+
+#include <netinet/in.h>
+
+#include <stddef.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h"                   /* must come after interface.h */
+
+#include "aodv.h"
+
+static void
+aodv_extension(struct aodv_ext *ep, u_int length)
+{
+       u_int i;
+       struct aodv_hello *ah;
+
+       switch (ep->type) {
+       case AODV_EXT_HELLO:
+               if (snapend < (u_char *) ep) {
+                       printf(" [|hello]");
+                       return;
+               }
+               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));
+               break;
+
+       default:
+               printf("\n\text %d %d", ep->type, ep->length);
+               break;
+       }
+}
+
+static void
+aodv_rreq(union aodv *ap, const u_char *dat, u_int length, void *ip6
+#ifndef INET6
+       _U_
+#endif
+       )
+{
+       u_int i;
+
+       if (snapend < dat) {
+               printf(" [|aodv]");
+               return;
+       }
+       i = min(length, (u_int)(snapend - dat));
+       if (i < sizeof(ap->rreq)) {
+               printf(" [|rreq]");
+               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 %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(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));
+               }
+       }
+}
+
+static void
+aodv_rrep(union aodv *ap, const u_char *dat, u_int length, void *ip6
+#ifndef INET6
+       _U_
+#endif
+       )
+{
+       u_int i;
+
+       if (snapend < dat) {
+               printf(" [|aodv]");
+               return;
+       }
+       i = min(length, (u_int)(snapend - dat));
+       if (i < sizeof(ap->rrep)) {
+               printf(" [|rrep]");
+               return;
+       }
+       i -= sizeof(ap->rrep);
+#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
+#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));
+               }
+       }
+}
+
+static void
+aodv_rerr(union aodv *ap, u_int length, void *ip6
+#ifndef INET6
+       _U_
+#endif
+       )
+{
+       int i, j, n, trunc;
+       struct rerr_unreach *dp;
+#ifdef INET6
+       struct rerr_unreach6 *dp6;
+#endif
+
+       i = length - offsetof(struct aodv_rerr, r);
+#ifdef INET6
+       if (ip6 != NULL) {
+               j = sizeof(ap->rerr.r.dest6[0]);
+               dp6 = &ap->rerr.r.dest6[0];
+       } else
+#endif
+       {
+               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);
+#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));
+               }
+       }
+       if (trunc)
+               printf("[|rerr]");
+}
+
+void
+aodv_print(const u_char *dat, u_int length, void *ip6)
+{
+       union aodv *ap;
+
+       ap = (union aodv *)dat;
+       if (snapend < dat) {
+               printf(" [|aodv]");
+               return;
+       }
+       if (min(length, (u_int)(snapend - dat)) < sizeof(ap->rrep_ack)) {
+               printf(" [|aodv]");
+               return;
+       }
+       printf(" aodv");
+
+       switch (ap->rerr.rerr_type) {
+       case AODV_RREQ:
+               aodv_rreq(ap, dat, length, ip6);
+               break;
+       case AODV_RREP:
+               aodv_rrep(ap, dat, length, ip6);
+               break;
+       case AODV_RERR:
+               aodv_rerr(ap, length, ip6);
+               break;
+       case AODV_RREP_ACK:
+               printf(" rrep-ack %d", ap->rrep_ack.ra_type);
+               break;
+
+       default:
+               printf(" %d %d", ap->rreq.rreq_type, length);
+       }
+}
index bf335169b420d028419de9e971306fbdc13ea69a..46f66e9ecea2ad829fa17cf886fb414ce97b31fa 100644 (file)
@@ -21,7 +21,7 @@
 
 #ifndef lint
 static const char rcsid[] =
-    "@(#) $Header: /tcpdump/master/tcpdump/print-udp.c,v 1.119 2003-07-31 23:38:20 fenner Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/tcpdump/print-udp.c,v 1.120 2003-08-06 06:49:40 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -374,6 +374,7 @@ static int udp6_cksum(const struct ip6_hdr *ip6, const struct udphdr *up,
 #define TIMED_PORT 525         /*XXX*/
 #define RIP_PORT 520           /*XXX*/
 #define LDP_PORT 646
+#define AODV_PORT 654          /*XXX*/
 #define KERBEROS_SEC_PORT 750  /*XXX*/
 #define L2TP_PORT 1701         /*XXX*/
 #define ISAKMP_PORT_USER1 7500 /*XXX - nonstandard*/
@@ -559,6 +560,19 @@ udp_print(register const u_char *bp, u_int length,
                        udpipaddr_print(ip, sport, dport);
                        tftp_print(cp, 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));
+#ifdef INET6
+                       aodv_print((void *)(up + 1), length, (void *) ip6);
+#else
+                       aodv_print((void *)(up + 1), length, NULL);
+#endif
+                       break;
                }
                return;
        }
@@ -636,6 +650,12 @@ udp_print(register const u_char *bp, u_int length,
                        bootp_print((const u_char *)(up + 1), length);
                else if (ISPORT(RIP_PORT))
                        rip_print((const u_char *)(up + 1), length);
+               else if (ISPORT(AODV_PORT))
+#ifdef INET6
+                       aodv_print((const u_char *)(up + 1), length, (void *) ip6);
+#else
+                       aodv_print((const u_char *)(up + 1), length, NULL);
+#endif
                else if (ISPORT(ISAKMP_PORT))
                        isakmp_print((const u_char *)(up + 1), length, bp2);
 #if 1 /*???*/
index 077534d4dbddcabf38cdeb2761855d9b092cc765..bf2a8f14c1f9cabe87f4ceed63ced42057df996d 100644 (file)
--- a/tcpdump.1
+++ b/tcpdump.1
@@ -426,6 +426,7 @@ Setting
 Force packets selected by "\fIexpression\fP" to be interpreted the
 specified \fItype\fR.
 Currently known types are
+\fBaodv\fR (Ad-hoc On-demand Distance Vector protocol),
 \fBcnfp\fR (Cisco NetFlow protocol),
 \fBrpc\fR (Remote Procedure Call),
 \fBrtp\fR (Real-Time Applications protocol),
index 14dca7408719f412c355be806e472009316f9349..b4ea020cd4d29ef71d5810f10e4ed8b5ac1fc02e 100644 (file)
--- a/tcpdump.c
+++ b/tcpdump.c
@@ -30,7 +30,7 @@ static const char copyright[] =
     "@(#) Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000\n\
 The Regents of the University of California.  All rights reserved.\n";
 static const char rcsid[] =
-    "@(#) $Header: /tcpdump/master/tcpdump/tcpdump.c,v 1.212 2003-08-01 01:01:40 fenner Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/tcpdump/tcpdump.c,v 1.213 2003-08-06 06:49:41 guy Exp $ (LBL)";
 #endif
 
 /*
@@ -543,6 +543,8 @@ main(int argc, char **argv)
                                packettype = PT_CNFP;
                        else if (strcasecmp(optarg, "tftp") == 0)
                                packettype = PT_TFTP;
+                       else if (strcasecmp(optarg, "aodv") == 0)
+                               packettype = PT_AODV;
                        else
                                error("unknown packet type `%s'", optarg);
                        break;