From Shingo Horisawa:

add the "unknown sequence number" flag;

	fix dissection of unreachable destinations in RERR messages;

	fix prefix size in draft-perkins-manet-aodv6-01 RREP
	messages to be 7 bits, not 5 bits;

	put the message dissection under the top-level AODV tree rather
	than at the top level;

	fix labeling of source IPv6 address in RREP messages.

Update the comments at the beginning (AODV is now RFC 3561), and note
that RFC 3561 says that, for IPv6, the only change is that the address
fields are enlarged.

Rename RREQ_DEST and RREQ_GRAT to more fully indicate what they are.

Fix the name of the draft in the description of the
draft-perkins-manet-aodv6-01 messages.

Fix description of Gratuitous RREP flag in RREQ messages.

svn path=/trunk/; revision=12562
This commit is contained in:
Guy Harris 2004-11-21 21:05:16 +00:00
parent 99576c146c
commit aada868cd8
2 changed files with 51 additions and 28 deletions

View File

@ -2309,6 +2309,7 @@ Mark Phillips <msp [AT] nortelnetworks.com>
Nils Ohlmeier <lists [AT] ohlmeier.org>
Ignacio Goyret <igoyret [AT] lucent.com>
Bart Braem <bart.braem [AT] gmail.com>
Shingo Horisawa <name4n5 [AT] hotmail.com>
Alain Magloire <alainm[AT]rcsm.ece.mcgill.ca> was kind enough to
give his permission to use his version of snprintf.c.

View File

@ -44,11 +44,15 @@
/*
* See
*
* http://www.ietf.org/internet-drafts/draft-ietf-manet-aodv-13.txt
* RFC 3561 (which indicates that, for IPv6, the only change is that
* the address fields are enlarged)
*
* http://www.cs.ucsb.edu/~ebelding/txt/aodv6.txt
*
* http://www.tcs.hut.fi/~anttit/manet/drafts/draft-perkins-aodv6-01.txt
*
* (both of the above two are draft-perkins-manet-aodv6-01.txt, which
* is from November 2000)
*/
#define INET6_ADDRLEN 16
@ -70,8 +74,9 @@
#define AODV_EXT_NTP 3
/* Flag bits: */
#define RREQ_DEST 0x10
#define RREQ_GRAT 0x20
#define RREQ_UNKNSEQ 0x08
#define RREQ_DESTONLY 0x10
#define RREQ_GRATRREP 0x20
#define RREQ_REP 0x40
#define RREQ_JOIN 0x80
@ -85,10 +90,10 @@ static const value_string type_vals[] = {
{ RREP, "Route Reply" },
{ RERR, "Route Error" },
{ RREP_ACK, "Route Reply Acknowledgment"},
{ DRAFT_01_V6_RREQ, "draft-perkins-aodv6-01 Route Request"},
{ DRAFT_01_V6_RREP, "draft-perkins-aodv6-01 Route Reply"},
{ DRAFT_01_V6_RERR, "draft-perkins-aodv6-01 Route Error"},
{ DRAFT_01_V6_RREP_ACK, "draft-perkins-aodv6-01 Route Reply Acknowledgment"},
{ DRAFT_01_V6_RREQ, "draft-perkins-manet-aodv6-01 IPv6 Route Request"},
{ DRAFT_01_V6_RREP, "draft-perkins-manet-aodv6-01 IPv6 Route Reply"},
{ DRAFT_01_V6_RERR, "draft-perkins-manet-aodv6-01 IPv6 Route Error"},
{ DRAFT_01_V6_RREP_ACK, "draft-perkins-manet-aodv6-01 IPv6 Route Reply Acknowledgment"},
{ 0, NULL }
};
@ -126,6 +131,7 @@ static int hf_aodv_flags_rreq_join = -1;
static int hf_aodv_flags_rreq_repair = -1;
static int hf_aodv_flags_rreq_gratuitous = -1;
static int hf_aodv_flags_rreq_destinationonly = -1;
static int hf_aodv_flags_rreq_unknown = -1;
static int hf_aodv_flags_rrep_repair = -1;
static int hf_aodv_flags_rrep_ack = -1;
static int hf_aodv_flags_rerr_nodelete = -1;
@ -231,14 +237,18 @@ dissect_aodv_rreq(tvbuff_t *tvb, packet_info *pinfo, proto_tree *aodv_tree,
tvb, offset, 1, flags);
proto_tree_add_boolean(aodv_flags_tree, hf_aodv_flags_rreq_destinationonly,
tvb, offset, 1, flags);
proto_tree_add_boolean(aodv_flags_tree, hf_aodv_flags_rreq_unknown,
tvb, offset, 1, flags);
if (flags & RREQ_JOIN)
proto_item_append_text(tj, " J");
if (flags & RREQ_REP)
proto_item_append_text(tj, " R");
if (flags & RREQ_GRAT)
if (flags & RREQ_GRATRREP)
proto_item_append_text(tj, " G");
if (flags & RREQ_DEST)
if (flags & RREQ_DESTONLY)
proto_item_append_text(tj, " D");
if (flags & RREQ_UNKNSEQ)
proto_item_append_text(tj, " U");
}
offset += 2; /* skip reserved byte */
@ -413,11 +423,11 @@ dissect_aodv_rrep(tvbuff_t *tvb, packet_info *pinfo, proto_tree *aodv_tree,
if (aodv_tree) {
proto_tree_add_ipv6(aodv_tree, hf_aodv_orig_ipv6, tvb, offset,
INET6_ADDRLEN, (guint8 *)&orig_addr_v6);
proto_item_append_text(ti, ", Dest IP: %s",
proto_item_append_text(ti, ", Orig IP: %s",
ip6_to_str(&orig_addr_v6));
}
if (check_col(pinfo->cinfo, COL_INFO))
col_append_fstr(pinfo->cinfo, COL_INFO, ", D: %s",
col_append_fstr(pinfo->cinfo, COL_INFO, ", O: %s",
ip6_to_str(&orig_addr_v6));
offset += INET6_ADDRLEN;
} else {
@ -495,9 +505,10 @@ dissect_aodv_rerr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *aodv_tree,
proto_tree_add_item(aodv_unreach_dest_tree,
hf_aodv_unreach_dest_ipv6,
tvb, offset, INET6_ADDRLEN, FALSE);
offset += INET6_ADDRLEN;
proto_tree_add_item(aodv_unreach_dest_tree, hf_aodv_dest_seqno,
tvb, offset, 4, FALSE);
offset += INET6_ADDRLEN + 4;
offset += 4;
}
} else {
tj = proto_tree_add_text(aodv_tree, tvb, offset, (4 + 4)*dest_count,
@ -506,9 +517,10 @@ dissect_aodv_rerr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *aodv_tree,
for (i = 0; i < dest_count; i++) {
proto_tree_add_item(aodv_unreach_dest_tree, hf_aodv_unreach_dest_ip,
tvb, offset, 4, FALSE);
offset += 4;
proto_tree_add_item(aodv_unreach_dest_tree, hf_aodv_dest_seqno,
tvb, offset, 4, FALSE);
offset += 4 + 4;
offset += 4;
}
}
}
@ -541,14 +553,18 @@ dissect_aodv_draft_01_v6_rreq(tvbuff_t *tvb, packet_info *pinfo,
tvb, offset, 1, flags);
proto_tree_add_boolean(aodv_flags_tree, hf_aodv_flags_rreq_destinationonly,
tvb, offset, 1, flags);
proto_tree_add_boolean(aodv_flags_tree, hf_aodv_flags_rreq_unknown,
tvb, offset, 1, flags);
if (flags & RREQ_JOIN)
proto_item_append_text(tj, " J");
if (flags & RREQ_REP)
proto_item_append_text(tj, " R");
if (flags & RREQ_GRAT)
if (flags & RREQ_GRATRREP)
proto_item_append_text(tj, " G");
if (flags & RREQ_DEST)
if (flags & RREQ_DESTONLY)
proto_item_append_text(tj, " D");
if (flags & RREQ_UNKNSEQ)
proto_item_append_text(tj, " U");
}
offset += 2; /* skip reserved byte */
@ -643,7 +659,7 @@ dissect_aodv_draft_01_v6_rrep(tvbuff_t *tvb, packet_info *pinfo,
}
offset += 1;
prefix_sz = tvb_get_guint8(tvb, offset) & 0x1F;
prefix_sz = tvb_get_guint8(tvb, offset) & 0x7F;
if (aodv_tree)
proto_tree_add_uint(aodv_tree, hf_aodv_prefix_sz, tvb, offset, 1,
prefix_sz);
@ -677,11 +693,11 @@ dissect_aodv_draft_01_v6_rrep(tvbuff_t *tvb, packet_info *pinfo,
if (aodv_tree) {
proto_tree_add_ipv6(aodv_tree, hf_aodv_orig_ipv6, tvb, offset,
INET6_ADDRLEN, (guint8 *)&orig_addr_v6);
proto_item_append_text(ti, ", Dest IP: %s",
proto_item_append_text(ti, ", Orig IP: %s",
ip6_to_str(&orig_addr_v6));
}
if (check_col(pinfo->cinfo, COL_INFO))
col_append_fstr(pinfo->cinfo, COL_INFO, ", D: %s",
col_append_fstr(pinfo->cinfo, COL_INFO, ", O: %s",
ip6_to_str(&orig_addr_v6));
offset += INET6_ADDRLEN;
@ -744,10 +760,11 @@ dissect_aodv_draft_01_v6_rerr(tvbuff_t *tvb, packet_info *pinfo,
for (i = 0; i < dest_count; i++) {
proto_tree_add_item(aodv_unreach_dest_tree, hf_aodv_dest_seqno,
tvb, offset, 4, FALSE);
offset += 4;
proto_tree_add_item(aodv_unreach_dest_tree,
hf_aodv_unreach_dest_ipv6,
tvb, offset, INET6_ADDRLEN, FALSE);
offset += 4 + INET6_ADDRLEN;
offset += INET6_ADDRLEN;
}
}
@ -793,24 +810,24 @@ dissect_aodv(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
switch (type) {
case RREQ:
dissect_aodv_rreq(tvb, pinfo, tree, ti, is_ipv6);
dissect_aodv_rreq(tvb, pinfo, aodv_tree, ti, is_ipv6);
break;
case RREP:
dissect_aodv_rrep(tvb, pinfo, tree, ti, is_ipv6);
dissect_aodv_rrep(tvb, pinfo, aodv_tree, ti, is_ipv6);
break;
case RERR:
dissect_aodv_rerr(tvb, pinfo, tree, is_ipv6);
dissect_aodv_rerr(tvb, pinfo, aodv_tree, is_ipv6);
break;
case RREP_ACK:
break;
case DRAFT_01_V6_RREQ:
dissect_aodv_draft_01_v6_rreq(tvb, pinfo, tree, ti);
dissect_aodv_draft_01_v6_rreq(tvb, pinfo, aodv_tree, ti);
break;
case DRAFT_01_V6_RREP:
dissect_aodv_draft_01_v6_rrep(tvb, pinfo, tree, ti);
dissect_aodv_draft_01_v6_rrep(tvb, pinfo, aodv_tree, ti);
break;
case DRAFT_01_V6_RERR:
dissect_aodv_draft_01_v6_rerr(tvb, pinfo, tree);
dissect_aodv_draft_01_v6_rerr(tvb, pinfo, aodv_tree);
break;
case DRAFT_01_V6_RREP_ACK:
break;
@ -849,13 +866,18 @@ proto_register_aodv(void)
"", HFILL }
},
{ &hf_aodv_flags_rreq_gratuitous,
{ "RREQ Gratuitous", "aodv.flags.rreq_gratuitous",
FT_BOOLEAN, 8, TFS(&flags_set_truth), RREQ_GRAT,
{ "RREQ Gratuitous RREP", "aodv.flags.rreq_gratuitous",
FT_BOOLEAN, 8, TFS(&flags_set_truth), RREQ_GRATRREP,
"", HFILL }
},
{ &hf_aodv_flags_rreq_destinationonly,
{ "RREQ Destination only", "aodv.flags.rreq_destinationonly",
FT_BOOLEAN, 8, TFS(&flags_set_truth), RREQ_DEST,
FT_BOOLEAN, 8, TFS(&flags_set_truth), RREQ_DESTONLY,
"", HFILL }
},
{ &hf_aodv_flags_rreq_unknown,
{ "RREQ Unknown Sequence Number", "aodv.flags.rreq_unknown",
FT_BOOLEAN, 8, TFS(&flags_set_truth), RREQ_UNKNSEQ,
"", HFILL }
},
{ &hf_aodv_flags_rrep_repair,