From: guy Date: Wed, 6 Aug 2003 06:49:38 +0000 (+0000) Subject: From Bruce M. Simpson : RFC 3561 AODV support. X-Git-Tag: tcpdump-3.8-bp~65 X-Git-Url: https://git.tcpdump.org/tcpdump/commitdiff_plain/073489bc829384eb9a027783a0b7c236fe4c2c98 From Bruce M. Simpson : RFC 3561 AODV support. --- diff --git a/CREDITS b/CREDITS index e9841302..dc79dd08 100644 --- a/CREDITS +++ b/CREDITS @@ -24,6 +24,7 @@ Additional people who have contributed patches: Atsushi Onoe Ben Smithurst Brent L. Bates + Bruce M. Simpson Charlie Lenahan Charles M. Hannum Chris G. Demetriou diff --git a/FILES b/FILES index 85bb22f7..8d1ac7d8 100644 --- 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 40b66b21..7993aa08 100644 --- 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 diff --git a/Makefile.in b/Makefile.in index 37304495..f99cc199 100644 --- a/Makefile.in +++ b/Makefile.in @@ -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 index 00000000..bffb8141 --- /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 + * 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_ */ diff --git a/interface.h b/interface.h index 6ab0d2b2..33930b67 100644 --- a/interface.h +++ b/interface.h @@ -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 index 00000000..c621ea34 --- /dev/null +++ b/print-aodv.c @@ -0,0 +1,284 @@ +/* + * Copyright (c) 2003 Bruce M. Simpson + * 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 +#include +#include + +#include + +#include +#include +#include +#include + +#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); + } +} diff --git a/print-udp.c b/print-udp.c index bf335169..46f66e9e 100644 --- a/print-udp.c +++ b/print-udp.c @@ -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 /*???*/ diff --git a/tcpdump.1 b/tcpdump.1 index 077534d4..bf2a8f14 100644 --- 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), diff --git a/tcpdump.c b/tcpdump.c index 14dca740..b4ea020c 100644 --- 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;