[aodvv2-discuss] Draft 10

  • From: Victoria Mercieca <vmercieca0@xxxxxxxxx>
  • To: "aodvv2-discuss@xxxxxxxxxxxxx" <aodvv2-discuss@xxxxxxxxxxxxx>
  • Date: Mon, 6 Jul 2015 11:36:03 +0100

Hi all,

This morning I added the multicast RREP idea. I changed the use of the
AckReq data element to include the address of the intended next hop (and
gave that address an address type value for our new Address Type TLV). I
did not write text that would allow the multicast RREP to take the place of
the RREP_Ack.

I also added clarification that the gateway router (Internet AODVv2 Router
or IAR) is not to be configured as a default router. If there is more text
that needs adding for any of the gateway functionality, send it quick! :-)

It could do with a proof-read if anyone has time.

I'm attaching an XML and a TXT file which will need to be submitted later
today as per the deadline of 2359 UTC Monday 6th July. I will leave that
for Charlie to do again.

Did we request a slot for the MANET meeting?

Kind regards,
Vicky.




Mobile Ad hoc Networks Working Group C. Perkins
Internet-Draft Futurewei
Intended status: Standards Track S. Ratliff
Expires: January 7, 2016 Idirect
J. Dowdell
Airbus Defence and Space
L. Steenbrink
HAW Hamburg, Dept. Informatik
V. Mercieca
Airbus Defence and Space
July 6, 2015


Ad Hoc On-demand Distance Vector (AODVv2) Routing
draft-ietf-manet-aodvv2-10

Abstract

The revised Ad Hoc On-demand Distance Vector (AODVv2) routing
protocol is intended for use by mobile routers in wireless, multihop
networks. AODVv2 determines unicast routes among AODVv2 routers
within the network in an on-demand fashion, offering rapid
convergence in dynamic topologies.

Status of This Memo

This Internet-Draft is submitted in full conformance with the
provisions of BCP 78 and BCP 79.

Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF). Note that other groups may also distribute
working documents as Internet-Drafts. The list of current Internet-
Drafts is at http://datatracker.ietf.org/drafts/current/.

Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress."

This Internet-Draft will expire on January 7, 2016.

Copyright Notice

Copyright (c) 2015 IETF Trust and the persons identified as the
document authors. All rights reserved.

This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents



Perkins, et al. Expires January 7, 2016 [Page 1]

Internet-Draft AODVv2 July 2015


(http://trustee.ietf.org/license-info) in effect on the date of
publication of this document. Please review these documents
carefully, as they describe your rights and restrictions with respect
to this document. Code Components extracted from this document must
include Simplified BSD License text as described in Section 4.e of
the Trust Legal Provisions and are provided without warranty as
described in the Simplified BSD License.

Table of Contents

1. Overview . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 5
3. Applicability Statement . . . . . . . . . . . . . . . . . . . 10
4. Data Structures . . . . . . . . . . . . . . . . . . . . . . . 11
4.1. Interface List . . . . . . . . . . . . . . . . . . . . . 11
4.2. Router Client List . . . . . . . . . . . . . . . . . . . 11
4.3. Neighbor Table . . . . . . . . . . . . . . . . . . . . . 12
4.4. Sequence Numbers . . . . . . . . . . . . . . . . . . . . 13
4.5. Multicast Route Message Table . . . . . . . . . . . . . . 14
4.6. Route Table Entry . . . . . . . . . . . . . . . . . . . . 15
5. Metrics . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
5.1. Cost Function . . . . . . . . . . . . . . . . . . . . . . 17
5.2. LoopFree Function . . . . . . . . . . . . . . . . . . . . 18
5.3. Default Metric Type . . . . . . . . . . . . . . . . . . . 18
5.4. Alternate Metric Types . . . . . . . . . . . . . . . . . 19
6. AODVv2 Protocol Operations . . . . . . . . . . . . . . . . . 19
6.1. Initialization . . . . . . . . . . . . . . . . . . . . . 19
6.2. Adjacency Monitoring . . . . . . . . . . . . . . . . . . 20
6.3. Message Transmission . . . . . . . . . . . . . . . . . . 22
6.4. Route Discovery, Retries and Buffering . . . . . . . . . 22
6.5. Processing Received Route Information . . . . . . . . . . 24
6.5.1. Evaluating Route Information . . . . . . . . . . . . 25
6.5.2. Applying Route Updates . . . . . . . . . . . . . . . 26
6.6. Suppressing Redundant Messages . . . . . . . . . . . . . 28
6.7. Route Maintenance . . . . . . . . . . . . . . . . . . . . 29
6.7.1. Route State . . . . . . . . . . . . . . . . . . . . . 29
6.7.2. Reporting Invalid Routes . . . . . . . . . . . . . . 31
7. AODVv2 Protocol Messages . . . . . . . . . . . . . . . . . . 31
7.1. Route Request (RREQ) Message . . . . . . . . . . . . . . 31
7.1.1. RREQ Generation . . . . . . . . . . . . . . . . . . . 33
7.1.2. RREQ Reception . . . . . . . . . . . . . . . . . . . 34
7.1.3. RREQ Regeneration . . . . . . . . . . . . . . . . . . 35
7.2. Route Reply (RREP) Message . . . . . . . . . . . . . . . 36
7.2.1. RREP Generation . . . . . . . . . . . . . . . . . . . 38
7.2.2. RREP Reception . . . . . . . . . . . . . . . . . . . 39
7.2.3. RREP Regeneration . . . . . . . . . . . . . . . . . . 41
7.3. Route Reply Acknowledgement (RREP_Ack) Message . . . . . 42
7.3.1. RREP_Ack Generation . . . . . . . . . . . . . . . . . 42



Perkins, et al. Expires January 7, 2016 [Page 2]

Internet-Draft AODVv2 July 2015


7.3.2. RREP_Ack Reception . . . . . . . . . . . . . . . . . 42
7.4. Route Error (RERR) Message . . . . . . . . . . . . . . . 43
7.4.1. RERR Generation . . . . . . . . . . . . . . . . . . . 44
7.4.2. RERR Reception . . . . . . . . . . . . . . . . . . . 46
7.4.3. RERR Regeneration . . . . . . . . . . . . . . . . . . 47
8. RFC 5444 Representation . . . . . . . . . . . . . . . . . . . 48
8.1. RREQ . . . . . . . . . . . . . . . . . . . . . . . . . . 49
8.1.1. Message Header . . . . . . . . . . . . . . . . . . . 49
8.1.2. Message TLV Block . . . . . . . . . . . . . . . . . . 49
8.1.3. Address Block . . . . . . . . . . . . . . . . . . . . 49
8.1.4. Address Block TLV Block . . . . . . . . . . . . . . . 50
8.2. RREP . . . . . . . . . . . . . . . . . . . . . . . . . . 51
8.2.1. Message Header . . . . . . . . . . . . . . . . . . . 51
8.2.2. Message TLV Block . . . . . . . . . . . . . . . . . . 51
8.2.3. Address Block . . . . . . . . . . . . . . . . . . . . 51
8.2.4. Address Block TLV Block . . . . . . . . . . . . . . . 51
8.3. RREP_Ack . . . . . . . . . . . . . . . . . . . . . . . . 52
8.3.1. Message Header . . . . . . . . . . . . . . . . . . . 52
8.3.2. Message TLV Block . . . . . . . . . . . . . . . . . . 53
8.3.3. Address Block . . . . . . . . . . . . . . . . . . . . 53
8.3.4. Address Block TLV Block . . . . . . . . . . . . . . . 53
8.4. RERR . . . . . . . . . . . . . . . . . . . . . . . . . . 53
8.4.1. Message Header . . . . . . . . . . . . . . . . . . . 53
8.4.2. Message TLV Block . . . . . . . . . . . . . . . . . . 53
8.4.3. Address Block . . . . . . . . . . . . . . . . . . . . 53
8.4.4. Address Block TLV Block . . . . . . . . . . . . . . . 54
9. Simple Internet Attachment . . . . . . . . . . . . . . . . . 55
10. Optional Features . . . . . . . . . . . . . . . . . . . . . . 56
10.1. Expanding Rings Multicast . . . . . . . . . . . . . . . 56
10.2. Precursor Lists . . . . . . . . . . . . . . . . . . . . 56
10.3. Intermediate RREP . . . . . . . . . . . . . . . . . . . 57
10.4. Message Aggregation Delay . . . . . . . . . . . . . . . 58
11. Configuration . . . . . . . . . . . . . . . . . . . . . . . . 58
11.1. Timers . . . . . . . . . . . . . . . . . . . . . . . . . 58
11.2. Protocol Constants . . . . . . . . . . . . . . . . . . . 59
11.3. Local Settings . . . . . . . . . . . . . . . . . . . . . 60
11.4. Network-Wide Settings . . . . . . . . . . . . . . . . . 60
11.5. Optional Feature Settings . . . . . . . . . . . . . . . 60
12. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 61
12.1. RFC 5444 Message Types . . . . . . . . . . . . . . . . . 61
12.2. RFC 5444 Address Block TLV Types . . . . . . . . . . . . 61
12.3. MetricType Allocation . . . . . . . . . . . . . . . . . 62
12.4. AddressType Allocation . . . . . . . . . . . . . . . . . 62
13. Security Considerations . . . . . . . . . . . . . . . . . . . 63
14. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 65
15. References . . . . . . . . . . . . . . . . . . . . . . . . . 66
15.1. Normative References . . . . . . . . . . . . . . . . . . 66
15.2. Informative References . . . . . . . . . . . . . . . . . 66



Perkins, et al. Expires January 7, 2016 [Page 3]

Internet-Draft AODVv2 July 2015


Appendix A. Features Required of IP . . . . . . . . . . . . . . 67
Appendix B. Multi-homing Considerations . . . . . . . . . . . . 68
Appendix C. Router Client Relocation . . . . . . . . . . . . . . 68
Appendix D. Example Algorithms for AODVv2 Operations . . . . . . 68
D.1. General Operations . . . . . . . . . . . . . . . . . . . 70
D.1.1. Check_Route_State . . . . . . . . . . . . . . . . . . 70
D.1.2. Process_Routing_Info . . . . . . . . . . . . . . . . 71
D.1.3. Fetch_Route_Table_Entry . . . . . . . . . . . . . . . 72
D.1.4. Update_Route_Table_Entry . . . . . . . . . . . . . . 73
D.1.5. Create_Route_Table_Entry . . . . . . . . . . . . . . 74
D.1.6. LoopFree . . . . . . . . . . . . . . . . . . . . . . 74
D.1.7. Fetch_Rte_Msg_Table_Entry . . . . . . . . . . . . . . 75
D.1.8. Update_Rte_Msg_Table . . . . . . . . . . . . . . . . 75
D.1.9. Build_RFC_5444_Message_Header . . . . . . . . . . . . 76
D.2. RREQ Operations . . . . . . . . . . . . . . . . . . . . . 77
D.2.1. Generate_RREQ . . . . . . . . . . . . . . . . . . . . 77
D.2.2. Receive_RREQ . . . . . . . . . . . . . . . . . . . . 78
D.2.3. Regenerate_RREQ . . . . . . . . . . . . . . . . . . . 80
D.3. RREP Operations . . . . . . . . . . . . . . . . . . . . . 81
D.3.1. Generate_RREP . . . . . . . . . . . . . . . . . . . . 81
D.3.2. Receive_RREP . . . . . . . . . . . . . . . . . . . . 82
D.3.3. Regenerate_RREP . . . . . . . . . . . . . . . . . . . 83
D.4. RREP_Ack Operations . . . . . . . . . . . . . . . . . . . 85
D.4.1. Generate_RREP_Ack . . . . . . . . . . . . . . . . . . 85
D.4.2. Receive_RREP_Ack . . . . . . . . . . . . . . . . . . 85
D.4.3. Timeout_RREP_Ack . . . . . . . . . . . . . . . . . . 85
D.5. RERR Operations . . . . . . . . . . . . . . . . . . . . . 85
D.5.1. Generate_RERR . . . . . . . . . . . . . . . . . . . . 85
D.5.2. Receive_RERR . . . . . . . . . . . . . . . . . . . . 87
D.5.3. Regenerate_RERR . . . . . . . . . . . . . . . . . . . 88
Appendix E. AODVv2 Draft Updates . . . . . . . . . . . . . . . . 90
E.1. Changes between revisions 9 and 10 . . . . . . . . . . . 90
E.2. Changes between revisions 8 and 9 . . . . . . . . . . . . 90
E.3. Changes between revisions 7 and 8 . . . . . . . . . . . . 93
E.4. Changes between revisions 6 and 7 . . . . . . . . . . . . 94
E.5. Changes between revisions 5 and 6 . . . . . . . . . . . . 95
E.6. Changes between revisions 4 and 5 . . . . . . . . . . . . 96
E.7. Changes between revisions 3 and 4 . . . . . . . . . . . . 97
E.8. Changes between revisions 2 and 3 . . . . . . . . . . . . 98
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 99

1. Overview

The revised Ad hoc On-demand Distance Vector (AODVv2) routing
protocol [formerly named DYMO] enables on-demand, multihop unicast
routing among AODVv2 routers in mobile ad hoc networks [MANETs]
[RFC2501]. The basic operations of the AODVv2 protocol are route
discovery and route maintenance.



Perkins, et al. Expires January 7, 2016 [Page 4]

Internet-Draft AODVv2 July 2015


Route discovery is performed when an AODVv2 router needs to forward a
packet for one of its clients, but does not have a valid route to the
packet's destination. AODVv2 routers use Route Request (RREQ) and
Route Reply (RREP) messages to carry route information between the
originator of the route discovery and the target node, establishing a
route to both endpoints on all intermediate routers.

A metric is included in RREQ and RREP messages to represent the cost
of the route to the originator or target of the route discovery.
AODVv2 compares route metrics in a way that ensures loop avoidance.
AODVv2 also uses sequence numbers to assure loop freedom, enabling
identification of stale routing information so that it can be
discarded.

Route maintenance involves monitoring the router's links and routes
for changes. This includes confirming adjacencies with other AODVv2
routers, issuing Route Error messages if link failures invalidate
routes, extending and enforcing route timeouts, and reacting to
received Route Error messages.

AODVv2 control plane messages use the Generalized MANET Packet/
Message Format defined in [RFC5444] and the parameters in [RFC5498].
AODVv2 defines a set of data elements which map to RFC 5444 Address
Blocks, Address Block TLVs, and Message TLVs.

Security for authentication of AODVv2 routers and encryption of
control messages is dealt with by using the recommendations in
[RFC7182].

2. Terminology

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
"OPTIONAL" in this document are to be interpreted as described in
[RFC2119]. In addition, this document uses terminology from
[RFC5444], and defines the following terms:

AddressList
An AODVv2 Data Element (see Table 1).

Adjacency
A bi-directional relationship between neighboring AODVv2 routers
for the purpose of exchanging routing information.

AckReq
An AODVv2 Data Element (see Table 1).

AODVv2 Router



Perkins, et al. Expires January 7, 2016 [Page 5]

Internet-Draft AODVv2 July 2015


An IP addressable device in the ad hoc network that performs the
AODVv2 protocol operations specified in this document.

CurrentTime
The current time as maintained by the AODVv2 router.

Data Element
A named object used within AODVv2 protocol messages (see Table 1).

Disregard
Ignore for further processing.

Invalid route
A route that cannot be used for forwarding.

MANET
A Mobile Ad Hoc Network as defined in [RFC2501].

MetricType
An AODVv2 Data Element (see Table 1).

MetricTypeList
An AODVv2 Data Element (see Table 1).

Node
An IP addressable device in the ad hoc network. All nodes in this
document are either AODVv2 Routers or Router Clients.

OrigAddr (Originator Address)
An AODVv2 Data Element (see Table 1).

OrigMetric
An AODVv2 Data Element (see Table 1).

OrigNode (Originating Node)
The node that launched the application requiring communication
with the Target Address.

OrigPrefixLen
The prefix length, in bits, associated with OrigAddr.

OrigSeqNum
An AODVv2 Data Element (see Table 1).

PktSource
An AODVv2 Data Element (see Table 1).

PrefixLengthList



Perkins, et al. Expires January 7, 2016 [Page 6]

Internet-Draft AODVv2 July 2015


An AODVv2 Data Element (see Table 1).

Reactive
A protocol operation is called "reactive" if it is performed only
in reaction to specific events. In this document, "reactive" is
synonymous with "on-demand".

RERR (Route Error)
The AODVv2 message type used to indicate that an AODVv2 router
does not have a route toward one or more particular destinations.

RERR_Gen (RERR Generating Router)
The AODVv2 router generating a Route Error message.

Routable Unicast IP Address
A routable unicast IP address is a unicast IP address that is
scoped sufficiently to be forwarded by a router. Globally-scoped
unicast IP addresses and Unique Local Addresses (ULAs) ([RFC4193])
are examples of routable unicast IP addresses.

Router Client
A node that requires the services of an AODVv2 router. An AODVv2
router is also its own client.

RREP (Route Reply)
The AODVv2 message type used to reply to a Route Request message.

RREP_Gen (RREP Generating Router)
The AODVv2 router responsible for the Target Node of a Route
Request message, i.e., the router that creates the Route Reply
message.

RREQ (Route Request)
The AODVv2 message type used to discover a route to the Target
Address and distribute information about the route to the
Originator Address.

RREQ_Gen (RREQ Generating Router)
The AODVv2 router that creates the Route Request message on behalf
of the Originating Node to discover a route for Target Address.

RteMsg (Route Message)
A Route Request (RREQ) or Route Reply (RREP) message.

Sequence Number (SeqNum)
One of the sequence numbers maintained by an AODVv2 router to
indicate freshness of route information. Used as an AODVv2 Data
Element (see Table 1).



Perkins, et al. Expires January 7, 2016 [Page 7]

Internet-Draft AODVv2 July 2015


SeqNumList
An AODVv2 Data Element (see Table 1).

TargAddr (Target Address)
An AODVv2 Data Element (see Table 1).

Target Node
The node hosting the IP address toward which a route is needed.

TargMetric
An AODVv2 Data Element (see Table 1).

TargPrefixLen
The prefix length, in bits, associated with TargAddr.

TargSeqNum
An AODVv2 Data Element (see Table 1).

Unreachable Address
An address for which a valid route is not known.

Upstream
In the direction from destination to source (from TargAddr to
OrigAddr).

Valid route
A route that can be used for forwarding.

ValidityTime
An AODVv2 Data Element (see Table 1).

This document defines a set of Data Elements in Table 1 which are
used in AODVv2 messages. These data elements contain the message
data which is transferred into RFC 5444 formatted messages
(Section 8) before sending.
















Perkins, et al. Expires January 7, 2016 [Page 8]

Internet-Draft AODVv2 July 2015


+------------------+------------------------------------------------+
| Data Element | Meaning |
+------------------+------------------------------------------------+
| AckReq | Presence in RREP means acknowledgement is |
| | requested from the router with the address |
| | indicated |
| AddressList | A list of IP addresses |
| MetricType | The metric type for a metric value |
| MetricTypeList | Metric types associated with routes to |
| | addresses in AddressList, used in RERR |
| msg_hop_limit | Number of hops the message is allowed to |
| | traverse |
| msg_hop_count | Number of hops traversed so far by the message |
| OrigMetric | Metric value associated with the route to |
| | OrigAddr |
| OrigSeqNum | Sequence number associated with OrigAddr, used |
| | in RREQ |
| OrigAddr | IP address of the Originating Node, the source |
| | address of the packet triggering route |
| | discovery |
| PktSource | Source address of a packet triggering a RERR |
| | message |
| PrefixLengthList | A list of routing prefixes associated with |
| | addresses in AddressList |
| SeqNum | Sequence number, when used in RERR |
| SeqNumList | A list of generic sequence numbers associated |
| | with addresses in an AddressList, used in RERR |
| TargAddr | IP address of the Target Node, the destination |
| | address for which a route is requested |
| TargMetric | Metric value associated with the route to |
| | TargAddr |
| TargSeqNum | Sequence number associated with TargAddr, used |
| | in RREQ (optional) and RREP |
| ValidityTime | Length of time a route is offered |
+------------------+------------------------------------------------+

Table 1: Data Elements

This document uses the notational conventions in Table 2 to simplify
the text.











Perkins, et al. Expires January 7, 2016 [Page 9]

Internet-Draft AODVv2 July 2015


+----------------------+--------------------------------------------+
| Notation | Meaning |
+----------------------+--------------------------------------------+
| Route[Address] | A route table entry toward Address |
| Route[Address].Field | A field in a route table entry toward |
| | Address |
| RteMsg | Either RREQ or RREP |
| RteMsg.Field | A field in either RREQ or RREP |
| AdvRte | A route advertised in an incoming RteMsg |
+----------------------+--------------------------------------------+

Table 2: Notational Conventions

3. Applicability Statement

The AODVv2 routing protocol is a reactive routing protocol designed
for stub or disconnected mobile ad hoc networks, i.e., non-transit
networks or those not connected to the internet.

AODVv2 handles a wide variety of mobility and traffic patterns by
determining routes on-demand. In networks with a large number of
routers, AODVv2 is best suited for relatively sparse traffic
scenarios where each router forwards packets to a small percentage of
other AODVv2 routers in the network. In this case fewer routes are
needed, and therefore less control traffic is produced.

AODVv2 is well suited to reactive scenarios such as emergency and
disaster relief, where the ability to communicate is more important
than being assured of secure operations. For other ad hoc networking
applications, in which insecure operation could negate the value of
establishing communication paths, it is important for neighboring
AODVv2 nodes to establish security associations with one another.

AODVv2 will not make use of uni-directional links. Route requests
from routers which cannot confirm bidirectional connectivity should
be ignored to avoid persistent packet loss or protocol failures.

AODVv2 is applicable to memory constrained devices, since only a
little routing state is maintained in each AODVv2 router. In
contrast to proactive routing protocols, which maintain routing
information for all destinations within the MANET, AODVv2 routes that
are not needed for forwarding data do not need to be maintained. On
routers unable to store persistent AODVv2 state, recovery can impose
a performance penalty (e.g., in case of AODVv2 router reboot).

AODVv2 supports routers with multiple interfaces, as long as each
interface configured for AODVv2 has its own unicast routable IP
address. Address assignment procedures are out of scope for AODVv2.



Perkins, et al. Expires January 7, 2016 [Page 10]

Internet-Draft AODVv2 July 2015


Multi-homing is not supported by AODVv2, and therefore a Router
Client SHOULD NOT be served by more than one AODVv2 router at any one
time. Appendix B contains some notes on this topic.

Although AODVv2 is closely related to AODV [RFC3561], and shares some
features of DSR [RFC4728], AODVv2 is not interoperable with either of
those protocols.

The routing algorithm in AODVv2 may be operated at layers other than
the network layer, using layer-appropriate addresses.

AODVv2 can be configured to perform gateway functions when attached
to the internet. Such a gateway router is referred to as an Internet
AODVv2 Router (IAR) as discussed in Section 9. The IAR will reply to
each route request generated inside the AODVv2 network for an
internet destination as if they were responsible for the target
address, and may advertise the AODVv2 network to the internet using
procedures out of scope for this specification. The IAR SHALL NOT be
configured as a default router.

4. Data Structures

4.1. Interface List

A list of the interfaces supporting AODVv2 should be configured in
the AODVv2_INTERFACES list.

4.2. Router Client List

An AODVv2 router may provide routing services for its own local
applications and for other non-routing nodes that are directly
reachable via its network interfaces. These nodes, including the
AODVv2 router itself, are referred to as Router Clients.

Each AODVv2 router MUST be configured with information about the IP
addresses of its clients. If a subnet is configured as a Router
Client, the AODVv2 router MUST serve every node in that subnet.

A CLIENT_ADDRESSES list should exist to store information about
Router Clients, with the following information:

RouterClient.IPAddress
The IP address of the client node or subnet that requires routing
services from the AODVv2 router.

RouterClient.PrefixLength
The length, in bits, of the routing prefix associated with the
client IP address or subnet.



Perkins, et al. Expires January 7, 2016 [Page 11]

Internet-Draft AODVv2 July 2015


The list of Router Clients for an AODVv2 router is never empty, since
an AODVv2 router is always its own client. The IP Addresses of the
router's interfaces will appear in the Router Client list.

The router MUST respond to Route Requests for all Router Clients. In
the initial state, an AODVv2 router is not required to have
information about the Router Clients of any other AODVv2 router.

A Router Client SHOULD NOT be served by more than one AODVv2 router
at any one time. Shifting responsibility for a Router Client to a
different AODVv2 router is discussed in Appendix C.

4.3. Neighbor Table

A neighbor table MUST be maintained with information about
neighboring AODVv2 routers, including an indication of the state of
the adjacency to the router. Section 6.2 discusses how to monitor
adjacency.

Neighboring routers which cannot confirm adjacency should be marked
as blacklisted. Certain AODVv2 messages received from a blacklisted
router should be ignored. Routers should be blacklisted for a
maximum of MAX_BLACKLIST_TIME, but can be removed from the blacklist
before this time if an indication of adjacency is received.

Neighbor entries should contain:

Neighbor.IPAddress
An IP address of the neighboring router.

Neighbor.State
The state of the adjacency (Confirmed, Unknown, or Blacklisted)

Neighbor.ResetTime
The time at which this router SHOULD no longer be considered
blacklisted. By default this value is calculated at the time the
router is blacklisted and is equal to CurrentTime +
MAX_BLACKLIST_TIME. After this time, the state should be reset to
Unknown. While the neighbor is not marked as blacklisted, this
value SHOULD be set to MAX_TIME.

Before a neighbor is confirmed, any routes learned through that
neighbor are marked as Unconfirmed. When neighbor state is set to
Confirmed, the Unconfirmed routes using the neighbor as a next hop
can transition to Idle state (see Section 6.7.1).

If a neighbor is blacklisted, any valid routes installed which use
that neighbor for their next hop should become Invalid.



Perkins, et al. Expires January 7, 2016 [Page 12]

Internet-Draft AODVv2 July 2015


When the link to a neighbor breaks, the neighbor entry should be
removed and all routes using the neighbor as next hop should become
Invalid.

4.4. Sequence Numbers

Sequence numbers enable AODVv2 routers to determine the temporal
order of route discovery messages, identifying stale routing
information so that it can be discarded. The sequence number
fulfills the same roles as the "Destination Sequence Number" of DSDV
[Perkins94], and the AODV Sequence Number in [RFC3561].

Each AODVv2 router in the network MUST maintain its own sequence
number as a 16-bit unsigned integer. All route messages (Route
Request and Route Reply messages) created by an AODVv2 router include
the router's sequence number.

If the router has multiple AODVv2 interfaces, it can maintain
different sequence numbers for each interface IP address, but the
router MUST NOT use multiple sequence numbers for any one interface
IP address. All route messages created on behalf of Router Clients
on a particular interface MUST include the sequence number of that
interface's IP address.

Each AODVv2 router MUST ensure that its sequence number is strictly
increasing. It can ensure this by incrementing the sequence number
by one (1) whenever a route message is created, except when the
sequence number is 65,535 (the maximum value of a 16-bit unsigned
integer), in which case it MUST be reset to one (1). The value zero
(0) is reserved to indicate that the sequence number for an address
is unknown.

A router receiving a route message uses the sequence number to
determine the freshness of the route information in the message in
comparison with any existing information about the same route. If
the sequence number stored in the route table is higher than the
sequence number in the message, the received information is
considered stale and MUST NOT be used to update the route table.

As a consequence, loop freedom is assured.

An AODVv2 router SHOULD maintain its sequence number(s) in persistent
storage. If a sequence number is lost, the router must follow the
procedure in Section 6.1 to safely resume routing operations with a
new sequence number.






Perkins, et al. Expires January 7, 2016 [Page 13]

Internet-Draft AODVv2 July 2015


4.5. Multicast Route Message Table

A route message (RteMsg) is either a Route Request and Route Reply
message. The Multicast Route Message Table (RteMsg Table) contains
information about previously received multicast route messages, so
that when a route message is received, an AODVv2 router can determine
if the incoming information is redundant, and avoid unnecessary
regeneration of the route message. RREQ messages are usually
multicast. Future extensions to AODVv2 MAY enable RREP messages to
be multicast.

Each entry in the RteMsg Table stores the following information,
copied from the route message:

RteMsg.MessageType
Either RREQ or RREP.

RteMsg.OrigAddr
The IP address of the originating node wishing to send a packet.

RteMsg.OrigPrefixLen
The prefix length associated with OrigAddr.

RteMsg.TargAddr
The IP address of the target node, the destination of the packet.

RteMsg.TargPrefixLen
The prefix length associated with TargAddr.

RteMsg.OrigSeqNum
The sequence number associated with the originator, if present in
RteMsg.

RteMsg.TargSeqNum
The sequence number associated with the target, if present in
RteMsg.

RteMsg.MetricType
The metric type of the route requested.

RteMsg.Metric
The metric value received in the RteMsg.

RteMsg.Timestamp
The last time this entry was updated.

RteMsg.RemoveTime
The time at which this entry MUST be removed.



Perkins, et al. Expires January 7, 2016 [Page 14]

Internet-Draft AODVv2 July 2015


Multicast RteMsgs are considered to be comparable if they have the
same MessageType, OrigAddr, TargAddr, and MetricType. The RteMsg
Table is maintained so that no two entries are comparable, i.e., all
entries either have different MessageType, different OrigAddr,
different TargAddr, or different MetricType. See Section 6.6 for
details on updating this table.

Entries in the RteMsg Table MUST be deleted when the sequence number
is no longer valid, i.e., after MAX_SEQNUM_LIFETIME. RemoveTime
should be set when the sequence number of the entry is updated, i.e.,
when OrigSeqNum is updated for a RREQ, and when TargSeqNum is updated
for a RREP. RemoveTime should be set to CurrentTime +
MAX_SEQNUM_LIFETIME. Memory-constrained devices MAY remove the entry
before this time, but the entry should be maintained for at least
RteMsg_ENTRY_TIME after the last Timestamp update in order to account
for long-lived RREQs traversing the network.

4.6. Route Table Entry

The route table entry is a conceptual data structure.
Implementations MAY use any internal representation that provides
access to the following information:

Route.Address
An address or address prefix of a node.

Route.PrefixLength
The prefix length, in bits, associated with the address. If it is
less than the length of Route.Address, this is a route to the
subnet on which Route.Address resides.

Route.SeqNum
The sequence number associated with Route.Address, obtained from
the last route message that successfully updated this route table
entry.

Route.NextHop
An IP address of the AODVv2 router used for the next hop on the
path toward Route.Address.

Route.NextHopInterface
The interface used to send packets toward Route.Address.

Route.LastUsed
The time this route was last used to forward a packet.

Route.LastSeqNumUpdate
The time the sequence number for this route was last updated.



Perkins, et al. Expires January 7, 2016 [Page 15]

Internet-Draft AODVv2 July 2015


Route.ExpirationTime
The time at which this route must be marked as Invalid.

Route.MetricType
The type of metric associated with this route.

Route.Metric
The cost of the route toward Route.Address expressed in units
consistent with Route.MetricType.

Route.State
The last known state (Active, Idle, Invalid, or Unconfirmed) of
the route.

Route.Precursors (optional feature)
A list of upstream neighbors using the route (see Section 10.2).

There are four possible states for an AODVv2 route:

Active
An Active route is in current use for forwarding packets.

Idle
An Idle route has not been used in the last ACTIVE_INTERVAL, but
can still be used for forwarding packets.

Invalid
An Invalid route cannot be used for forwarding packets, but its
sequence number information allows incoming information to be
assessed for freshness.

Unconfirmed
An Unconfirmed route cannot be used for forwarding packets. It is
a route learned

from a Route Request which has not yet been confirmed as
bidirectional.

Route state changes are detailed in Section 6.7.1.

An AODVv2 route may be offered for a limited time. In this case, the
route is referred to as a timed route. The length of time for which
the route is valid is referred to as validity time, and is included
in messages which advertise the route. The shortened validity time
is reflected in Route.ExpirationTime. If a route is not timed, the
ExpirationTime is MAX_TIME, and the route will become Idle and then
Invalid if it is not used. Invalid routes should be maintained for
their sequence number information.



Perkins, et al. Expires January 7, 2016 [Page 16]

Internet-Draft AODVv2 July 2015


5. Metrics

Metrics measure a cost or quality associated with a route or a link,
e.g., latency, delay, financial cost, energy, etc.

AODVv2 enables the use of multiple metric types. Each metric that
can be used in AODVv2 has a MetricType number. Numbers are allocated
by IANA as specified in [RFC6551] or detailed in Section 12.3. The
default metric type is discussed in Section 5.3. Alternate metrics
are discussed in Section 5.4.

An AODVv2 implementation MAY be configured to use a limited set of
the supported metric types. In the processing described in
Section 7, a "known" MetricType can be interpreted as a configured
MetricType. If a message is received using an unknown or non-
configured MetricType it MUST be ignored. Since the message will not
be regenerated, other routers which do support the MetricType will
not be able to route through a router which does not support the
MetricType.

For each MetricType, a maximum value is defined, denoted
MAX_METRIC[MetricType]. AODVv2 cannot store routes that cost more
than MAX_METRIC[MetricType].

Metric information reported in incoming route messages describes the
metric as measured by message sender, and does not reflect the cost
of traversing the link to that sender. The receiving router
calculates the cost of the route from its perspective. This cost is
used to determine whether to use incoming information to update an
existing route. If the cost exceeds MAX_METRIC[MetricType], the
route is ignored.

5.1. Cost Function

This document uses the following notation to represent costs:

o Cost(L) for link cost

o Cost(R) for route cost

These functions return the cost of traversing a link or a route.
Cost(L) and Cost(R) for the default metric type are detailed in
Section 5.3. The Cost() functions for other metric types are beyond
the scope of this document.







Perkins, et al. Expires January 7, 2016 [Page 17]

Internet-Draft AODVv2 July 2015


5.2. LoopFree Function

When comparing an advertised route to an existing route for the same
destination and the same metric type, the metric value should be
examined to ensure that using the advertised route does not create
any routing loops.

The function LoopFree(R1, R2) is defined to verify that a route R2 is
not a part of another route R1. LoopFree returns TRUE if R2 cannot
be a sub-section of the route R1.

An AODVv2 router invokes LoopFree() as part of the process in
Section 6.5.1. The advertised route (AdvRte) is used as parameter
R1, and the stored route (Route) is used as parameter R2.

The LoopFree(R1,R2) function for the default metric type is detailed
in Section 5.3. The LoopFree(R1,R2) functions for other metric types
are beyond the scope of this document.

5.3. Default Metric Type

AODVv2's default metric type (DEFAULT_METRIC_TYPE) is HopCount, and
is the only metric described in detail in this document. Alternate
metrics are discussed in Section 5.4.

For the HopCount metric:

o Cost(L) := 1

o Cost(R) := Sum (Cost(L) of each link in the route), i.e., the hop
count between the router calculating the cost, and the destination
of the route

o LoopFree(R1, R2) returns TRUE when the cost of R1 is less than or
equal to the cost of R2, i.e., Cost(R1) <= Cost(R2)

o MAX_METRIC[HopCount] := MAX_HOPCOUNT

The LoopFree function for the HopCount metric is derived from the
fact that route cost increases with number of hops. When examining
two routes, the route with higher cost may include the route with
lower cost as a sub-section of its route. Therefore, an advertised
route with higher cost than the corresponding stored route could
include the stored route as a sub-section. Replacing the stored
route with the received route could form a routing loop. LoopFree
returns FALSE in this case to indicate that an advertised route with
higher cost is not to be used to update a stored route, even if the
stored route is Invalid.



Perkins, et al. Expires January 7, 2016 [Page 18]

Internet-Draft AODVv2 July 2015


MAX_HOPCOUNT is a constant defined in Section 11.2. It MUST be
larger than the AODVv2 network diameter, in order that AODVv2
protocol messages may reach their intended destinations.

5.4. Alternate Metric Types

Some applications may require metric information other than hop
count. For this reason, AODVv2 enables route selection based on
alternate metric types.

Using non-default metrics in an AODVv2 message requires the inclusion
of the MetricType data element.

Alternate metrics may have different types and ranges, for example
integers or floating point numbers, or restricted subsets thereof.
Therefore the size of the metric field in route messages may vary.
See Section 12.3 for further information on MetricType number
allocation and size.

Metrics might be classified as additive, concave, convex, or
multiplicative as discussed in [RFC6551]. Where Cost and LoopFree
functions can be developed for a metric type, it can be supported by
AODVv2.

AODVv2 can support additive metrics using the Cost(R) and
LoopFree(R1, R2) functions defined for the default metric.
Furthermore, any strictly increasing metric can be supported using
the LoopFree function defined. It is, however, out of the scope of
this document to specify for alternate metrics the correct Cost(L),
Cost(R), and LoopFree() functions. Where possible these should take
into account differences in the link cost in each direction.

6. AODVv2 Protocol Operations

The AODVv2 protocol's operations include managing sequence numbers,
monitoring adjacent AODVv2 routers, performing route discovery and
dealing with requests from other routers, processing incoming route
information and updating the route table, suppressing redundant
messages, maintaining the route table and reporting broken routes.
These processes are discussed in detail in the following sections.

6.1. Initialization

During initialization where the previous sequence number is unknown,
or if the sequence number is lost at any point, an AODVv2 router
resets its sequence number(s) to one (1). However, other AODVv2
routers may still hold sequence number information this router
previously issued. Since sequence number information will be removed



Perkins, et al. Expires January 7, 2016 [Page 19]

Internet-Draft AODVv2 July 2015


if there have been no sequence number updates in MAX_SEQNUM_LIFETIME,
the initializing router must wait for MAX_SEQNUM_LIFETIME before it
creates any messages containing its sequence number. It can then be
sure that the information it sends will not be considered stale.

Until MAX_SEQNUM_LIFETIME after its sequence number is reset, the
router SHOULD not create RREQ or RREP messages.

During this wait period, the router can do the following:

o Process information in a received RREQ or RREP message to learn a
route to the originator or target

o Send a RREP_Ack

o Regenerate a received RREQ or RREP

o Forward data packets to Router Clients, and to other routers, if a
route exists

o Create, process and regenerate RERR messages

6.2. Adjacency Monitoring

An adjacency is a bidirectional relationship between neighboring
AODVv2 routers for the purpose of exchanging routing information.
Not every pair of neighboring routers will necessarily form an
adjacency, but AODVv2 routers MUST monitor connectivity to
neighboring AODVv2 routers along potential routes and MUST NOT
establish routes over uni-directional links, since packet losses are
likely to occur and route establishment can fail.

The default approach for monitoring bidirectional connectivity to the
next hop toward OrigAddr is to request acknowledgement of Route Reply
messages. Receipt of an acknowledgement proves that bidirectional
connectivity exists. All AODVv2 routers MUST support this process,
which is explained in Section 7.2 and Section 7.3.

Bidirectionality to the next hop toward TargAddr is confirmed by
receipt of the Route Reply message, since a Route Reply message is a
reply to a Route Request message which previously crossed the link in
the opposite direction.

When routers perform other operations such as those from the list
below, these can be used as additional indications of connectivity:

o NHDP HELLO Messages [RFC6130]




Perkins, et al. Expires January 7, 2016 [Page 20]

Internet-Draft AODVv2 July 2015


o Route timeout

o Lower layer triggers, e.g. message reception or link status
notifications

o TCP timeouts

o Promiscuous listening

o Other monitoring mechanisms or heuristics

For example, receipt of a Neighborhood Discovery Protocol HELLO
message with the receiving router listed as a neighbor is a signal of
bidirectional connectivity. In this case, acknowledgement of a RREP
message sent to that neighbor is unnecessary. Similarly, if AODVv2
receives notification of a timeout, this may be due to a
disconnection. The AODVv2 router SHOULD attempt to verify
connectivity by requesting acknowledgement of the next RREP sent to
that neighbor.

The Neighbor Table (Section 4.3) gives the last known state of the
neighbor adjacency, either Confirmed, Unknown, or Blacklisted. Until
bidirectionality is confirmed, the state is Unknown, and
acknowledgement of RREP messages MUST be requested. If the state is
Confirmed, the acknowledgement request is unnecessary. If
bidirectionality cannot be confirmed, the state is Blacklisted.
RREQs received from a blacklisted router, or any router over a link
that is known to be incoming-only, MUST be disregarded.

Neighbor state is updated as follows:

o If a link to a neighbor is determined to be unidirectional, either
by failure to acknowledge a RREP, or by some other means, the
neighbor MUST be marked as blacklisted.

o If a notification indicates that there may be a problem with
bidirectionality, and the neighbor state is currently Confirmed,
the state SHOULD be set to Unknown to force acknowledgement of the
next RREP sent to the neighbor.

o If an indication of bidirectional connectivity is received, the
neighbor state SHOULD be set to Confirmed.

o If the neighbor state is Blacklisted and the reset time is
reached, the neighbor state SHOULD be reset to Unknown and the
neighbor SHOULD again be allowed to participate in route
discovery.




Perkins, et al. Expires January 7, 2016 [Page 21]

Internet-Draft AODVv2 July 2015


If a link to a neighbor is determined to be broken, the neighbor
entry should be removed.

6.3. Message Transmission

In its default mode of operation, AODVv2 sends [RFC5444] formatted
messages using the parameters for port number and IP protocol
specified in [RFC5498]. Mapping of AODVv2 data elements to RFC 5444
is detailed in Section 8.

Unless otherwise specified, AODVv2 multicast messages are sent to the
link-local multicast address LL-MANET-Routers [RFC5498]. All AODVv2
routers MUST subscribe to LL-MANET-Routers [RFC5498] to receive
AODVv2 messages.

Implementations are free to choose their own heuristics for reducing
multicast overhead. Some methods for doing so are described in
[RFC6621]. AODVv2 does not specify which method should be used to
restrict the set of AODVv2 routers that have the responsibility to
regenerate multicast messages. Note that multicast messages MAY be
sent via unicast. For example, this may occur for certain link-types
(non-broadcast media), for manually configured router adjacencies, or
in order to improve robustness.

When multiple interfaces are available, a node transmitting a
multicast message to LL-MANET-Routers MUST send the message on all
interfaces that have been configured for AODVv2 operation, as given
in the AODVv2_INTERFACES list (Section 4.1). Similarly, AODVv2
routers MUST subscribe to LL-MANET-Routers on all their AODVv2
interfaces.

To avoid congestion, each AODVv2 router's rate of message generation
(CONTROL_TRAFFIC_LIMIT) SHOULD be limited and administratively
configurable. The implementation is free to choose the algorithm for
limiting messages, including prioritizing messages when approaching
the limit. AODVv2 messages SHOULD be discarded in the following
order: RERR for invalidated routes, RREQ, RREP, RERR for
undeliverable packet, RREP_Ack.

IP packets containing AODVv2 protocol messages SHOULD be given
priority queuing and channel access.

6.4. Route Discovery, Retries and Buffering

AODVv2's RREQ and RREP messages are used for route discovery and are
together known as route messages (RteMsgs). The main difference
between the two messages is that, by default, RREQ messages are
multicast to solicit a RREP, whereas RREP is unicast as a response to



Perkins, et al. Expires January 7, 2016 [Page 22]

Internet-Draft AODVv2 July 2015


the RREQ. The constants used in this section are defined in
Section 11.

When an AODVv2 router needs to forward a data packet (with source
address OrigAddr and destination address TargAddr) from one of its
Router Clients, it needs a route to the packet's destination. If no
route exists, the AODVv2 router generates and multicasts a Route
Request message (RREQ) using OrigAddr and TargAddr. The procedure
for this is described in Section 7.1.1. The AODVv2 router is
referred to as RREQ_Gen.

Data packets awaiting a route MAY be buffered by RREQ_Gen. Buffering
of data packets can have both positive and negative effects (albeit
usually positive). Real-time traffic, voice, and scheduled delivery
may suffer if packets are buffered and subjected to delays, but TCP
connection establishment will benefit if packets are queued while
route discovery is performed.

The packet buffer is configured with a fixed limited size of
BUFFER_SIZE_PACKETS or BUFFER_SIZE_BYTES. Determining which packets
to discard first when the buffer is full is a matter of policy at
each AODVv2 router. Nodes without sufficient memory available for
buffering SHOULD have buffering disabled by configuring
BUFFER_SIZE_PACKETS := 0 and BUFFER_SIZE_BYTES := 0. This will
affect the latency for launching TCP applications to new
destinations.

RREQ_Gen awaits reception of a Route Reply message (RREP) containing
a route toward TargAddr. A RREQ from TargAddr would also fulfil the
request, if adjacency to the next hop is already confirmed. If a
route to TargAddr is not learned within RREQ_WAIT_TIME, RREQ_Gen MAY
retry the route discovery by generating another RREQ with a new
sequence number. To reduce congestion in a network, repeated
attempts at route discovery for a particular target address SHOULD
utilize a binary exponential backoff, as described in [RFC3561],
where the wait time is doubled for each retry.

The RREQ is received by neighboring AODVv2 routers, and processed and
regenerated as described in Section 7.1. Intermediate routers learn
a potential route to OrigAddr from the RREQ. The router responsible
for TargAddr responds by generating a Route Reply message (RREP) and
sends it back toward RREQ_Gen using the route to OrigAddr learned
from the RREQ. Each intermediate router regenerates the RREP and
unicasts toward OrigAddr.

Links which are not bidirectional cause problems. If a RREP is not
received at an intermediate router, the RREP cannot be regenerated
and will never reach RREQ_Gen. However, since routers monitor



Perkins, et al. Expires January 7, 2016 [Page 23]

Internet-Draft AODVv2 July 2015


adjacencies (Section 6.2), the loss of the RREP will cause the last
router which regenerated the RREP to blacklist the router which did
not receive it. When a timeout occurs at RREQ_Gen, a new RREQ may be
regenerated. When the new RREQ arrives again via the blacklisted
router, it will be ignored, and the RREQ should discover a different
path.

Route discovery SHOULD be considered to have failed after
DISCOVERY_ATTEMPTS_MAX and the corresponding wait time for a RREP
response to the final RREQ. After the attempted route discovery has
failed, RREQ_Gen MUST wait at least RREQ_HOLDDOWN_TIME before
attempting another route discovery to the same destination. Any data
packets buffered for TargAddr MUST also be dropped and a Destination
Unreachable ICMP message (Type 3) with a code of 1 (Host Unreachable
Error) SHOULD be delivered to the source of the data packet. The
source may be an application on RREQ_Gen itself, or on a Router
Client with address OrigAddr.

If RREQ_Gen does receive a route message containing a route to
TargAddr within the timeout, it processes the message according to
Section 7. When a valid route is installed, the router can begin
sending the buffered packets. Any retry timers for the corresponding
RREQ SHOULD be cancelled.

During route discovery, all routers on the path learn a route to both
OrigAddr and TargAddr, making the constructed route bidirectional.

6.5. Processing Received Route Information

All AODVv2 route messages contain a route. A Route Request (RREQ)
includes a route to OrigAddr, and a Route Reply (RREP) contains a
route to TargAddr.

All AODVv2 routers that receive a route message can store the route
contained within it. Incoming information is first checked to verify
that it is both safe to use and offers an improvement to existing
information. This process is explained in Section 6.5.1. The route
table may then be updated according to Section 6.5.2.

In the processes below, RteMsg is used to denote the route message,
AdvRte is used to denote the route contained within it, and Route
denotes a stored routing table entry which matches AdvRte.

AdvRte has the following properties:

o AdvRte.Address := RteMsg.OrigAddr (in RREQ) or RteMsg.TargAddr (in
RREP)




Perkins, et al. Expires January 7, 2016 [Page 24]

Internet-Draft AODVv2 July 2015


o AdvRte.PrefixLength := RteMsg.OrigPrefixLen (in RREQ) or
RteMsg.TargPrefixLen (in RREP) if included, or if no prefix length
was included in RteMsg, the address length, in bits, of
AdvRte.Address

o AdvRte.SeqNum := RteMsg.OrigSeqNum (in RREQ) or RteMsg.TargSeqNum
(in RREP)

o AdvRte.NextHop := IP.SourceAddress (the address of the router from
which the AdvRte was received)

o AdvRte.MetricType := RteMsg.MetricType if included, or
DEFAULT_METRIC_TYPE if not

o AdvRte.Metric := RteMsg.Metric

o AdvRte.Cost := Cost(R) using the cost function associated with the
route's metric type, where L is the link from the advertising
router, i.e. Cost(R) = AdvRte.Metric + Cost(L) for the default
metric type

o AdvRte.ValidityTime := RteMsg.ValidityTime, if included

If prefix length information is present, the route describes the
subnet on which the address resides.

6.5.1. Evaluating Route Information

To determine whether the advertised route should be used to update
the routing table, the incoming route information MUST be processed
as follows:

1. Search for a routing table entry (Route) matching AdvRte's
address, prefix length and metric type

* If no matching route exists, AdvRte SHOULD be used to update
the routing table. Multiple routes to the same destination
may exists with different metric types.

* If all matching routes have State set to Unconfirmed, AdvRte
SHOULD be used to update the routing table, so that it
contains multiple Unconfirmed routes. If an Unconfirmed route
becomes valid in future, any remaining Unconfirmed routes
which would not offer improvement will be expunged.

* If a matching route exists with State set to Active, Idle, or
Invalid, continue to Step 2.




Perkins, et al. Expires January 7, 2016 [Page 25]

Internet-Draft AODVv2 July 2015


2. Compare sequence numbers

* If AdvRte is more recent (AdvRte.SeqNum > Route.SeqNum),
AdvRte MUST be used to update the routing table.

* If AdvRte is stale (AdvRte.SeqNum < Route.SeqNum), AdvRte MUST
NOT be used to update the routing table.

* If the sequence numbers are equal, continue to Step 3.

3. Check that AdvRte is safe against routing loops (see Section 5.2)

* If LoopFree(AdvRte, Route) returns FALSE, AdvRte MUST NOT be
used to update the routing table because using the incoming
information might cause a routing loop.

* If LoopFree(AdvRte, Route) returns TRUE, continue to Step 3.

4. Compare route costs

* For some metric types, including the default metric specified
in Section 5.3, the best route is the route with the lowest
metric value. For other metric types, the best route may be
the route with the highest metric.

* If AdvRte is better, it SHOULD be used to update the routing
table because it offers improvement.

* If AdvRte is not better (i.e., it is worse or equal) and Route
is valid, AdvRte MUST NOT be used to update the routing table
because it does not offer any improvement.

* If AdvRte is not better (i.e., it is worse or equal) but Route
is Invalid, AdvRte SHOULD be used to update the routing table
because it can safely repair the existing Invalid route.

If the advertised route SHOULD be used to update the routing table,
the procedure in Section 6.5.2 is followed.

6.5.2. Applying Route Updates

If AdvRte is from a RREQ message, the next hop neighbor may not be
confirmed as adjacent (see Section 4.3). If Neighbor.State is
Unknown, the route may not be viable, but it MUST be stored to allow
a corresponding RREP to be sent. It SHOULD NOT yet be used to
forward data. Route.State will be set to Unconfirmed to indicate
this. If a valid route already exists for this destination, the
Unconfirmed route should be stored as an additional entry.



Perkins, et al. Expires January 7, 2016 [Page 26]

Internet-Draft AODVv2 July 2015


The route update is applied as follows:

1. If no existing entry in the route table matches AdvRte on
address, prefix length and metric type, continue to Step 3 and
create a new route table entry.

2. If a matching entry exists:

* If AdvRte.NextHop is not equal to Route.NextHop, and
AdvRte.NextHop's Neighbor.State is Unknown and Route.State is
Active or Idle, the current route is valid but the advertised
route may offer improvement, if it can be confirmed. Continue
to Step 3 and create a new route table entry. It can replace
the original route when Neighbor.State is set to Confirmed.

* If AdvRte.NextHop's Neighbor.State is Unknown and Route.State
is Invalid, continue to Step 4 and update the existing route
table entry.

* If AdvRte.NextHop's Neighbor.State is Confirmed, continue to
Step 4 and update the existing route table entry.

3. Create a route table entry and initialize as follows:

* Route.Address := AdvRte.Address

* Route.PrefixLength := AdvRte.PrefixLength (if included), or
the length, in bits, of Route.Address (32 for IPv4 or 128 for
IPv6)

* Route.MetricType := AdvRte.MetricType

4. Update the route table entry as follows:

* Route.SeqNum := AdvRte.SeqNum

* Route.NextHop := AdvRte.NextHop

* Route.NextHopInterface := interface on which RteMsg was
received

* Route.Metric := AdvRte.Cost

* Route.LastUsed := CurrentTime

* Route.LastSeqNumUpdate := CurrentTime





Perkins, et al. Expires January 7, 2016 [Page 27]

Internet-Draft AODVv2 July 2015


* Route.ExpirationTime := CurrentTime + AdvRte.ValidityTime if a
validity time exists, otherwise MAX_TIME

5. If a new route was created, or if the existing Route.State is
Invalid or Unconfirmed, update as follows:

* Route.State := Unconfirmed (if the next hop's Neighbor.State
is Unknown) or Idle

6. If an existing route changed from Invalid or Unconfirmed to
become Idle, any matching inferior routes should be expunged.

7. If this update results in a valid route which fulfills an
outstanding route discovery, the associated timers can be
cancelled and any buffered packets for this route can be
forwarded.

6.6. Suppressing Redundant Messages

When route messages are flooded in a MANET, an AODVv2 router may
receive multiple similar messages. Regenerating every one of these
gives little additional benefit, and generates unnecessary signaling
traffic and interference.

Each AODVv2 router stores information about recently received route
messages in the AODVv2 Multicast RteMsg Table (Section 4.5).
Received RteMsgs are tested against previously received RteMsgs, and
if determined to be redundant, regeneration can be avoided. Where
necessary, regeneration is performed using the processes in
Section 7.

To determine if a received RREQ is redundant:

1. Search for an entry in the RteMsg Table with the same
MessageType, OrigAddr, TargAddr, and MetricType

* If there is none, create an entry to store information about
the received RREQ and regenerate the RREQ.

* If there is an entry, update the timestamp field, since
comparable RteMsgs are still traversing the network, and
continue to Step 2.

2. Compare the sequence numbers

* If the entry has a lower OrigSeqNum than the received RREQ,
update the entry using information from the new RREQ and
regenerate the RREQ.



Perkins, et al. Expires January 7, 2016 [Page 28]

Internet-Draft AODVv2 July 2015


* If the entry has a higher OrigSeqNum than the received RREQ,
do not update the entry and do not regenerate the RREQ.

* If the entry has the same OrigSeqNum, continue to Step 3.

3. Compare the metric values

* If the entry has a Metric that is worse than the received
RREQ, update the entry using information from the new RREQ.

* If the entry has a Metric that is better than the received
RREQ, do not update the entry.

* In both cases, the RREQ MAY be suppressed to avoid extra
control traffic. However, if the processing of the RREQ
results in an update to the route table, the RREQ MAY be
regenerated to ensure other routers have up-to-date
information.

6.7. Route Maintenance

Route maintenance involves monitoring and updating route state,
handling route timeouts and reporting routes that become Invalid.

Before using a route to forward a packet, an AODVv2 router MUST check
the status of the route (Section 6.7.1). If the route is valid, it
MUST be marked as Active and its LastUsed timestamp MUST be updated,
before forwarding the packet to the route's next hop. If there is no
valid route, this MUST be reported to the packet's source (see
Section 6.7.2).

6.7.1. Route State

During normal operation, AODVv2 does not require any explicit
timeouts to manage the lifetime of a route. At any time, any route
table entry can be examined and updated according to the rules below.
Route state should be checked before packet forwarding and before any
operation based on route state.

The four possible states for an AODVv2 route are Active, Idle,
Invalid, and Unconfirmed, as defined in Section 4.6.

Active
If an Active route is not timed (i.e., its ExpirationTime is
MAX_TIME), it becomes Idle if not used within ACTIVE_INTERVAL. A
timed route (i.e., a route with ExpirationTime not equal to
MAX_TIME) remains Active until its expiration time, after which it
MAY either be expunged or marked as Invalid.



Perkins, et al. Expires January 7, 2016 [Page 29]

Internet-Draft AODVv2 July 2015


Idle
An Idle route becomes Active if it is used to forward a packet.
If not used, an Idle route remains idle for MAX_IDLETIME before
becoming an Invalid route.

Invalid
An Invalid route MAY be maintained until MAX_SEQNUM_LIFETIME after
the last sequence number update. This allows incoming information
to be assessed for freshness. After this time it should be
expunged.

Unconfirmed
An Unconfirmed route becomes Idle when adjacency with the next hop
router is confirmed, or will be expunged if the neighbor is
blacklisted, or at MAX_SEQNUM_LIFETIME after the last sequence
number update.

In all cases, if the time since the route's last sequence number
update exceeds MAX_SEQNUM_LIFETIME, the sequence number must be
removed from the route. If the route is Invalid or Unconfirmed at
this time, it MUST be expunged. Active and Idle routes can continue
to be used to forward packets. The removal of the sequence number is
required to ensure that any AODVv2 routers following the
initialization procedure can safely begin routing functions using a
new sequence number.

Appendix D.1.1 contains an algorithmic representation of this timeout
behavior.

Routes can become Invalid before a timeout occurs:

o If a link breaks, all routes using that link as the next hop MUST
immediately be marked as Invalid.

o If a Route Error (RERR) message containing the route is received
from the route's next hop, the route MUST immediately be marked as
Invalid.

When an Unconfirmed route is set as Idle as a result of the adjacency
with Route.NextHop being Confirmed (see Section 4.3), any inferior
matching routes MUST be expunged.

Memory constrained devices MAY choose to expunge routes from the
AODVv2 route table before their expiration time, but MUST adhere to
the following rules:

o An Active route MUST NOT be expunged.




Perkins, et al. Expires January 7, 2016 [Page 30]

Internet-Draft AODVv2 July 2015


o An Idle route SHOULD NOT be expunged.

o Any Invalid route MAY be expunged; least recently used Invalid
routes SHOULD be expunged first.

o An Unconfirmed route MUST NOT be expunged if it was installed
within the last RREQ_WAIT_TIME. Otherwise, it MAY be expunged.

6.7.2. Reporting Invalid Routes

When an Active route becomes Invalid as a result of a broken link or
a received Route Error (RERR) message, other routers should be
informed by sending a RERR message containing details of the
invalidated route.

A RERR message should also be sent when an AODVv2 router receives a
packet to forward on behalf of another router but does not have a
valid route for the destination of the packet. This packet may be a
data packet or, in rare cases, a RREP message, if the route to the
request originator has been lost. The packet or message triggering
the RERR MUST be discarded.

Generation of a RERR message is described in Section 7.4.1.

7. AODVv2 Protocol Messages

AODVv2 defines four message types: Route Request (RREQ), Route Reply
(RREP), Route Reply Acknowledgement (RREP_Ack), and Route Error
(RERR).

Each AODVv2 message is defined as a set of data elements. Rules for
the generation, reception and regeneration of each message type are
described in the following sections. Section 8 discusses how the
data elements map to RFC 5444 Message TLVs, Address Blocks, and
Address TLVs.

7.1. Route Request (RREQ) Message

Route Request messages are used in route discovery operations to
request a route to a specified target address. RREQ messages have
the following general structure:










Perkins, et al. Expires January 7, 2016 [Page 31]

Internet-Draft AODVv2 July 2015


+-----------------------------------------------------------------+
| msg_hop_limit, (optional) msg_hop_count |
+-----------------------------------------------------------------+
| AddressList |
+-----------------------------------------------------------------+
| PrefixLengthList (optional) |
+-----------------------------------------------------------------+
| OrigSeqNum, (optional) TargSeqNum |
+-----------------------------------------------------------------+
| MetricType (optional) |
+-----------------------------------------------------------------+
| OrigMetric |
+-----------------------------------------------------------------+
| ValidityTime (optional) |
+-----------------------------------------------------------------+

Figure 1: RREQ message structure

RREQ Data Elements

msg_hop_limit
The remaining number of hops allowed for dissemination of the
RREQ message.

msg_hop_count
The number of hops already traversed during dissemination of
the RREQ message.

AddressList
Contains OrigAddr and TargAddr, the source and destination
addresses of the packet for which a route is requested.
OrigAddr and TargAddr MUST be routable unicast addresses.

PrefixLengthList
Contains OrigPrefixLen, i.e., the length, in bits, of the
prefix associated with OrigAddr. If omitted, the prefix length
is equal to OrigAddr's address length in bits. If OrigAddr
resides on a subnet configured as a Router Client, the prefix
length represents the number of bits in the subnet mask.

OrigSeqNum
The sequence number associated with OrigAddr.

TargSeqNum
A sequence number associated with TargAddr. This may be
included if an Invalid route exists to the target. This is
useful for the optional Intermediate RREP feature (see
Section 10.3).



Perkins, et al. Expires January 7, 2016 [Page 32]

Internet-Draft AODVv2 July 2015


MetricType
The type of metric associated with OrigMetric. This element
can be omitted if the default metric type is used.

OrigMetric
The metric associated with the route to OrigAddr, as measured
by the sender of the message.

ValidityTime
The length of time that the message sender is willing to offer
a route toward OrigAddr. Omitted if no time limit is imposed.

7.1.1. RREQ Generation

A RREQ is generated when a packet needs to be forwarded for a Router
Client, and no valid route currently exists for the packet's
destination.

Before creating a RREQ, the router should check if a RREQ has
recently been sent for the requested destination. If so, and the
wait time for a reply has not yet been reached, the router should
continue to await a response without generating a new RREQ. If the
timeout has been reached, a new RREQ may be generated. If buffering
is configured, the incoming packet SHOULD be buffered until the route
discovery is completed.

If the limit for the rate of AODVv2 control message generation has
been reached, no message should be generated.

To generate the RREQ, the router (referred to as RREQ_Gen) follows
this procedure:

1. Set msg_hop_limit := MAX_HOPCOUNT

2. Set msg_hop_count := 0, if including it

3. Set AddressList := {OrigAddr, TargAddr}

4. For the PrefixLengthList:

* If OrigAddr resides on a Router Client subnet, set
PrefixLengthList := {OrigPrefixLen, null}.

* Otherwise, omit PrefixLengthList.

5. For OrigSeqNum:





Perkins, et al. Expires January 7, 2016 [Page 33]

Internet-Draft AODVv2 July 2015


* Increment the SeqNum associated with OrigAddr as specified in
Section 4.4.

* Set OrigSeqNum := SeqNum.

6. For TargSeqNum:

* If an Invalid route exists matching TargAddr using longest
prefix matching and has a valid sequence number, set
TargSeqNum := route's sequence number.

* If no Invalid route exists matching TargAddr, or the route
doesn't have a sequence number, omit TargSeqNum.

7. Include the MetricType data element if requesting a route for a
non-default metric type, and set the type accordingly

8. Set OrigMetric := Route[OrigAddr].Metric

9. Include the ValidityTime data element if advertising that the
route to OrigAddr via this router is offered for a limited time,
and set ValidityTime accordingly

This AODVv2 message is used to create a corresponding RFC 5444
message (see Section 8) which is multicast, by default, to LL-MANET-
Routers on all interfaces configured for AODVv2 operation.

7.1.2. RREQ Reception

Upon receiving a RREQ, an AODVv2 router performs the following steps:

1. If the sender is blacklisted (Section 4.3), check the entry's
reset time

* If CurrentTime < Remove Time, ignore this RREQ for further
processing.

* If CurrentTime >= Remove Time, reset the neighbor state to
Unknown and continue to Step 2.

2. Verify that the message hop count, if included, hasn't exceeded
MAX_HOPCOUNT

* If so, ignore this RREQ for further processing.

3. Verify that the message contains the required data elements:
msg_hop_limit, OrigAddr, TargAddr, OrigSeqNum, and OrigMetric,




Perkins, et al. Expires January 7, 2016 [Page 34]

Internet-Draft AODVv2 July 2015


and that OrigAddr and TargAddr are valid addresses (routable and
unicast)

* If not, ignore this RREQ for further processing.

4. If the MetricType data element is present, check that the metric
type is known

* If not, ignore this RREQ for further processing.

5. Verify that the cost of the advertised route will not exceed the
maximum allowed metric value for the metric type (Metric <=
MAX_METRIC[MetricType] - Cost(L))

* If it will, ignore this RREQ for further processing.

6. Process the route to OrigAddr as specified in Section 6.5.1

7. Check if the message is redundant by comparing to entries in the
RteMsg table (Section 6.6)

* If redundant, ignore this RREQ for further processing.

* If not redundant, save the information in the RteMsg table to
identify future duplicates and continue processing.

8. Check if the TargAddr belongs to one of the Router Clients

* If so, generate a RREP as specified in Section 7.2.1.

* If not, continue to RREQ regeneration.

7.1.3. RREQ Regeneration

By regenerating a RREQ, a router advertises that it will forward
packets to the OrigAddr contained in the RREQ according to the
information enclosed. The router MAY choose not to regenerate the
RREQ, though this could decrease connectivity in the network or
result in non-optimal paths. The full set of circumstances under
which a router may avoid regenerating a RREQ are not declared in this
document, though examples include the router being heavily loaded or
low on energy and therefore unwilling to advertise routing capability
for more traffic.

The RREQ should not be regenerated if the limit for the rate of
AODVv2 control message generation has been reached.

The procedure for RREQ regeneration is as follows:



Perkins, et al. Expires January 7, 2016 [Page 35]

Internet-Draft AODVv2 July 2015


1. Set msg_hop_limit := received msg_hop_limit - 1

2. If msg_hop_limit is now zero, do not continue the regeneration
process

3. Set msg_hop_count := received msg_hop_count + 1, if included,
otherwise omit msg_hop_count

4. Set AddressList, PrefixLengthList, sequence numbers and
MetricType to the values in the received RREQ

5. Set OrigMetric := Route[OrigAddr].Metric

6. If the received RREQ contains a ValidityTime, or if the
regenerating router wishes to limit the time that it offers a
route to OrigAddr, the regenerated RREQ MUST include a
ValidityTime data element

* The ValidityTime is either the ValidityTime the previous
AODVv2 router specified, or the ValidityTime this router
wishes to impose, whichever is lower.

This AODVv2 message is used to create a corresponding RFC 5444
message (see Section 8) which is multicast, by default, to LL-MANET-
Routers on all interfaces configured for AODVv2 operation. However,
the regenerated RREQ can be unicast to the next hop address of the
route toward TargAddr, if known.

7.2. Route Reply (RREP) Message

A Route Reply message is sent in response to a Route Request message
and offers a route to the Target Address in the RREQ.

The RREP is sent by unicast to the next hop router on the route to
OrigAddr, if the next hop is confirmed as an adjacent neighbor.
Otherwise, the RREP is sent multicast to LL-MANET-Routers, including
the AckReq data element in the message to indicate the intended next
hop address and request acknowledgement to confirm the neighbor
adjacency.

RREP messages have the following general structure:










Perkins, et al. Expires January 7, 2016 [Page 36]

Internet-Draft AODVv2 July 2015


+-----------------------------------------------------------------+
| msg_hop_limit, (optional) msg_hop_count |
+-----------------------------------------------------------------+
| AckReq (optional) |
+-----------------------------------------------------------------+
| AddressList |
+-----------------------------------------------------------------+
| PrefixLengthList (optional) |
+-----------------------------------------------------------------+
| TargSeqNum |
+-----------------------------------------------------------------+
| MetricType (optional) |
+-----------------------------------------------------------------+
| TargMetric |
+-----------------------------------------------------------------+
| ValidityTime (optional) |
+-----------------------------------------------------------------+

Figure 2: RREP message structure

RREP Data Elements

msg_hop_limit
The remaining number of hops allowed for dissemination of the
RREP message.

msg_hop_count
The number of hops already traversed during dissemination of
the RREP message.

AckReq
The address of the intended next hop of the RREP. This data
element is used when the RREP is multicast because the next hop
toward OrigAddr is a neighbor with Unknown state. It indicates
that an acknowledgement to the RREP is requested by the sender
from the intended next hop (see Section 6.2).

AddressList
Contains OrigAddr and TargAddr, the source and destination
addresses of the packet for which a route is requested.
OrigAddr and TargAddr MUST be routable unicast addresses.

PrefixLengthList
Contains TargPrefixLen, i.e., the length, in bits, of the
prefix associated with TargAddr. If omitted, the prefix length
is equal to TargAddr's address length, in bits. If TargAddr
resides on a subnet configured as a Router Client, the prefix
length represents the number of bits in the subnet mask.



Perkins, et al. Expires January 7, 2016 [Page 37]

Internet-Draft AODVv2 July 2015


TargSeqNum
The sequence number associated with TargAddr.

MetricType
The type of metric associated with TargMetric. This element
can be omitted if the default metric type is used.

TargMetric
The metric associated with the route to TargAddr, as seen from
the sender of the message.

ValidityTime
The length of time that the message sender is willing to offer
a route toward TargAddr. Omitted if no time limit is imposed.

7.2.1. RREP Generation

A RREP is generated when a RREQ arrives for one of the AODVv2
router's Router Clients.

Before creating a RREP, the router should check if the corresponding
RREQ is redundant, i.e., a response has already been generated, or if
the limit for the rate of AODVv2 control message generation has been
reached. If so, the RREP should not be created.

If the next hop neighbor on the route to OrigAddr is not yet
confirmed as adjacent (as described in Section 6.2), the RREP MUST
include an AckReq data element including the intended next hop
address, in order to perform adjacency monitoring. If the adjacency
is already confirmed, it can be omitted. The AckReq data element
indicates that an acknowledgement to the RREP is requested from the
intended next hop router in the form of a Route Reply Acknowledgement
(RREP_Ack).

Implementations may allow a number of retries of the RREP if an
acknowledgement is not received within RREP_Ack_SENT_TIMEOUT,
doubling the timeout with each retry, up to a maximum of
RREP_RETRIES, using the same exponential backoff described in
Section 6.4 for RREQ retries. Adjacency confirmation MUST be
considered to have failed after the wait time for a RREP_Ack response
to the final RREP. The next hop router MUST be marked as blacklisted
(Section 4.3), and any installed routes with next hop set to the
newly blacklisted router should become Invalid.

To generate the RREP, the router (also referred to as RREP_Gen)
follows this procedure:





Perkins, et al. Expires January 7, 2016 [Page 38]

Internet-Draft AODVv2 July 2015


1. Set msg_hop_limit := msg_hop_count from the received RREQ
message, if it was included, or MAX_HOPCOUNT if it was not
included

2. Set msg_hop_count := 0, if including it

3. If adjacency with the next hop toward OrigAddr is not already
confirmed, include the AckReq data element with the address of
the intended next hop router

4. Set Address List := {OrigAddr, TargAddr}

5. For the PrefixLengthList:

* If TargAddr resides on a Router Client subnet, set
PrefixLengthList := {null, TargPrefixLen}.

* Otherwise, omit PrefixLengthList.

6. For the TargSeqNum:

* Increment the SeqNum associated with TargAddr as specified in
Section 4.4.

* Set TargSeqNum := SeqNum.

7. Include the MetricType data element if the route requested is for
a non-default metric type, and set the type accordingly

8. Set TargMetric := Route[TargAddr].Metric

9. Include the ValidityTime data element if advertising that the
route to TargAddr via this router is offered for a limited time,
and set ValidityTime accordingly

This AODVv2 message is used to create a corresponding RFC 5444
message (see Section 8). If the next hop of RREP_Gen's route to
OrigAddr is a neighbor with state Confirmed, the RREP is unicast to
the IP address of the neighbor. If the neighbor has state Unknown,
the RREP is multicast to LL-MANET-Routers.

7.2.2. RREP Reception

Upon receiving a RREP, an AODVv2 router performs the following steps:

1. If the sender is blacklisted (Section 4.3), but the RREP answers
a recently sent RREQ, the sender state should be set to
Confirmed since a RREP is an indication of adjacency



Perkins, et al. Expires January 7, 2016 [Page 39]

Internet-Draft AODVv2 July 2015


2. Verify that the message hop count, if included, hasn't exceeded
MAX_HOPCOUNT

* If so, ignore this RREQ for further processing.

3. Verify that the message contains the required data elements:
msg_hop_limit, OrigAddr, TargAddr, TargSeqNum, and TargMetric,
and that OrigAddr and TargAddr are valid addresses (routable and
unicast)

* If not, ignore this RREP for further processing.

4. If the MetricType data element is present, check that the metric
type is known

* If not, ignore this RREP for further processing.

5. Verify that the cost of the advertised route will not exceed the
maximum allowed metric value for the metric type (Metric <=
MAX_METRIC[MetricType] - Cost(L))

* If it will, ignore this RREP for further processing.

6. If the AckReq data element is present, check the intended
recipient of the received RREP

* If the receiving router is the intended recipient, send an
acknowledgement as specified in Section 7.3 and continue
processing.

* If the receiving router is not the intended recipient, ignore
this RREP for further processing.

7. Process the route to TargAddr as specified in Section 6.5.1

* If the route to TargAddr fulfills a previously sent RREQ, any
associated timeouts will be cancelled and buffered packets
will be forwarded to TargAddr, but processing continues to
Step 8.

8. Check if the message is redundant by comparing to entries in the
RteMsg table (Section 6.6)

* If redundant, ignore this RREP for further processing.

* If not redundant, save the information in the RteMsg table to
identify future redundant RREP messages and continue
processing.



Perkins, et al. Expires January 7, 2016 [Page 40]

Internet-Draft AODVv2 July 2015


9. Check if the OrigAddr belongs to one of the Router Clients

* If so, no further processing is necessary.

10. Check if a valid (Active or Idle) or Unconfirmed route exists to
OrigAddr

* If so, continue to RREP regeneration.

* If not, a Route Error message SHOULD be transmitted to
TargAddr according to Section 7.4.1 and the RREP should be
discarded and not regenerated.

7.2.3. RREP Regeneration

A received Route Reply message is regenerated toward OrigAddr.
Unless the router is prepared to advertise the route contained within
the received RREP, it halts processing. By regenerating a RREP, a
router advertises that it will forward packets to TargAddr according
to the information enclosed. The router MAY choose not to regenerate
the RREP, in the same way it may choose not to regenerate a RREQ (see
Section 7.1.3), though this could decrease connectivity in the
network or result in non-optimal paths.

The RREP should not be regenerated if the limit for the rate of
AODVv2 control message generation has been reached.

If the next hop neighbor on the route to OrigAddr is not yet
confirmed as adjacent (as described in Section 6.2), the RREP MUST
include an AckReq data element including the intended next hop
address, in order to perform adjacency monitoring. If the adjacency
is already confirmed, the AckReq data element can be omitted. The
AckReq data element indicates that an acknowledgement to the RREP is
requested in the form of a Route Reply Acknowledgement (RREP_Ack)
from the intended next hop router.

The procedure for RREP regeneration is as follows:

1. Set msg_hop_limit := received msg_hop_limit - 1

2. If msg_hop_limit is now zero, do not continue the regeneration
process

3. Set msg_hop_count := received msg_hop_count + 1, if it was
included, otherwise omit msg_hop_count






Perkins, et al. Expires January 7, 2016 [Page 41]

Internet-Draft AODVv2 July 2015


4. If an adjacency with the next hop toward OrigAddr is not already
confirmed, include the AckReq data element with the address of
the intended next hop router

5. Set AddressList, PrefixLengthList, TargSeqNum and MetricType to
the values in the received RREP

6. Set TargMetric := Route[TargAddr].Metric

7. If the received RREP contains a ValidityTime, or if the
regenerating router wishes to limit the time that it will offer a
route to TargAddr, the regenerated RREP MUST include a
ValidityTime data element

* The ValidityTime is either the ValidityTime the previous
AODVv2 router specified, or the ValidityTime this router
wishes to impose, whichever is lower.

This AODVv2 message is used to create a corresponding RFC 5444
message (see Section 8). If the next hop of RREP_Gen's route to
OrigAddr is a neighbor with state Confirmed, the RREP is unicast to
the IP address of the neighbor. If the neighbor has state Unknown,
the RREP is multicast to LL-MANET-Routers.

7.3. Route Reply Acknowledgement (RREP_Ack) Message

The Route Reply Acknowledgement MUST be sent in response to a
received Route Reply which includes an AckReq data element with an
address matching one of the receiving router's IP addresses. When
the RREP_Ack message is received, it confirms the adjacency between
the two routers. The RREP_Ack has no data elements.

7.3.1. RREP_Ack Generation

A RREP_Ack MUST be generated when a received RREP includes the AckReq
data element with the address of the receiving router. The RREP_Ack
should not be generated if the limit for the rate of AODVv2 control
message generation has been reached.

There are no data elements in a RREP_Ack. The RFC 5444
representation is discussed in Section 8. The RREP_Ack is unicast,
by default, to the IP address of the router that requested it.

7.3.2. RREP_Ack Reception

Upon receiving a RREP_Ack, an AODVv2 router performs the following
steps:




Perkins, et al. Expires January 7, 2016 [Page 42]

Internet-Draft AODVv2 July 2015


1. If a RREP_Ack message was expected from the IP source address of
the RREP_Ack, the router cancels any associated timeouts

2. If the RREP_Ack was expected, ensure the router sending the
RREP_Ack is marked with state Confirmed in the Neighbor
Table (Section 4.3)

7.4. Route Error (RERR) Message

A Route Error message is generated by an AODVv2 router to notify
other AODVv2 routers of routes that are no longer available. A RERR
message has the following general structure:

+-----------------------------------------------------------------+
| msg_hop_limit |
+-----------------------------------------------------------------+
| PktSource (optional) |
+-----------------------------------------------------------------+
| AddressList |
+-----------------------------------------------------------------+
| PrefixLengthList (optional) |
+-----------------------------------------------------------------+
| SeqNumList (optional) |
+-----------------------------------------------------------------+
| MetricTypeList (optional) |
+-----------------------------------------------------------------+

Figure 3: RERR message structure

RERR Data Elements

msg_hop_limit
The remaining number of hops allowed for dissemination of the
RERR message.

PktSource
The source IP address of the packet triggering the RERR. If
the RERR is triggered by a broken link, the PktSource data
element is not required.

AddressList
The addresses of the routes no longer available through
RERR_Gen.

PrefixLengthList
The prefix lengths, in bits, associated with the routes no
longer available through RERR_Gen, indicating whether a route
represents a single device or a subnet.



Perkins, et al. Expires January 7, 2016 [Page 43]

Internet-Draft AODVv2 July 2015


SeqNumList
The sequence numbers of the routes no longer available through
RERR_Gen (where known).

MetricTypeList
The types of metric associated with the routes no longer
available through RERR_Gen. This element can be omitted if all
routes use the default metric type.

7.4.1. RERR Generation

A RERR is generated when an AODVv2 router (also referred to as
RERR_Gen) needs to report that a destination is no longer reachable.
There are two events that cause this response:

o If a packet arrives that cannot be forwarded because no valid
route exists for its destination, the RERR generated MUST contain
the PktSource data element and will contain only one unreachable
address. The contents of PktSource and AddressList depend on the
packet that triggered the RERR:

* If the packet is a data packet forwarded by another AODVv2
router, PktSource is set to the source IP address of the
packet, and the AddressList contains the destination IP address
of the packet.

* If the packet contains a RREP message and the route to OrigAddr
has been lost, PktSource is set to the TargAddr of the RREP,
and the AddressList contains the OrigAddr from the RREP.

The prefix length and sequence number MAY be included if known
from an Invalid route entry to the destination of the packet. The
MetricTypeList MAY also be included if a MetricType can be
determined from the packet itself, or if an Invalid route exists
for the packet's destination and the metric type is not
DEFAULT_METRIC_TYPE.

RERR_Gen MUST discard the packet or message that triggered
generation of the RERR.

In order to avoid flooding the network with RERR messages when a
stream of packets to an unreachable address arrives, an AODVv2
router SHOULD determine whether a RERR has recently been sent with
the same unreachable address and PktSource, and SHOULD avoid
creating duplicate RERR messages.

o When a link breaks, multiple routes may become Invalid, and the
RERR generated MAY contain multiple unreachable addresses. If the



Perkins, et al. Expires January 7, 2016 [Page 44]

Internet-Draft AODVv2 July 2015


message contents would cause the MTU to be exceeded, multiple RERR
messages must be sent. The RERR MUST include the MetricTypeList
data element when it contains routes which do not use the
DEFAULT_METRIC_TYPE. The PktSource data element is omitted.

All previously Active routes that used the broken link MUST be
reported. The AddressList, PrefixLengthList, SeqNumList, and
MetricTypeList will contain entries for each route which has
become Invalid.

A RERR message is only sent if an Active route becomes Invalid,
though an AODVv2 router can also include Idle routes that become
Invalid if the configuration parameter ENABLE_IDLE_IN_RERR is set
(see Section 11.3).

Incidentally, if an AODVv2 router receives an ICMP error packet to or
from the address of one of its Router Clients, it simply forwards the
ICMP packet in the same way as any other data packet, and will not
generate any RERR message based on the contents of the ICMP packet.

The RERR should not be generated if the limit for the rate of AODVv2
control message generation has been reached.

To generate the RERR, the router follows this procedure:

1. Set msg_hop_limit := MAX_HOPCOUNT

2. If necessary, include the PktSource data element and set the
value to the source address of the packet triggering the RERR

3. For each route that needs to be reported, while respecting the
interface MTU:

* Insert the route address into the AddressList.

* Insert the prefix length into PrefixLengthList, if known and
not equal to the address length.

* Insert the sequence number into SeqNumList, if known.

* Insert the metric type into MetricTypeList, if known and not
equal to DEFAULT_METRIC_TYPE.

4. If interface MTU would be exceeded, create additional RERR
messages

The AODVv2 message is used to create a corresponding RFC 5444 message
(see Section 8).



Perkins, et al. Expires January 7, 2016 [Page 45]

Internet-Draft AODVv2 July 2015


If the RERR is sent in response to an undeliverable packet or
message, it SHOULD be sent unicast to the next hop on the route to
PktSource, or alternatively it MUST be multicast to LL-MANET-Routers.

If the RERR is sent in response to a broken link, the RERR is, by
default, multicast to LL-MANET-Routers.

If the optional precursor lists feature (see Section 10.2) is
enabled, the RERR is unicast to the precursors of the routes being
reported.

7.4.2. RERR Reception

Upon receiving a RERR, an AODVv2 router performs the following steps:

1. Verify that the message contains the required data elements:
msg_hop_limit and at least one unreachable address

* If not, ignore this RREP for further processing.

2. For each address in the AddressList, check that:

* The address is valid (routable and unicast)

* The MetricType, if present, is known (assume
DEFAULT_METRIC_TYPE if not present)

* There is a valid route with the same MetricType matching the
address using longest prefix matching

* Either the route's next hop is the sender of the RERR and
route's next hop interface is the interface on which the RERR
was received, or PktSource is present in the RERR and is a
Router Client address

* The unreachable address' sequence number is either unknown, or
is greater than the route's sequence number

If any of the above are false, the route does not need to be made
Invalid and the unreachable address does not need to be
advertised in a regenerated RERR.

If all of the above are true:

* If the route's prefix length is the same as the unreachable
address' prefix length, set the route state to Invalid, and
note that the route should be advertised in a regenerated
RERR.



Perkins, et al. Expires January 7, 2016 [Page 46]

Internet-Draft AODVv2 July 2015


* If the prefix length is shorter than the original route, the
route MUST be expunged from the routing table, since it is a
sub-route of the larger route which is reported to be Invalid.

* If the prefix length is different, create a new route with the
unreachable address, and its prefix and sequence number, set
the state to Invalid, and note that the route should be
advertised in a regenerated RERR.

* Update the sequence number on the stored route, if the
reported sequence number is greater.

3. If PktSource is included and is a Router Client, do not
regenerate the RERR.

4. Check if there are unreachable addresses which need to be
advertised in a regenerated RERR

* If so, regenerate the RERR as detailed in Section 7.4.3.

* If not, take no further action.

7.4.3. RERR Regeneration

The RERR should not be generated if the limit for the rate of AODVv2
control message generation has been reached.

The procedure for RERR regeneration is as follows:

1. Set msg_hop_limit := received msg_hop_limit - 1

2. If msg_hop_limit is now zero, do not continue the regeneration
process

3. If the PktSource data element was included in the original RERR,
copy it into the regenerated RERR

4. For each route that needs to be reported, while respecting the
interface MTU:

* Insert the unreachable address into the AddressList.

* Insert the prefix length into PrefixLengthList, if known and
not equal to the address length.

* Insert the sequence number into SeqNumList, if known.





Perkins, et al. Expires January 7, 2016 [Page 47]

Internet-Draft AODVv2 July 2015


* Insert the MetricType into MetricTypeList if known, and not
equal to DEFAULT_METRIC_TYPE.

5. If interface MTU would be exceeded, create additional RERR
messages

The AODVv2 message is used to create a corresponding RFC 5444 message
(see Section 8). If the RERR contains the PktSource data element,
the regenerated RERR SHOULD be sent unicast to the next hop on the
route to PktSource, or alternatively it MUST be multicast to LL-
MANET-Routers. If the RERR is sent in response to a broken link, the
RERR is, by default, multicast to LL-MANET-Routers.

8. RFC 5444 Representation

AODVv2 specifies that all control plane messages between routers
SHOULD use the Generalized Mobile Ad Hoc Network Packet/Message
Format [RFC5444], and therefore AODVv2 defines route messages
comprising data elements that map to message elements in RFC 5444.

RFC 5444 provides a multiplexed transport for multiple protocols. An
RFC 5444 multiplexer may choose to optimize the content of certain
message elements to reduce control plane overhead.

A brief summary of the RFC 5444 format:

1. A packet contains zero or more messages

2. A message contains a Message Header, one Message TLV Block, zero
or more Address Blocks, and one Address Block TLV Block per
Address Block

3. The Message TLV Block MAY contain zero or more Message TLVs

4. An Address Block TLV Block MAY include zero or more Address Block
TLVs

5. Each TLV value in an Address Block TLV Block can be associated
with all of the addresses, a contiguous set of addresses, or a
single address in the Address Block

AODVv2 does not require access to the RFC 5444 packet header.

In the message header, AODVv2 uses <msg-hop-limit>, <msg-hop-count>,
<msg-type> and <msg-addr-length>. <msg-addr-length> indicates the
length of any addresses in the message (using <msg-addr-length> :=
address length in octets - 1, i.e. 3 for IPv4 and 15 for IPv6).




Perkins, et al. Expires January 7, 2016 [Page 48]

Internet-Draft AODVv2 July 2015


Each address included in the Address Block is identified as OrigAddr,
TargAddr, PktSource, or Unreachable Address by including an
ADDRESS_TYPE TLV in the Address Block TLV Block.

The addresses in an Address Block may appear in any order, and values
in a TLV in the Address Block TLV Block must be associated with the
correct address in the Address Block. To indicate which value is
associated with each address, the AODVv2 message representation uses
lists where the order of the addresses in the AODVv2 AddressList data
element matches the order of values in other list-based data
elements, e.g., the order of SeqNums in the SeqNumList in a RERR.

The following sections show how AODVv2 data elements are represented
in RFC 5444 messages. See Section 12 for more information about the
Message TLVs and Address Block TLVs AODVv2 defines, and the type
numbers allocated.

Where the extension type of a TLV is set to zero, this is the default
RFC 5444 value and the extension type will not be included in the
message.

8.1. RREQ

8.1.1. Message Header

+---------------+-----------------+---------------------------------+
| Data Element | Header Field | Value |
+---------------+-----------------+---------------------------------+
| None | <msg-type> | RREQ |
| msg_hop_limit | <msg-hop-limit> | MAX_HOPCOUNT |
| msg_hop_count | <msg-hop-count> | Number of hops traversed so far |
| | | by the message. |
+---------------+-----------------+---------------------------------+

8.1.2. Message TLV Block

A RREQ contains no Message TLVs.

8.1.3. Address Block

A RREQ contains two Addresses, OrigAddr and TargAddr, and each
address has an associated prefix length. If the prefix length has
not been included in the AODVv2 message, it is equal to the address
length in bits.







Perkins, et al. Expires January 7, 2016 [Page 49]

Internet-Draft AODVv2 July 2015


+-------------------------+------------------------------+
| Data Elements | Address Block |
+-------------------------+------------------------------+
| OrigAddr/OrigPrefixLen | <address> + <prefix-length> |
| TargAddr/TargPrefixLen | <address> + <prefix-length> |
+-------------------------+------------------------------+

8.1.4. Address Block TLV Block

Address Block TLVs are always associated with addresses in the
Address Block. The following sections show the TLVs that apply to
each address.

8.1.4.1. Address Block TLVs for OrigAddr

+--------------+---------------+------------+-----------------------+
| Data Element | TLV Type | Extension | Value |
| | | Type | |
+--------------+---------------+------------+-----------------------+
| None | ADDRESS_TYPE | 0 | ADDRTYPE_ORIGADDR |
| OrigSeqNum | SEQ_NUM | 0 | Sequence Number of |
| | | | RREQ_Gen, the router |
| | | | which initiated route |
| | | | discovery. |
| OrigMetric | PATH_METRIC | MetricType | Metric for the route |
| /MetricType | | | to OrigAddr, using |
| | | | MetricType. |
| ValidityTime | VALIDITY_TIME | 0 | ValidityTime for |
| | | | route to OrigAddr. |
+--------------+---------------+------------+-----------------------+

In the AODVv2 representation, if the message relates to
DEFAULT_METRIC_TYPE, MetricType is not included in the message. The
RFC 5444 representation will set the extension type in the
PATH_METRIC TLV to 0. AODVv2 interprets a MetricType of 0 as
DEFAULT_METRIC_TYPE.

8.1.4.2. Address Block TLVs for TargAddr

+------------+--------------+-------------+-------------------------+
| Data | TLV Type | Extension | Value |
| Element | | Type | |
+------------+--------------+-------------+-------------------------+
| None | ADDRESS_TYPE | 0 | ADDRTYPE_TARGADDR |
| TargSeqNum | SEQ_NUM | 0 | The last known |
| | | | TargSeqNum for |
| | | | TargAddr. |
+------------+--------------+-------------+-------------------------+



Perkins, et al. Expires January 7, 2016 [Page 50]

Internet-Draft AODVv2 July 2015


8.2. RREP

8.2.1. Message Header

+---------------+-----------------+---------------------------------+
| Data Element | Header Field | Value |
+---------------+-----------------+---------------------------------+
| None | <msg-type> | RREP |
| msg_hop_limit | <msg-hop-limit> | <msg-hop-count> from |
| | | corresponding RREQ. |
| msg_hop_count | <msg-hop-count> | Number of hops traversed so far |
| | | by the message. |
+---------------+-----------------+---------------------------------+

8.2.2. Message TLV Block

A RREP contains no Message TLVs.

8.2.3. Address Block

A RREP contains a minimum of two Addresses, OrigAddr and TargAddr,
and each address has an associated prefix length. If the prefix
length has not been included in the AODVv2 message, it is equal to
the address length in bits.

It may also contain the address of the intended next hop, in order to
request acknowledgement to confirm adjacency, as described in
Section 6.2. The prefix length associated with this address is equal
to the address length in bits.

+-------------------------+------------------------------+
| Data Elements | Address Block |
+-------------------------+------------------------------+
| OrigAddr/OrigPrefixLen | <address> + <prefix-length> |
| TargAddr/TargPrefixLen | <address> + <prefix-length> |
| AckReq | <address> + <prefix-length> |
+-------------------------+------------------------------+

8.2.4. Address Block TLV Block

Address Block TLVs are always associated with addresses in the
Address Block. The following sections show the TLVs that apply to
each address.








Perkins, et al. Expires January 7, 2016 [Page 51]

Internet-Draft AODVv2 July 2015


8.2.4.1. Address Block TLVs for OrigAddr

+-------------+---------------+----------------+--------------------+
| Data | TLV Type | Extension Type | Value |
| Element | | | |
+-------------+---------------+----------------+--------------------+
| None | ADDRESS_TYPE | 0 | ADDRTYPE_ORIGADDR |
+-------------+---------------+----------------+--------------------+

8.2.4.2. Address Block TLVs for TargAddr

+--------------+---------------+------------+-----------------------+
| Data Element | TLV Type | Extension | Value |
| | | Type | |
+--------------+---------------+------------+-----------------------+
| None | ADDRESS_TYPE | 0 | ADDRTYPE_TARGADDR |
| TargSeqNum | SEQ_NUM | 0 | Sequence number of |
| | | | RREP_Gen, the router |
| | | | which created the |
| | | | RREP. |
| TargMetric | PATH_METRIC | MetricType | Metric for the route |
| /MetricType | | | to TargAddr, using |
| | | | MetricType. |
| ValidityTime | VALIDITY_TIME | 0 | ValidityTime for |
| | | | route to TargAddr. |
+--------------+---------------+------------+-----------------------+

In the AODVv2 representation, if the message relates to
DEFAULT_METRIC_TYPE, MetricType is not included in the message. The
RFC 5444 representation will set the extension type in the
PATH_METRIC TLV to 0. AODVv2 interprets a MetricType of 0 as
DEFAULT_METRIC_TYPE.

8.2.4.3. Address Block TLVs for AckReq Intended Recipient Address

+--------------+---------------+-----------------+------------------+
| Data Element | TLV Type | Extension Type | Value |
+--------------+---------------+-----------------+------------------+
| None | ADDRESS_TYPE | 0 | ADDRTYPE_INTEND |
+--------------+---------------+-----------------+------------------+

8.3. RREP_Ack

8.3.1. Message Header







Perkins, et al. Expires January 7, 2016 [Page 52]

Internet-Draft AODVv2 July 2015


+---------------+---------------+-----------+
| Data Element | Header Field | Value |
+---------------+---------------+-----------+
| None | <msg-type> | RREP_Ack |
+---------------+---------------+-----------+

8.3.2. Message TLV Block

A RREP_Ack contains no Message TLVs.

8.3.3. Address Block

A RREP_Ack contains no Address Block.

8.3.4. Address Block TLV Block

A RREP_Ack contains no Address Block TLV Block.

8.4. RERR

8.4.1. Message Header

+----------------+------------------+---------------+
| Data Element | Header Field | Value |
+----------------+------------------+---------------+
| None | <msg-type> | RERR |
| msg_hop_limit | <msg-hop-limit> | MAX_HOPCOUNT |
+----------------+------------------+---------------+

8.4.2. Message TLV Block

A RERR contains no Message TLVs.

8.4.3. Address Block

The Address Block in a RERR may contain PktSource, the source IP
address of the packet triggering RERR generation, as detailed in
Section 7.4. Prefix Length associated with PktSource is equal to the
address length in bits.

Address Block always contains one Address per route that is no longer
valid, and each address has an associated prefix length. If a prefix
length has not been included for this address, it is equal to the
address length in bits.







Perkins, et al. Expires January 7, 2016 [Page 53]

Internet-Draft AODVv2 July 2015


+------------------------------+------------------------------------+
| Data Element | Address Block |
+------------------------------+------------------------------------+
| PktSource | <address> + <prefix-length> for |
| | PktSource |
| AddressList/PrefixLengthList | <address> + <prefix-length> for |
| | each unreachable address in |
| | AddressList |
+------------------------------+------------------------------------+

8.4.4. Address Block TLV Block

Address Block TLVs are always associated with addresses in the
Address Block. The following sections show the TLVs that apply to
each type of address in the RERR.

8.4.4.1. Address Block TLVs for PktSource

+--------------+---------------+---------------+--------------------+
| Data Element | TLV Type | Extension | Value |
| | | Type | |
+--------------+---------------+---------------+--------------------+
| PktSource | ADDRESS_TYPE | 0 | ADDRTYPE_PKTSOURCE |
+--------------+---------------+---------------+--------------------+

8.4.4.2. Address Block TLVs for Unreachable Addresses

+----------------+--------------+------------+----------------------+
| Data Element | TLV Type | Extension | Value |
| | | Type | |
+----------------+--------------+------------+----------------------+
| None | ADDRESS_TYPE | 0 | ADDRTYPE_UNREACHABLE |
| SeqNumList | SEQ_NUM | 0 | Sequence Number |
| | | | associated with |
| | | | invalid route to the |
| | | | unreachable address. |
| MetricTypeList | PATH_METRIC | MetricType | None. Extension Type |
| | | | set to MetricType of |
| | | | the route to the |
| | | | unreachable address. |
+----------------+--------------+------------+----------------------+

Using the PATH_METRIC TLV without a value is a mechanism used in RERR
messages to indicate the MetricType associated with the route being
reported, without the need to include a Metric value. Multiple
PATH_METRIC TLVs may be necessary if routes with multiple MetricTypes
are included in the RERR.




Perkins, et al. Expires January 7, 2016 [Page 54]

Internet-Draft AODVv2 July 2015


In the AODVv2 representation, if the RERR message includes only
routes with DEFAULT_METRIC_TYPE, MetricType is not included in the
message. In this case, the RFC 5444 representation does not need to
include a PATH_METRIC TLV to indicate the DEFAULT_METRIC_TYPE. If
the RERR message includes both routes with DEFAULT_METRIC_TYPE and
other MetricTypes, only the routes with non-default MetricType need
to be marked with a PATH_METRIC TLV using Extension Type to indicate
MetricType. AODVv2 interprets the absence of MetricType information
as an indication of DEFAULT_METRIC_TYPE.

9. Simple Internet Attachment

Figure 4 shows a stub (i.e., non-transit) network of AODVv2 routers
which is attached to the Internet via a single Internet AODVv2 Router
(abbreviated IAR).

As in any Internet-attached network, AODVv2 routers and clients that
wish to be reachable from hosts on the Internet MUST have IP
addresses within the IAR's routable and topologically correct prefix
(i.e., 191.0.2.0/24). This AODVv2 network and subnets within it will
be advertised to the internet using procedures which are out of scope
for this specification.

/-------------------------\
/ +----------------+ \
/ | AODVv2 Router | \
| | 191.0.2.2/32 | |
| +----------------+ | Routable
| +-----+--------+ Prefix
| | Internet | /191.0.2.0/24
| | AODVv2 Router| /
| | 191.0.2.1 |/ /---------------\
| | serving net +------+ Internet \
| | 191.0.2.0/24 | \ /
| +-----+--------+ \---------------/
| +----------------+ |
| | AODVv2 Router | |
| | 191.0.2.3/32 | |
\ +----------------+ /
\ /
\-------------------------/

Figure 4: Simple Internet Attachment Example

When an AODVv2 router within the AODVv2 MANET wants to discover a
route toward a node on the Internet, it uses the normal AODVv2 route
discovery for that IP Destination Address. The IAR MUST respond to




Perkins, et al. Expires January 7, 2016 [Page 55]

Internet-Draft AODVv2 July 2015


RREQ on behalf of all Internet destinations, i.e., destinations not
on the configured 191.0.2.0/24 subnet.

When a packet from a node on the Internet destined for a node in the
AODVv2 MANET reaches the IAR, if the IAR does not have a route toward
that exact destination it will perform normal AODVv2 route discovery
for that destination.

The IAR SHALL NOT be configured as a default router.

10. Optional Features

A number of optional features for AODVv2, associated initially with
AODV, MAY be useful in networks with greater mobility or larger node
populations, or networks requiring reduced latency for application
launches. These features are not required by minimal
implementations.

10.1. Expanding Rings Multicast

For multicast RREQ, msg_hop_limit MAY be set in accordance with an
expanding ring search as described in [RFC3561] to limit the RREQ
propagation to a subset of the local network and possibly reduce
route discovery overhead.

10.2. Precursor Lists

This section specifies an interoperable enhancement to AODVv2
enabling more economical RERR notifications.

There can be several sources of traffic for a certain destination.
Each source of traffic and each upstream router between the
forwarding AODVv2 router and the traffic source is known as a
"precursor" for the destination. For each destination, an AODVv2
router MAY choose to keep track of precursors that have provided
traffic for that destination. Route Error messages about that
destination can be sent unicast to these precursors instead of
multicast to all AODVv2 routers.

Since a RERR will be regenerated if it comes from a next hop on a
valid route, the RERR should ideally be sent backwards along the
route that the source of the traffic uses, to ensure it is
regenerated at each hop and reaches the traffic source. If the
reverse path is unknown, the RERR should be sent toward the source
along some other route. Therefore, the options for saving precursor
information are as follows:





Perkins, et al. Expires January 7, 2016 [Page 56]

Internet-Draft AODVv2 July 2015


o Save the next hop on an existing route to the packet's source
address as the precursor. In this case, it is not guaranteed that
a RERR that is sent will follow the reverse of the source's route.
In rare situations, this may prevent the route from being
invalidated at the source of the data traffic.

o Save the packet's source address as the precursor. In this case,
the RERR can be sent along any existing route to the source of the
data traffic, and should include the PktSource data element to
ensure that the route will be invalidated at the source of the
traffic, in case the RERR does not follow the reverse of the
source's route.

o By inspecting the MAC address of each forwarded packet, determine
which router forwarded the packet, and save the router address as
a precursor. This ensures that when a RERR is sent to the
precursor router, the route will be invalidated at that router,
and the RERR will be regenerated toward the source of the packet.

During normal operation, each AODVv2 router maintaining precursor
lists for a route must update the precursor list whenever it uses
this route to forward traffic to the destination. Precursors are
classified as Active if traffic has recently been forwarded by the
precursor. The precursor is marked with a timestamp to indicate the
time it last forwarded traffic on this route.

When an AODVv2 router detects that one or more routes are broken, it
MAY notify each Active precursor using a unicast Route Error message
instead of creating multicast traffic. Unicast is applicable when
there are few Active precursors compared to the number of neighboring
AODVv2 routers. However, the default multicast behavior is still
preferable when there are many precursors, since fewer message
transmissions are required.

When an AODVv2 router supporting precursor lists receives a RERR
message, it MAY identify the list of its own affected Active
precursors for the routes in the RERR, and choose to send a unicast
RERR to those, rather than send a multicast RERR.

When a route is expunged, any precursor list associated with it must
also be expunged.

10.3. Intermediate RREP

Without iRREP, only the AODVv2 router responsible for the target
address can respond to a RREQ. Using iRREP, route discoveries can be
faster and create less control traffic. This specification has been
published as a separate Internet Draft [I-D.perkins-irrep].



Perkins, et al. Expires January 7, 2016 [Page 57]

Internet-Draft AODVv2 July 2015


10.4. Message Aggregation Delay

The aggregation of multiple messages into a packet is specified in
RFC 5444 [RFC5444].

Implementations MAY choose to briefly delay transmission of messages
for the purpose of aggregation (into a single packet) or to improve
performance by using jitter [RFC5148].

11. Configuration

AODVv2 uses various parameters which can be grouped into the
following categories:

o Timers

o Protocol constants

o Administrative parameters and controls

This section show the parameters along with their definitions and
default values (if any).

Note that several fields have limited size (bits or bytes). These
sizes and their encoding may place specific limitations on the values
that can be set.

11.1. Timers

AODVv2 requires certain timing information to be associated with
route table entries and message replies. The default values are as
follows:

+------------------------+----------------+
| Name | Default Value |
+------------------------+----------------+
| ACTIVE_INTERVAL | 5 second |
| MAX_IDLETIME | 200 seconds |
| MAX_BLACKLIST_TIME | 200 seconds |
| MAX_SEQNUM_LIFETIME | 300 seconds |
| RteMsg_ENTRY_TIME | 12 seconds |
| RREQ_WAIT_TIME | 2 seconds |
| RREP_Ack_SENT_TIMEOUT | 1 second |
| RREQ_HOLDDOWN_TIME | 10 seconds |
+------------------------+----------------+

Table 3: Timing Parameter Values




Perkins, et al. Expires January 7, 2016 [Page 58]

Internet-Draft AODVv2 July 2015


The above timing parameter values have worked well for small and
medium well-connected networks with moderate topology changes. The
timing parameters SHOULD be administratively configurable. Ideally,
for networks with frequent topology changes the AODVv2 parameters
should be adjusted using experimentally determined values or dynamic
adaptation. For example, in networks with infrequent topology
changes MAX_IDLETIME may be set to a much larger value.

11.2. Protocol Constants

AODVv2 protocol constants typically do not require changes. The
following table lists these constants, along with their values and a
reference to the section describing their use.

+------------------------+---------+--------------------------------+
| Name | Default | Description |
+------------------------+---------+--------------------------------+
| DISCOVERY_ATTEMPTS_MAX | 3 | Section 6.4 |
| RREP_RETRIES | 2 | Section 7.2.1 |
| MAX_METRIC[MetricType] | [TBD] | Section 5 |
| MAX_METRIC[HopCount] | 20 hops | Section 5 and Section 7 |
| MAX_HOPCOUNT | 20 | Same as MAX_METRIC[HopCount] |
| MAX_TIME | [TBD] | Maximum expressible clock time |
| | | (Section 6.5.2) |
+------------------------+---------+--------------------------------+

Table 4: AODVv2 Constants

Note that <msg-hop-count> is an 8-bit field in the RFC 5444 message
header and therefore MAX_HOPCOUNT cannot be larger than 255. Field
lengths associated with metrics are to be found in Section 12.3.

MAX_METRIC[MetricType] MUST always be the maximum expressible metric
of type MetricType.

These protocol constants MUST have the same values for all AODVv2
routers in the ad hoc network. If the values were configured
differently, the following consequences may be observed:

o DISCOVERY_ATTEMPTS_MAX: Nodes with higher values are likely to be
more successful at finding routes, at the cost of additional
control traffic.

o RREP_RETRIES: Nodes with lower values are more likely to blacklist
neighbors when there is a temporary fluctuation in link quality.

o MAX_HOPCOUNT: Nodes with a value too small would not be able to
discover routes to distant addresses.



Perkins, et al. Expires January 7, 2016 [Page 59]

Internet-Draft AODVv2 July 2015


o MAX_METRIC[MetricType]: No interoperability problems due to
variations on different nodes, but nodes with lower values may
exhibit overly restrictive behavior during route comparisons.

o MAX_TIME: No interoperability problems due to variations on
different nodes, but if a lower value is used, route state
management may exhibit overly restrictive behavior.

11.3. Local Settings

The following table lists AODVv2 parameters which should be
administratively configured for each node:

+------------------------+------------------------+--------------+
| Name | Default Value | Description |
+------------------------+------------------------+--------------+
| AODVv2_INTERFACES | | Section 3 |
| BUFFER_SIZE_PACKETS | 2 | Section 6.4 |
| BUFFER_SIZE_BYTES | MAX_PACKET_SIZE [TBD] | Section 6.4 |
| CLIENT_ADDRESSES | AODVv2_INTERFACES | Section 4.2 |
| CONTROL_TRAFFIC_LIMIT | [TBD - 50 pkts/sec?] | Section 7 |
+------------------------+------------------------+--------------+

Table 5: Configuration for Local Settings

11.4. Network-Wide Settings

The following administrative controls may be used to change the
operation of the network. The same settings should be used across
the network. Inconsistent settings at different nodes in the network
will not result in protocol errors, but poor performance may result,
especially if metrics are misinterpreted because DEFAULT_METRIC_TYPE
is configured differently at different nodes.

+----------------------+----------------------+----------------+
| Name | Default | Description |
+----------------------+----------------------+----------------+
| DEFAULT_METRIC_TYPE | 3 (i.e., Hop Count) | [RFC6551] |
| ENABLE_IDLE_IN_RERR | Disabled | Section 7.4.1 |
+----------------------+----------------------+----------------+

Table 6: Configuration for Network-Wide Settings

11.5. Optional Feature Settings

These options are not required for correct routing behavior, although
they may reduce AODVv2 protocol overhead in certain situations. The
default behavior is to leave these options disabled.



Perkins, et al. Expires January 7, 2016 [Page 60]

Internet-Draft AODVv2 July 2015


+---------------------------+-----------+---------------------------+
| Name | Default | Description |
+---------------------------+-----------+---------------------------+
| PRECURSOR_LISTS | Disabled | Local (Section 10.2) |
| MSG_AGGREGATION | Disabled | Local (Section 10.4) |
| ENABLE_IRREP | Disabled | Network-wide (Section |
| | | 10.3) |
| EXPANDING_RINGS_MULTICAST | Disabled | Network-wide (Section |
| | | 10.1) |
+---------------------------+-----------+---------------------------+

Table 7: Configuration for Optional Features

12. IANA Considerations

This section specifies several RFC 5444 message types, message tlv-
types, and address tlv-types required for AODVv2. Also, a new
registry of 16-bit metric types is specified.

12.1. RFC 5444 Message Types

+-----------------------------------------+-----------+
| Name of Message | Type |
+-----------------------------------------+-----------+
| Route Request (RREQ) | 10 (TBD) |
| Route Reply (RREP) | 11 (TBD) |
| Route Error (RERR) | 12 (TBD) |
| Route Reply Acknowledgement (RREP_Ack) | 13 (TBD) |
+-----------------------------------------+-----------+

Table 8: AODVv2 Message Types

12.2. RFC 5444 Address Block TLV Types

+------------------------+----------+---------------+---------------+
| Name of TLV | Type | Length | Reference |
| | | (octets) | |
+------------------------+----------+---------------+---------------+
| PATH_METRIC | 10 (TBD) | depends on | Section 7 |
| | | MetricType | |
| SEQ_NUM | 11 (TBD) | 2 | Section 7 |
| ADDRESS_TYPE | 15 (TBD) | 1 | Section 8 |
| VALIDITY_TIME | 1 | 1 | [RFC5497] |
+------------------------+----------+---------------+---------------+

Table 9: AODVv2 Address Block TLV Types





Perkins, et al. Expires January 7, 2016 [Page 61]

Internet-Draft AODVv2 July 2015


12.3. MetricType Allocation

Metric types are identified according to the assignments in
[RFC6551].

+------------------------+----------+--------------+
| Name of MetricType | Type | Metric Size |
+------------------------+----------+--------------+
| Unassigned | 0 | Undefined |
| Currently Unsupported | 1 - 2 | TBD |
| Hop Count | 3 [TBD] | 1 octet |
| Currently Unsupported | 4 - 8 | TBD |
| Unallocated | 9 - 254 | TBD |
| Reserved | 255 | Undefined |
+------------------------+----------+--------------+

Table 10: AODVv2 Metric Types

When creating AODVv2 messages which relate to the
DEFAULT_METRIC_TYPE, MetricType is not reported in the message. In
the RFC 5444 message representation, the PATH_METRIC TLV, if
included, will not include an extension type. While RFC 5444 would
interpret the lack of an extension type value as indication that
extension type is zero, AODVv2 will interpret an extension type of
zero to mean the DEFAULT_METRIC_TYPE configured on the router. This
is possible because zero is not assigned to any metric type
([RFC6551]). In RERR, the absence of the PATH_METRIC TLV also
indicates use of the DEFAULT_METRIC_TYPE.

12.4. AddressType Allocation

The values used in the Address Type TLV used in Section 8 are given
in the table below:

+-----------------------+--------+
| Address Type | Value |
+-----------------------+--------+
| ADDRTYPE_ORIGADDR | 0 |
| ADDRTYPE_TARGADDR | 1 |
| ADDRTYPE_UNREACHABLE | 2 |
| ADDRTYPE_PKTSOURCE | 3 |
| ADDRTYPE_INTEND | 4 |
+-----------------------+--------+

Table 11: AODVv2 Address Types






Perkins, et al. Expires January 7, 2016 [Page 62]

Internet-Draft AODVv2 July 2015


13. Security Considerations

This section describes various security considerations and potential
avenues to secure AODVv2 routing. The objective of the AODVv2
protocol is for each router to communicate reachability information
about addresses for which it is responsible, and for routes it has
learned from other AODVv2 routers. Positive routing information
(i.e. a route exists) is distributed via RREQ and RREP messages.
Negative routing information (i.e. a route does not exist) is
distributed via RERR messages. AODVv2 routers store the information
contained in these messages in order to properly forward data
packets, and they generally provide this information to other AODVv2
routers.

Networks using AODVv2 to maintain connectivity and establish routes
on demand may be vulnerable to certain well-known types of threats.
Flooding attacks using RREQ amount to a denial of service for route
discovery. Valid route table entries can be replaced by maliciously
constructed RREQ and RREP messages. Links could be erroneously
treated as bidirectional if malicious unsolicited RREP or RREP_Ack
messages were to be accepted. Replay attacks using RERR messages
could, in some circumstances, be used to disrupt active routes.
Passive inspection of AODVv2 control messages could enable
unauthorized devices to gain information about the network topology,
since exchanging such information is the main purpose of AODVv2.

The on-demand nature of AODVv2 route discovery reduces the
vulnerability to route disruption. Since control traffic for
updating route tables is diminished, there is less opportunity for
failure. Processing requirements for AODVv2 are typically quite
small, and would typically be dominated by calculations to verify
integrity. This has the effect of reducing (but by no means
eliminating) AODVv2's vulnerability to denial of service attacks.

Encryption MAY be used for AODVv2 messages. If the routers share a
packet-level security association, the message data can be encrypted
prior to message transmission. The establishment of such security
associations is outside the scope of this specification. Encryption
will not only protect against unauthorized devices obtaining
information about network topology but will ensure that only trusted
routers participate in routing operations.

Message integrity checking is enabled by the Integrity Check Value
mechanisms defined in [RFC7182]. The data contained in AODVv2
routing protocol messages SHOULD be verified using ICV values, to
avoid the use of message data if the message has been tampered with
or replayed. Otherwise, it would be possible to disrupt
communications by injecting nonexistent or malicious routes into the



Perkins, et al. Expires January 7, 2016 [Page 63]

Internet-Draft AODVv2 July 2015


route tables of nodes within the ad hoc network. This can result in
loss of data or message processing by unauthorized devices.

The remainder of this section provides specific recommendations for
the use of the integrity checking and timestamp functions defined in
[RFC7182] to ensure the integrity of each AODVv2 message. The
calculation used for the Integrity Check Value will depend on the
message type. Sequence numbers can be used as timestamps to protect
against replay, since they are known to be strictly increasing.

RREQ messages advertise a route to OrigAddr, and impose very little
processing requirement for receivers. The main threat presented by
sending a RREQ message with false information is that traffic to
OrigAddr could be disrupted. Since RREQ is multicast and likely to
be received by all nodes in the ad hoc network, this threat could
have serious impact on applications communicating by way of OrigAddr.
The actual threat to disrupt routes to OrigAddr is reduced by the
AODVv2 mechanism of marking RREQ-derived routes as "Unconfirmed"
until adjacency with the next hop is confirmed. If AODVv2 routers
always verify the integrity of the RREQ message data, then the threat
of disruption is minimized. The ICV mechanisms offered in [RFC7182]
are sufficient for this purpose. Since OrigAddr is included as a
data element of the RREQ, the ICV can be calculated and verified
using message contents. The ICV should be verified at every step
along the dispersal path of the RREQ to mitigate the threat. Since
RREQ_Gen's sequence number is incremented for each new RREQ, replay
protection is already afforded and no extra timestamp mechanism is
required.

RREP messages advertise a route to TargAddr, and impose very little
processing requirement for receivers. The main threat presented by
sending a RREP message with false information is that traffic to
TargAddr could be disrupted. Since RREP is unicast, this threat is
restricted to receivers along the path from OrigAddr to TargAddr. If
AODVv2 routers always verify the integrity of the RREP message data,
then this threat is minimized. This facility is offered by the ICV
mechanisms in [RFC7182]. Since TargAddr is included as a data
element of the RREP, the ICV can be calculated and verified using
message contents. The ICV should be verified at every step along the
unicast path of the RREP. Since RREP_Gen's sequence number is
incremented for each new RREP, replay protection is afforded and no
extra timestamp mechanism is required.

RREP_Ack messages are intended to verify bidirectional neighbor
connectivity, and impose very little processing requirement for
receivers. The main threat presented by sending a RREP_Ack message
with false information is that the route advertised to a target node
in a RREP might be erroneously accepted even though the route would



Perkins, et al. Expires January 7, 2016 [Page 64]

Internet-Draft AODVv2 July 2015


contain a unidirectional link and thus not be suitable for most
traffic. Since RREP_Ack is unicast, this threat is strictly local to
the RREP transmitter expecting the acknowledgement. A malicious
router could also attempt to send an unsolicited RREP_Ack to convince
another router that a bidirectional link exists and subsequently use
further messages to divert traffic along a route which is not valid.
If AODVv2 routers always verify the integrity of the RREP_Ack message
data, then this threat is minimized. This facility is offered by the
ICV mechanisms in [RFC7182]. The RREP_Gen SHOULD use the source IP
address of the RREP_Ack to identify the sender, and so the ICV should
be calculated using the message contents and the IP source address.
The message must also include the Timestamp defined in [RFC7182] to
protect against replay attacks, using TargSeqNum from the RREP as the
value in the TIMESTAMP TLV.

RERR messages remove routes, and impose very little processing
requirement for receivers. The main threat presented by sending a
RERR message with false information is that traffic to the advertised
destinations could be disrupted. Since RERR is multicast and can be
received by many routers in the ad hoc network, this threat could
have serious impact on applications communicating by way of the
sender of the RERR message. However, since the sender of the RERR
message with erroneous information may be presumed to be either
malicious or broken, it is better that such routes not be used
anyway. Another threat is that a malicious RERR message may be sent
with a PktSource data element included, to disrupt PktSource's
ability to send to the addresses contained in the RERR. If AODVv2
routers always verify the integrity of the RERR message data, then
this threat is reduced. This facility is offered by the ICV
mechanisms in [RFC7182]. The receiver of the RERR SHOULD use the
source IP address of the RERR to identify the sender. The message
must also include the Timestamp defined in [RFC7182] to protect
against replay attacks, using SeqNum from RERR_Gen as the value in
the TIMESTAMP TLV.

14. Acknowledgments

AODVv2 is a descendant of the design of previous MANET on-demand
protocols, especially AODV [RFC3561] and DSR [RFC4728]. Changes to
previous MANET on-demand protocols stem from research and
implementation experiences. Thanks to Elizabeth Belding and Ian
Chakeres for their long time authorship of AODV. Additional thanks
to Derek Atkins, Emmanuel Baccelli, Abdussalam Baryun, Ramon Caceres,
Thomas Clausen, Justin Dean, Christopher Dearlove, Ulrich Herberg,
Henner Jakob, Luke Klein-Berndt, Lars Kristensen, Tronje Krop,
Koojana Kuladinithi, Kedar Namjoshi, Alexandru Petrescu, Henning
Rogge, Fransisco Ros, Pedro Ruiz, Christoph Sommer, Romain Thouvenin,




Perkins, et al. Expires January 7, 2016 [Page 65]

Internet-Draft AODVv2 July 2015


Richard Trefler, Jiazi Yi, Seung Yi, and Cong Yuan, for their reviews
AODVv2 and DYMO, as well as numerous specification suggestions.

15. References

15.1. Normative References

[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
Requirement Levels", BCP 14, RFC 2119, March 1997.

[RFC4291] Hinden, R. and S. Deering, "IP Version 6 Addressing
Architecture", RFC 4291, February 2006.

[RFC5082] Gill, V., Heasley, J., Meyer, D., Savola, P., and C.
Pignataro, "The Generalized TTL Security Mechanism
(GTSM)", RFC 5082, October 2007.

[RFC5444] Clausen, T., Dearlove, C., Dean, J., and C. Adjih,
"Generalized Mobile Ad Hoc Network (MANET) Packet/Message
Format", RFC 5444, February 2009.

[RFC5497] Clausen, T. and C. Dearlove, "Representing Multi-Value
Time in Mobile Ad Hoc Networks (MANETs)", RFC 5497, March
2009.

[RFC5498] Chakeres, I., "IANA Allocations for Mobile Ad Hoc Network
(MANET) Protocols", RFC 5498, March 2009.

[RFC6551] Vasseur, JP., Kim, M., Pister, K., Dejean, N., and D.
Barthel, "Routing Metrics Used for Path Calculation in
Low-Power and Lossy Networks", RFC 6551, March 2012.

15.2. Informative References

[I-D.perkins-irrep]
Perkins, C., "Intermediate RREP for dynamic MANET On-
demand (AODVv2) Routing", draft-perkins-irrep-03 (work in
progress), May 2015.

[Perkins94]
Perkins, C. and P. Bhagwat, "Highly Dynamic Destination-
Sequenced Distance-Vector Routing (DSDV) for Mobile
Computers", Proceedings of the ACM SIGCOMM '94 Conference
on Communications Architectures, Protocols and
Applications, London, UK, pp. 234-244, August 1994.






Perkins, et al. Expires January 7, 2016 [Page 66]

Internet-Draft AODVv2 July 2015


[Perkins99]
Perkins, C. and E. Royer, "Ad hoc On-Demand Distance
Vector (AODV) Routing", Proceedings of the 2nd IEEE
Workshop on Mobile Computing Systems and Applications, New
Orleans, LA, pp. 90-100, February 1999.

[RFC2501] Corson, M. and J. Macker, "Mobile Ad hoc Networking
(MANET): Routing Protocol Performance Issues and
Evaluation Considerations", RFC 2501, January 1999.

[RFC3561] Perkins, C., Belding-Royer, E., and S. Das, "Ad hoc On-
Demand Distance Vector (AODV) Routing", RFC 3561, July
2003.

[RFC4193] Hinden, R. and B. Haberman, "Unique Local IPv6 Unicast
Addresses", RFC 4193, October 2005.

[RFC4728] Johnson, D., Hu, Y., and D. Maltz, "The Dynamic Source
Routing Protocol (DSR) for Mobile Ad Hoc Networks for
IPv4", RFC 4728, February 2007.

[RFC4861] Narten, T., Nordmark, E., Simpson, W., and H. Soliman,
"Neighbor Discovery for IP version 6 (IPv6)", RFC 4861,
September 2007.

[RFC5148] Clausen, T., Dearlove, C., and B. Adamson, "Jitter
Considerations in Mobile Ad Hoc Networks (MANETs)", RFC
5148, February 2008.

[RFC6130] Clausen, T., Dearlove, C., and J. Dean, "Mobile Ad Hoc
Network (MANET) Neighborhood Discovery Protocol (NHDP)",
RFC 6130, April 2011.

[RFC6621] Macker, J., "Simplified Multicast Forwarding", RFC 6621,
May 2012.

[RFC7182] Herberg, U., Clausen, T., and C. Dearlove, "Integrity
Check Value and Timestamp TLV Definitions for Mobile Ad
Hoc Networks (MANETs)", RFC 7182, April 2014.

Appendix A. Features Required of IP

AODVv2 needs the following:

o information that IP routes are requested

o information that packets are flowing




Perkins, et al. Expires January 7, 2016 [Page 67]

Internet-Draft AODVv2 July 2015


o the ability to queue packets

A reactive protocol reacts when a route is needed. A route is
requested when an application tries to send a packet. The
fundamental concept of reactive routing is to avoid creating routes
that are not needed. The trigger for route discovery is an
application trying to send a packet. If a route is not available to
forward the packet, the packet is queued while the route is
requested.

Appendix B. Multi-homing Considerations

Multi-homing is not supported by the AODVv2 specification. The
coordination between multiple AODVv2 routers to distribute routing
information correctly for a shared address is not defined.

Previous work indicates that it can be supported by expanding the
sequence number to include the AODVv2 router's IP address as a
parsable field of the SeqNum. Without this, comparing sequence
numbers would not work to evaluate freshness. Even when the IP
address is included, there is no good way to compare sequence numbers
from different IP addresses, but a handling node can determine
whether the two given sequence numbers are comparable. If the route
table can store multiple routes for the same destination, then multi-
homing can work with sequence numbers augmented by IP addresses.

This non-normative information is provided simply to document the
results of previous efforts to enable multi-homing. The intention is
to simplify the task of future specification if multihoming becomes
necessary for reactive protocol operation.

Appendix C. Router Client Relocation

Only one AODVv2 router within a MANET SHOULD be responsible for a
particular address at any time. If two AODVv2 routers dynamically
shift the advertisement of a network prefix, correct AODVv2 routing
behavior must be observed. The AODVv2 router adding the new network
prefix must wait for any existing routing information about this
network prefix to be purged from the network, i.e., it must wait at
least MAX_SEQNUM_LIFETIME after the previous AODVv2 router's last
SeqNum update for this network prefix.

Appendix D. Example Algorithms for AODVv2 Operations

The following subsections show example algorithms for protocol
operations required by AODVv2. AODVv2 requires general algorithms
for manipulating and comparing table entries, and algorithms specific
to each message type.



Perkins, et al. Expires January 7, 2016 [Page 68]

Internet-Draft AODVv2 July 2015


Processing for messages follows the following general outline:

1. Receive incoming message.

2. Update route table as appropriate.

3. Respond as needed, often regenerating the incoming message with
updated information.

Once the route table has been updated, the information contained
there is known to be the most recent available information for any
fields in the outgoing message. For this reason, the algorithms are
written as if outgoing message field values are assigned from the
route table information, even though it is often equally appropriate
to use fields from the incoming message.

The following table indicates the field names used in subsequent
sections to describe the AODVv2 algorithms.

+-------------------------+-----------------------------------------+
| Parameter | Description |
+-------------------------+-----------------------------------------+
| RteMsg | A route message |
| | (inRREQ/outRREQ/inRREP/outRREP) |
| RteMsg.HopLimit | Hop limit for the message |
| RteMsg.HopCount | Hop count for the message |
| RteMsg.AckReq | True/False, optional in RREP |
| RteMsg.MetricType | The type of metric included, optional |
| RteMsg.OrigAddr | Address of source of queued data |
| RteMsg.TargAddr | Address route is requested for |
| RteMsg.OrigPrefixLen | Prefix length of OrigAddr, optional |
| RteMsg.TargPrefixLen | Prefix length of TargAddr, optional |
| RteMsg.OrigSeqNum | SeqNum of OrigAddr, in RREQ only |
| RteMsg.TargSeqNum | SeqNum of TargAddr, in RREP, optional |
| | in RREQ |
| RteMsg.OrigMetric | Metric to OrigAddr, in RREQ only |
| RteMsg.TargMetric | Metric to TargAddr, in RREP only |
| RteMsg.ValidityTime | Time limit for route advertised |
| RteMsg.NbrIP | Sender of the RteMsg |
| RteMsg.Netif | Interface on which the RteMsg arrived |
| AdvRte | Derived from a RteMsg (see Section 6.5) |
| AdvRte.Address | Route destination address |
| AdvRte.PrefixLength | Route destination prefix length |
| AdvRte.SeqNum | SeqNum associated with route |
| AdvRte.MetricType | MetricType associated with route |
| AdvRte.Metric | Advertised metric of route |
| AdvRte.Cost | Cost from receiving router |
| AdvRte.ValidityTime | Time limit for route advertised |



Perkins, et al. Expires January 7, 2016 [Page 69]

Internet-Draft AODVv2 July 2015


| AdvRte.NextHopIP | Sender of the RteMsg |
| AdvRte.NextHopIntf | Interface on which the RteMsg arrived |
| AdvRte.HopCount | Number of hops traversed |
| AdvRte.HopLimit | Allowed number of hops remaining |
| Route | A route table entry (see Section 4.6) |
| Route.Address | Route destination address |
| Route.PrefixLength | Route destination prefix length |
| Route.SeqNum | SeqNum associated with route |
| Route.NextHop | Address of router which advertised the |
| | route |
| Route.NextHopInterface | Interface on which next hop is |
| | reachable |
| Route.LastUsed | Time this route was last used for |
| | packet forwarding |
| Route.LastSeqNumUpdate | Time the SeqNum of the route was last |
| | updated |
| Route.ExpirationTime | Time at which the route will expire |
| Route.MetricType | MetricType associated with route |
| Route.Metric | Cost from receiving router |
| Route.State | Active/Idle/Invalid |
| Route.Precursors | Optional (see Section 10.2) |
| RERR | Route Error message (inRERR/outRERR) |
| RERR.HopLimit | Hop limit for the message |
| RERR.PktSource | Source address of packet which |
| | triggered RERR |
| RERR.AddressList[] | List of unreachable route addresses |
| RERR.PrefixLengthList[] | List of PrefixLengths for AddressList |
| RERR.SeqNumList[] | List of SeqNums for AddressList |
| RERR.MetricTypeList[] | MetricType for the invalid routes |
| RERR.Netif | Interface on which the RERR arrived |
+-------------------------+-----------------------------------------+

Table 12: Notation used in Appendix

D.1. General Operations

D.1.1. Check_Route_State














Perkins, et al. Expires January 7, 2016 [Page 70]

Internet-Draft AODVv2 July 2015


/* Update the state of the route entry based on timeouts. Return
whether the route can be used for forwarding a packet. */

Check_Route_State(route)
{
if (CurrentTime > route.ExpirationTime)
route.State := Invalid;
if ((CurrentTime - route.LastUsed > ACTIVE_INTERVAL + MAX_IDLETIME)
AND (route.State != Unconfirmed)
AND (route.ExpirationTime == MAX_TIME)) //not a timed route
route.State := Invalid;
if ((CurrentTime - route.LastUsed > ACTIVE_INTERVAL)
AND (route.State != Unconfirmed)
AND (route.ExpirationTime == MAX_TIME)) //not a timed route
route.State := Idle;
if ((CurrentTime - route.LastSeqNumUpdate > MAX_SEQNUM_LIFETIME)
AND (route.State == Invalid OR route.State == Unconfirmed))
/* remove route from route table */
if ((CurrentTime - route.LastSeqNumUpdate > MAX_SEQNUM_LIFETIME)
AND (route.State != Invalid)
route.SeqNum := 0;

if (route still exists AND route.State != Invalid
AND Route.State != Unconfirmed)
return TRUE;
else
return FALSE;
}

D.1.2. Process_Routing_Info

(See Section 6.5.1)



















Perkins, et al. Expires January 7, 2016 [Page 71]

Internet-Draft AODVv2 July 2015


/* Compare incoming route information to stored route, and if better,
use to update stored route. */

Process_Routing_Info (advRte)
{
rte := Fetch_Route_Table_Entry (advRte);
if (!rte exists)
{
rte := Create_Route_Table_Entry(advRte);
return rte;
}

if (AdvRte.SeqNum > Route.SeqNum /* stored route is stale */
OR
(AdvRte.SeqNum == Route.SeqNum /* same SeqNum */
AND
((Route.State == Invalid AND LoopFree(advRte, rte))
/* advRte can repair stored */
OR AdvRte.Cost < Route.Metric))) /* advRte is better */
{
if (advRte is from a RREQ)
rte := Create_Route_Table_Entry(advRte);
else
Update_Route_Table_Entry (rte, advRte);
}
return rte;
}

D.1.3. Fetch_Route_Table_Entry






















Perkins, et al. Expires January 7, 2016 [Page 72]

Internet-Draft AODVv2 July 2015


/* Lookup a route table entry matching an advertised route */

Fetch_Route_Table_Entry (advRte)
{
foreach (rteTableEntry in rteTable)
{
if (rteTableEntry.Address == advRte.Address
AND rteTableEntry.MetricType == advRte.MetricType)
return rteTableEntry;
}
return null;
}

/* Lookup a route table entry matching address and metric type */

Fetch_Route_Table_Entry (destination, metricType)
{
foreach (rteTableEntry in rteTable)
{
if (rteTableEntry.Address == destination
AND rteTableEntry.MetricType == metricType)
return rteTableEntry;
}
return null;
}

D.1.4. Update_Route_Table_Entry

/* Update a route table entry using AdvRte in received RteMsg */

Update_Route_Table_Entry (rte, advRte);
{
rte.SeqNum := advRte.SeqNum;
rte.NextHop := advRte.NextHopIp;
rte.NextHopInterface := advRte.NextHopIntf;
rte.LastUsed := CurrentTime;
rte.LastSeqNumUpdate := CurrentTime;
if (validityTime)
rte.ExpirationTime := CurrentTime + advRte.ValidityTime;
else
rte.ExpirationTime := MAX_TIME;

rte.Metric := advRte.Cost;
if (rte.State == Invalid)
rte.State := Idle (if advRte is from RREP);
or Unconfirmed (if advRte is from RREQ);
}




Perkins, et al. Expires January 7, 2016 [Page 73]

Internet-Draft AODVv2 July 2015


D.1.5. Create_Route_Table_Entry

/* Create a route table entry from address and prefix length */

Create_Route_Table_Entry (address, prefixLength, seqNum, metricType)
{
rte := allocate_memory();
rte.Address := address;
rte.PrefixLength := prefixLength;
rte.SeqNum := seqNum;
rte.MetricType := metricType;
}


/* Create a route table entry from the advertised route */

Create_Route_Table_Entry(advRte)
{
rte := allocate_memory();

rte.Address := advRte.Address;
if (advRte.PrefixLength)
rte.PrefixLength := advRte.PrefixLength;
else
rte.PrefixLength := maxPrefixLenForAddressFamily;

rte.SeqNum := advRte.SeqNum;
rte.NextHop := advRte.NextHopIp;
rte.NextHopInterface := advRte.NextHopIntf;
rte.LastUsed := CurrentTime;
rte.LastSeqNumUpdate := CurrentTime;
if (validityTime)
rte.ExpirationTime := CurrentTime + advRte.ValidityTime;
else
rte.ExpirationTime := MAX_TIME;
rte.MetricType := advRte.MetricType;
rte.Metric := advRte.Metric;
rte.State := Idle (if advRte is from RREP);
or Unconfirmed (if advRte is from RREQ);
}

D.1.6. LoopFree









Perkins, et al. Expires January 7, 2016 [Page 74]

Internet-Draft AODVv2 July 2015


/* Return TRUE if the route advRte is LoopFree compared to rte */

LoopFree(advRte, rte)
{
if (advRte.Cost <= rte.Cost)
return TRUE;
else
return FALSE;
}

D.1.7. Fetch_Rte_Msg_Table_Entry

/* Find an entry in the RteMsg table matching the given
message's msg-type, OrigAddr, TargAddr, MetricType */

Fetch_Rte_Msg_Table_Entry (rteMsg)
{
foreach (entry in RteMsgTable)
{
if (entry.msg-type == rteMsg.msg-type
AND entry.OrigAddr == rteMsg.OrigAddr
AND entry.TargAddr == rteMsg.TargAddr
AND entry.MetricType == rteMsg.MetricType)
return entry;
}
return NULL;
}

D.1.8. Update_Rte_Msg_Table

(See Section 4.5)

/* Update the multicast route message suppression table based on the
received RteMsg, return true if it was created or the SeqNum was
updated (i.e. it needs to be regenerated) */

Update_Rte_Msg_Table(rteMsg)
{
/* search for a comparable entry */
entry := Fetch_Rte_Msg_Table_Entry(rteMsg);

/* if there is none, create one */
if (entry does not exist)
{
entry.MessageType := rteMsg.msg_type;
entry.OrigAddr := rteMsg.OrigAddr;
entry.TargAddr := rteMsg.TargAddr;
entry.OrigSeqNum := rteMsg.origSeqNum; // (if present)



Perkins, et al. Expires January 7, 2016 [Page 75]

Internet-Draft AODVv2 July 2015


entry.TargSeqNum := rteMsg.targSeqNum; // (if present)
entry.MetricType := rteMsg.MetricType;
entry.Metric := rteMsg.OrigMetric; // (for RREQ)
or rteMsg.TargMetric; // (for RREP)
entry.Timestamp := CurrentTime;
return TRUE;
}

/* if current entry is stale */
if (
(rteMsg.msg-type == RREQ AND entry.OrigSeqNum < rteMsg.OrigSeqNum)
OR
(rteMsg.msg-type == RREP AND entry.TargSeqNum < rteMsg.TargSeqNum))
{
entry.OrigSeqNum := rteMsg.OrigSeqNum; // (if present)
entry.TargSeqNum := rteMsg.TargSeqNum; // (if present)
entry.Timestamp := CurrentTime;
return TRUE;
}

/* if received rteMsg is stale */
if (
(rteMsg.msg-type == RREQ AND entry.OrigSeqNum > rteMsg.OrigSeqNum)
OR
(rteMsg.msg-type == RREP AND entry.TargSeqNum > rteMsg.TargSeqNum))
{
entry.Timestamp := CurrentTime;
return FALSE;
}

/* if same SeqNum but rteMsg has lower metric */
if (entry.Metric > rteMsg.Metric)
entry.Metric := rteMsg.Metric;

entry.Timestamp := CurrentTime;
return FALSE;
}

D.1.9. Build_RFC_5444_Message_Header












Perkins, et al. Expires January 7, 2016 [Page 76]

Internet-Draft AODVv2 July 2015


/* This pseudocode shows possible RFC 5444 actions, and would not
be performed by the AODVv2 implementation. It is shown only to
provide more understanding about the AODVv2 message that will be
constructed by RFC 5444.
MAL := Message Address Length
MF := Message Flags
Size := number of octets in MsgHdr, AddrBlk, AddrTLVs */

Build_RFC_5444_Message_Header (msgType, Flags, AddrFamily, Size,
hopLimit, hopCount, tlvLength)
{
/* Build RFC 5444 message header fields */
msg-type := msgType;
MF := Flags;
MAL := 3 or 15; // for IPv4 or IPv6
msg-size := Size;
msg-hop-limit := hopLimit;
if (hopCount != 0) /* if hopCount is 0, do not include */
msg-hop-count := hopCount;
msg.tlvs-length := tlvLength;
}

D.2. RREQ Operations

D.2.1. Generate_RREQ

/* Generate a route request message to find a route from OrigAddr
to TargAddr using the given MetricType
origAddr := IP address of Router Client which generated the
packet to be forwarded
origPrefix := prefix length associated with the Router Client
targAddr := destination IP address in the packet to be forwarded
targSeqNum := sequence number in existing route to targAddr
mType := metric type for the requested route */

Generate_RREQ(origAddr, origPrefix, targAddr, targSeqNum, mType)
{
/* Increment sequence number in nonvolatile storage */
mySeqNum := (1 + mySeqNum);

/* Marshall parameters */
outRREQ.HopLimit := MAX_HOPCOUNT;
outRREQ.HopCount := 0; // if included
outRREQ.MetricType := mType; //include if not DEFAULT_METRIC_TYPE
outRREQ.OrigAddr := origAddr;
outRREQ.TargAddr := targAddr;
outRREQ.OrigPrefixLen := origPrefix; //include if not address length
outRREQ.OrigSeqNum := mySeqNum;



Perkins, et al. Expires January 7, 2016 [Page 77]

Internet-Draft AODVv2 July 2015


outRREQ.TargSeqNum := targSeqNum; //included if available
outRREQ.OrigMetric := Route[OrigAddr].Metric; //zero by default
outRREQ.ValidityTime := limit for route to OrigAddr; //if required

/* Build Address Blk using prefix length information from
outRREQ.OrigPrefixLen if necessary */
AddrBlk := {outRREQ.OrigAddr, outRREQ.TargAddr};

/* Include sequence numbers in appropriate Address Block TLVs */
/* OrigSeqNum Address Block TLV */
origSeqNumAddrBlkTlv.value := outRREQ.OrigSeqNum;
/* TargSeqNum Address Block TLV */
if (outRREQ.TargSeqNum is known)
targSeqNumAddrBlkTlv.value := outRREQ.TargSeqNum;

/* Build Metric Address Block TLV, include Metric AddrBlkTlv
Extension type if a non-default metric */
metricAddrBlkTlv.value := outRREQ.OrigMetric;
if (outRREQ.MetricType != DEFAULT_METRIC_TYPE)
metricAddrBlkTlv.typeExtension := outRREQ.MetricType;

if (outRREQ.ValidityTime is required)
{
/* Build VALIDITY_TIME Address Block TLV */
VALIDITY_TIMEAddrBlkTlv.value := outRREQ.ValidityTime;
}

Build_RFC_5444_Message_Header (RREQ, 4, IPv4 or IPv6, NN,
outRREQ.HopLimit, outRREQ.HopCount, tlvLength);

/* multicast RFC 5444 message to LL-MANET-Routers */
}

D.2.2. Receive_RREQ

















Perkins, et al. Expires January 7, 2016 [Page 78]

Internet-Draft AODVv2 July 2015


/* Process a RREQ received on link L */

Receive_RREQ (inRREQ, L)
{
if (inRREQ.NbrIP present in blacklist)
{
if (blacklist_expiration_time < CurrentTime)
return; // don't process or regenerate RREQ
else
remove nbrIP from blacklist;
}
if (inRREQ does not contain msg_hop_limit, OrigAddr,
TargAddr, OrigSeqNum, OrigMetric)
return;
if (inRREQ.OrigAddr and inRREQ.TargAddr are not valid routable
and unicast addresses)
return;
if (inRREQ.MetricType is present but an unknown value)
return;
if (inRREQ.OrigMetric > MAX_METRIC[inRREQ.MetricType] - Cost(L))
return;

/* Extract inRREQ values */
advRte.Address := inRREQ.OrigAddr;
advRte.PrefixLength := inRREQ.OrigPrefixLen; (if present)
or the address length of advRte.Address;
advRte.SeqNum := inRREQ.OrigSeqNum;
advRte.MetricType := inRREQ.MetricType;
advRte.Metric := inRREQ.OrigMetric;
advRte.Cost := inRREQ.OrigMetric + Cost(L);
//according to the indicated MetricType
advRte.ValidityTime := inRREQ.ValidityTime; //if present
advRte.NextHopIP := inRREQ.NbrIP;
advRte.NextHopIntf := inRREQ.Netif;
advRte.HopCount := inRREQ.HopCount;
advRte.HopLimit := inRREQ.HopLimit;

rte := Process_Routing_Info (advRte);

/* Update the RteMsgTable and determine if the RREQ needs
to be regenerated */
regenerate := Update_Rte_Msg_Table(inRREQ);

if (inRREQ.TargAddr is in Router Client list)
Generate_RREP(inRREQ, rte);
else if (regenerate)
Regenerate_RREQ(inRREQ, rte);
}



Perkins, et al. Expires January 7, 2016 [Page 79]

Internet-Draft AODVv2 July 2015


D.2.3. Regenerate_RREQ

/* Called from receive_RREQ()
rte := the route to OrigAddr */

Regenerate_RREQ (inRREQ, rte)
{
outRREQ.HopLimit := inRREQ.HopLimit - 1;
if (outRREQ.HopLimit == 0)
return; // don't regenerate

if (inRREQ.HopCount exists)
{
if (inRREQ.HopCount >= MAX_HOPCOUNT)
return; // don't regenerate
outRREQ.HopCount := inRREQ.HopCount + 1;
}

/* Marshall parameters */
outRREQ.MetricType := rte.MetricType;
outRREQ.OrigAddr := rte.Address;
outRREQ.TargAddr := inRREQ.TargAddr;
/* include prefix length if not equal to address length */
outRREQ.OrigPrefixLen := rte.PrefixLength;
outRREQ.OrigSeqNum := rte.SeqNum;
outRREQ.TargSeqNum := inRREQ.TargSeqNum; // if present
outRREQ.OrigMetric := rte.Metric;
outRREQ.ValidityTime := rte.ValidityTime;
or the time limit this router wishes to put on
route to OrigAddr

/* Build Address Block using prefix length information from
outRREQ.OrigPrefixLen if necessary */
AddrBlk := {outRREQ.OrigAddr, outRREQ.TargAddr};

/* Include sequence numbers in appropriate Address Block TLVs */
/* OrigSeqNum Address Block TLV */
origSeqNumAddrBlkTlv.value := outRREQ.OrigSeqNum;
/* TargSeqNum Address Block TLV */
if (outRREQ.TargSeqNum is known)
targSeqNumAddrBlkTlv.value := outRREQ.TargSeqNum;

/* Build Metric Address Block TLV, include Metric AddrBlkTlv
Extension type if a non-default metric */
metricAddrBlkTlv.value := outRREQ.OrigMetric;
if (outRREQ.MetricType != DEFAULT_METRIC_TYPE)
metricAddrBlkTlv.typeExtension := outRREQ.MetricType;




Perkins, et al. Expires January 7, 2016 [Page 80]

Internet-Draft AODVv2 July 2015


if (outRREQ.ValidityTime is required)
{
/* Build VALIDITY_TIME Address Block TLV */
VALIDITY_TIMEAddrBlkTlv.value := outRREQ.ValidityTime;
}
Build_RFC_5444_Message_Header (RREQ, 4, IPv4 or IPv6, NN,
outRREQ.HopLimit, outRREQ.HopCount, tlvLength);

/* Multicast RFC 5444 message to LL-MANET-Routers, or if
inRREQ was unicast, the message can be unicast to the next
hop on the route to TargAddr, if known */
}

D.3. RREP Operations

D.3.1. Generate_RREP

Generate_RREP(inRREQ, rte)
{
/* Increment sequence number in nonvolatile storage */
mySeqNum := (1 + mySeqNum);

/* Marshall parameters */
outRREP.HopLimit := inRREQ.HopCount;
outRREP.HopCount := 0;
/* Include the AckReq when:
- previous RREP does not seem to enable any data flow, OR
- when RREQ is received from same OrigAddr after RREP was
unicast to rte.NextHop */
outRREP.AckReq := TRUE or FALSE; //TRUE if acknowledgement required
/* if included, set timeout RREP_Ack_SENT_TIMEOUT */

if (rte.MetricType != DEFAULT_METRIC_TYPE)
outRREP.MetricType := rte.MetricType;
outRREP.OrigAddr := rte.Address;
outRREP.TargAddr := inRREQ.TargAddr;
outRREP.TargPrefixLen := rte.PrefixLength; //if not address length
outRREP.TargSeqNum := mySeqNum;
outRREP.TargMetric := Route[TargAddr].Metric;
//zero by default
outRREP.ValidityTime := limit for route to TargAddr; //if required

if (outRREP.AckReq == TRUE)
/* include AckReq Message TLV */

/* Build Address Block using prefix length information from
outRREP.TargPrefixLen if necessary */
AddrBlk := {outRREP.OrigAddr, outRREP.TargAddr};



Perkins, et al. Expires January 7, 2016 [Page 81]

Internet-Draft AODVv2 July 2015


/* TargSeqNum Address Block TLV */
targSeqNumAddrBlkTlv.value := outRREP.TargSeqNum;

/* Build Metric Address Block TLV include Metric AddrBlkTlv
Extension type if a non-default metric */
metricAddrBlkTlv.value := outRREP.TargMetric;
if (outRREP.MetricType != DEFAULT_METRIC_TYPE)
metricAddrBlkTlv.typeExtension := outRREP.MetricType;

if (outRREP.ValidityTime is required)
{
/* Build VALIDITY_TIME Address Block TLV */
VALIDITY_TIMEAddrBlkTlv.value := outRREP.ValidityTime;
}

Build_RFC_5444_Message_Header (RREP, 4, IPv4 or IPv6, NN,
outRREP.HopLimit, outRREQ.HopCount, tlvLength);

/* unicast RFC 5444 message to rte[OrigAddr].NextHop */
}

D.3.2. Receive_RREP

/* Process a RREP received on link L */

Receive_RREP (inRREP, L)
{
if (inRREP.NbrIP present in blacklist)
{
if (blacklist_expiration_time < CurrentTime)
return; // don't process or regenerate RREP
else
remove NbrIP from blacklist;
}

if (inRREP does not contain msg_hop_limit, OrigAddr,
TargAddr, TargSeqNum, TargMetric)
return;
if (inRREP.OrigAddr and inRREQ.TargAddr are not
valid routable and unicast addresses)
return;
if (inRREP.MetricType is present but an unknown value)
return;
if (inRREP.TargMetric > MAX_METRIC[inRREP.MetricType] - Cost(L))
return;

/* Extract inRREP values */
advRte.Address := inRREP.TargAddr;



Perkins, et al. Expires January 7, 2016 [Page 82]

Internet-Draft AODVv2 July 2015


advRte.PrefixLength := inRREP.TargPrefixLen; //if present
or the address length of advRte.Address;
advRte.SeqNum := inRREP.TargSeqNum;
advRte.MetricType := inRREP.MetricType;
advRte.Metric := inRREP.TargMetric;
advRte.Cost := inRREP.TargMetric + Cost(L);
//according to the indicated MetricType
advRte.ValidityTime := inRREP.ValidityTime; //if present
advRte.NextHopIP := inRREP.NbrIP;
advRte.NextHopIntf := inRREP.Netif;
advRte.HopCount := inRREP.HopCount;
advRte.HopLimit := inRREP.HopLimit; //if included

rte := Process_Routing_Info (advRte);

` if (inRREP includes AckReq data element)
Generate_RREP_Ack(inRREP);

/* Update the RteMsgTable and determine if the RREP needs
to be regenerated */
regenerate := Update_Rte_Msg_Table(inRREP);

if (inRREP.TargAddr is in the Router Client list)
send_buffered_packets(rte); /* start to use the route */
else if (regenerate)
Regenerate_RREP(inRREP, rte);
}

D.3.3. Regenerate_RREP

Regenerate_RREP(inRREP, rte)
{
if (rte does not exist)
{
Generate_RERR(inRREP);
return;
}

outRREP.HopLimit := inRREP.HopLimit - 1;
if (outRREP.HopLimit == 0) /* don't regenerate */
return;

if (inRREP.HopCount exists)
{
if (inRREP.HopCount >= MAX_HOPCOUNT)
return; // don't regenerate the RREP
outRREP.HopCount := inRREP.HopCount + 1;
}



Perkins, et al. Expires January 7, 2016 [Page 83]

Internet-Draft AODVv2 July 2015


/* Marshall parameters */
/* Include the AckReq when:
- previous unicast RREP seems not to enable data flow, OR
- when RREQ is received from same OrigAddr after RREP
was unicast to rte.NextHop */
outRREP.AckReq := TRUE or FALSE; //TRUE if acknowledgement required
/* if included, set timeout RREP_Ack_SENT_TIMEOUT */

if (rte.MetricType != DEFAULT_METRIC_TYPE)
outRREP.MetricType := rte.MetricType;
outRREP.OrigAddr := inRREP.OrigAddr;
outRREP.TargAddr := rte.Address;
outRREP.TargPrefixLen := rte.PrefixLength; //if not address length
outRREP.TargSeqNum := rte.SeqNum;
outRREP.TargMetric := rte.Metric;
outRREP.ValidityTime := limit for route to TargAddr; //if required
outRREP.NextHop := rte.NextHop

if (outRREP.AckReq == TRUE)
/* include AckReq Message TLV */

/* Build Address Block using prefix length information from
outRREP.TargPrefixLen if necessary */
AddrBlk := {outRREP.OrigAddr, outRREP.TargAddr};

/* TargSeqNum Address Block TLV */
targSeqNumAddrBlkTlv.value := outRREP.TargSeqNum;

/* Build Metric Address Block TLV include Metric AddrBlkTlv
Extension type if a non-default metric */
metricAddrBlkTlv.value := outRREP.TargMetric;
if (outRREP.MetricType != DEFAULT_METRIC_TYPE)
metricAddrBlkTlv.typeExtension := outRREP.MetricType;

if (outRREP.ValidityTime is required)
{
/* Build VALIDITY_TIME Address Block TLV */
VALIDITY_TIMEAddrBlkTlv.value := outRREP.ValidityTime;
}

Build_RFC_5444_Message_Header (RREP, 4, IPv4 or IPv6, NN,
outRREP.HopLimit, 0, tlvLength);

/* unicast RFC 5444 message to rte[OrigAddr].NextHop */
}






Perkins, et al. Expires January 7, 2016 [Page 84]

Internet-Draft AODVv2 July 2015


D.4. RREP_Ack Operations

D.4.1. Generate_RREP_Ack

/* To be sent when a received RREP includes the AckReq data element */

Generate_RREP_Ack(inRREP)
{
Build_RFC_5444_Message_Header (RREP_Ack, 4, IPv4 or IPv6, NN,
1, 0, 0);
/* unicast RFC 5444 message to inRREP.NbrIP */
}

D.4.2. Receive_RREP_Ack

Receive_RREP_Ack(inRREP_Ack)
{
/* cancel timeout event for the node sending RREP_Ack */
}

D.4.3. Timeout_RREP_Ack

Timeout_RREP_Ack(outRREP)
{
if (numRetries < RREP_RETRIES)
/* resend RREP and double the previous timeout */
else
/* insert unresponsive node into blacklist */
}

D.5. RERR Operations

D.5.1. Generate_RERR

There are two parts to this function, based on whether it was
triggered by an undeliverable packet or a broken link to neighboring
AODVv2 router.

/* Generate a Route Error message.
errorType := undeliverablePacket or brokenLink */

Generate_RERR(errorType, triggerPkt, brokenLinkNbrIp)
{
switch (errorType)
{
case (brokenLink):
doGenerate := FALSE;
num-broken-addr := 0;



Perkins, et al. Expires January 7, 2016 [Page 85]

Internet-Draft AODVv2 July 2015


precursors[] := new empty precursor list;
outRERR.HopLimit := MAX_HOPCOUNT;
/* find routes which are now Invalid */
foreach (rte in route table)
{
if (brokenLinkNbrIp == rte.NextHop
AND (rte.State == Active
OR
(rte.State == Idle AND ENABLE_IDLE_IN_RERR)))
{
if (rte.State == Active)
doGenerate := TRUE;
rte.State := Invalid;
precursors += rte.Precursors (if any);
outRERR.AddressList[num-broken-addr] := rte.Address;
outRERR.PrefixLengthList[num-broken-addr] :=
rte.PrefixLength;
outRERR.SeqNumList[num-broken-addr] := rte.SeqNum;
outRERR.MetricTypeList[num-broken-addr] := rte.MetricType
num-broken-addr := num-broken-addr + 1;
}
}
}
case (undeliverablePacket):
doGenerate := TRUE;
num-broken-addr := 1;
outRERR.HopLimit := MAX_HOPCOUNT;
outRERR.PktSource := triggerPkt.SrcIP;
or triggerPkt.TargAddr; //if pkt was a RREP
outRERR.AddressList[0] := triggerPkt.DestIP;
or triggerPkt.OrigAddr; //if pkt was RREP
/* optional to include outRERR.PrefixLengthList, outRERR.SeqNumList
and outRERR.MetricTypeList */
}

if (doGenerate == FALSE)
return;

if (triggerPkt exists)
{
/* Build PktSource Message TLV */
pktSourceMessageTlv.value := outRERR.PktSource;
}

/* The remaining steps add address, prefix length, sequence
number and metric type information for each unreachable address,
while conforming to the allowed MTU. If the MTU is reached, a new
message MUST be created. */



Perkins, et al. Expires January 7, 2016 [Page 86]

Internet-Draft AODVv2 July 2015


/* Build Address Block using prefix length information from
outRERR.PrefixLengthList[] if necessary */
AddrBlk := outRERR.AddressList[];

/* Optionally, add SeqNum Address Block TLV, including index values */
seqNumAddrBlkTLV := outRERR.SeqNumList[];

if (outRERR.MetricTypeList contains non-default MetricTypes)
/* include Metric Address Block TLVs with Type Extension set to
MetricType, including index values if necessary */
metricAddrBlkTlv.typeExtension := outRERR.MetricTypeList[];

Build_RFC_5444_Message_Header (RERR, 4, IPv4 or IPv6, NN,
outRERR.HopLimit, 0, tlvLength);

if (undeliverablePacket)
/* unicast outRERR to rte[outRERR.PktSource].NextHop */
else if (brokenLink)
/* unicast to precursors, or multicast to LL-MANET-Routers */
}

D.5.2. Receive_RERR

Receive_RERR (inRERR)
{
if (inRERR does not contain msg_hop_limit and at least
one unreachable address)
return;

/* Extract inRERR values, copy relevant unreachable addresses,
their prefix lengths, and sequence numbers to outRERR */
num-broken-addr := 0;
precursors[] := new empty precursor list;
foreach (unreachableAddress in inRERR.AddressList)
{
if (unreachableAddress is not valid routable and unicast)
continue;
if (unreachableAddress MetricType is present but an unknown value)
return;

/* Find a matching route table entry, assume
DEFAULT_METRIC_TYPE if no MetricType included */
rte := Fetch_Route_Table_Entry (unreachableAddress,
unreachableAddress MetricType)
if (rte does not exist)
continue;
if (rte.State == Invalid)/* ignore already invalid routes */
continue;



Perkins, et al. Expires January 7, 2016 [Page 87]

Internet-Draft AODVv2 July 2015


if ((rte.NextHop != inRERR.NbrIP
OR
rte.NextHopInterface != inRERR.Netif)
AND (PktSource is not present OR is not a Router Client))
continue;
if (unreachableAddress SeqNum (if known) < rte.SeqNum)
continue;

/* keep a note of all precursors of newly Invalid routes */
precursors += rte.Precursors; //if any

/* assume prefix length is address length if not included */
if (rte.PrefixLength != unreachableAddress prefixLength)
{
/* create new route with unreachableAddress information */
invalidRte := Create_Route_Table_Entry(unreachableAddress,
unreachableAddress PrefixLength,
unreachableAddress SeqNum,
unreachableAddress MetricType);
invalidRte.State := Invalid;

if (rte.PrefixLength > unreachableAddress prefixLength)
expunge_route(rte);
rte := invalidRte;
}
else if (rte.PrefixLength == unreachableAddress prefixLength)
rte.State := Invalid;

outRERR.AddressList[num-broken-addr] := rte.Address;
outRERR.PrefixLengthList[num-broken-addr] := rte.PrefixLength;
outRERR.SeqNumList[num-broken-addr] := rte.SeqNum;
outRERR.MetricTypeList[num-broken-addr] := rte.MetricType;
num-broken-addr := num-broken-addr + 1;
}

if (num-broken-addr AND (PktSource is not present OR PktSource is not
a Router Client))
Regenerate_RERR(outRERR, inRERR, precursors);
}

D.5.3. Regenerate_RERR










Perkins, et al. Expires January 7, 2016 [Page 88]

Internet-Draft AODVv2 July 2015


Regenerate_RERR (outRERR, inRERR, precursors)
{
/* Marshal parameters */
outRERR.HopLimit := inRERR.HopLimit - 1;
if (outRERR.HopLimit == 0) // don't regenerate
return;

outRERR.PktSource := inRERR.PktSource; //if included
/* AddressList[], SeqNumList[], and PrefixLengthList[] are
already up-to-date */

if (outRERR.PktSource exists)
{
/* Build PktSource Message TLV */
pktSourceMessageTlv.value := outRERR.PktSource;
}

/* Build Address Block using prefix length information from
outRERR.PrefixLengthList[] if necessary */
AddrBlk := outRERR.AddressList[];

/* Optionally, add SeqNum Address Block TLV, including index values */
seqNumAddrBlkTLV := outRERR.SeqNumList[];

if (outRERR.MetricTypeList contains non-default MetricTypes)
/* include Metric Address Block TLVs with Type Extension set to
MetricType, including index values if necessary */
metricAddrBlkTlv.typeExtension := outRERR.MetricTypeList[];

Build_RFC_5444_Message_Header (RERR, 4, IPv4 or IPv6, NN,
outRERR.HopLimit, 0, tlvLength);

if (outRERR.PktSource exists)
/* unicast RFC 5444 message to next hop towards
outRERR.PktSource */
else if (number of precursors == 1)
/* unicast RFC 5444 message to precursors[0] */
else if (number of precursors > 1)
/* unicast RFC 5444 message to all precursors, or multicast
RFC 5444 message to RERR_PRECURSORS if preferable */
else
/* multicast RFC 5444 message to LL-MANET-Routers */
}








Perkins, et al. Expires January 7, 2016 [Page 89]

Internet-Draft AODVv2 July 2015


Appendix E. AODVv2 Draft Updates

E.1. Changes between revisions 9 and 10

This section lists the changes between AODVv2 revisions ...-09.txt
and ...-10.txt.

o Updated RFC 5444 Representation section to add "Address Type" TLV,
which explicitly declares the meaning of addresses in the RFC 5444
Address Block.

o Relocated route state definitions. Minor improvements to clarity
throughout.

o Updated definition of timed routes.

o More consistent use of OrigPrefixLen, TargPrefixLen, and Invalid.

o Mandated use of neighbor adjacency checking and support of AckReq
and RREP_Ack and clarified related text.

o Changed order of LoopFree checking and route cost comparisons in
Evaluating Route Information.

o Updated structure of section on Applying Route Updates.

o Updated AckReq to include intended next hop address, and RREP to
be multicast if intended next hop is not a confirmed neighbor.

o Clarified that gateway router is not default router.

E.2. Changes between revisions 8 and 9

This section lists the changes between AODVv2 revisions ...-08.txt
and ...-09.txt.

o Numerous editorial improvements were made, including
relocation/removal/renaming/adding of some sections and text,
collection and tidying of scattered text on same topic, formatting
made more consistent to improve readability.

o Removed mentions of precursors from main text, except one mention
in Route Table Entry.

o Removed use of MIN_METRIC which was not defined.

o Changed Current_Time to CurrentTime for consistency.




Perkins, et al. Expires January 7, 2016 [Page 90]

Internet-Draft AODVv2 July 2015


o Changed OrigAddrMetric and TargAddrMetric to OrigMetric and
TargMetric respectively.

o Updated Overview to simplify and provide a broader summary.

o Updated Terminology definitions, Data Elements tables and combined
sections.

o Updated Applicability Statement to move some of the non-
applicability text and to simplify what remains.

o Updated TLV names to conform to existing naming style.

o Updated Blacklist to be a NeighborList to include neighbors that
have confirmed bidirectional connectivity.

o Updated messages processed if router on blacklist and which are
indicators of bidirectional links.

o Added RemoveTime to RteMsg Table section.

o Added short description of timed route to Route Table Entry
section but removed Route.Timed flag. Route is timed if its
expiration time is not MAX_TIME.

o Added Unconfirmed route state for route to OrigAddr learned from
RREQ.

o Updated AODVv2 Protocol Operations section and subsections,
including Initialization, Adjacency Monitoring, making algorithms
easier to read and making notation consistent, general
improvements to the text.

o Updated Route Discovery, Retries and Buffering to include a more
complete description of the route discovery process.

o Updated wording relating to different metric types.

o Added text regarding control message limit in Message Transmission
section.

o Added short explanation of positive/negative effects of buffering.

o Simplified the packet diagrams, since some of their contents was
already explained in the text below and then again as part of
generation, reception and regeneration processes.

o Clarified some elements of the message content descriptions.



Perkins, et al. Expires January 7, 2016 [Page 91]

Internet-Draft AODVv2 July 2015


o Moved MetricType above MetricList in message sections, for
consistency.

o Mirrored structure throughout AODVv2 Protocol Messages.

o Changed RREQ and RREP's use of Lists when only one entry is
necessary.

o Added some pre-message-generation checks.

o Ensured consistency in regeneration (if msg-hop-limit is reduced
to zero, do not regenerate).

o Removed statements about neighbors but added blacklist checks
where necessary.

o Noted that RREQ retries should increase the SeqNum.

o Added statement that implementations SHOULD retry sending RREP.

o Added text explaining what happens if RREP is lost, regarding
blacklisting and RREQ retries.

o Removed hop limit from RREP_Ack. Changed order of blacklist
check.

o Updated RERR so that multiple metric types can be reported in the
same message.

o Updated RERR reception processing to ensure PktSource deletes the
contained route.

o Added text to show that if a router is the destination of a RERR,
the RERR is not regenerated.

o Added text that RERRs should not be created if the same RERR has
recently been sent.

o Updated RFC 5444 overview and simplified/rearranged text in this
section.

o Major update to RFC 5444 representation section

o Updated RERR's RFC 5444 representation so that PktSource is placed
in Address Block, and updated IANA section to make PktSource an
Address Block TLV to indicate which address is PktSource.





Perkins, et al. Expires January 7, 2016 [Page 92]

Internet-Draft AODVv2 July 2015


o Described use of extension type in Metric TLV to represent
MetricType, and the interpretation when using the default metric
type.

o Removed Multicast RREP as an optional feature.

o Updated Precursor Lists section to include options for precursor
information to store.

o Updated Security Considerations.

E.3. Changes between revisions 7 and 8

This section lists the changes between AODVv2 revisions ...-07.txt
and ...-08.txt.

o MetricType is now an Address Block TLV. Minor changes to the
text. By using an extension type in the Metric TLV we can
represent MetricType more elegantly in the RFC 5444 message.

o Updated Overview to be slightly more concise.

o Moved MetricType next to Metric when mentioned for better flow.

o Added text to Applicability to address comments on mailing list
regarding gateway behavior and NHDP HELLO messages.

o Removed paragraph in AODVv2 Message Transmission section regarding
TTL.

o Added reference where precursors are mentioned in route table
entry.

o Added text to bidirectionality explanation regarding NHDP HELLO
messages and lower layer triggers.

o Clarified blacklist removal with SHOULD rather than MAY.

o Removed pseudo-code from section on evaluating incoming routing
information.

o Clarified rules for expunging route entries on memory-constrained
devices.

o Clarified the use of exponential backoff for route discovery
attempts.





Perkins, et al. Expires January 7, 2016 [Page 93]

Internet-Draft AODVv2 July 2015


o Small updates to message sections. Removed steps about checking
if neighbors.

o Renamed RFC 5444 parser to multiplexer in Section 10.

o Removed "optional feature" to include multiple addresses in RERR.

o Removed MetricType from the Message TLV Type Specification.

o Updated Security Considerations.

o Added reference to RFC 7182.

o Small updates to message algorithms, including moving MetricType
from Message TLV to the Metric TLV in the Address Block TLV Block,
and only generating RERR if an Active route was made Invalid.

E.4. Changes between revisions 6 and 7

This section lists the changes since AODVv2 revision ...-06.txt

o Added Victoria Mercieca as co-author.

o Reorganized protocol message descriptions into major subsections
for each protocol message. For protocol messages, organized
processing into Generation, Reception, and Regeneration
subsections.

o Separated RREQ and RREP message processing description into
separate major subsection which had previously been combined into
RteMsg description.

o Enlarged RREQ Table function to include similar processing for
optional flooded RREP messages. The table name has been
correspondingly been changed to be the Table for Multicast
RteMsgs.

o Moved sections for Multiple Interfaces and AODVv2 Control Message
Generation Limits to be major subsections of the AODVv2 Protocol
Operations section.

o Reorganized the protocol message processing steps into the
subsections as previously described, adopting a more step-by-step
presentation.

o Coalesced the router states Broken and Expired into a new combined
state named the Invalid state. No changes in processing are
required for this.



Perkins, et al. Expires January 7, 2016 [Page 94]

Internet-Draft AODVv2 July 2015


o Merged the sections describing Next-hop Router Adjacency
Monitoring and Blacklists.

o Specified that routes created during Route Discovery are marked as
Idle routes. If they are used for carrying data they become
Active routes.

o Added Route.LastSeqNumUpdate information to route table, so that
route activity and sequence number validity can be tracked
separately. An active route can still forward traffic even if the
sequence number has not been refreshed within MAX_SEQNUM_LIFETIME.

o Mandated implementation of RREP_Ack as response to AckReq Message
TLV in RREP messages.
Added field to RREP_Ack to ensure correspondence to the correct
AckReq message.

o Added explanations for what happens if protocol constants are
given different values on different AODVv2 routers.

o Specified that AODVv2 implementations are free to choose their own
heuristics for reducing multicast overhead, including RFC 6621.

o Added appendix to identify AODVv2 requirements from OS
implementation of IP and ICMP.

o Deleted appendix showing example RFC 5444 packet formats.

o Clarification on the use of RFC 5497 VALIDITY_TIME.

o In Terminology, deleted superfluous definitions, added missing
definitions.

o Numerous editorial improvements and clarifications.

E.5. Changes between revisions 5 and 6

This section lists the changes between AODVv2 revisions ...-05.txt
and ...-06.txt.

o Added Lotte Steenbrink as co-author.

o Reorganized section on Metrics to improve readability by putting
specific topics into subsections.

o Introduced concept of data element, which is used to clarify the
method of enabling RFC 5444 representation for AODVv2 data
elements. A list of Data Elements was introduced in section 3,



Perkins, et al. Expires January 7, 2016 [Page 95]

Internet-Draft AODVv2 July 2015


which provides a better understanding of their role than was
previously supplied by the table of notational devices.

o Replaced instances of OrigNode by OrigAddr whenever the more
specific meaning is appropriate. Similarly for instances of other
node versus address terminology.

o Introduced concepts of PrefixLengthList and MetricList in order to
avoid use of index-based terminology such as OrigNdx and TargNdx.

o Added section 5, "AODVv2 Message Transmission", describing the
intended interface to RFC 5444.

o Included within the main body of the specification the mandatory
setting of the TLV flag thassingleindex for TLVs OrigSeqNum and
TargSeqNum.

o Removed the Route.Timed state. Created a new flag for route table
entries known as Route.Timed. This flag can be set when the route
is in the active state. Previous description would require that
the route table entry be in two states at the same time, which
seems to be misleading. The new flag is used to clarify other
specification details for Timed routes.

o Created table 3 to show the correspondence between AODVv2 data
elements and RFC 5444 message components.

o Replaced "invalid" terminology by the more specific terms "broken"
or "expired" where appropriate.

o Eliminated the instance of duplicate specification for inclusion
of OrigNode (now, OrigAddr) in the message.

o Corrected the terminology to be Mid instead of Tail for the
trailing address bits of OrigAddr and TargAddr for the example
message formats in the appendices.

o Repaired remaining instances of phraseology that could be
construed as indicating that AODV only supports a single network
interface.

o Numerous editorial improvements and clarifications.

E.6. Changes between revisions 4 and 5

This section lists the changes between AODVv2 revisions ...-04.txt
and ...-05.txt.




Perkins, et al. Expires January 7, 2016 [Page 96]

Internet-Draft AODVv2 July 2015


o Normative text moved out of definitions into the relevant section
of the body of the specification.

o Editorial improvements and improvements to consistent terminology
were made. Replaced "retransmit" by the slightly more accurate
term "regenerate".

o Issues were resolved as discussed on the mailing list.

o Changed definition of LoopFree as suggested by Kedar Namjoshi and
Richard Trefler to avoid the failure condition that they have
described. In order to make understanding easier, replaced
abstract parameters R1 by RteMsg and R2 by Route to reduce the
level of abstraction when the function LoopFree is discussed.

o Added text to clarify that different metrics may have different
data types and different ranges of acceptable values.

o Added text to section "RteMsg Structure" to emphasize the proper
use of RFC 5444.

o Included within the main body of the specification the mandatory
setting of the TLV flag thassingleindex for TLVs OrigSeqNum and
TargSeqNum.

o Made more extensive use of the AdvRte terminology, in order to
better distinguish between the incoming RREQ or RREP message
(i.e., RteMsg) versus the route advertised by the RteMsg (i.e.,
AdvRte).

E.7. Changes between revisions 3 and 4

This section lists the changes between AODVv2 revisions ...-03.txt
and ...-04.txt.

o An appendix was added to exhibit algorithmic code for
implementation of AODVv2 functions.

o Numerous editorial improvements and improvements to consistent
terminology were made. Terminology related to prefix lengths was
made consistent. Some items listed in "Notational Conventions"
were no longer used, and so deleted.

o Issues were resolved as discussed on the mailing list.

o Appropriate instances of "may" were changed to "MAY".

o Definition inserted for "upstream".



Perkins, et al. Expires January 7, 2016 [Page 97]

Internet-Draft AODVv2 July 2015


o Route.Precursors included as an *optional* route table field

o Reworded text to avoid use of "relevant".

o Deleted references to "DestOnly" flag.

o Refined statements about MetricType TLV to allow for omission when
MetricType == HopCount.

o Bulletized list in section 8.1

o ENABLE_IDLE_UNREACHABLE renamed to be ENABLE_IDLE_IN_RERR

o Transmission and subscription to LL-MANET-Routers converted to
MUST from SHOULD.

E.8. Changes between revisions 2 and 3

This section lists the changes between AODVv2 revisions ...-02.txt
and ...-03.txt.

o The "Added Node" feature was removed. This feature was intended
to enable additional routing information to be carried within a
RREQ or a RREP message, thus increasing the amount of topological
information available to nodes along a routing path. However,
enlarging the packet size to include information which might never
be used can increase congestion of the wireless medium. The
feature can be included as an optional feature at a later date
when better algorithms are understood for determining when the
inclusion of additional routing information might be worthwhile.

o Numerous editorial improvements and improvements to consistent
terminology were made. Instances of OrigNodeNdx and TargNodeNdx
were replaced by OrigNdx and TargNdx, to be consistent with the
terminology shown in Table 2.

o Example RREQ and RREP message formats shown in the Appendices were
changed to use OrigSeqNum and TargSeqNum message TLVs instead of
using the SeqNum message TLV.

o Inclusion of the OrigNode's SeqNum in the RREP message is not
specified. The processing rules for the OrigNode's SeqNum were
incompletely specified in previous versions of the draft, and very
little benefit is foreseen for including that information, since
reverse path forwarding is used for the RREP.

o Additional acknowledgements were included, and contributors names
were alphabetized.



Perkins, et al. Expires January 7, 2016 [Page 98]

Internet-Draft AODVv2 July 2015


o Definitions in the Terminology section capitalize the term to be
defined.

o Uncited bibliographic entries deleted.

o Ancient "Changes" sections were deleted.

Authors' Addresses

Charles E. Perkins
Futurewei Inc.
2330 Central Expressway
Santa Clara, CA 95050
USA

Phone: +1-408-330-4586
Email: charliep@xxxxxxxxxxxx


Stan Ratliff
Idirect
13861 Sunrise Valley Drive, Suite 300
Herndon, VA 20171
USA

Email: ratliffstan@xxxxxxxxx


John Dowdell
Airbus Defence and Space
Celtic Springs
Newport, Wales NP10 8FZ
United Kingdom

Email: john.dowdell@xxxxxxxxxx


Lotte Steenbrink
HAW Hamburg, Dept. Informatik
Berliner Tor 7
D-20099 Hamburg
Germany

Email: lotte.steenbrink@xxxxxxxxxxxxxx







Perkins, et al. Expires January 7, 2016 [Page 99]

Internet-Draft AODVv2 July 2015


Victoria Mercieca
Airbus Defence and Space
Celtic Springs
Newport, Wales NP10 8FZ
United Kingdom

Email: victoria.mercieca@xxxxxxxxxx












































Perkins, et al. Expires January 7, 2016 [Page 100]
<?xml version='1.0' encoding='ascii'?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd">
<?rfc toc="yes"?>
<?rfc tocompact="yes"?>
<?rfc tocdepth="3"?>
<?rfc tocindent="yes"?>
<?rfc symrefs="yes"?>
<!-- use symbolic references tags, i.e, [RFC2119] instead of [1] -->
<?rfc sortrefs="yes" ?>
<!-- sort the reference entries alphabetically -->
<!-- control vertical white space
(using these PIs as follows is recommended by the RFC Editor) -->
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc compact="yes" ?>
<!-- do not start each main section on a new page -->
<?rfc subcompact="no" ?>
<!-- keep one blank line between list items -->
<?rfc strict="yes" ?>
<!-- give errors regarding ID-nits and DTD validation -->
<rfc category="std" docName="draft-ietf-manet-aodvv2-10" ipr="trust200902"
obsoletes="" updates="" submissionType="IETF" xml:lang="en">
<front>
<title abbrev="AODVv2">Ad Hoc On-demand Distance Vector (AODVv2)
Routing</title>
<author fullname="Charles E. Perkins" initials="C.E." surname="Perkins">
<organization abbrev="Futurewei">Futurewei Inc. </organization>
<address>
<postal>
<street>2330 Central Expressway</street>
<city>Santa Clara</city>
<code>95050</code>
<region>CA</region>
<country>USA</country>
</postal>
<phone>+1-408-330-4586</phone>
<email>charliep@xxxxxxxxxxxx</email>
</address>
</author>
<author fullname="Stan Ratliff" initials="S." surname="Ratliff">
<organization>Idirect</organization>
<address>
<postal>
<street>13861 Sunrise Valley Drive, Suite 300</street>
<city>Herndon</city>
<region>VA</region>
<code>20171</code>
<country>USA</country>
</postal>
<email>ratliffstan@xxxxxxxxx</email>
</address>
</author>
<author fullname="John Dowdell" initials="J." surname="Dowdell">
<organization>Airbus Defence and Space</organization>
<address>
<postal>
<street>Celtic Springs</street>
<city>Newport</city>
<region>Wales</region>
<code>NP10 8FZ</code>
<country>United Kingdom</country>
</postal>
<email>john.dowdell@xxxxxxxxxx</email>
</address>
</author>
<author fullname="Lotte Steenbrink" initials="L." surname="Steenbrink">
<organization>HAW Hamburg, Dept. Informatik</organization>
<address>
<postal>
<street>Berliner Tor 7</street>
<city>D-20099 Hamburg</city>
<!--<code>D-20099</code> -->
<country>Germany</country>
</postal>
<email>lotte.steenbrink@xxxxxxxxxxxxxx</email>
</address>
</author>
<author fullname="Victoria Mercieca" initials="V." surname="Mercieca">
<organization>Airbus Defence and Space</organization>
<address>
<postal>
<street>Celtic Springs</street>
<city>Newport</city>
<region>Wales</region>
<code>NP10 8FZ</code>
<country>United Kingdom</country>
</postal>
<email>victoria.mercieca@xxxxxxxxxx</email>
</address>
</author>
<date/>
<area>Routing</area>
<workgroup>Mobile Ad hoc Networks Working Group</workgroup>
<keyword>RFC</keyword>
<keyword>Request for Comments</keyword>
<keyword>I-D</keyword>
<keyword>Internet-Draft</keyword>
<keyword>XML</keyword>
<keyword>reactive protocol</keyword>
<abstract><!--This document was prepared using Pandoc2rfc,
https://github.com/miekg/pandoc2rfc --><t>The revised Ad Hoc On-demand Distance
Vector (AODVv2) routing protocol is intended for use by mobile routers in
wireless, multihop networks. AODVv2 determines unicast routes among AODVv2
routers within the network in an on-demand fashion, offering rapid convergence
in dynamic topologies. </t> </abstract>
</front>
<middle><!--This document was prepared using Pandoc2rfc,
https://github.com/miekg/pandoc2rfc --><section title="Overview"
anchor="overview" toc="default"><t>The revised Ad hoc On-demand Distance Vector
(AODVv2) routing protocol [formerly named DYMO] enables on-demand, multihop
unicast routing among AODVv2 routers in mobile ad hoc networks [MANETs] <xref
target="RFC2501" pageno="false" format="default"/>. The basic operations of the
AODVv2 protocol are route discovery and route maintenance. </t><t>Route
discovery is performed when an AODVv2 router needs to forward a packet for one
of its clients, but does not have a valid route to the packet's destination.
AODVv2 routers use Route Request (RREQ) and Route Reply (RREP) messages to
carry route information between the originator of the route discovery and the
target node, establishing a route to both endpoints on all intermediate
routers. </t><t>A metric is included in RREQ and RREP messages to represent
the cost of the route to the originator or target of the route discovery.
AODVv2 compares route metrics in a way that ensures loop avoidance. AODVv2
also uses sequence numbers to assure loop freedom, enabling identification of
stale routing information so that it can be discarded. </t><t>Route
maintenance involves monitoring the router's links and routes for changes. This
includes confirming adjacencies with other AODVv2 routers, issuing Route Error
messages if link failures invalidate routes, extending and enforcing route
timeouts, and reacting to received Route Error messages. </t><t>AODVv2 control
plane messages use the Generalized MANET Packet/Message Format defined in <xref
target="RFC5444" pageno="false" format="default"/> and the parameters in <xref
target="RFC5498" pageno="false" format="default"/>. AODVv2 defines a set of
data elements which map to RFC 5444 Address Blocks, Address Block TLVs, and
Message TLVs. </t><t>Security for authentication of AODVv2 routers and
encryption of control messages is dealt with by using the recommendations in
<xref target="RFC7182" pageno="false" format="default"/>.
</t></section><section title="Terminology" anchor="terminology"
toc="default"><t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
"OPTIONAL" in this document are to be interpreted as described in <xref
target="RFC2119" pageno="false" format="default"/>. In addition, this document
uses terminology from <xref target="RFC5444" pageno="false" format="default"/>,
and defines the following terms: </t><t><list style="hanging"><t
hangText="AddressList"><vspace blankLines="0"/>An AODVv2 Data Element (see
<xref target="data-elements" pageno="false" format="default"/>). </t><t
hangText="Adjacency"><vspace blankLines="0"/>A bi-directional relationship
between neighboring AODVv2 routers for the purpose of exchanging routing
information. </t><t hangText="AckReq"><vspace blankLines="0"/>An AODVv2 Data
Element (see <xref target="data-elements" pageno="false" format="default"/>).
</t><t hangText="AODVv2 Router"><vspace blankLines="0"/>An IP addressable
device in the ad hoc network that performs the AODVv2 protocol operations
specified in this document. </t><t hangText="CurrentTime"><vspace
blankLines="0"/>The current time as maintained by the AODVv2 router.
</t></list></t><t><list style="hanging"><t hangText="Data Element"><vspace
blankLines="0"/>A named object used within AODVv2 protocol messages (see <xref
target="data-elements" pageno="false" format="default"/>). </t><t
hangText="Disregard"><vspace blankLines="0"/>Ignore for further processing.
</t></list></t><t><list style="hanging"><t hangText="Invalid route"><vspace
blankLines="0"/>A route that cannot be used for forwarding. </t><t
hangText="MANET"><vspace blankLines="0"/>A Mobile Ad Hoc Network as defined in
<xref target="RFC2501" pageno="false" format="default"/>. </t><t
hangText="MetricType"><vspace blankLines="0"/>An AODVv2 Data Element (see <xref
target="data-elements" pageno="false" format="default"/>). </t><t
hangText="MetricTypeList"><vspace blankLines="0"/>An AODVv2 Data Element (see
<xref target="data-elements" pageno="false" format="default"/>). </t><t
hangText="Node"><vspace blankLines="0"/>An IP addressable device in the ad hoc
network. All nodes in this document are either AODVv2 Routers or Router
Clients. </t><t hangText="OrigAddr (Originator Address)"><vspace
blankLines="0"/>An AODVv2 Data Element (see <xref target="data-elements"
pageno="false" format="default"/>). </t><t hangText="OrigMetric"><vspace
blankLines="0"/>An AODVv2 Data Element (see <xref target="data-elements"
pageno="false" format="default"/>). </t><t hangText="OrigNode (Originating
Node)"><vspace blankLines="0"/>The node that launched the application requiring
communication with the Target Address. </t><t hangText="OrigPrefixLen"><vspace
blankLines="0"/>The prefix length, in bits, associated with OrigAddr. </t><t
hangText="OrigSeqNum"><vspace blankLines="0"/>An AODVv2 Data Element (see <xref
target="data-elements" pageno="false" format="default"/>). </t><t
hangText="PktSource"><vspace blankLines="0"/>An AODVv2 Data Element (see <xref
target="data-elements" pageno="false" format="default"/>). </t><t
hangText="PrefixLengthList"><vspace blankLines="0"/>An AODVv2 Data Element (see
<xref target="data-elements" pageno="false" format="default"/>). </t><t
hangText="Reactive"><vspace blankLines="0"/>A protocol operation is called
"reactive" if it is performed only in reaction to specific events. In this
document, "reactive" is synonymous with "on-demand". </t><t hangText="RERR
(Route Error)"><vspace blankLines="0"/>The AODVv2 message type used to indicate
that an AODVv2 router does not have a route toward one or more particular
destinations. </t><t hangText="RERR_Gen (RERR Generating Router)"><vspace
blankLines="0"/>The AODVv2 router generating a Route Error message. </t><t
hangText="Routable Unicast IP Address"><vspace blankLines="0"/>A routable
unicast IP address is a unicast IP address that is scoped sufficiently to be
forwarded by a router. Globally-scoped unicast IP addresses and Unique Local
Addresses (ULAs) (<xref target="RFC4193" pageno="false" format="default"/>) are
examples of routable unicast IP addresses. </t><t hangText="Router
Client"><vspace blankLines="0"/>A node that requires the services of an AODVv2
router. An AODVv2 router is also its own client. </t><t hangText="RREP (Route
Reply)"><vspace blankLines="0"/>The AODVv2 message type used to reply to a
Route Request message. </t><t hangText="RREP_Gen (RREP Generating
Router)"><vspace blankLines="0"/>The AODVv2 router responsible for the Target
Node of a Route Request message, i.e., the router that creates the Route Reply
message. </t><t hangText="RREQ (Route Request)"><vspace blankLines="0"/>The
AODVv2 message type used to discover a route to the Target Address and
distribute information about the route to the Originator Address. </t><t
hangText="RREQ_Gen (RREQ Generating Router)"><vspace blankLines="0"/>The AODVv2
router that creates the Route Request message on behalf of the Originating Node
to discover a route for Target Address. </t><t hangText="RteMsg (Route
Message)"><vspace blankLines="0"/>A Route Request (RREQ) or Route Reply (RREP)
message. </t><t hangText="Sequence Number (SeqNum)"><vspace
blankLines="0"/>One of the sequence numbers maintained by an AODVv2 router to
indicate freshness of route information. Used as an AODVv2 Data Element (see
<xref target="data-elements" pageno="false" format="default"/>). </t><t
hangText="SeqNumList"><vspace blankLines="0"/>An AODVv2 Data Element (see <xref
target="data-elements" pageno="false" format="default"/>). </t><t
hangText="TargAddr (Target Address)"><vspace blankLines="0"/>An AODVv2 Data
Element (see <xref target="data-elements" pageno="false" format="default"/>).
</t><t hangText="Target Node"><vspace blankLines="0"/>The node hosting the IP
address toward which a route is needed. </t><t hangText="TargMetric"><vspace
blankLines="0"/>An AODVv2 Data Element (see <xref target="data-elements"
pageno="false" format="default"/>). </t><t hangText="TargPrefixLen"><vspace
blankLines="0"/>The prefix length, in bits, associated with TargAddr. </t><t
hangText="TargSeqNum"><vspace blankLines="0"/>An AODVv2 Data Element (see <xref
target="data-elements" pageno="false" format="default"/>). </t><t
hangText="Unreachable Address"><vspace blankLines="0"/>An address for which a
valid route is not known. </t><t hangText="Upstream"><vspace
blankLines="0"/>In the direction from destination to source (from TargAddr to
OrigAddr). </t><t hangText="Valid route"><vspace blankLines="0"/>A route that
can be used for forwarding. </t><t hangText="ValidityTime"><vspace
blankLines="0"/>An AODVv2 Data Element (see <xref target="data-elements"
pageno="false" format="default"/>). </t></list></t><t>This document defines a
set of Data Elements in <xref target="data-elements" pageno="false"
format="default"/> which are used in AODVv2 messages. These data elements
contain the message data which is transferred into RFC 5444 formatted messages
(<xref target="represent" pageno="false" format="default"/>) before sending.
</t><texttable anchor="data-elements" align="center" title="Data Elements"
suppress-title="false" style="full"><ttcol align="left">Data Element
</ttcol><ttcol align="left">Meaning </ttcol><c>AckReq </c><c>Presence in RREP
means acknowledgement is requested from the router with the address indicated
</c><c>AddressList </c><c>A list of IP addresses </c><c>MetricType </c><c>The
metric type for a metric value </c><c>MetricTypeList </c><c>Metric types
associated with routes to addresses in AddressList, used in RERR
</c><c>msg_hop_limit </c><c>Number of hops the message is allowed to traverse
</c><c>msg_hop_count </c><c>Number of hops traversed so far by the message
</c><c>OrigMetric </c><c>Metric value associated with the route to OrigAddr
</c><c>OrigSeqNum </c><c>Sequence number associated with OrigAddr, used in RREQ
</c><c>OrigAddr </c><c>IP address of the Originating Node, the source address
of the packet triggering route discovery </c><c>PktSource </c><c>Source address
of a packet triggering a RERR message </c><c>PrefixLengthList </c><c>A list of
routing prefixes associated with addresses in AddressList </c><c>SeqNum
</c><c>Sequence number, when used in RERR </c><c>SeqNumList </c><c>A list of
generic sequence numbers associated with addresses in an AddressList, used in
RERR </c><c>TargAddr </c><c>IP address of the Target Node, the destination
address for which a route is requested </c><c>TargMetric </c><c>Metric value
associated with the route to TargAddr </c><c>TargSeqNum </c><c>Sequence number
associated with TargAddr, used in RREQ (optional) and RREP </c><c>ValidityTime
</c><c>Length of time a route is offered </c></texttable><t></t><t>This
document uses the notational conventions in <xref target="conventions"
pageno="false" format="default"/> to simplify the text. </t><texttable
anchor="conventions" align="center" title="Notational Conventions"
suppress-title="false" style="full"><ttcol align="left">Notation </ttcol><ttcol
align="left">Meaning </ttcol><c>Route[Address] </c><c>A route table entry
toward Address </c><c>Route[Address].Field </c><c>A field in a route table
entry toward Address </c><c>RteMsg </c><c>Either RREQ or RREP
</c><c>RteMsg.Field </c><c>A field in either RREQ or RREP </c><c>AdvRte
</c><c>A route advertised in an incoming RteMsg
</c></texttable><t></t></section><section title="Applicability Statement"
anchor="apply" toc="default"><t>The AODVv2 routing protocol is a reactive
routing protocol designed for stub or disconnected mobile ad hoc networks,
i.e., non-transit networks or those not connected to the internet.
</t><t>AODVv2 handles a wide variety of mobility and traffic patterns by
determining routes on-demand. In networks with a large number of routers,
AODVv2 is best suited for relatively sparse traffic scenarios where each router
forwards packets to a small percentage of other AODVv2 routers in the network.
In this case fewer routes are needed, and therefore less control traffic is
produced. </t><t>AODVv2 is well suited to reactive scenarios such as emergency
and disaster relief, where the ability to communicate is more important than
being assured of secure operations. For other ad hoc networking applications,
in which insecure operation could negate the value of establishing
communication paths, it is important for neighboring AODVv2 nodes to establish
security associations with one another. </t><t>AODVv2 will not make use of
uni-directional links. Route requests from routers which cannot confirm
bidirectional connectivity should be ignored to avoid persistent packet loss or
protocol failures. </t><t>AODVv2 is applicable to memory constrained devices,
since only a little routing state is maintained in each AODVv2 router. In
contrast to proactive routing protocols, which maintain routing information for
all destinations within the MANET, AODVv2 routes that are not needed for
forwarding data do not need to be maintained. On routers unable to store
persistent AODVv2 state, recovery can impose a performance penalty (e.g., in
case of AODVv2 router reboot). </t><t>AODVv2 supports routers with multiple
interfaces, as long as each interface configured for AODVv2 has its own unicast
routable IP address. Address assignment procedures are out of scope for AODVv2.
</t><t>Multi-homing is not supported by AODVv2, and therefore a Router Client
SHOULD NOT be served by more than one AODVv2 router at any one time. <xref
target="multihome" pageno="false" format="default"/> contains some notes on
this topic. </t><t>Although AODVv2 is closely related to AODV <xref
target="RFC3561" pageno="false" format="default"/>, and shares some features of
DSR <xref target="RFC4728" pageno="false" format="default"/>, AODVv2 is not
interoperable with either of those protocols. </t><t>The routing algorithm in
AODVv2 may be operated at layers other than the network layer, using
layer-appropriate addresses. </t><t>AODVv2 can be configured to perform
gateway functions when attached to the internet. Such a gateway router is
referred to as an Internet AODVv2 Router (IAR) as discussed in <xref
target="gateway" pageno="false" format="default"/>. The IAR will reply to each
route request generated inside the AODVv2 network for an internet destination
as if they were responsible for the target address, and may advertise the
AODVv2 network to the internet using procedures out of scope for this
specification. The IAR SHALL NOT be configured as a default router.
</t></section><section title="Data Structures" anchor="data-structures"
toc="default"><section title="Interface List" anchor="interfaceslist"
toc="default"><t>A list of the interfaces supporting AODVv2 should be
configured in the AODVv2_INTERFACES list. </t></section><section title="Router
Client List" anchor="clients" toc="default"><t>An AODVv2 router may provide
routing services for its own local applications and for other non-routing nodes
that are directly reachable via its network interfaces. These nodes, including
the AODVv2 router itself, are referred to as Router Clients. </t><t>Each
AODVv2 router MUST be configured with information about the IP addresses of its
clients. If a subnet is configured as a Router Client, the AODVv2 router MUST
serve every node in that subnet. </t><t>A CLIENT_ADDRESSES list should exist
to store information about Router Clients, with the following information:
</t><t><list style="hanging"><t hangText="RouterClient.IPAddress"><vspace
blankLines="0"/>The IP address of the client node or subnet that requires
routing services from the AODVv2 router. </t><t
hangText="RouterClient.PrefixLength"><vspace blankLines="0"/>The length, in
bits, of the routing prefix associated with the client IP address or subnet.
</t></list></t><t>The list of Router Clients for an AODVv2 router is never
empty, since an AODVv2 router is always its own client. The IP Addresses of the
router's interfaces will appear in the Router Client list. </t><t>The router
MUST respond to Route Requests for all Router Clients. In the initial state,
an AODVv2 router is not required to have information about the Router Clients
of any other AODVv2 router. </t><t>A Router Client SHOULD NOT be served by
more than one AODVv2 router at any one time. Shifting responsibility for a
Router Client to a different AODVv2 router is discussed in <xref
target="change_address_location" pageno="false" format="default"/>.
</t></section><section title="Neighbor Table" anchor="nbrlist"
toc="default"><t>A neighbor table MUST be maintained with information about
neighboring AODVv2 routers, including an indication of the state of the
adjacency to the router. <xref target="adjacencymonitoring" pageno="false"
format="default"/> discusses how to monitor adjacency. </t><t>Neighboring
routers which cannot confirm adjacency should be marked as blacklisted. Certain
AODVv2 messages received from a blacklisted router should be ignored. Routers
should be blacklisted for a maximum of MAX_BLACKLIST_TIME, but can be removed
from the blacklist before this time if an indication of adjacency is received.
</t><t>Neighbor entries should contain: </t><t><list style="hanging"><t
hangText="Neighbor.IPAddress"><vspace blankLines="0"/>An IP address of the
neighboring router. </t><t hangText="Neighbor.State"><vspace
blankLines="0"/>The state of the adjacency (Confirmed, Unknown, or Blacklisted)
</t><t hangText="Neighbor.ResetTime"><vspace blankLines="0"/>The time at which
this router SHOULD no longer be considered blacklisted. By default this value
is calculated at the time the router is blacklisted and is equal to CurrentTime
+ MAX_BLACKLIST_TIME. After this time, the state should be reset to Unknown.
While the neighbor is not marked as blacklisted, this value SHOULD be set to
MAX_TIME. </t></list></t><t>Before a neighbor is confirmed, any routes learned
through that neighbor are marked as Unconfirmed. When neighbor state is set to
Confirmed, the Unconfirmed routes using the neighbor as a next hop can
transition to Idle state (see <xref target="routestatechanges" pageno="false"
format="default"/>). </t><t>If a neighbor is blacklisted, any valid routes
installed which use that neighbor for their next hop should become Invalid.
</t><t>When the link to a neighbor breaks, the neighbor entry should be removed
and all routes using the neighbor as next hop should become Invalid.
</t></section><section title="Sequence Numbers" anchor="seqnum"
toc="default"><t>Sequence numbers enable AODVv2 routers to determine the
temporal order of route discovery messages, identifying stale routing
information so that it can be discarded. The sequence number fulfills the same
roles as the "Destination Sequence Number" of DSDV <xref target="Perkins94"
pageno="false" format="default"/>, and the AODV Sequence Number in <xref
target="RFC3561" pageno="false" format="default"/>. </t><t>Each AODVv2 router
in the network MUST maintain its own sequence number as a 16-bit unsigned
integer. All route messages (Route Request and Route Reply messages) created by
an AODVv2 router include the router's sequence number. </t><t>If the router
has multiple AODVv2 interfaces, it can maintain different sequence numbers for
each interface IP address, but the router MUST NOT use multiple sequence
numbers for any one interface IP address. All route messages created on behalf
of Router Clients on a particular interface MUST include the sequence number of
that interface's IP address. </t><t>Each AODVv2 router MUST ensure that its
sequence number is strictly increasing. It can ensure this by incrementing the
sequence number by one (1) whenever a route message is created, except when the
sequence number is 65,535 (the maximum value of a 16-bit unsigned integer), in
which case it MUST be reset to one (1). The value zero (0) is reserved to
indicate that the sequence number for an address is unknown. </t><t>A router
receiving a route message uses the sequence number to determine the freshness
of the route information in the message in comparison with any existing
information about the same route. If the sequence number stored in the route
table is higher than the sequence number in the message, the received
information is considered stale and MUST NOT be used to update the route table.
</t><t>As a consequence, loop freedom is assured. </t><t>An AODVv2 router
SHOULD maintain its sequence number(s) in persistent storage. If a sequence
number is lost, the router must follow the procedure in <xref target="boot"
pageno="false" format="default"/> to safely resume routing operations with a
new sequence number. </t></section><section title="Multicast Route Message
Table" anchor="rtemsgtable" toc="default"><t>A route message (RteMsg) is either
a Route Request and Route Reply message. The Multicast Route Message Table
(RteMsg Table) contains information about previously received multicast route
messages, so that when a route message is received, an AODVv2 router can
determine if the incoming information is redundant, and avoid unnecessary
regeneration of the route message. RREQ messages are usually multicast. Future
extensions to AODVv2 MAY enable RREP messages to be multicast. </t><t>Each
entry in the RteMsg Table stores the following information, copied from the
route message: </t><t><list style="hanging"><t
hangText="RteMsg.MessageType"><vspace blankLines="0"/>Either RREQ or RREP.
</t><t hangText="RteMsg.OrigAddr"><vspace blankLines="0"/>The IP address of the
originating node wishing to send a packet. </t><t
hangText="RteMsg.OrigPrefixLen"><vspace blankLines="0"/>The prefix length
associated with OrigAddr. </t><t hangText="RteMsg.TargAddr"><vspace
blankLines="0"/>The IP address of the target node, the destination of the
packet. </t><t hangText="RteMsg.TargPrefixLen"><vspace blankLines="0"/>The
prefix length associated with TargAddr. </t><t
hangText="RteMsg.OrigSeqNum"><vspace blankLines="0"/>The sequence number
associated with the originator, if present in RteMsg. </t><t
hangText="RteMsg.TargSeqNum"><vspace blankLines="0"/>The sequence number
associated with the target, if present in RteMsg. </t><t
hangText="RteMsg.MetricType"><vspace blankLines="0"/>The metric type of the
route requested. </t><t hangText="RteMsg.Metric"><vspace blankLines="0"/>The
metric value received in the RteMsg. </t><t
hangText="RteMsg.Timestamp"><vspace blankLines="0"/>The last time this entry
was updated. </t><t hangText="RteMsg.RemoveTime"><vspace blankLines="0"/>The
time at which this entry MUST be removed. </t></list></t><t>Multicast RteMsgs
are considered to be comparable if they have the same MessageType, OrigAddr,
TargAddr, and MetricType. The RteMsg Table is maintained so that no two entries
are comparable, i.e., all entries either have different MessageType, different
OrigAddr, different TargAddr, or different MetricType. See <xref
target="suppress" pageno="false" format="default"/> for details on updating
this table. </t><t>Entries in the RteMsg Table MUST be deleted when the
sequence number is no longer valid, i.e., after MAX_SEQNUM_LIFETIME.
RemoveTime should be set when the sequence number of the entry is updated,
i.e., when OrigSeqNum is updated for a RREQ, and when TargSeqNum is updated for
a RREP. RemoveTime should be set to CurrentTime + MAX_SEQNUM_LIFETIME.
Memory-constrained devices MAY remove the entry before this time, but the entry
should be maintained for at least RteMsg_ENTRY_TIME after the last Timestamp
update in order to account for long-lived RREQs traversing the network.
</t></section><section title="Route Table Entry" anchor="rte"
toc="default"><t>The route table entry is a conceptual data structure.
Implementations MAY use any internal representation that provides access to the
following information: </t><t><list style="hanging"><t
hangText="Route.Address"><vspace blankLines="0"/>An address or address prefix
of a node. </t><t hangText="Route.PrefixLength"><vspace blankLines="0"/>The
prefix length, in bits, associated with the address. If it is less than the
length of Route.Address, this is a route to the subnet on which Route.Address
resides. </t><t hangText="Route.SeqNum"><vspace blankLines="0"/>The sequence
number associated with Route.Address, obtained from the last route message that
successfully updated this route table entry. </t><t
hangText="Route.NextHop"><vspace blankLines="0"/>An IP address of the AODVv2
router used for the next hop on the path toward Route.Address. </t><t
hangText="Route.NextHopInterface"><vspace blankLines="0"/>The interface used to
send packets toward Route.Address. </t><t hangText="Route.LastUsed"><vspace
blankLines="0"/>The time this route was last used to forward a packet. </t><t
hangText="Route.LastSeqNumUpdate"><vspace blankLines="0"/>The time the sequence
number for this route was last updated. </t><t
hangText="Route.ExpirationTime"><vspace blankLines="0"/>The time at which this
route must be marked as Invalid. </t><t hangText="Route.MetricType"><vspace
blankLines="0"/>The type of metric associated with this route. </t><t
hangText="Route.Metric"><vspace blankLines="0"/>The cost of the route toward
Route.Address expressed in units consistent with Route.MetricType. </t><t
hangText="Route.State"><vspace blankLines="0"/>The last known state (Active,
Idle, Invalid, or Unconfirmed) of the route. </t><t hangText="Route.Precursors
(optional feature)"><vspace blankLines="0"/>A list of upstream neighbors using
the route (see <xref target="precursor" pageno="false" format="default"/>).
</t></list></t><t>There are four possible states for an AODVv2 route:
</t><t><list style="hanging"><t hangText="Active"><vspace blankLines="0"/>An
Active route is in current use for forwarding packets. </t><t
hangText="Idle"><vspace blankLines="0"/>An Idle route has not been used in the
last ACTIVE_INTERVAL, but can still be used for forwarding packets. </t><t
hangText="Invalid"><vspace blankLines="0"/>An Invalid route cannot be used for
forwarding packets, but its sequence number information allows incoming
information to be assessed for freshness. </t><t
hangText="Unconfirmed"><vspace blankLines="0"/>An Unconfirmed route cannot be
used for forwarding packets. It is a route learned </t></list></t><t>from a
Route Request which has not yet been confirmed as bidirectional. </t><t>Route
state changes are detailed in <xref target="routestatechanges" pageno="false"
format="default"/>. </t><t>An AODVv2 route may be offered for a limited time.
In this case, the route is referred to as a timed route. The length of time for
which the route is valid is referred to as validity time, and is included in
messages which advertise the route. The shortened validity time is reflected in
Route.ExpirationTime. If a route is not timed, the ExpirationTime is MAX_TIME,
and the route will become Idle and then Invalid if it is not used. Invalid
routes should be maintained for their sequence number information.
</t></section></section><section title="Metrics" anchor="metrics"
toc="default"><t>Metrics measure a cost or quality associated with a route or a
link, e.g., latency, delay, financial cost, energy, etc. </t><t>AODVv2 enables
the use of multiple metric types. Each metric that can be used in AODVv2 has a
MetricType number. Numbers are allocated by IANA as specified in <xref
target="RFC6551" pageno="false" format="default"/> or detailed in <xref
target="metric-type" pageno="false" format="default"/>. The default metric type
is discussed in <xref target="default_metric" pageno="false"
format="default"/>. Alternate metrics are discussed in <xref target="alternate"
pageno="false" format="default"/>. </t><t>An AODVv2 implementation MAY be
configured to use a limited set of the supported metric types. In the
processing described in <xref target="aodv_msgs" pageno="false"
format="default"/>, a "known" MetricType can be interpreted as a configured
MetricType. If a message is received using an unknown or non-configured
MetricType it MUST be ignored. Since the message will not be regenerated, other
routers which do support the MetricType will not be able to route through a
router which does not support the MetricType. </t><t>For each MetricType, a
maximum value is defined, denoted MAX_METRIC[MetricType]. AODVv2 cannot store
routes that cost more than MAX_METRIC[MetricType]. </t><t>Metric information
reported in incoming route messages describes the metric as measured by message
sender, and does not reflect the cost of traversing the link to that sender.
The receiving router calculates the cost of the route from its perspective.
This cost is used to determine whether to use incoming information to update an
existing route. If the cost exceeds MAX_METRIC[MetricType], the route is
ignored. </t><section title="Cost Function" anchor="cost"
toc="default"><t>This document uses the following notation to represent costs:
</t><t><list style="symbols"><t>Cost(L) for link cost </t><t>Cost(R) for route
cost </t></list></t><t>These functions return the cost of traversing a link or
a route. Cost(L) and Cost(R) for the default metric type are detailed in <xref
target="default_metric" pageno="false" format="default"/>. The Cost() functions
for other metric types are beyond the scope of this document.
</t></section><section title="LoopFree Function" anchor="loopfree"
toc="default"><t>When comparing an advertised route to an existing route for
the same destination and the same metric type, the metric value should be
examined to ensure that using the advertised route does not create any routing
loops. </t><t>The function LoopFree(R1, R2) is defined to verify that a route
R2 is not a part of another route R1. LoopFree returns TRUE if R2 cannot be a
sub-section of the route R1. </t><t>An AODVv2 router invokes LoopFree() as
part of the process in <xref target="test" pageno="false" format="default"/>.
The advertised route (AdvRte) is used as parameter R1, and the stored route
(Route) is used as parameter R2. </t><t>The LoopFree(R1,R2) function for the
default metric type is detailed in <xref target="default_metric" pageno="false"
format="default"/>. The LoopFree(R1,R2) functions for other metric types are
beyond the scope of this document. </t></section><section title="Default
Metric Type" anchor="default_metric" toc="default"><t>AODVv2's default metric
type (DEFAULT_METRIC_TYPE) is HopCount, and is the only metric described in
detail in this document. Alternate metrics are discussed in <xref
target="alternate" pageno="false" format="default"/>. </t><t>For the HopCount
metric: </t><t><list style="symbols"><t>Cost(L) := 1 </t><t>Cost(R) := Sum
(Cost(L) of each link in the route), i.e., the hop count between the router
calculating the cost, and the destination of the route </t><t>LoopFree(R1, R2)
returns TRUE when the cost of R1 is less than or equal to the cost of R2, i.e.,
Cost(R1) &lt;= Cost(R2) </t><t>MAX_METRIC[HopCount] := MAX_HOPCOUNT
</t></list></t><t>The LoopFree function for the HopCount metric is derived from
the fact that route cost increases with number of hops. When examining two
routes, the route with higher cost may include the route with lower cost as a
sub-section of its route. Therefore, an advertised route with higher cost than
the corresponding stored route could include the stored route as a sub-section.
Replacing the stored route with the received route could form a routing loop.
LoopFree returns FALSE in this case to indicate that an advertised route with
higher cost is not to be used to update a stored route, even if the stored
route is Invalid. </t><t>MAX_HOPCOUNT is a constant defined in <xref
target="constants" pageno="false" format="default"/>. It MUST be larger than
the AODVv2 network diameter, in order that AODVv2 protocol messages may reach
their intended destinations. </t></section><section title="Alternate Metric
Types" anchor="alternate" toc="default"><t>Some applications may require metric
information other than hop count. For this reason, AODVv2 enables route
selection based on alternate metric types. </t><t>Using non-default metrics in
an AODVv2 message requires the inclusion of the MetricType data element.
</t><t>Alternate metrics may have different types and ranges, for example
integers or floating point numbers, or restricted subsets thereof. Therefore
the size of the metric field in route messages may vary. See <xref
target="metric-type" pageno="false" format="default"/> for further information
on MetricType number allocation and size. </t><t>Metrics might be classified
as additive, concave, convex, or multiplicative as discussed in <xref
target="RFC6551" pageno="false" format="default"/>. Where Cost and LoopFree
functions can be developed for a metric type, it can be supported by AODVv2.
</t><t>AODVv2 can support additive metrics using the Cost(R) and LoopFree(R1,
R2) functions defined for the default metric. Furthermore, any strictly
increasing metric can be supported using the LoopFree function defined. It is,
however, out of the scope of this document to specify for alternate metrics the
correct Cost(L), Cost(R), and LoopFree() functions. Where possible these should
take into account differences in the link cost in each direction.
</t></section></section><section title="AODVv2 Protocol Operations"
anchor="aodv_ops" toc="default"><t>The AODVv2 protocol's operations include
managing sequence numbers, monitoring adjacent AODVv2 routers, performing route
discovery and dealing with requests from other routers, processing incoming
route information and updating the route table, suppressing redundant messages,
maintaining the route table and reporting broken routes. These processes are
discussed in detail in the following sections. </t><section
title="Initialization" anchor="boot" toc="default"><t>During initialization
where the previous sequence number is unknown, or if the sequence number is
lost at any point, an AODVv2 router resets its sequence number(s) to one (1).
However, other AODVv2 routers may still hold sequence number information this
router previously issued. Since sequence number information will be removed if
there have been no sequence number updates in MAX_SEQNUM_LIFETIME, the
initializing router must wait for MAX_SEQNUM_LIFETIME before it creates any
messages containing its sequence number. It can then be sure that the
information it sends will not be considered stale. </t><t>Until
MAX_SEQNUM_LIFETIME after its sequence number is reset, the router SHOULD not
create RREQ or RREP messages. </t><t>During this wait period, the router can
do the following: </t><t><list style="symbols"><t>Process information in a
received RREQ or RREP message to learn a route to the originator or target
</t><t>Send a RREP_Ack </t><t>Regenerate a received RREQ or RREP </t><t>Forward
data packets to Router Clients, and to other routers, if a route exists
</t><t>Create, process and regenerate RERR messages
</t></list></t></section><section title="Adjacency Monitoring"
anchor="adjacencymonitoring" toc="default"><t>An adjacency is a bidirectional
relationship between neighboring AODVv2 routers for the purpose of exchanging
routing information. Not every pair of neighboring routers will necessarily
form an adjacency, but AODVv2 routers MUST monitor connectivity to neighboring
AODVv2 routers along potential routes and MUST NOT establish routes over
uni-directional links, since packet losses are likely to occur and route
establishment can fail. </t><t>The default approach for monitoring
bidirectional connectivity to the next hop toward OrigAddr is to request
acknowledgement of Route Reply messages. Receipt of an acknowledgement proves
that bidirectional connectivity exists. All AODVv2 routers MUST support this
process, which is explained in <xref target="RREP_msgs" pageno="false"
format="default"/> and <xref target="rrep_ack_msgs" pageno="false"
format="default"/>. </t><t>Bidirectionality to the next hop toward TargAddr is
confirmed by receipt of the Route Reply message, since a Route Reply message is
a reply to a Route Request message which previously crossed the link in the
opposite direction. </t><t>When routers perform other operations such as those
from the list below, these can be used as additional indications of
connectivity: </t><t><list style="symbols"><t>NHDP HELLO Messages <xref
target="RFC6130" pageno="false" format="default"/> </t><t>Route timeout
</t><t>Lower layer triggers, e.g. message reception or link status
notifications </t><t>TCP timeouts </t><t>Promiscuous listening </t><t>Other
monitoring mechanisms or heuristics </t></list></t><t>For example, receipt of a
Neighborhood Discovery Protocol HELLO message with the receiving router listed
as a neighbor is a signal of bidirectional connectivity. In this case,
acknowledgement of a RREP message sent to that neighbor is unnecessary.
Similarly, if AODVv2 receives notification of a timeout, this may be due to a
disconnection. The AODVv2 router SHOULD attempt to verify connectivity by
requesting acknowledgement of the next RREP sent to that neighbor. </t><t>The
Neighbor Table (<xref target="nbrlist" pageno="false" format="default"/>) gives
the last known state of the neighbor adjacency, either Confirmed, Unknown, or
Blacklisted. Until bidirectionality is confirmed, the state is Unknown, and
acknowledgement of RREP messages MUST be requested. If the state is Confirmed,
the acknowledgement request is unnecessary. If bidirectionality cannot be
confirmed, the state is Blacklisted. RREQs received from a blacklisted router,
or any router over a link that is known to be incoming-only, MUST be
disregarded. </t><t>Neighbor state is updated as follows: </t><t><list
style="symbols"><t>If a link to a neighbor is determined to be unidirectional,
either by failure to acknowledge a RREP, or by some other means, the neighbor
MUST be marked as blacklisted. </t><t>If a notification indicates that there
may be a problem with bidirectionality, and the neighbor state is currently
Confirmed, the state SHOULD be set to Unknown to force acknowledgement of the
next RREP sent to the neighbor. </t><t>If an indication of bidirectional
connectivity is received, the neighbor state SHOULD be set to Confirmed.
</t><t>If the neighbor state is Blacklisted and the reset time is reached, the
neighbor state SHOULD be reset to Unknown and the neighbor SHOULD again be
allowed to participate in route discovery. </t></list></t><t>If a link to a
neighbor is determined to be broken, the neighbor entry should be removed.
</t></section><section title="Message Transmission" anchor="MsgXmit"
toc="default"><t>In its default mode of operation, AODVv2 sends <xref
target="RFC5444" pageno="false" format="default"/> formatted messages using the
parameters for port number and IP protocol specified in <xref target="RFC5498"
pageno="false" format="default"/>. Mapping of AODVv2 data elements to RFC 5444
is detailed in <xref target="represent" pageno="false" format="default"/>.
</t><t>Unless otherwise specified, AODVv2 multicast messages are sent to the
link-local multicast address LL-MANET-Routers <xref target="RFC5498"
pageno="false" format="default"/>. All AODVv2 routers MUST subscribe to
LL-MANET-Routers <xref target="RFC5498" pageno="false" format="default"/> to
receive AODVv2 messages. </t><t>Implementations are free to choose their own
heuristics for reducing multicast overhead. Some methods for doing so are
described in <xref target="RFC6621" pageno="false" format="default"/>. AODVv2
does not specify which method should be used to restrict the set of AODVv2
routers that have the responsibility to regenerate multicast messages. Note
that multicast messages MAY be sent via unicast. For example, this may occur
for certain link-types (non-broadcast media), for manually configured router
adjacencies, or in order to improve robustness. </t><t>When multiple
interfaces are available, a node transmitting a multicast message to
LL-MANET-Routers MUST send the message on all interfaces that have been
configured for AODVv2 operation, as given in the AODVv2_INTERFACES list (<xref
target="interfaceslist" pageno="false" format="default"/>). Similarly, AODVv2
routers MUST subscribe to LL-MANET-Routers on all their AODVv2 interfaces.
</t><t>To avoid congestion, each AODVv2 router's rate of message generation
(CONTROL_TRAFFIC_LIMIT) SHOULD be limited and administratively configurable.
The implementation is free to choose the algorithm for limiting messages,
including prioritizing messages when approaching the limit. AODVv2 messages
SHOULD be discarded in the following order: RERR for invalidated routes, RREQ,
RREP, RERR for undeliverable packet, RREP_Ack. </t><t>IP packets containing
AODVv2 protocol messages SHOULD be given priority queuing and channel access.
</t></section><section title="Route Discovery, Retries and Buffering"
anchor="route_discovery" toc="default"><t>AODVv2's RREQ and RREP messages are
used for route discovery and are together known as route messages (RteMsgs).
The main difference between the two messages is that, by default, RREQ messages
are multicast to solicit a RREP, whereas RREP is unicast as a response to the
RREQ. The constants used in this section are defined in <xref target="param"
pageno="false" format="default"/>. </t><t>When an AODVv2 router needs to
forward a data packet (with source address OrigAddr and destination address
TargAddr) from one of its Router Clients, it needs a route to the packet's
destination. If no route exists, the AODVv2 router generates and multicasts a
Route Request message (RREQ) using OrigAddr and TargAddr. The procedure for
this is described in <xref target="RREQ_gen" pageno="false" format="default"/>.
The AODVv2 router is referred to as RREQ_Gen. </t><t>Data packets awaiting a
route MAY be buffered by RREQ_Gen. Buffering of data packets can have both
positive and negative effects (albeit usually positive). Real-time traffic,
voice, and scheduled delivery may suffer if packets are buffered and subjected
to delays, but TCP connection establishment will benefit if packets are queued
while route discovery is performed. </t><t>The packet buffer is configured
with a fixed limited size of BUFFER_SIZE_PACKETS or BUFFER_SIZE_BYTES.
Determining which packets to discard first when the buffer is full is a matter
of policy at each AODVv2 router. Nodes without sufficient memory available for
buffering SHOULD have buffering disabled by configuring BUFFER_SIZE_PACKETS :=
0 and BUFFER_SIZE_BYTES := 0. This will affect the latency for launching TCP
applications to new destinations. </t><t>RREQ_Gen awaits reception of a Route
Reply message (RREP) containing a route toward TargAddr. A RREQ from TargAddr
would also fulfil the request, if adjacency to the next hop is already
confirmed. If a route to TargAddr is not learned within RREQ_WAIT_TIME,
RREQ_Gen MAY retry the route discovery by generating another RREQ with a new
sequence number. To reduce congestion in a network, repeated attempts at route
discovery for a particular target address SHOULD utilize a binary exponential
backoff, as described in <xref target="RFC3561" pageno="false"
format="default"/>, where the wait time is doubled for each retry. </t><t>The
RREQ is received by neighboring AODVv2 routers, and processed and regenerated
as described in <xref target="RREQ_msgs" pageno="false" format="default"/>.
Intermediate routers learn a potential route to OrigAddr from the RREQ. The
router responsible for TargAddr responds by generating a Route Reply message
(RREP) and sends it back toward RREQ_Gen using the route to OrigAddr learned
from the RREQ. Each intermediate router regenerates the RREP and unicasts
toward OrigAddr. </t><t>Links which are not bidirectional cause problems. If a
RREP is not received at an intermediate router, the RREP cannot be regenerated
and will never reach RREQ_Gen. However, since routers monitor adjacencies
(<xref target="adjacencymonitoring" pageno="false" format="default"/>), the
loss of the RREP will cause the last router which regenerated the RREP to
blacklist the router which did not receive it. When a timeout occurs at
RREQ_Gen, a new RREQ may be regenerated. When the new RREQ arrives again via
the blacklisted router, it will be ignored, and the RREQ should discover a
different path. </t><t>Route discovery SHOULD be considered to have failed
after DISCOVERY_ATTEMPTS_MAX and the corresponding wait time for a RREP
response to the final RREQ. After the attempted route discovery has failed,
RREQ_Gen MUST wait at least RREQ_HOLDDOWN_TIME before attempting another route
discovery to the same destination. Any data packets buffered for TargAddr MUST
also be dropped and a Destination Unreachable ICMP message (Type 3) with a code
of 1 (Host Unreachable Error) SHOULD be delivered to the source of the data
packet. The source may be an application on RREQ_Gen itself, or on a Router
Client with address OrigAddr. </t><t>If RREQ_Gen does receive a route message
containing a route to TargAddr within the timeout, it processes the message
according to <xref target="aodv_msgs" pageno="false" format="default"/>. When a
valid route is installed, the router can begin sending the buffered packets.
Any retry timers for the corresponding RREQ SHOULD be cancelled. </t><t>During
route discovery, all routers on the path learn a route to both OrigAddr and
TargAddr, making the constructed route bidirectional. </t></section><section
title="Processing Received Route Information" anchor="processingrte"
toc="default"><t>All AODVv2 route messages contain a route. A Route Request
(RREQ) includes a route to OrigAddr, and a Route Reply (RREP) contains a route
to TargAddr. </t><t>All AODVv2 routers that receive a route message can store
the route contained within it. Incoming information is first checked to verify
that it is both safe to use and offers an improvement to existing information.
This process is explained in <xref target="test" pageno="false"
format="default"/>. The route table may then be updated according to <xref
target="update_rte" pageno="false" format="default"/>. </t><t>In the processes
below, RteMsg is used to denote the route message, AdvRte is used to denote the
route contained within it, and Route denotes a stored routing table entry which
matches AdvRte. </t><t>AdvRte has the following properties: </t><t><list
style="symbols"><t>AdvRte.Address := RteMsg.OrigAddr (in RREQ) or
RteMsg.TargAddr (in RREP) </t><t>AdvRte.PrefixLength := RteMsg.OrigPrefixLen
(in RREQ) or RteMsg.TargPrefixLen (in RREP) if included, or if no prefix length
was included in RteMsg, the address length, in bits, of AdvRte.Address
</t><t>AdvRte.SeqNum := RteMsg.OrigSeqNum (in RREQ) or RteMsg.TargSeqNum (in
RREP) </t><t>AdvRte.NextHop := IP.SourceAddress (the address of the router from
which the AdvRte was received) </t><t>AdvRte.MetricType := RteMsg.MetricType if
included, or DEFAULT_METRIC_TYPE if not </t><t>AdvRte.Metric := RteMsg.Metric
</t><t>AdvRte.Cost := Cost(R) using the cost function associated with the
route's metric type, where L is the link from the advertising router, i.e.
Cost(R) = AdvRte.Metric + Cost(L) for the default metric type
</t><t>AdvRte.ValidityTime := RteMsg.ValidityTime, if included
</t></list></t><t>If prefix length information is present, the route describes
the subnet on which the address resides. </t><section title="Evaluating Route
Information" anchor="test" toc="default"><t>To determine whether the advertised
route should be used to update the routing table, the incoming route
information MUST be processed as follows: </t><t><list
style="numbers"><t>Search for a routing table entry (Route) matching AdvRte's
address, prefix length and metric type <list style="symbols"><t>If no matching
route exists, AdvRte SHOULD be used to update the routing table. Multiple
routes to the same destination may exists with different metric types.
</t><t>If all matching routes have State set to Unconfirmed, AdvRte SHOULD be
used to update the routing table, so that it contains multiple Unconfirmed
routes. If an Unconfirmed route becomes valid in future, any remaining
Unconfirmed routes which would not offer improvement will be expunged.
</t><t>If a matching route exists with State set to Active, Idle, or Invalid,
continue to Step 2. </t></list> </t><t>Compare sequence numbers <list
style="symbols"><t>If AdvRte is more recent (AdvRte.SeqNum &gt; Route.SeqNum),
AdvRte MUST be used to update the routing table. </t><t>If AdvRte is stale
(AdvRte.SeqNum &lt; Route.SeqNum), AdvRte MUST NOT be used to update the
routing table. </t><t>If the sequence numbers are equal, continue to Step 3.
</t></list> </t><t>Check that AdvRte is safe against routing loops (see <xref
target="loopfree" pageno="false" format="default"/>) <list
style="symbols"><t>If LoopFree(AdvRte, Route) returns FALSE, AdvRte MUST NOT be
used to update the routing table because using the incoming information might
cause a routing loop. </t><t>If LoopFree(AdvRte, Route) returns TRUE, continue
to Step 3. </t></list> </t><t>Compare route costs <list style="symbols"><t>For
some metric types, including the default metric specified in <xref
target="default_metric" pageno="false" format="default"/>, the best route is
the route with the lowest metric value. For other metric types, the best route
may be the route with the highest metric. </t><t>If AdvRte is better, it
SHOULD be used to update the routing table because it offers improvement.
</t><t>If AdvRte is not better (i.e., it is worse or equal) and Route is valid,
AdvRte MUST NOT be used to update the routing table because it does not offer
any improvement. </t><t>If AdvRte is not better (i.e., it is worse or equal)
but Route is Invalid, AdvRte SHOULD be used to update the routing table because
it can safely repair the existing Invalid route. </t></list>
</t></list></t><t>If the advertised route SHOULD be used to update the routing
table, the procedure in <xref target="update_rte" pageno="false"
format="default"/> is followed. </t></section><section title="Applying Route
Updates" anchor="update_rte" toc="default"><t>If AdvRte is from a RREQ message,
the next hop neighbor may not be confirmed as adjacent (see <xref
target="nbrlist" pageno="false" format="default"/>). If Neighbor.State is
Unknown, the route may not be viable, but it MUST be stored to allow a
corresponding RREP to be sent. It SHOULD NOT yet be used to forward data.
Route.State will be set to Unconfirmed to indicate this. If a valid route
already exists for this destination, the Unconfirmed route should be stored as
an additional entry. </t><t>The route update is applied as follows:
</t><t><list style="numbers"><t>If no existing entry in the route table matches
AdvRte on address, prefix length and metric type, continue to Step 3 and create
a new route table entry. </t><t>If a matching entry exists: <list
style="symbols"><t>If AdvRte.NextHop is not equal to Route.NextHop, and
AdvRte.NextHop's Neighbor.State is Unknown and Route.State is Active or Idle,
the current route is valid but the advertised route may offer improvement, if
it can be confirmed. Continue to Step 3 and create a new route table entry. It
can replace the original route when Neighbor.State is set to Confirmed.
</t><t>If AdvRte.NextHop's Neighbor.State is Unknown and Route.State is
Invalid, continue to Step 4 and update the existing route table entry.
</t><t>If AdvRte.NextHop's Neighbor.State is Confirmed, continue to Step 4 and
update the existing route table entry. </t></list> </t><t>Create a route table
entry and initialize as follows: <list style="symbols"><t>Route.Address :=
AdvRte.Address </t><t>Route.PrefixLength := AdvRte.PrefixLength (if included),
or the length, in bits, of Route.Address (32 for IPv4 or 128 for IPv6)
</t><t>Route.MetricType := AdvRte.MetricType </t></list> </t><t>Update the
route table entry as follows: <list style="symbols"><t>Route.SeqNum :=
AdvRte.SeqNum </t><t>Route.NextHop := AdvRte.NextHop
</t><t>Route.NextHopInterface := interface on which RteMsg was received
</t><t>Route.Metric := AdvRte.Cost </t><t>Route.LastUsed := CurrentTime
</t><t>Route.LastSeqNumUpdate := CurrentTime </t><t>Route.ExpirationTime :=
CurrentTime + AdvRte.ValidityTime if a validity time exists, otherwise MAX_TIME
</t></list> </t><t>If a new route was created, or if the existing Route.State
is Invalid or Unconfirmed, update as follows: <list
style="symbols"><t>Route.State := Unconfirmed (if the next hop's Neighbor.State
is Unknown) or Idle </t></list> </t><t>If an existing route changed from
Invalid or Unconfirmed to become Idle, any matching inferior routes should be
expunged. </t><t>If this update results in a valid route which fulfills an
outstanding route discovery, the associated timers can be cancelled and any
buffered packets for this route can be forwarded.
</t></list></t></section></section><section title="Suppressing Redundant
Messages" anchor="suppress" toc="default"><t>When route messages are flooded in
a MANET, an AODVv2 router may receive multiple similar messages. Regenerating
every one of these gives little additional benefit, and generates unnecessary
signaling traffic and interference. </t><t>Each AODVv2 router stores
information about recently received route messages in the AODVv2 Multicast
RteMsg Table (<xref target="rtemsgtable" pageno="false" format="default"/>).
Received RteMsgs are tested against previously received RteMsgs, and if
determined to be redundant, regeneration can be avoided. Where necessary,
regeneration is performed using the processes in <xref target="aodv_msgs"
pageno="false" format="default"/>. </t><t>To determine if a received RREQ is
redundant: </t><t><list style="numbers"><t>Search for an entry in the RteMsg
Table with the same MessageType, OrigAddr, TargAddr, and MetricType <list
style="symbols"><t>If there is none, create an entry to store information about
the received RREQ and regenerate the RREQ. </t><t>If there is an entry, update
the timestamp field, since comparable RteMsgs are still traversing the network,
and continue to Step 2. </t></list> </t><t>Compare the sequence numbers <list
style="symbols"><t>If the entry has a lower OrigSeqNum than the received RREQ,
update the entry using information from the new RREQ and regenerate the RREQ.
</t><t>If the entry has a higher OrigSeqNum than the received RREQ, do not
update the entry and do not regenerate the RREQ. </t><t>If the entry has the
same OrigSeqNum, continue to Step 3. </t></list> </t><t>Compare the metric
values <list style="symbols"><t>If the entry has a Metric that is worse than
the received RREQ, update the entry using information from the new RREQ.
</t><t>If the entry has a Metric that is better than the received RREQ, do not
update the entry. </t><t>In both cases, the RREQ MAY be suppressed to avoid
extra control traffic. However, if the processing of the RREQ results in an
update to the route table, the RREQ MAY be regenerated to ensure other routers
have up-to-date information. </t></list> </t></list></t></section><section
title="Route Maintenance" anchor="route_maint" toc="default"><t>Route
maintenance involves monitoring and updating route state, handling route
timeouts and reporting routes that become Invalid. </t><t>Before using a route
to forward a packet, an AODVv2 router MUST check the status of the route (<xref
target="routestatechanges" pageno="false" format="default"/>). If the route is
valid, it MUST be marked as Active and its LastUsed timestamp MUST be updated,
before forwarding the packet to the route's next hop. If there is no valid
route, this MUST be reported to the packet's source (see <xref
target="brokenrerr" pageno="false" format="default"/>). </t><section
title="Route State" anchor="routestatechanges" toc="default"><t>During normal
operation, AODVv2 does not require any explicit timeouts to manage the lifetime
of a route. At any time, any route table entry can be examined and updated
according to the rules below. Route state should be checked before packet
forwarding and before any operation based on route state. </t><t>The four
possible states for an AODVv2 route are Active, Idle, Invalid, and Unconfirmed,
as defined in <xref target="rte" pageno="false" format="default"/>.
</t><t><list style="hanging"><t hangText="Active"><vspace blankLines="0"/>If an
Active route is not timed (i.e., its ExpirationTime is MAX_TIME), it becomes
Idle if not used within ACTIVE_INTERVAL. A timed route (i.e., a route with
ExpirationTime not equal to MAX_TIME) remains Active until its expiration time,
after which it MAY either be expunged or marked as Invalid. </t><t
hangText="Idle"><vspace blankLines="0"/>An Idle route becomes Active if it is
used to forward a packet. If not used, an Idle route remains idle for
MAX_IDLETIME before becoming an Invalid route. </t><t
hangText="Invalid"><vspace blankLines="0"/>An Invalid route MAY be maintained
until MAX_SEQNUM_LIFETIME after the last sequence number update. This allows
incoming information to be assessed for freshness. After this time it should be
expunged. </t><t hangText="Unconfirmed"><vspace blankLines="0"/>An Unconfirmed
route becomes Idle when adjacency with the next hop router is confirmed, or
will be expunged if the neighbor is blacklisted, or at MAX_SEQNUM_LIFETIME
after the last sequence number update. </t></list></t><t>In all cases, if the
time since the route's last sequence number update exceeds MAX_SEQNUM_LIFETIME,
the sequence number must be removed from the route. If the route is Invalid or
Unconfirmed at this time, it MUST be expunged. Active and Idle routes can
continue to be used to forward packets. The removal of the sequence number is
required to ensure that any AODVv2 routers following the initialization
procedure can safely begin routing functions using a new sequence number.
</t><t><xref target="check_route_state" pageno="false" format="default"/>
contains an algorithmic representation of this timeout behavior. </t><t>Routes
can become Invalid before a timeout occurs: </t><t><list style="symbols"><t>If
a link breaks, all routes using that link as the next hop MUST immediately be
marked as Invalid. </t><t>If a Route Error (RERR) message containing the route
is received from the route's next hop, the route MUST immediately be marked as
Invalid. </t></list></t><t>When an Unconfirmed route is set as Idle as a
result of the adjacency with Route.NextHop being Confirmed (see <xref
target="nbrlist" pageno="false" format="default"/>), any inferior matching
routes MUST be expunged. </t><t>Memory constrained devices MAY choose to
expunge routes from the AODVv2 route table before their expiration time, but
MUST adhere to the following rules: </t><t><list style="symbols"><t>An Active
route MUST NOT be expunged. </t><t>An Idle route SHOULD NOT be expunged.
</t><t>Any Invalid route MAY be expunged; least recently used Invalid routes
SHOULD be expunged first. </t><t>An Unconfirmed route MUST NOT be expunged if
it was installed within the last RREQ_WAIT_TIME. Otherwise, it MAY be expunged.
</t></list></t></section><section title="Reporting Invalid Routes"
anchor="brokenrerr" toc="default"><t>When an Active route becomes Invalid as a
result of a broken link or a received Route Error (RERR) message, other routers
should be informed by sending a RERR message containing details of the
invalidated route. </t><t>A RERR message should also be sent when an AODVv2
router receives a packet to forward on behalf of another router but does not
have a valid route for the destination of the packet. This packet may be a
data packet or, in rare cases, a RREP message, if the route to the request
originator has been lost. The packet or message triggering the RERR MUST be
discarded. </t><t>Generation of a RERR message is described in <xref
target="RERR_gen" pageno="false" format="default"/>.
</t></section></section></section><section title="AODVv2 Protocol Messages"
anchor="aodv_msgs" toc="default"><t>AODVv2 defines four message types: Route
Request (RREQ), Route Reply (RREP), Route Reply Acknowledgement (RREP_Ack), and
Route Error (RERR). </t><t>Each AODVv2 message is defined as a set of data
elements. Rules for the generation, reception and regeneration of each message
type are described in the following sections. <xref target="represent"
pageno="false" format="default"/> discusses how the data elements map to RFC
5444 Message TLVs, Address Blocks, and Address TLVs. </t><section title="Route
Request (RREQ) Message" anchor="RREQ_msgs" toc="default"><t>Route Request
messages are used in route discovery operations to request a route to a
specified target address. RREQ messages have the following general structure:
</t><figure anchor="RREQ_elem" align="center" title="RREQ message structure"
suppress-title="false" alt="" width="" height=""><artwork align="center"
xml:space="preserve" name="" type="" alt="" width="" height="">
+-----------------------------------------------------------------+
| msg_hop_limit, (optional) msg_hop_count |
+-----------------------------------------------------------------+
| AddressList |
+-----------------------------------------------------------------+
| PrefixLengthList (optional) |
+-----------------------------------------------------------------+
| OrigSeqNum, (optional) TargSeqNum |
+-----------------------------------------------------------------+
| MetricType (optional) |
+-----------------------------------------------------------------+
| OrigMetric |
+-----------------------------------------------------------------+
| ValidityTime (optional) |
+-----------------------------------------------------------------+
</artwork></figure><t></t><t><list style="hanging"><t hangText="RREQ Data
Elements"><list style="hanging"><t hangText="msg_hop_limit"><vspace
blankLines="0"/>The remaining number of hops allowed for dissemination of the
RREQ message. </t><t hangText="msg_hop_count"><vspace blankLines="0"/>The
number of hops already traversed during dissemination of the RREQ message.
</t><t hangText="AddressList"><vspace blankLines="0"/>Contains OrigAddr and
TargAddr, the source and destination addresses of the packet for which a route
is requested. OrigAddr and TargAddr MUST be routable unicast addresses. </t><t
hangText="PrefixLengthList"><vspace blankLines="0"/>Contains OrigPrefixLen,
i.e., the length, in bits, of the prefix associated with OrigAddr. If omitted,
the prefix length is equal to OrigAddr's address length in bits. If OrigAddr
resides on a subnet configured as a Router Client, the prefix length represents
the number of bits in the subnet mask. </t><t hangText="OrigSeqNum"><vspace
blankLines="0"/>The sequence number associated with OrigAddr. </t><t
hangText="TargSeqNum"><vspace blankLines="0"/>A sequence number associated with
TargAddr. This may be included if an Invalid route exists to the target. This
is useful for the optional Intermediate RREP feature (see <xref target="iRREP"
pageno="false" format="default"/>). </t><t hangText="MetricType"><vspace
blankLines="0"/>The type of metric associated with OrigMetric. This element can
be omitted if the default metric type is used. </t><t
hangText="OrigMetric"><vspace blankLines="0"/>The metric associated with the
route to OrigAddr, as measured by the sender of the message. </t><t
hangText="ValidityTime"><vspace blankLines="0"/>The length of time that the
message sender is willing to offer a route toward OrigAddr. Omitted if no time
limit is imposed. </t></list> </t></list></t><section title="RREQ Generation"
anchor="RREQ_gen" toc="default"><t>A RREQ is generated when a packet needs to
be forwarded for a Router Client, and no valid route currently exists for the
packet's destination. </t><t>Before creating a RREQ, the router should check
if a RREQ has recently been sent for the requested destination. If so, and the
wait time for a reply has not yet been reached, the router should continue to
await a response without generating a new RREQ. If the timeout has been
reached, a new RREQ may be generated. If buffering is configured, the incoming
packet SHOULD be buffered until the route discovery is completed. </t><t>If
the limit for the rate of AODVv2 control message generation has been reached,
no message should be generated. </t><t>To generate the RREQ, the router
(referred to as RREQ_Gen) follows this procedure: </t><t><list
style="numbers"><t>Set msg_hop_limit := MAX_HOPCOUNT </t><t>Set msg_hop_count
:= 0, if including it </t><t>Set AddressList := {OrigAddr, TargAddr} </t><t>For
the PrefixLengthList: <list style="symbols"><t>If OrigAddr resides on a Router
Client subnet, set PrefixLengthList := {OrigPrefixLen, null}.
</t><t>Otherwise, omit PrefixLengthList. </t></list> </t><t>For OrigSeqNum:
<list style="symbols"><t>Increment the SeqNum associated with OrigAddr as
specified in <xref target="seqnum" pageno="false" format="default"/>.
</t><t>Set OrigSeqNum := SeqNum. </t></list> </t><t>For TargSeqNum: <list
style="symbols"><t>If an Invalid route exists matching TargAddr using longest
prefix matching and has a valid sequence number, set TargSeqNum := route's
sequence number. </t><t>If no Invalid route exists matching TargAddr, or the
route doesn't have a sequence number, omit TargSeqNum. </t></list>
</t><t>Include the MetricType data element if requesting a route for a
non-default metric type, and set the type accordingly </t><t>Set OrigMetric :=
Route[OrigAddr].Metric </t><t>Include the ValidityTime data element if
advertising that the route to OrigAddr via this router is offered for a limited
time, and set ValidityTime accordingly </t></list></t><t>This AODVv2 message is
used to create a corresponding RFC 5444 message (see <xref target="represent"
pageno="false" format="default"/>) which is multicast, by default, to
LL-MANET-Routers on all interfaces configured for AODVv2 operation.
</t></section><section title="RREQ Reception" anchor="RREQ_rcv"
toc="default"><t>Upon receiving a RREQ, an AODVv2 router performs the following
steps: </t><t><list style="numbers"><t>If the sender is blacklisted (<xref
target="nbrlist" pageno="false" format="default"/>), check the entry's reset
time <list style="symbols"><t>If CurrentTime &lt; Remove Time, ignore this RREQ
for further processing. </t><t>If CurrentTime &gt;= Remove Time, reset the
neighbor state to Unknown and continue to Step 2. </t></list> </t><t>Verify
that the message hop count, if included, hasn't exceeded MAX_HOPCOUNT <list
style="symbols"><t>If so, ignore this RREQ for further processing. </t></list>
</t><t>Verify that the message contains the required data elements:
msg_hop_limit, OrigAddr, TargAddr, OrigSeqNum, and OrigMetric, and that
OrigAddr and TargAddr are valid addresses (routable and unicast) <list
style="symbols"><t>If not, ignore this RREQ for further processing.
</t></list> </t><t>If the MetricType data element is present, check that the
metric type is known <list style="symbols"><t>If not, ignore this RREQ for
further processing. </t></list> </t><t>Verify that the cost of the advertised
route will not exceed the maximum allowed metric value for the metric type
(Metric &lt;= MAX_METRIC[MetricType] - Cost(L)) <list style="symbols"><t>If it
will, ignore this RREQ for further processing. </t></list> </t><t>Process the
route to OrigAddr as specified in <xref target="test" pageno="false"
format="default"/> </t><t>Check if the message is redundant by comparing to
entries in the RteMsg table (<xref target="suppress" pageno="false"
format="default"/>) <list style="symbols"><t>If redundant, ignore this RREQ for
further processing. </t><t>If not redundant, save the information in the
RteMsg table to identify future duplicates and continue processing.
</t></list> </t><t>Check if the TargAddr belongs to one of the Router Clients
<list style="symbols"><t>If so, generate a RREP as specified in <xref
target="RREP_gen" pageno="false" format="default"/>. </t><t>If not, continue
to RREQ regeneration. </t></list> </t></list></t></section><section
title="RREQ Regeneration" anchor="RREQ_regen" toc="default"><t>By regenerating
a RREQ, a router advertises that it will forward packets to the OrigAddr
contained in the RREQ according to the information enclosed. The router MAY
choose not to regenerate the RREQ, though this could decrease connectivity in
the network or result in non-optimal paths. The full set of circumstances under
which a router may avoid regenerating a RREQ are not declared in this document,
though examples include the router being heavily loaded or low on energy and
therefore unwilling to advertise routing capability for more traffic.
</t><t>The RREQ should not be regenerated if the limit for the rate of AODVv2
control message generation has been reached. </t><t>The procedure for RREQ
regeneration is as follows: </t><t><list style="numbers"><t>Set msg_hop_limit
:= received msg_hop_limit - 1 </t><t>If msg_hop_limit is now zero, do not
continue the regeneration process </t><t>Set msg_hop_count := received
msg_hop_count + 1, if included, otherwise omit msg_hop_count </t><t>Set
AddressList, PrefixLengthList, sequence numbers and MetricType to the values in
the received RREQ </t><t>Set OrigMetric := Route[OrigAddr].Metric </t><t>If the
received RREQ contains a ValidityTime, or if the regenerating router wishes to
limit the time that it offers a route to OrigAddr, the regenerated RREQ MUST
include a ValidityTime data element <list style="symbols"><t>The ValidityTime
is either the ValidityTime the previous AODVv2 router specified, or the
ValidityTime this router wishes to impose, whichever is lower. </t></list>
</t></list></t><t>This AODVv2 message is used to create a corresponding RFC
5444 message (see <xref target="represent" pageno="false" format="default"/>)
which is multicast, by default, to LL-MANET-Routers on all interfaces
configured for AODVv2 operation. However, the regenerated RREQ can be unicast
to the next hop address of the route toward TargAddr, if known.
</t></section></section><section title="Route Reply (RREP) Message"
anchor="RREP_msgs" toc="default"><t>A Route Reply message is sent in response
to a Route Request message and offers a route to the Target Address in the
RREQ. </t><t>The RREP is sent by unicast to the next hop router on the route
to OrigAddr, if the next hop is confirmed as an adjacent neighbor. Otherwise,
the RREP is sent multicast to LL-MANET-Routers, including the AckReq data
element in the message to indicate the intended next hop address and request
acknowledgement to confirm the neighbor adjacency. </t><t>RREP messages have
the following general structure: </t><figure anchor="figRREP" align="center"
title="RREP message structure" suppress-title="false" alt="" width=""
height=""><artwork align="center" xml:space="preserve" name="" type="" alt=""
width="" height="">
+-----------------------------------------------------------------+
| msg_hop_limit, (optional) msg_hop_count |
+-----------------------------------------------------------------+
| AckReq (optional) |
+-----------------------------------------------------------------+
| AddressList |
+-----------------------------------------------------------------+
| PrefixLengthList (optional) |
+-----------------------------------------------------------------+
| TargSeqNum |
+-----------------------------------------------------------------+
| MetricType (optional) |
+-----------------------------------------------------------------+
| TargMetric |
+-----------------------------------------------------------------+
| ValidityTime (optional) |
+-----------------------------------------------------------------+
</artwork></figure><t></t><t><list style="hanging"><t hangText="RREP Data
Elements"><list style="hanging"><t hangText="msg_hop_limit"><vspace
blankLines="0"/>The remaining number of hops allowed for dissemination of the
RREP message. </t><t hangText="msg_hop_count"><vspace blankLines="0"/>The
number of hops already traversed during dissemination of the RREP message.
</t><t hangText="AckReq"><vspace blankLines="0"/>The address of the intended
next hop of the RREP. This data element is used when the RREP is multicast
because the next hop toward OrigAddr is a neighbor with Unknown state. It
indicates that an acknowledgement to the RREP is requested by the sender from
the intended next hop (see <xref target="adjacencymonitoring" pageno="false"
format="default"/>). </t><t hangText="AddressList"><vspace
blankLines="0"/>Contains OrigAddr and TargAddr, the source and destination
addresses of the packet for which a route is requested. OrigAddr and TargAddr
MUST be routable unicast addresses. </t><t hangText="PrefixLengthList"><vspace
blankLines="0"/>Contains TargPrefixLen, i.e., the length, in bits, of the
prefix associated with TargAddr. If omitted, the prefix length is equal to
TargAddr's address length, in bits. If TargAddr resides on a subnet configured
as a Router Client, the prefix length represents the number of bits in the
subnet mask. </t><t hangText="TargSeqNum"><vspace blankLines="0"/>The sequence
number associated with TargAddr. </t><t hangText="MetricType"><vspace
blankLines="0"/>The type of metric associated with TargMetric. This element can
be omitted if the default metric type is used. </t><t
hangText="TargMetric"><vspace blankLines="0"/>The metric associated with the
route to TargAddr, as seen from the sender of the message. </t><t
hangText="ValidityTime"><vspace blankLines="0"/>The length of time that the
message sender is willing to offer a route toward TargAddr. Omitted if no time
limit is imposed. </t></list> </t></list></t><section title="RREP Generation"
anchor="RREP_gen" toc="default"><t>A RREP is generated when a RREQ arrives for
one of the AODVv2 router's Router Clients. </t><t>Before creating a RREP, the
router should check if the corresponding RREQ is redundant, i.e., a response
has already been generated, or if the limit for the rate of AODVv2 control
message generation has been reached. If so, the RREP should not be created.
</t><t>If the next hop neighbor on the route to OrigAddr is not yet confirmed
as adjacent (as described in <xref target="adjacencymonitoring" pageno="false"
format="default"/>), the RREP MUST include an AckReq data element including the
intended next hop address, in order to perform adjacency monitoring. If the
adjacency is already confirmed, it can be omitted. The AckReq data element
indicates that an acknowledgement to the RREP is requested from the intended
next hop router in the form of a Route Reply Acknowledgement (RREP_Ack).
</t><t>Implementations may allow a number of retries of the RREP if an
acknowledgement is not received within RREP_Ack_SENT_TIMEOUT, doubling the
timeout with each retry, up to a maximum of RREP_RETRIES, using the same
exponential backoff described in <xref target="route_discovery" pageno="false"
format="default"/> for RREQ retries. Adjacency confirmation MUST be considered
to have failed after the wait time for a RREP_Ack response to the final RREP.
The next hop router MUST be marked as blacklisted (<xref target="nbrlist"
pageno="false" format="default"/>), and any installed routes with next hop set
to the newly blacklisted router should become Invalid. </t><t>To generate the
RREP, the router (also referred to as RREP_Gen) follows this procedure:
</t><t><list style="numbers"><t>Set msg_hop_limit := msg_hop_count from the
received RREQ message, if it was included, or MAX_HOPCOUNT if it was not
included </t><t>Set msg_hop_count := 0, if including it </t><t>If adjacency
with the next hop toward OrigAddr is not already confirmed, include the AckReq
data element with the address of the intended next hop router </t><t>Set
Address List := {OrigAddr, TargAddr} </t><t>For the PrefixLengthList: <list
style="symbols"><t>If TargAddr resides on a Router Client subnet, set
PrefixLengthList := {null, TargPrefixLen}. </t><t>Otherwise, omit
PrefixLengthList. </t></list> </t><t>For the TargSeqNum: <list
style="symbols"><t>Increment the SeqNum associated with TargAddr as specified
in <xref target="seqnum" pageno="false" format="default"/>. </t><t>Set
TargSeqNum := SeqNum. </t></list> </t><t>Include the MetricType data element
if the route requested is for a non-default metric type, and set the type
accordingly </t><t>Set TargMetric := Route[TargAddr].Metric </t><t>Include the
ValidityTime data element if advertising that the route to TargAddr via this
router is offered for a limited time, and set ValidityTime accordingly
</t></list></t><t>This AODVv2 message is used to create a corresponding RFC
5444 message (see <xref target="represent" pageno="false" format="default"/>).
If the next hop of RREP_Gen's route to OrigAddr is a neighbor with state
Confirmed, the RREP is unicast to the IP address of the neighbor. If the
neighbor has state Unknown, the RREP is multicast to LL-MANET-Routers.
</t></section><section title="RREP Reception" anchor="RREP_rcv"
toc="default"><t>Upon receiving a RREP, an AODVv2 router performs the following
steps: </t><t><list style="numbers"><t>If the sender is blacklisted (<xref
target="nbrlist" pageno="false" format="default"/>), but the RREP answers a
recently sent RREQ, the sender state should be set to Confirmed since a RREP is
an indication of adjacency </t><t>Verify that the message hop count, if
included, hasn't exceeded MAX_HOPCOUNT <list style="symbols"><t>If so, ignore
this RREQ for further processing. </t></list> </t><t>Verify that the message
contains the required data elements: msg_hop_limit, OrigAddr, TargAddr,
TargSeqNum, and TargMetric, and that OrigAddr and TargAddr are valid addresses
(routable and unicast) <list style="symbols"><t>If not, ignore this RREP for
further processing. </t></list> </t><t>If the MetricType data element is
present, check that the metric type is known <list style="symbols"><t>If not,
ignore this RREP for further processing. </t></list> </t><t>Verify that the
cost of the advertised route will not exceed the maximum allowed metric value
for the metric type (Metric &lt;= MAX_METRIC[MetricType] - Cost(L)) <list
style="symbols"><t>If it will, ignore this RREP for further processing.
</t></list> </t><t>If the AckReq data element is present, check the intended
recipient of the received RREP <list style="symbols"><t>If the receiving router
is the intended recipient, send an acknowledgement as specified in <xref
target="rrep_ack_msgs" pageno="false" format="default"/> and continue
processing. </t><t>If the receiving router is not the intended recipient,
ignore this RREP for further processing. </t></list> </t><t>Process the route
to TargAddr as specified in <xref target="test" pageno="false"
format="default"/> <list style="symbols"><t>If the route to TargAddr fulfills a
previously sent RREQ, any associated timeouts will be cancelled and buffered
packets will be forwarded to TargAddr, but processing continues to Step 8.
</t></list> </t><t>Check if the message is redundant by comparing to entries in
the RteMsg table (<xref target="suppress" pageno="false" format="default"/>)
<list style="symbols"><t>If redundant, ignore this RREP for further processing.
</t><t>If not redundant, save the information in the RteMsg table to identify
future redundant RREP messages and continue processing. </t></list>
</t><t>Check if the OrigAddr belongs to one of the Router Clients <list
style="symbols"><t>If so, no further processing is necessary. </t></list>
</t><t>Check if a valid (Active or Idle) or Unconfirmed route exists to
OrigAddr <list style="symbols"><t>If so, continue to RREP regeneration.
</t><t>If not, a Route Error message SHOULD be transmitted to TargAddr
according to <xref target="RERR_gen" pageno="false" format="default"/> and the
RREP should be discarded and not regenerated. </t></list>
</t></list></t></section><section title="RREP Regeneration" anchor="RREP_regen"
toc="default"><t>A received Route Reply message is regenerated toward OrigAddr.
Unless the router is prepared to advertise the route contained within the
received RREP, it halts processing. By regenerating a RREP, a router advertises
that it will forward packets to TargAddr according to the information enclosed.
The router MAY choose not to regenerate the RREP, in the same way it may choose
not to regenerate a RREQ (see <xref target="RREQ_regen" pageno="false"
format="default"/>), though this could decrease connectivity in the network or
result in non-optimal paths. </t><t>The RREP should not be regenerated if the
limit for the rate of AODVv2 control message generation has been reached.
</t><t>If the next hop neighbor on the route to OrigAddr is not yet confirmed
as adjacent (as described in <xref target="adjacencymonitoring" pageno="false"
format="default"/>), the RREP MUST include an AckReq data element including the
intended next hop address, in order to perform adjacency monitoring. If the
adjacency is already confirmed, the AckReq data element can be omitted. The
AckReq data element indicates that an acknowledgement to the RREP is requested
in the form of a Route Reply Acknowledgement (RREP_Ack) from the intended next
hop router. </t><t>The procedure for RREP regeneration is as follows:
</t><t><list style="numbers"><t>Set msg_hop_limit := received msg_hop_limit - 1
</t><t>If msg_hop_limit is now zero, do not continue the regeneration process
</t><t>Set msg_hop_count := received msg_hop_count + 1, if it was included,
otherwise omit msg_hop_count </t><t>If an adjacency with the next hop toward
OrigAddr is not already confirmed, include the AckReq data element with the
address of the intended next hop router </t><t>Set AddressList,
PrefixLengthList, TargSeqNum and MetricType to the values in the received RREP
</t><t>Set TargMetric := Route[TargAddr].Metric </t><t>If the received RREP
contains a ValidityTime, or if the regenerating router wishes to limit the time
that it will offer a route to TargAddr, the regenerated RREP MUST include a
ValidityTime data element <list style="symbols"><t>The ValidityTime is either
the ValidityTime the previous AODVv2 router specified, or the ValidityTime this
router wishes to impose, whichever is lower. </t></list>
</t></list></t><t>This AODVv2 message is used to create a corresponding RFC
5444 message (see <xref target="represent" pageno="false" format="default"/>).
If the next hop of RREP_Gen's route to OrigAddr is a neighbor with state
Confirmed, the RREP is unicast to the IP address of the neighbor. If the
neighbor has state Unknown, the RREP is multicast to LL-MANET-Routers.
</t></section></section><section title="Route Reply Acknowledgement (RREP_Ack)
Message" anchor="rrep_ack_msgs" toc="default"><t>The Route Reply
Acknowledgement MUST be sent in response to a received Route Reply which
includes an AckReq data element with an address matching one of the receiving
router's IP addresses. When the RREP_Ack message is received, it confirms the
adjacency between the two routers. The RREP_Ack has no data elements.
</t><section title="RREP_Ack Generation" anchor="RREP_Ack_gen"
toc="default"><t>A RREP_Ack MUST be generated when a received RREP includes the
AckReq data element with the address of the receiving router. The RREP_Ack
should not be generated if the limit for the rate of AODVv2 control message
generation has been reached. </t><t>There are no data elements in a RREP_Ack.
The RFC 5444 representation is discussed in <xref target="represent"
pageno="false" format="default"/>. The RREP_Ack is unicast, by default, to the
IP address of the router that requested it. </t></section><section
title="RREP_Ack Reception" anchor="RREP_Ack_rcv" toc="default"><t>Upon
receiving a RREP_Ack, an AODVv2 router performs the following steps:
</t><t><list style="numbers"><t>If a RREP_Ack message was expected from the IP
source address of the RREP_Ack, the router cancels any associated timeouts
</t><t>If the RREP_Ack was expected, ensure the router sending the RREP_Ack is
marked with state Confirmed in the Neighbor Table (<xref target="nbrlist"
pageno="false" format="default"/>) </t></list></t></section></section><section
title="Route Error (RERR) Message" anchor="RERR_msgs" toc="default"><t>A Route
Error message is generated by an AODVv2 router to notify other AODVv2 routers
of routes that are no longer available. A RERR message has the following
general structure: </t><figure anchor="figRERRstruct" align="center"
title="RERR message structure" suppress-title="false" alt="" width=""
height=""><artwork align="center" xml:space="preserve" name="" type="" alt=""
width="" height="">
+-----------------------------------------------------------------+
| msg_hop_limit |
+-----------------------------------------------------------------+
| PktSource (optional) |
+-----------------------------------------------------------------+
| AddressList |
+-----------------------------------------------------------------+
| PrefixLengthList (optional) |
+-----------------------------------------------------------------+
| SeqNumList (optional) |
+-----------------------------------------------------------------+
| MetricTypeList (optional) |
+-----------------------------------------------------------------+
</artwork></figure><t></t><t><list style="hanging"><t hangText="RERR Data
Elements"><list style="hanging"><t hangText="msg_hop_limit"><vspace
blankLines="0"/>The remaining number of hops allowed for dissemination of the
RERR message. </t><t hangText="PktSource"><vspace blankLines="0"/>The source
IP address of the packet triggering the RERR. If the RERR is triggered by a
broken link, the PktSource data element is not required. </t><t
hangText="AddressList"><vspace blankLines="0"/>The addresses of the routes no
longer available through RERR_Gen. </t><t hangText="PrefixLengthList"><vspace
blankLines="0"/>The prefix lengths, in bits, associated with the routes no
longer available through RERR_Gen, indicating whether a route represents a
single device or a subnet. </t><t hangText="SeqNumList"><vspace
blankLines="0"/>The sequence numbers of the routes no longer available through
RERR_Gen (where known). </t><t hangText="MetricTypeList"><vspace
blankLines="0"/>The types of metric associated with the routes no longer
available through RERR_Gen. This element can be omitted if all routes use the
default metric type. </t></list> </t></list></t><section title="RERR
Generation" anchor="RERR_gen" toc="default"><t>A RERR is generated when an
AODVv2 router (also referred to as RERR_Gen) needs to report that a destination
is no longer reachable. There are two events that cause this response:
</t><t><list style="symbols"><t>If a packet arrives that cannot be forwarded
because no valid route exists for its destination, the RERR generated MUST
contain the PktSource data element and will contain only one unreachable
address. The contents of PktSource and AddressList depend on the packet that
triggered the RERR: <list style="symbols"><t>If the packet is a data packet
forwarded by another AODVv2 router, PktSource is set to the source IP address
of the packet, and the AddressList contains the destination IP address of the
packet. </t><t>If the packet contains a RREP message and the route to OrigAddr
has been lost, PktSource is set to the TargAddr of the RREP, and the
AddressList contains the OrigAddr from the RREP. </t></list> <vspace
blankLines="1"/> The prefix length and sequence number MAY be included if known
from an Invalid route entry to the destination of the packet. The
MetricTypeList MAY also be included if a MetricType can be determined from the
packet itself, or if an Invalid route exists for the packet's destination and
the metric type is not DEFAULT_METRIC_TYPE. <vspace blankLines="1"/> RERR_Gen
MUST discard the packet or message that triggered generation of the RERR.
<vspace blankLines="1"/> In order to avoid flooding the network with RERR
messages when a stream of packets to an unreachable address arrives, an AODVv2
router SHOULD determine whether a RERR has recently been sent with the same
unreachable address and PktSource, and SHOULD avoid creating duplicate RERR
messages. </t><t>When a link breaks, multiple routes may become Invalid, and
the RERR generated MAY contain multiple unreachable addresses. If the message
contents would cause the MTU to be exceeded, multiple RERR messages must be
sent. The RERR MUST include the MetricTypeList data element when it contains
routes which do not use the DEFAULT_METRIC_TYPE. The PktSource data element is
omitted. <vspace blankLines="1"/> All previously Active routes that used the
broken link MUST be reported. The AddressList, PrefixLengthList, SeqNumList,
and MetricTypeList will contain entries for each route which has become
Invalid. <vspace blankLines="1"/> A RERR message is only sent if an Active
route becomes Invalid, though an AODVv2 router can also include Idle routes
that become Invalid if the configuration parameter ENABLE_IDLE_IN_RERR is set
(see <xref target="other" pageno="false" format="default"/>).
</t></list></t><t>Incidentally, if an AODVv2 router receives an ICMP error
packet to or from the address of one of its Router Clients, it simply forwards
the ICMP packet in the same way as any other data packet, and will not generate
any RERR message based on the contents of the ICMP packet. </t><t>The RERR
should not be generated if the limit for the rate of AODVv2 control message
generation has been reached. </t><t>To generate the RERR, the router follows
this procedure: </t><t><list style="numbers"><t>Set msg_hop_limit :=
MAX_HOPCOUNT </t><t>If necessary, include the PktSource data element and set
the value to the source address of the packet triggering the RERR </t><t>For
each route that needs to be reported, while respecting the interface MTU: <list
style="symbols"><t>Insert the route address into the AddressList.
</t><t>Insert the prefix length into PrefixLengthList, if known and not equal
to the address length. </t><t>Insert the sequence number into SeqNumList, if
known. </t><t>Insert the metric type into MetricTypeList, if known and not
equal to DEFAULT_METRIC_TYPE. </t></list> </t><t>If interface MTU would be
exceeded, create additional RERR messages </t></list></t><t>The AODVv2 message
is used to create a corresponding RFC 5444 message (see <xref
target="represent" pageno="false" format="default"/>). </t><t>If the RERR is
sent in response to an undeliverable packet or message, it SHOULD be sent
unicast to the next hop on the route to PktSource, or alternatively it MUST be
multicast to LL-MANET-Routers. </t><t>If the RERR is sent in response to a
broken link, the RERR is, by default, multicast to LL-MANET-Routers. </t><t>If
the optional precursor lists feature (see <xref target="precursor"
pageno="false" format="default"/>) is enabled, the RERR is unicast to the
precursors of the routes being reported. </t></section><section title="RERR
Reception" anchor="RERR_rcv" toc="default"><t>Upon receiving a RERR, an AODVv2
router performs the following steps: </t><t><list style="numbers"><t>Verify
that the message contains the required data elements: msg_hop_limit and at
least one unreachable address <list style="symbols"><t>If not, ignore this RREP
for further processing. </t></list> </t><t>For each address in the
AddressList, check that: <list style="symbols"><t>The address is valid
(routable and unicast) </t><t>The MetricType, if present, is known (assume
DEFAULT_METRIC_TYPE if not present) </t><t>There is a valid route with the same
MetricType matching the address using longest prefix matching </t><t>Either the
route's next hop is the sender of the RERR and route's next hop interface is
the interface on which the RERR was received, or PktSource is present in the
RERR and is a Router Client address </t><t>The unreachable address' sequence
number is either unknown, or is greater than the route's sequence number
</t></list> <vspace blankLines="1"/> If any of the above are false, the route
does not need to be made Invalid and the unreachable address does not need to
be advertised in a regenerated RERR. <vspace blankLines="1"/> If all of the
above are true: <list style="symbols"><t>If the route's prefix length is the
same as the unreachable address' prefix length, set the route state to Invalid,
and note that the route should be advertised in a regenerated RERR. </t><t>If
the prefix length is shorter than the original route, the route MUST be
expunged from the routing table, since it is a sub-route of the larger route
which is reported to be Invalid. </t><t>If the prefix length is different,
create a new route with the unreachable address, and its prefix and sequence
number, set the state to Invalid, and note that the route should be advertised
in a regenerated RERR. </t><t>Update the sequence number on the stored route,
if the reported sequence number is greater. </t></list> </t><t>If PktSource is
included and is a Router Client, do not regenerate the RERR. </t><t>Check if
there are unreachable addresses which need to be advertised in a regenerated
RERR <list style="symbols"><t>If so, regenerate the RERR as detailed in <xref
target="RERR_regen" pageno="false" format="default"/>. </t><t>If not, take no
further action. </t></list> </t></list></t></section><section title="RERR
Regeneration" anchor="RERR_regen" toc="default"><t>The RERR should not be
generated if the limit for the rate of AODVv2 control message generation has
been reached. </t><t>The procedure for RERR regeneration is as follows:
</t><t><list style="numbers"><t>Set msg_hop_limit := received msg_hop_limit - 1
</t><t>If msg_hop_limit is now zero, do not continue the regeneration process
</t><t>If the PktSource data element was included in the original RERR, copy it
into the regenerated RERR </t><t>For each route that needs to be reported,
while respecting the interface MTU: <list style="symbols"><t>Insert the
unreachable address into the AddressList. </t><t>Insert the prefix length into
PrefixLengthList, if known and not equal to the address length. </t><t>Insert
the sequence number into SeqNumList, if known. </t><t>Insert the MetricType
into MetricTypeList if known, and not equal to DEFAULT_METRIC_TYPE.
</t></list> </t><t>If interface MTU would be exceeded, create additional RERR
messages </t></list></t><t>The AODVv2 message is used to create a corresponding
RFC 5444 message (see <xref target="represent" pageno="false"
format="default"/>). If the RERR contains the PktSource data element, the
regenerated RERR SHOULD be sent unicast to the next hop on the route to
PktSource, or alternatively it MUST be multicast to LL-MANET-Routers. If the
RERR is sent in response to a broken link, the RERR is, by default, multicast
to LL-MANET-Routers. </t></section></section></section><section title="RFC
5444 Representation" anchor="represent" toc="default"><t>AODVv2 specifies that
all control plane messages between routers SHOULD use the Generalized Mobile Ad
Hoc Network Packet/Message Format <xref target="RFC5444" pageno="false"
format="default"/>, and therefore AODVv2 defines route messages comprising data
elements that map to message elements in RFC 5444. </t><t>RFC 5444 provides a
multiplexed transport for multiple protocols. An RFC 5444 multiplexer may
choose to optimize the content of certain message elements to reduce control
plane overhead. </t><t>A brief summary of the RFC 5444 format: </t><t><list
style="numbers"><t>A packet contains zero or more messages </t><t>A message
contains a Message Header, one Message TLV Block, zero or more Address Blocks,
and one Address Block TLV Block per Address Block </t><t>The Message TLV Block
MAY contain zero or more Message TLVs </t><t>An Address Block TLV Block MAY
include zero or more Address Block TLVs </t><t>Each TLV value in an Address
Block TLV Block can be associated with all of the addresses, a contiguous set
of addresses, or a single address in the Address Block </t></list></t><t>AODVv2
does not require access to the RFC 5444 packet header. </t><t>In the message
header, AODVv2 uses &lt;msg-hop-limit&gt;, &lt;msg-hop-count&gt;,
&lt;msg-type&gt; and &lt;msg-addr-length&gt;. &lt;msg-addr-length&gt;
indicates the length of any addresses in the message (using
&lt;msg-addr-length&gt; := address length in octets - 1, i.e. 3 for IPv4 and 15
for IPv6). </t><t>Each address included in the Address Block is identified as
OrigAddr, TargAddr, PktSource, or Unreachable Address by including an
ADDRESS_TYPE TLV in the Address Block TLV Block. </t><t>The addresses in an
Address Block may appear in any order, and values in a TLV in the Address Block
TLV Block must be associated with the correct address in the Address Block. To
indicate which value is associated with each address, the AODVv2 message
representation uses lists where the order of the addresses in the AODVv2
AddressList data element matches the order of values in other list-based data
elements, e.g., the order of SeqNums in the SeqNumList in a RERR. </t><t>The
following sections show how AODVv2 data elements are represented in RFC 5444
messages. See <xref target="IANA" pageno="false" format="default"/> for more
information about the Message TLVs and Address Block TLVs AODVv2 defines, and
the type numbers allocated. </t><t>Where the extension type of a TLV is set to
zero, this is the default RFC 5444 value and the extension type will not be
included in the message. </t><section title="RREQ" anchor="rreq"
toc="default"><section title="Message Header" anchor="message-header"
toc="default"><texttable title="" suppress-title="false" align="center"
style="full"><ttcol align="left">Data Element </ttcol><ttcol
align="left">Header Field </ttcol><ttcol align="left">Value </ttcol><c>None
</c><c>&lt;msg-type&gt; </c><c>RREQ </c><c>msg_hop_limit
</c><c>&lt;msg-hop-limit&gt; </c><c>MAX_HOPCOUNT </c><c>msg_hop_count
</c><c>&lt;msg-hop-count&gt; </c><c>Number of hops traversed so far by the
message. </c></texttable></section><section title="Message TLV Block"
anchor="message-tlv-block" toc="default"><t>A RREQ contains no Message TLVs.
</t></section><section title="Address Block" anchor="address-block"
toc="default"><t>A RREQ contains two Addresses, OrigAddr and TargAddr, and each
address has an associated prefix length. If the prefix length has not been
included in the AODVv2 message, it is equal to the address length in bits.
</t><texttable title="" suppress-title="false" align="center"
style="full"><ttcol align="left">Data Elements </ttcol><ttcol
align="left">Address Block </ttcol><c>OrigAddr/OrigPrefixLen
</c><c>&lt;address&gt; + &lt;prefix-length&gt; </c><c>TargAddr/TargPrefixLen
</c><c>&lt;address&gt; + &lt;prefix-length&gt;
</c></texttable></section><section title="Address Block TLV Block"
anchor="address-block-tlv-block" toc="default"><t>Address Block TLVs are always
associated with addresses in the Address Block. The following sections show the
TLVs that apply to each address. </t><section title="Address Block TLVs for
OrigAddr" anchor="address-block-tlvs-for-origaddr" toc="default"><texttable
title="" suppress-title="false" align="center" style="full"><ttcol
align="left">Data Element </ttcol><ttcol align="left">TLV Type </ttcol><ttcol
align="left">Extension Type </ttcol><ttcol align="left">Value </ttcol><c>None
</c><c>ADDRESS_TYPE </c><c>0 </c><c>ADDRTYPE_ORIGADDR </c><c>OrigSeqNum
</c><c>SEQ_NUM </c><c>0 </c><c>Sequence Number of RREQ_Gen, the router which
initiated route discovery. </c><c>OrigMetric /MetricType </c><c>PATH_METRIC
</c><c>MetricType </c><c>Metric for the route to OrigAddr, using MetricType.
</c><c>ValidityTime </c><c>VALIDITY_TIME </c><c>0 </c><c>ValidityTime for route
to OrigAddr. </c></texttable><t>In the AODVv2 representation, if the message
relates to DEFAULT_METRIC_TYPE, MetricType is not included in the message. The
RFC 5444 representation will set the extension type in the PATH_METRIC TLV to
0. AODVv2 interprets a MetricType of 0 as DEFAULT_METRIC_TYPE.
</t></section><section title="Address Block TLVs for TargAddr"
anchor="address-block-tlvs-for-targaddr" toc="default"><texttable title=""
suppress-title="false" align="center" style="full"><ttcol align="left">Data
Element </ttcol><ttcol align="left">TLV Type </ttcol><ttcol
align="left">Extension Type </ttcol><ttcol align="left">Value </ttcol><c>None
</c><c>ADDRESS_TYPE </c><c>0 </c><c>ADDRTYPE_TARGADDR </c><c>TargSeqNum
</c><c>SEQ_NUM </c><c>0 </c><c>The last known TargSeqNum for TargAddr.
</c></texttable></section></section></section><section title="RREP"
anchor="rrep" toc="default"><section title="Message Header"
anchor="message-header-1" toc="default"><texttable title=""
suppress-title="false" align="center" style="full"><ttcol align="left">Data
Element </ttcol><ttcol align="left">Header Field </ttcol><ttcol
align="left">Value </ttcol><c>None </c><c>&lt;msg-type&gt; </c><c>RREP
</c><c>msg_hop_limit </c><c>&lt;msg-hop-limit&gt; </c><c>&lt;msg-hop-count&gt;
from corresponding RREQ. </c><c>msg_hop_count </c><c>&lt;msg-hop-count&gt;
</c><c>Number of hops traversed so far by the message.
</c></texttable></section><section title="Message TLV Block"
anchor="message-tlv-block-1" toc="default"><t>A RREP contains no Message TLVs.
</t></section><section title="Address Block" anchor="address-block-1"
toc="default"><t>A RREP contains a minimum of two Addresses, OrigAddr and
TargAddr, and each address has an associated prefix length. If the prefix
length has not been included in the AODVv2 message, it is equal to the address
length in bits. </t><t>It may also contain the address of the intended next
hop, in order to request acknowledgement to confirm adjacency, as described in
<xref target="adjacencymonitoring" pageno="false" format="default"/>. The
prefix length associated with this address is equal to the address length in
bits. </t><texttable title="" suppress-title="false" align="center"
style="full"><ttcol align="left">Data Elements </ttcol><ttcol
align="left">Address Block </ttcol><c>OrigAddr/OrigPrefixLen
</c><c>&lt;address&gt; + &lt;prefix-length&gt; </c><c>TargAddr/TargPrefixLen
</c><c>&lt;address&gt; + &lt;prefix-length&gt; </c><c>AckReq
</c><c>&lt;address&gt; + &lt;prefix-length&gt;
</c></texttable></section><section title="Address Block TLV Block"
anchor="address-block-tlv-block-1" toc="default"><t>Address Block TLVs are
always associated with addresses in the Address Block. The following sections
show the TLVs that apply to each address. </t><section title="Address Block
TLVs for OrigAddr" anchor="address-block-tlvs-for-origaddr-1"
toc="default"><texttable title="" suppress-title="false" align="center"
style="full"><ttcol align="left">Data Element </ttcol><ttcol align="left">TLV
Type </ttcol><ttcol align="left">Extension Type </ttcol><ttcol
align="left">Value </ttcol><c>None </c><c>ADDRESS_TYPE </c><c>0
</c><c>ADDRTYPE_ORIGADDR </c></texttable></section><section title="Address
Block TLVs for TargAddr" anchor="address-block-tlvs-for-targaddr-1"
toc="default"><texttable title="" suppress-title="false" align="center"
style="full"><ttcol align="left">Data Element </ttcol><ttcol align="left">TLV
Type </ttcol><ttcol align="left">Extension Type </ttcol><ttcol
align="left">Value </ttcol><c>None </c><c>ADDRESS_TYPE </c><c>0
</c><c>ADDRTYPE_TARGADDR </c><c>TargSeqNum </c><c>SEQ_NUM </c><c>0
</c><c>Sequence number of RREP_Gen, the router which created the RREP.
</c><c>TargMetric /MetricType </c><c>PATH_METRIC </c><c>MetricType
</c><c>Metric for the route to TargAddr, using MetricType. </c><c>ValidityTime
</c><c>VALIDITY_TIME </c><c>0 </c><c>ValidityTime for route to TargAddr.
</c></texttable><t>In the AODVv2 representation, if the message relates to
DEFAULT_METRIC_TYPE, MetricType is not included in the message. The RFC 5444
representation will set the extension type in the PATH_METRIC TLV to 0. AODVv2
interprets a MetricType of 0 as DEFAULT_METRIC_TYPE. </t></section><section
title="Address Block TLVs for AckReq Intended Recipient Address"
anchor="address-block-tlvs-for-ackreq-intended-recipient-address"
toc="default"><texttable title="" suppress-title="false" align="center"
style="full"><ttcol align="left">Data Element </ttcol><ttcol align="left">TLV
Type </ttcol><ttcol align="left">Extension Type </ttcol><ttcol
align="left">Value </ttcol><c>None </c><c>ADDRESS_TYPE </c><c>0
</c><c>ADDRTYPE_INTEND </c></texttable></section></section></section><section
title="RREP_Ack" anchor="rrep_ack" toc="default"><section title="Message
Header" anchor="message-header-2" toc="default"><texttable title=""
suppress-title="false" align="center" style="full"><ttcol align="left">Data
Element </ttcol><ttcol align="left">Header Field </ttcol><ttcol
align="left">Value </ttcol><c>None </c><c>&lt;msg-type&gt; </c><c>RREP_Ack
</c></texttable></section><section title="Message TLV Block"
anchor="message-tlv-block-2" toc="default"><t>A RREP_Ack contains no Message
TLVs. </t></section><section title="Address Block" anchor="address-block-2"
toc="default"><t>A RREP_Ack contains no Address Block. </t></section><section
title="Address Block TLV Block" anchor="address-block-tlv-block-2"
toc="default"><t>A RREP_Ack contains no Address Block TLV Block.
</t></section></section><section title="RERR" anchor="rerr"
toc="default"><section title="Message Header" anchor="message-header-3"
toc="default"><texttable title="" suppress-title="false" align="center"
style="full"><ttcol align="left">Data Element </ttcol><ttcol
align="left">Header Field </ttcol><ttcol align="left">Value </ttcol><c>None
</c><c>&lt;msg-type&gt; </c><c>RERR </c><c>msg_hop_limit
</c><c>&lt;msg-hop-limit&gt; </c><c>MAX_HOPCOUNT
</c></texttable></section><section title="Message TLV Block"
anchor="message-tlv-block-3" toc="default"><t>A RERR contains no Message TLVs.
</t></section><section title="Address Block" anchor="address-block-3"
toc="default"><t>The Address Block in a RERR may contain PktSource, the source
IP address of the packet triggering RERR generation, as detailed in <xref
target="RERR_msgs" pageno="false" format="default"/>. Prefix Length associated
with PktSource is equal to the address length in bits. </t><t>Address Block
always contains one Address per route that is no longer valid, and each address
has an associated prefix length. If a prefix length has not been included for
this address, it is equal to the address length in bits. </t><texttable
title="" suppress-title="false" align="center" style="full"><ttcol
align="left">Data Element </ttcol><ttcol align="left">Address Block
</ttcol><c>PktSource </c><c>&lt;address&gt; + &lt;prefix-length&gt; for
PktSource </c><c>AddressList/PrefixLengthList </c><c>&lt;address&gt; +
&lt;prefix-length&gt; for each unreachable address in AddressList
</c></texttable></section><section title="Address Block TLV Block"
anchor="address-block-tlv-block-3" toc="default"><t>Address Block TLVs are
always associated with addresses in the Address Block. The following sections
show the TLVs that apply to each type of address in the RERR. </t><section
title="Address Block TLVs for PktSource"
anchor="address-block-tlvs-for-pktsource" toc="default"><texttable title=""
suppress-title="false" align="center" style="full"><ttcol align="left">Data
Element </ttcol><ttcol align="left">TLV Type </ttcol><ttcol
align="left">Extension Type </ttcol><ttcol align="left">Value
</ttcol><c>PktSource </c><c>ADDRESS_TYPE </c><c>0 </c><c>ADDRTYPE_PKTSOURCE
</c></texttable></section><section title="Address Block TLVs for Unreachable
Addresses" anchor="address-block-tlvs-for-unreachable-addresses"
toc="default"><texttable title="" suppress-title="false" align="center"
style="full"><ttcol align="left">Data Element </ttcol><ttcol align="left">TLV
Type </ttcol><ttcol align="left">Extension Type </ttcol><ttcol
align="left">Value </ttcol><c>None </c><c>ADDRESS_TYPE </c><c>0
</c><c>ADDRTYPE_UNREACHABLE </c><c>SeqNumList </c><c>SEQ_NUM </c><c>0
</c><c>Sequence Number associated with invalid route to the unreachable
address. </c><c>MetricTypeList </c><c>PATH_METRIC </c><c>MetricType
</c><c>None. Extension Type set to MetricType of the route to the unreachable
address. </c></texttable><t>Using the PATH_METRIC TLV without a value is a
mechanism used in RERR messages to indicate the MetricType associated with the
route being reported, without the need to include a Metric value. Multiple
PATH_METRIC TLVs may be necessary if routes with multiple MetricTypes are
included in the RERR. </t><t>In the AODVv2 representation, if the RERR message
includes only routes with DEFAULT_METRIC_TYPE, MetricType is not included in
the message. In this case, the RFC 5444 representation does not need to include
a PATH_METRIC TLV to indicate the DEFAULT_METRIC_TYPE. If the RERR message
includes both routes with DEFAULT_METRIC_TYPE and other MetricTypes, only the
routes with non-default MetricType need to be marked with a PATH_METRIC TLV
using Extension Type to indicate MetricType. AODVv2 interprets the absence of
MetricType information as an indication of DEFAULT_METRIC_TYPE.
</t></section></section></section></section><section title="Simple Internet
Attachment" anchor="gateway" toc="default"><t><xref target="net_top"
pageno="false" format="default"/> shows a stub (i.e., non-transit) network of
AODVv2 routers which is attached to the Internet via a single Internet AODVv2
Router (abbreviated IAR). </t><t>As in any Internet-attached network, AODVv2
routers and clients that wish to be reachable from hosts on the Internet MUST
have IP addresses within the IAR's routable and topologically correct prefix
(i.e., 191.0.2.0/24). This AODVv2 network and subnets within it will be
advertised to the internet using procedures which are out of scope for this
specification. </t><figure anchor="net_top" align="center" title="Simple
Internet Attachment Example" suppress-title="false" alt="" width=""
height=""><artwork align="center" xml:space="preserve" name="" type="" alt=""
width="" height="">
/-------------------------\
/ +----------------+ \
/ | AODVv2 Router | \
| | 191.0.2.2/32 | |
| +----------------+ | Routable
| +-----+--------+ Prefix
| | Internet | /191.0.2.0/24
| | AODVv2 Router| /
| | 191.0.2.1 |/ /---------------\
| | serving net +------+ Internet \
| | 191.0.2.0/24 | \ /
| +-----+--------+ \---------------/
| +----------------+ |
| | AODVv2 Router | |
| | 191.0.2.3/32 | |
\ +----------------+ /
\ /
\-------------------------/
</artwork></figure><t></t><t>When an AODVv2 router within the AODVv2 MANET
wants to discover a route toward a node on the Internet, it uses the normal
AODVv2 route discovery for that IP Destination Address. The IAR MUST respond to
RREQ on behalf of all Internet destinations, i.e., destinations not on the
configured 191.0.2.0/24 subnet. </t><t>When a packet from a node on the
Internet destined for a node in the AODVv2 MANET reaches the IAR, if the IAR
does not have a route toward that exact destination it will perform normal
AODVv2 route discovery for that destination. </t><t>The IAR SHALL NOT be
configured as a default router. </t></section><section title="Optional
Features" anchor="optional" toc="default"><t>A number of optional features for
AODVv2, associated initially with AODV, MAY be useful in networks with greater
mobility or larger node populations, or networks requiring reduced latency for
application launches. These features are not required by minimal
implementations. </t><section title="Expanding Rings Multicast" anchor="rings"
toc="default"><t>For multicast RREQ, msg_hop_limit MAY be set in accordance
with an expanding ring search as described in <xref target="RFC3561"
pageno="false" format="default"/> to limit the RREQ propagation to a subset of
the local network and possibly reduce route discovery overhead.
</t></section><section title="Precursor Lists" anchor="precursor"
toc="default"><t>This section specifies an interoperable enhancement to AODVv2
enabling more economical RERR notifications. </t><t>There can be several
sources of traffic for a certain destination. Each source of traffic and each
upstream router between the forwarding AODVv2 router and the traffic source is
known as a "precursor" for the destination. For each destination, an AODVv2
router MAY choose to keep track of precursors that have provided traffic for
that destination. Route Error messages about that destination can be sent
unicast to these precursors instead of multicast to all AODVv2 routers.
</t><t>Since a RERR will be regenerated if it comes from a next hop on a valid
route, the RERR should ideally be sent backwards along the route that the
source of the traffic uses, to ensure it is regenerated at each hop and reaches
the traffic source. If the reverse path is unknown, the RERR should be sent
toward the source along some other route. Therefore, the options for saving
precursor information are as follows: </t><t><list style="symbols"><t>Save the
next hop on an existing route to the packet's source address as the precursor.
In this case, it is not guaranteed that a RERR that is sent will follow the
reverse of the source's route. In rare situations, this may prevent the route
from being invalidated at the source of the data traffic. </t><t>Save the
packet's source address as the precursor. In this case, the RERR can be sent
along any existing route to the source of the data traffic, and should include
the PktSource data element to ensure that the route will be invalidated at the
source of the traffic, in case the RERR does not follow the reverse of the
source's route. </t><t>By inspecting the MAC address of each forwarded packet,
determine which router forwarded the packet, and save the router address as a
precursor. This ensures that when a RERR is sent to the precursor router, the
route will be invalidated at that router, and the RERR will be regenerated
toward the source of the packet. </t></list></t><t>During normal operation,
each AODVv2 router maintaining precursor lists for a route must update the
precursor list whenever it uses this route to forward traffic to the
destination. Precursors are classified as Active if traffic has recently been
forwarded by the precursor. The precursor is marked with a timestamp to
indicate the time it last forwarded traffic on this route. </t><t>When an
AODVv2 router detects that one or more routes are broken, it MAY notify each
Active precursor using a unicast Route Error message instead of creating
multicast traffic. Unicast is applicable when there are few Active precursors
compared to the number of neighboring AODVv2 routers. However, the default
multicast behavior is still preferable when there are many precursors, since
fewer message transmissions are required. </t><t>When an AODVv2 router
supporting precursor lists receives a RERR message, it MAY identify the list of
its own affected Active precursors for the routes in the RERR, and choose to
send a unicast RERR to those, rather than send a multicast RERR. </t><t>When a
route is expunged, any precursor list associated with it must also be expunged.
</t></section><section title="Intermediate RREP" anchor="iRREP"
toc="default"><t>Without iRREP, only the AODVv2 router responsible for the
target address can respond to a RREQ. Using iRREP, route discoveries can be
faster and create less control traffic. This specification has been published
as a separate Internet Draft <xref target="I-D.perkins-irrep" pageno="false"
format="default"/>. </t><t></t></section><section title="Message Aggregation
Delay" anchor="aggreg" toc="default"><t>The aggregation of multiple messages
into a packet is specified in RFC 5444 <xref target="RFC5444" pageno="false"
format="default"/>. </t><t>Implementations MAY choose to briefly delay
transmission of messages for the purpose of aggregation (into a single packet)
or to improve performance by using jitter <xref target="RFC5148" pageno="false"
format="default"/>. </t></section></section><section title="Configuration"
anchor="param" toc="default"><t>AODVv2 uses various parameters which can be
grouped into the following categories: </t><t><list style="symbols"><t>Timers
</t><t>Protocol constants </t><t>Administrative parameters and controls
</t></list></t><t>This section show the parameters along with their definitions
and default values (if any). </t><t>Note that several fields have limited size
(bits or bytes). These sizes and their encoding may place specific limitations
on the values that can be set. </t><section title="Timers" anchor="timers"
toc="default"><t>AODVv2 requires certain timing information to be associated
with route table entries and message replies. The default values are as
follows: </t><texttable anchor="timer-tbl" align="center" title="Timing
Parameter Values" suppress-title="false" style="full"><ttcol align="left">Name
</ttcol><ttcol align="left">Default Value </ttcol><c>ACTIVE_INTERVAL </c><c>5
second </c><c>MAX_IDLETIME </c><c>200 seconds </c><c>MAX_BLACKLIST_TIME
</c><c>200 seconds </c><c>MAX_SEQNUM_LIFETIME </c><c>300 seconds
</c><c>RteMsg_ENTRY_TIME </c><c>12 seconds </c><c>RREQ_WAIT_TIME </c><c>2
seconds </c><c>RREP_Ack_SENT_TIMEOUT </c><c>1 second </c><c>RREQ_HOLDDOWN_TIME
</c><c>10 seconds </c></texttable><t></t><t>The above timing parameter values
have worked well for small and medium well-connected networks with moderate
topology changes. The timing parameters SHOULD be administratively
configurable. Ideally, for networks with frequent topology changes the AODVv2
parameters should be adjusted using experimentally determined values or dynamic
adaptation. For example, in networks with infrequent topology changes
MAX_IDLETIME may be set to a much larger value. </t></section><section
title="Protocol Constants" anchor="constants" toc="default"><t>AODVv2 protocol
constants typically do not require changes. The following table lists these
constants, along with their values and a reference to the section describing
their use. </t><texttable anchor="const-tbl" align="center" title="AODVv2
Constants" suppress-title="false" style="full"><ttcol align="left">Name
</ttcol><ttcol align="left">Default </ttcol><ttcol align="left">Description
</ttcol><c>DISCOVERY_ATTEMPTS_MAX </c><c>3 </c><c><xref
target="route_discovery" pageno="false" format="default"/> </c><c>RREP_RETRIES
</c><c>2 </c><c><xref target="RREP_gen" pageno="false" format="default"/>
</c><c>MAX_METRIC[MetricType] </c><c>[TBD] </c><c><xref target="metrics"
pageno="false" format="default"/> </c><c>MAX_METRIC[HopCount] </c><c>20 hops
</c><c><xref target="metrics" pageno="false" format="default"/> and <xref
target="aodv_msgs" pageno="false" format="default"/> </c><c>MAX_HOPCOUNT
</c><c>20 </c><c>Same as MAX_METRIC[HopCount] </c><c>MAX_TIME </c><c>[TBD]
</c><c>Maximum expressible clock time (<xref target="update_rte" pageno="false"
format="default"/>) </c></texttable><t></t><t>Note that &lt;msg-hop-count&gt;
is an 8-bit field in the RFC 5444 message header and therefore MAX_HOPCOUNT
cannot be larger than 255. Field lengths associated with metrics are to be
found in <xref target="metric-type" pageno="false" format="default"/>.
</t><t>MAX_METRIC[MetricType] MUST always be the maximum expressible metric of
type MetricType. </t><t>These protocol constants MUST have the same values for
all AODVv2 routers in the ad hoc network. If the values were configured
differently, the following consequences may be observed: </t><t><list
style="symbols"><t>DISCOVERY_ATTEMPTS_MAX: Nodes with higher values are likely
to be more successful at finding routes, at the cost of additional control
traffic. </t><t>RREP_RETRIES: Nodes with lower values are more likely to
blacklist neighbors when there is a temporary fluctuation in link quality.
</t><t>MAX_HOPCOUNT: Nodes with a value too small would not be able to discover
routes to distant addresses. </t><t>MAX_METRIC[MetricType]: No
interoperability problems due to variations on different nodes, but nodes with
lower values may exhibit overly restrictive behavior during route comparisons.
</t><t>MAX_TIME: No interoperability problems due to variations on different
nodes, but if a lower value is used, route state management may exhibit overly
restrictive behavior. </t></list></t></section><section title="Local Settings"
anchor="other" toc="default"><t>The following table lists AODVv2 parameters
which should be administratively configured for each node: </t><texttable
anchor="admincontrol" align="center" title="Configuration for Local Settings"
suppress-title="false" style="full"><ttcol align="left">Name </ttcol><ttcol
align="left">Default Value </ttcol><ttcol align="left">Description
</ttcol><c>AODVv2_INTERFACES </c><c></c><c><xref target="apply" pageno="false"
format="default"/> </c><c>BUFFER_SIZE_PACKETS </c><c>2 </c><c><xref
target="route_discovery" pageno="false" format="default"/>
</c><c>BUFFER_SIZE_BYTES </c><c>MAX_PACKET_SIZE [TBD] </c><c><xref
target="route_discovery" pageno="false" format="default"/>
</c><c>CLIENT_ADDRESSES </c><c>AODVv2_INTERFACES </c><c><xref target="clients"
pageno="false" format="default"/> </c><c>CONTROL_TRAFFIC_LIMIT </c><c>[TBD - 50
pkts/sec?] </c><c><xref target="aodv_msgs" pageno="false" format="default"/>
</c></texttable><t></t></section><section title="Network-Wide Settings"
anchor="network-wide-settings" toc="default"><t>The following administrative
controls may be used to change the operation of the network. The same settings
should be used across the network. Inconsistent settings at different nodes in
the network will not result in protocol errors, but poor performance may
result, especially if metrics are misinterpreted because DEFAULT_METRIC_TYPE is
configured differently at different nodes. </t><texttable
anchor="suggestedoptions" align="center" title="Configuration for Network-Wide
Settings" suppress-title="false" style="full"><ttcol align="left">Name
</ttcol><ttcol align="left">Default </ttcol><ttcol align="left">Description
</ttcol><c>DEFAULT_METRIC_TYPE </c><c>3 (i.e., Hop Count) </c><c><xref
target="RFC6551" pageno="false" format="default"/> </c><c>ENABLE_IDLE_IN_RERR
</c><c>Disabled </c><c><xref target="RERR_gen" pageno="false"
format="default"/> </c></texttable><t></t></section><section title="Optional
Feature Settings" anchor="optional-feature-settings" toc="default"><t>These
options are not required for correct routing behavior, although they may reduce
AODVv2 protocol overhead in certain situations. The default behavior is to
leave these options disabled. </t><texttable anchor="optionsettings"
align="center" title="Configuration for Optional Features"
suppress-title="false" style="full"><ttcol align="left">Name </ttcol><ttcol
align="left">Default </ttcol><ttcol align="left">Description
</ttcol><c>PRECURSOR_LISTS </c><c>Disabled </c><c>Local (<xref
target="precursor" pageno="false" format="default"/>) </c><c>MSG_AGGREGATION
</c><c>Disabled </c><c>Local (<xref target="aggreg" pageno="false"
format="default"/>) </c><c>ENABLE_IRREP </c><c>Disabled </c><c>Network-wide
(<xref target="iRREP" pageno="false" format="default"/>)
</c><c>EXPANDING_RINGS_MULTICAST </c><c>Disabled </c><c>Network-wide (<xref
target="rings" pageno="false" format="default"/>)
</c></texttable><t></t></section></section><section title="IANA Considerations"
anchor="IANA" toc="default"><t>This section specifies several RFC 5444 message
types, message tlv-types, and address tlv-types required for AODVv2. Also, a
new registry of 16-bit metric types is specified. </t><section title="RFC 5444
Message Types" anchor="msgtype" toc="default"><texttable anchor="msgtypes"
align="center" title="AODVv2 Message Types" suppress-title="false"
style="full"><ttcol align="left">Name of Message </ttcol><ttcol
align="left">Type </ttcol><c>Route Request (RREQ) </c><c>10 (TBD) </c><c>Route
Reply (RREP) </c><c>11 (TBD) </c><c>Route Error (RERR) </c><c>12 (TBD)
</c><c>Route Reply Acknowledgement (RREP_Ack) </c><c>13 (TBD)
</c></texttable><t></t></section><section title="RFC 5444 Address Block TLV
Types" anchor="addrtlvspec" toc="default"><texttable anchor="addrtlvtypes"
align="center" title="AODVv2 Address Block TLV Types" suppress-title="false"
style="full"><ttcol align="left" width="41%">Name of TLV </ttcol><ttcol
align="left" width="13%">Type </ttcol><ttcol align="left" width="22%">Length
(octets) </ttcol><ttcol align="left" width="22%">Reference
</ttcol><c>PATH_METRIC </c><c>10 (TBD) </c><c>depends on MetricType
</c><c><xref target="aodv_msgs" pageno="false" format="default"/>
</c><c>SEQ_NUM </c><c>11 (TBD) </c><c>2 </c><c><xref target="aodv_msgs"
pageno="false" format="default"/> </c><c>ADDRESS_TYPE </c><c>15 (TBD) </c><c>1
</c><c><xref target="represent" pageno="false" format="default"/>
</c><c>VALIDITY_TIME </c><c>1 </c><c>1 </c><c><xref target="RFC5497"
pageno="false" format="default"/> </c></texttable><t></t></section><section
title="MetricType Allocation" anchor="metric-type" toc="default"><t>Metric
types are identified according to the assignments in <xref target="RFC6551"
pageno="false" format="default"/>. </t><texttable anchor="metric-tbl"
align="center" title="AODVv2 Metric Types" suppress-title="false"
style="full"><ttcol align="left">Name of MetricType </ttcol><ttcol
align="left">Type </ttcol><ttcol align="left">Metric Size </ttcol><c>Unassigned
</c><c>0 </c><c>Undefined </c><c>Currently Unsupported </c><c>1 - 2 </c><c>TBD
</c><c>Hop Count </c><c>3 [TBD] </c><c>1 octet </c><c>Currently Unsupported
</c><c>4 - 8 </c><c>TBD </c><c>Unallocated </c><c>9 - 254 </c><c>TBD
</c><c>Reserved </c><c>255 </c><c>Undefined </c></texttable><t></t><t>When
creating AODVv2 messages which relate to the DEFAULT_METRIC_TYPE, MetricType is
not reported in the message. In the RFC 5444 message representation, the
PATH_METRIC TLV, if included, will not include an extension type. While RFC
5444 would interpret the lack of an extension type value as indication that
extension type is zero, AODVv2 will interpret an extension type of zero to mean
the DEFAULT_METRIC_TYPE configured on the router. This is possible because
zero is not assigned to any metric type (<xref target="RFC6551" pageno="false"
format="default"/>). In RERR, the absence of the PATH_METRIC TLV also indicates
use of the DEFAULT_METRIC_TYPE. </t></section><section title="AddressType
Allocation" anchor="address-type" toc="default"><t>The values used in the
Address Type TLV used in <xref target="represent" pageno="false"
format="default"/> are given in the table below: </t><texttable
anchor="addrtype-tbl" align="center" title="AODVv2 Address Types"
suppress-title="false" style="full"><ttcol align="left">Address Type
</ttcol><ttcol align="left">Value </ttcol><c>ADDRTYPE_ORIGADDR </c><c>0
</c><c>ADDRTYPE_TARGADDR </c><c>1 </c><c>ADDRTYPE_UNREACHABLE </c><c>2
</c><c>ADDRTYPE_PKTSOURCE </c><c>3 </c><c>ADDRTYPE_INTEND </c><c>4
</c></texttable><t></t></section></section><section title="Security
Considerations" anchor="Security" toc="default"><t>This section describes
various security considerations and potential avenues to secure AODVv2 routing.
The objective of the AODVv2 protocol is for each router to communicate
reachability information about addresses for which it is responsible, and for
routes it has learned from other AODVv2 routers. Positive routing information
(i.e. a route exists) is distributed via RREQ and RREP messages. Negative
routing information (i.e. a route does not exist) is distributed via RERR
messages. AODVv2 routers store the information contained in these messages in
order to properly forward data packets, and they generally provide this
information to other AODVv2 routers. </t><t>Networks using AODVv2 to maintain
connectivity and establish routes on demand may be vulnerable to certain
well-known types of threats. Flooding attacks using RREQ amount to a denial of
service for route discovery. Valid route table entries can be replaced by
maliciously constructed RREQ and RREP messages. Links could be erroneously
treated as bidirectional if malicious unsolicited RREP or RREP_Ack messages
were to be accepted. Replay attacks using RERR messages could, in some
circumstances, be used to disrupt active routes. Passive inspection of AODVv2
control messages could enable unauthorized devices to gain information about
the network topology, since exchanging such information is the main purpose of
AODVv2. </t><t>The on-demand nature of AODVv2 route discovery reduces the
vulnerability to route disruption. Since control traffic for updating route
tables is diminished, there is less opportunity for failure. Processing
requirements for AODVv2 are typically quite small, and would typically be
dominated by calculations to verify integrity. This has the effect of reducing
(but by no means eliminating) AODVv2's vulnerability to denial of service
attacks. </t><t>Encryption MAY be used for AODVv2 messages. If the routers
share a packet-level security association, the message data can be encrypted
prior to message transmission. The establishment of such security associations
is outside the scope of this specification. Encryption will not only protect
against unauthorized devices obtaining information about network topology but
will ensure that only trusted routers participate in routing operations.
</t><t>Message integrity checking is enabled by the Integrity Check Value
mechanisms defined in <xref target="RFC7182" pageno="false" format="default"/>.
The data contained in AODVv2 routing protocol messages SHOULD be verified using
ICV values, to avoid the use of message data if the message has been tampered
with or replayed. Otherwise, it would be possible to disrupt communications by
injecting nonexistent or malicious routes into the route tables of nodes within
the ad hoc network. This can result in loss of data or message processing by
unauthorized devices. </t><t>The remainder of this section provides specific
recommendations for the use of the integrity checking and timestamp functions
defined in <xref target="RFC7182" pageno="false" format="default"/> to ensure
the integrity of each AODVv2 message. The calculation used for the Integrity
Check Value will depend on the message type. Sequence numbers can be used as
timestamps to protect against replay, since they are known to be strictly
increasing. </t><t>RREQ messages advertise a route to OrigAddr, and impose
very little processing requirement for receivers. The main threat presented by
sending a RREQ message with false information is that traffic to OrigAddr could
be disrupted. Since RREQ is multicast and likely to be received by all nodes in
the ad hoc network, this threat could have serious impact on applications
communicating by way of OrigAddr. The actual threat to disrupt routes to
OrigAddr is reduced by the AODVv2 mechanism of marking RREQ-derived routes as
"Unconfirmed" until adjacency with the next hop is confirmed. If AODVv2 routers
always verify the integrity of the RREQ message data, then the threat of
disruption is minimized. The ICV mechanisms offered in <xref target="RFC7182"
pageno="false" format="default"/> are sufficient for this purpose. Since
OrigAddr is included as a data element of the RREQ, the ICV can be calculated
and verified using message contents. The ICV should be verified at every step
along the dispersal path of the RREQ to mitigate the threat. Since RREQ_Gen's
sequence number is incremented for each new RREQ, replay protection is already
afforded and no extra timestamp mechanism is required. </t><t>RREP messages
advertise a route to TargAddr, and impose very little processing requirement
for receivers. The main threat presented by sending a RREP message with false
information is that traffic to TargAddr could be disrupted. Since RREP is
unicast, this threat is restricted to receivers along the path from OrigAddr to
TargAddr. If AODVv2 routers always verify the integrity of the RREP message
data, then this threat is minimized. This facility is offered by the ICV
mechanisms in <xref target="RFC7182" pageno="false" format="default"/>. Since
TargAddr is included as a data element of the RREP, the ICV can be calculated
and verified using message contents. The ICV should be verified at every step
along the unicast path of the RREP. Since RREP_Gen's sequence number is
incremented for each new RREP, replay protection is afforded and no extra
timestamp mechanism is required. </t><t>RREP_Ack messages are intended to
verify bidirectional neighbor connectivity, and impose very little processing
requirement for receivers. The main threat presented by sending a RREP_Ack
message with false information is that the route advertised to a target node in
a RREP might be erroneously accepted even though the route would contain a
unidirectional link and thus not be suitable for most traffic. Since RREP_Ack
is unicast, this threat is strictly local to the RREP transmitter expecting the
acknowledgement. A malicious router could also attempt to send an unsolicited
RREP_Ack to convince another router that a bidirectional link exists and
subsequently use further messages to divert traffic along a route which is not
valid. If AODVv2 routers always verify the integrity of the RREP_Ack message
data, then this threat is minimized. This facility is offered by the ICV
mechanisms in <xref target="RFC7182" pageno="false" format="default"/>. The
RREP_Gen SHOULD use the source IP address of the RREP_Ack to identify the
sender, and so the ICV should be calculated using the message contents and the
IP source address. The message must also include the Timestamp defined in <xref
target="RFC7182" pageno="false" format="default"/> to protect against replay
attacks, using TargSeqNum from the RREP as the value in the TIMESTAMP TLV.
</t><t>RERR messages remove routes, and impose very little processing
requirement for receivers. The main threat presented by sending a RERR message
with false information is that traffic to the advertised destinations could be
disrupted. Since RERR is multicast and can be received by many routers in the
ad hoc network, this threat could have serious impact on applications
communicating by way of the sender of the RERR message. However, since the
sender of the RERR message with erroneous information may be presumed to be
either malicious or broken, it is better that such routes not be used anyway.
Another threat is that a malicious RERR message may be sent with a PktSource
data element included, to disrupt PktSource's ability to send to the addresses
contained in the RERR. If AODVv2 routers always verify the integrity of the
RERR message data, then this threat is reduced. This facility is offered by the
ICV mechanisms in <xref target="RFC7182" pageno="false" format="default"/>. The
receiver of the RERR SHOULD use the source IP address of the RERR to identify
the sender. The message must also include the Timestamp defined in <xref
target="RFC7182" pageno="false" format="default"/> to protect against replay
attacks, using SeqNum from RERR_Gen as the value in the TIMESTAMP TLV.
</t></section><section title="Acknowledgments" anchor="acknowledgments"
toc="default"><t>AODVv2 is a descendant of the design of previous MANET
on-demand protocols, especially AODV <xref target="RFC3561" pageno="false"
format="default"/> and DSR <xref target="RFC4728" pageno="false"
format="default"/>. Changes to previous MANET on-demand protocols stem from
research and implementation experiences. Thanks to Elizabeth Belding and Ian
Chakeres for their long time authorship of AODV. Additional thanks to Derek
Atkins, Emmanuel Baccelli, Abdussalam Baryun, Ramon Caceres, Thomas Clausen,
Justin Dean, Christopher Dearlove, Ulrich Herberg, Henner Jakob, Luke
Klein-Berndt, Lars Kristensen, Tronje Krop, Koojana Kuladinithi, Kedar
Namjoshi, Alexandru Petrescu, Henning Rogge, Fransisco Ros, Pedro Ruiz,
Christoph Sommer, Romain Thouvenin, Richard Trefler, Jiazi Yi, Seung Yi, and
Cong Yuan, for their reviews AODVv2 and DYMO, as well as numerous specification
suggestions. </t></section> </middle>
<back><references title="Normative References"><reference
anchor="RFC2119"><front><title abbrev="RFC Key Words">Key words for use in RFCs
to Indicate Requirement Levels</title><author initials="S." surname="Bradner"
fullname="Scott Bradner"><organization>Harvard
University</organization><address><postal><street>1350 Mass.
Ave.</street><street>Cambridge</street><street>MA
02138</street></postal><phone>- +1 617 495
3864</phone><email>sob@xxxxxxxxxxx</email></address></author><date year="1997"
month="March"/><area>General</area><keyword>keyword</keyword><abstract><t>In
many standards track documents several words are used to signify the
requirements in the specification. These words are often capitalized. This
document defines these words as they should be interpreted in IETF documents.
Authors who follow these guidelines should incorporate this phrase near the
beginning of their document: <list><t>The key words "MUST", "MUST NOT",
"REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED",
"MAY", and "OPTIONAL" in this document are to be interpreted as described in
RFC 2119. </t></list></t><t>Note that the force of these words is modified by
the requirement level of the document in which they are used.
</t></abstract></front><seriesInfo name="BCP" value="14"/><seriesInfo
name="RFC" value="2119"/><format type="TXT" octets="4723"
target="http://www.rfc-editor.org/rfc/rfc2119.txt"/><format type="HTML"
octets="17970"
target="http://xml.resource.org/public/rfc/html/rfc2119.html"/><format
type="XML" octets="5777"
target="http://xml.resource.org/public/rfc/xml/rfc2119.xml"/></reference><reference
anchor="RFC4291"><front><title>IP Version 6 Addressing
Architecture</title><author initials="R." surname="Hinden" fullname="R.
Hinden"><organization/></author><author initials="S." surname="Deering"
fullname="S. Deering"><organization/></author><date year="2006"
month="February"/><abstract><t>This specification defines the addressing
architecture of the IP Version 6 (IPv6) protocol. The document includes the
IPv6 addressing model, text representations of IPv6 addresses, definition of
IPv6 unicast addresses, anycast addresses, and multicast addresses, and an IPv6
node's required addresses.&lt;/t&gt;&lt;t&gt; This document obsoletes RFC 3513,
"IP Version 6 Addressing Architecture".
[STANDARDS-TRACK]</t></abstract></front><seriesInfo name="RFC"
value="4291"/><format type="TXT" octets="52897"
target="http://www.rfc-editor.org/rfc/rfc4291.txt"/></reference><reference
anchor="RFC5082"><front><title>The Generalized TTL Security Mechanism
(GTSM)</title><author initials="V." surname="Gill" fullname="V.
Gill"><organization/></author><author initials="J." surname="Heasley"
fullname="J. Heasley"><organization/></author><author initials="D."
surname="Meyer" fullname="D. Meyer"><organization/></author><author
initials="P." surname="Savola" fullname="P.
Savola"><organization/></author><author initials="C." surname="Pignataro"
fullname="C. Pignataro"><organization/></author><date year="2007"
month="October"/><abstract><t>The use of a packet's Time to Live (TTL) (IPv4)
or Hop Limit (IPv6) to verify whether the packet was originated by an adjacent
node on a connected link has been used in many recent protocols. This document
generalizes this technique. This document obsoletes Experimental RFC 3682.
[STANDARDS-TRACK]</t></abstract></front><seriesInfo name="RFC"
value="5082"/><format type="TXT" octets="36579"
target="http://www.rfc-editor.org/rfc/rfc5082.txt"/></reference><reference
anchor="RFC5444"><front><title>Generalized Mobile Ad Hoc Network (MANET)
Packet/Message Format</title><author initials="T." surname="Clausen"
fullname="T. Clausen"><organization/></author><author initials="C."
surname="Dearlove" fullname="C. Dearlove"><organization/></author><author
initials="J." surname="Dean" fullname="J. Dean"><organization/></author><author
initials="C." surname="Adjih" fullname="C. Adjih"><organization/></author><date
year="2009" month="February"/><abstract><t>This document specifies a packet
format capable of carrying multiple messages that may be used by mobile ad hoc
network routing protocols. [STANDARDS-TRACK]</t></abstract></front><seriesInfo
name="RFC" value="5444"/><format type="TXT" octets="139048"
target="http://www.rfc-editor.org/rfc/rfc5444.txt"/></reference><reference
anchor="RFC5497"><front><title>Representing Multi-Value Time in Mobile Ad Hoc
Networks (MANETs)</title><author initials="T." surname="Clausen" fullname="T.
Clausen"><organization/></author><author initials="C." surname="Dearlove"
fullname="C. Dearlove"><organization/></author><date year="2009"
month="March"/><abstract><t>This document describes a general and flexible TLV
(type-length-value structure) for representing time-values, such as an interval
or a duration, using the generalized Mobile Ad hoc NETwork (MANET) packet/
message format. It defines two Message TLVs and two Address Block TLVs for
representing validity and interval times for MANET routing protocols.
[STANDARDS-TRACK]</t></abstract></front><seriesInfo name="RFC"
value="5497"/><format type="TXT" octets="30653"
target="http://www.rfc-editor.org/rfc/rfc5497.txt"/></reference><reference
anchor="RFC5498"><front><title>IANA Allocations for Mobile Ad Hoc Network
(MANET) Protocols</title><author initials="I." surname="Chakeres" fullname="I.
Chakeres"><organization/></author><date year="2009"
month="March"/><abstract><t>This document enumerates several common IANA
allocations for use by Mobile Ad hoc NETwork (MANET) protocols. The following
well-known numbers are required: a UDP port number, an IP protocol number, and
a link-local multicast group address.
[STANDARDS-TRACK]</t></abstract></front><seriesInfo name="RFC"
value="5498"/><format type="TXT" octets="8399"
target="http://www.rfc-editor.org/rfc/rfc5498.txt"/></reference><reference
anchor="RFC6551"><front><title>Routing Metrics Used for Path Calculation in
Low-Power and Lossy Networks</title><author initials="JP." surname="Vasseur"
fullname="JP. Vasseur"><organization/></author><author initials="M."
surname="Kim" fullname="M. Kim"><organization/></author><author initials="K."
surname="Pister" fullname="K. Pister"><organization/></author><author
initials="N." surname="Dejean" fullname="N.
Dejean"><organization/></author><author initials="D." surname="Barthel"
fullname="D. Barthel"><organization/></author><date year="2012"
month="March"/><abstract><t>Low-Power and Lossy Networks (LLNs) have unique
characteristics compared with traditional wired and ad hoc networks that
require the specification of new routing metrics and constraints. By contrast,
with typical Interior Gateway Protocol (IGP) routing metrics using hop counts
or link metrics, this document specifies a set of link and node routing metrics
and constraints suitable to LLNs to be used by the Routing Protocol for
Low-Power and Lossy Networks (RPL).
[STANDARDS-TRACK]</t></abstract></front><seriesInfo name="RFC"
value="6551"/><format type="TXT" octets="67707"
target="http://www.rfc-editor.org/rfc/rfc6551.txt"/></reference></references><references
title="Informative References"><reference anchor="RFC2501"><front><title
abbrev="MANET Performance Issues">Mobile Ad hoc Networking (MANET): Routing
Protocol Performance Issues and Evaluation Considerations</title><author
initials="M.S." surname="Corson" fullname="M. Scott
Corson"><organization>Institute for Systems
Research</organization><address><postal><street>University of
Maryland</street><street>College Park</street><street>MD
20742</street></postal><phone>(301)
405-6630</phone><email>corson@xxxxxxxxxxx</email></address></author><author
initials="J." surname="Macker" fullname="Joseph
Macker"><organization>Information Technology
Division</organization><address><postal><street>Naval Research
Laboratory</street><street>Washington</street><street>DC
20375</street></postal><phone>(202)
767-2001</phone><email>macker@xxxxxxxxxxxxxxxx</email></address></author><date
year="1999" month="January"/><area>Routing</area><keyword>mobile
IP</keyword><keyword>Mobile Ad hoc Networks</keyword><abstract><t>This memo
first describes the characteristics of Mobile Ad hoc Networks (MANETs), and
their idiosyncrasies with respect to traditional, hardwired packet networks.
It then discusses the effect these differences have on the design and
evaluation of network control protocols with an emphasis on routing performance
evaluation considerations. </t></abstract></front><seriesInfo name="RFC"
value="2501"/><format type="TXT" octets="28912"
target="http://www.rfc-editor.org/rfc/rfc2501.txt"/><format type="XML"
octets="27582"
target="http://xml.resource.org/public/rfc/xml/rfc2501.xml"/></reference><reference
anchor="RFC3561"><front><title>Ad hoc On-Demand Distance Vector (AODV)
Routing</title><author initials="C." surname="Perkins" fullname="C.
Perkins"><organization/></author><author initials="E." surname="Belding-Royer"
fullname="E. Belding-Royer"><organization/></author><author initials="S."
surname="Das" fullname="S. Das"><organization/></author><date year="2003"
month="July"/><abstract><t>The Ad hoc On-Demand Distance Vector (AODV) routing
protocol is intended for use by mobile nodes in an ad hoc network. It offers
quick adaptation to dynamic link conditions, low processing and memory
overhead, low network utilization, and determines unicast routes to
destinations within the ad hoc network. It uses destination sequence numbers
to ensure loop freedom at all times (even in the face of anomalous delivery of
routing control messages), avoiding problems (such as "counting to infinity")
associated with classical distance vector protocols. This memo defines an
Experimental Protocol for the Internet
community.</t></abstract></front><seriesInfo name="RFC" value="3561"/><format
type="TXT" octets="90356"
target="http://www.rfc-editor.org/rfc/rfc3561.txt"/></reference><reference
anchor="RFC4193"><front><title>Unique Local IPv6 Unicast
Addresses</title><author initials="R." surname="Hinden" fullname="R.
Hinden"><organization/></author><author initials="B." surname="Haberman"
fullname="B. Haberman"><organization/></author><date year="2005"
month="October"/><abstract><t>This document defines an IPv6 unicast address
format that is globally unique and is intended for local communications,
usually inside of a site. These addresses are not expected to be routable on
the global Internet. [STANDARDS-TRACK]</t></abstract></front><seriesInfo
name="RFC" value="4193"/><format type="TXT" octets="35908"
target="http://www.rfc-editor.org/rfc/rfc4193.txt"/></reference><reference
anchor="RFC4728"><front><title>The Dynamic Source Routing Protocol (DSR) for
Mobile Ad Hoc Networks for IPv4</title><author initials="D." surname="Johnson"
fullname="D. Johnson"><organization/></author><author initials="Y."
surname="Hu" fullname="Y. Hu"><organization/></author><author initials="D."
surname="Maltz" fullname="D. Maltz"><organization/></author><date year="2007"
month="February"/><abstract><t>The Dynamic Source Routing protocol (DSR) is a
simple and efficient routing protocol designed specifically for use in
multi-hop wireless ad hoc networks of mobile nodes. DSR allows the network to
be completely self-organizing and self-configuring, without the need for any
existing network infrastructure or administration. The protocol is composed of
the two main mechanisms of "Route Discovery" and "Route Maintenance", which
work together to allow nodes to discover and maintain routes to arbitrary
destinations in the ad hoc network. All aspects of the protocol operate
entirely on demand, allowing the routing packet overhead of DSR to scale
automatically to only what is needed to react to changes in the routes
currently in use. The protocol allows multiple routes to any destination and
allows each sender to select and control the routes used in routing its
packets, for example, for use in load balancing or for increased robustness.
Other advantages of the DSR protocol include easily guaranteed loop-free
routing, operation in networks containing unidirectional links, use of only
"soft state" in routing, and very rapid recovery when routes in the network
change. The DSR protocol is designed mainly for mobile ad hoc networks of up
to about two hundred nodes and is designed to work well even with very high
rates of mobility. This document specifies the operation of the DSR protocol
for routing unicast IPv4 packets. This memo defines an Experimental Protocol
for the Internet community.</t></abstract></front><seriesInfo name="RFC"
value="4728"/><format type="TXT" octets="265706"
target="http://www.rfc-editor.org/rfc/rfc4728.txt"/></reference><reference
anchor="RFC4861"><front><title>Neighbor Discovery for IP version 6
(IPv6)</title><author initials="T." surname="Narten" fullname="T.
Narten"><organization/></author><author initials="E." surname="Nordmark"
fullname="E. Nordmark"><organization/></author><author initials="W."
surname="Simpson" fullname="W. Simpson"><organization/></author><author
initials="H." surname="Soliman" fullname="H.
Soliman"><organization/></author><date year="2007"
month="September"/><abstract><t>This document specifies the Neighbor Discovery
protocol for IP Version 6. IPv6 nodes on the same link use Neighbor Discovery
to discover each other's presence, to determine each other's link-layer
addresses, to find routers, and to maintain reachability information about the
paths to active neighbors. [STANDARDS-TRACK]</t></abstract></front><seriesInfo
name="RFC" value="4861"/><format type="TXT" octets="235106"
target="http://www.rfc-editor.org/rfc/rfc4861.txt"/></reference><reference
anchor="RFC5148"><front><title>Jitter Considerations in Mobile Ad Hoc Networks
(MANETs)</title><author initials="T." surname="Clausen" fullname="T.
Clausen"><organization/></author><author initials="C." surname="Dearlove"
fullname="C. Dearlove"><organization/></author><author initials="B."
surname="Adamson" fullname="B. Adamson"><organization/></author><date
year="2008" month="February"/><abstract><t>This document provides
recommendations for jittering (randomly modifying timing) of control traffic
transmissions in Mobile Ad hoc NETwork (MANET) routing protocols to reduce the
probability of transmission collisions. This memo provides information for the
Internet community.</t></abstract></front><seriesInfo name="RFC"
value="5148"/><format type="TXT" octets="26379"
target="http://www.rfc-editor.org/rfc/rfc5148.txt"/></reference><reference
anchor="RFC6130"><front><title>Mobile Ad Hoc Network (MANET) Neighborhood
Discovery Protocol (NHDP)</title><author initials="T." surname="Clausen"
fullname="T. Clausen"><organization/></author><author initials="C."
surname="Dearlove" fullname="C. Dearlove"><organization/></author><author
initials="J." surname="Dean" fullname="J. Dean"><organization/></author><date
year="2011" month="April"/><abstract><t>This document describes a 1-hop and
symmetric 2-hop neighborhood discovery protocol (NHDP) for mobile ad hoc
networks (MANETs). [STANDARDS-TRACK]</t></abstract></front><seriesInfo
name="RFC" value="6130"/><format type="TXT" octets="190678"
target="http://www.rfc-editor.org/rfc/rfc6130.txt"/></reference><reference
anchor="RFC6621"><front><title>Simplified Multicast Forwarding</title><author
initials="J." surname="Macker" fullname="J.
Macker"><organization/></author><date year="2012"
month="May"/><abstract><t>This document describes a Simplified Multicast
Forwarding (SMF) mechanism that provides basic Internet Protocol (IP) multicast
forwarding suitable for limited wireless mesh and mobile ad hoc network (MANET)
use. It is mainly applicable in situations where efficient flooding represents
an acceptable engineering design trade-off. It defines techniques for
multicast duplicate packet detection (DPD), to be applied in the forwarding
process, for both IPv4 and IPv6 protocol use. This document also specifies
optional mechanisms for using reduced relay sets to achieve more efficient
multicast data distribution within a mesh topology as compared to Classic
Flooding. Interactions with other protocols, such as use of information
provided by concurrently running unicast routing protocols or interaction with
other multicast protocols, as well as multiple deployment approaches are also
described. Distributed algorithms for selecting reduced relay sets and related
discussion are provided in the appendices. Basic issues relating to the
operation of multicast MANET border routers are discussed, but ongoing work
remains in this area and is beyond the scope of this document. This document
defines an Experimental Protocol for the Internet
community.</t></abstract></front><seriesInfo name="RFC" value="6621"/><format
type="TXT" octets="139674"
target="http://www.rfc-editor.org/rfc/rfc6621.txt"/></reference><reference
anchor="RFC7182"><front><title>Integrity Check Value and Timestamp TLV
Definitions for Mobile Ad Hoc Networks (MANETs)</title><author initials="U."
surname="Herberg" fullname="U. Herberg"><organization/></author><author
initials="T." surname="Clausen" fullname="T.
Clausen"><organization/></author><author initials="C." surname="Dearlove"
fullname="C. Dearlove"><organization/></author><date year="2014"
month="April"/><abstract><t>This document revises, extends, and replaces RFC
6622. It describes general and flexible TLVs for representing cryptographic
Integrity Check Values (ICVs) and timestamps, using the generalized Mobile Ad
Hoc Network (MANET) packet/message format defined in RFC 5444. It defines two
Packet TLVs, two Message TLVs, and two Address Block TLVs for affixing ICVs and
timestamps to a packet, a message, and one or more addresses,
respectively.</t></abstract></front><seriesInfo name="RFC"
value="7182"/><format type="TXT" octets="68671"
target="http://www.rfc-editor.org/rfc/rfc7182.txt"/></reference><reference
anchor="I-D.perkins-irrep"><front><title>Intermediate RREP for dynamic MANET
On-demand (AODVv2) Routing</title><author initials="C" surname="Perkins"
fullname="Charles Perkins"><organization/></author><date month="May" day="30"
year="2015"/><abstract><t>The Ad Hoc On-demand Distance Vector (AODVv2) routing
protocol is intended for use by mobile routers in wireless, multihop networks.
AODVv2 determines unicast routes among AODVv2 routers within the network in an
on-demand fashion, offering on-demand convergence in dynamic topologies. This
document specifies an extension to AODVv2 (possibly useful with other reactive
routing protocols) enabling intermediate nodes to shorten route discovery
times.</t></abstract></front><seriesInfo name="Internet-Draft"
value="draft-perkins-irrep-03"/><format type="TXT"
target="http://www.ietf.org/internet-drafts/draft-perkins-irrep-03.txt"/></reference><reference
anchor="Perkins94" quote-title="true"><front><title>Highly Dynamic
Destination-Sequenced Distance-Vector Routing (DSDV) for Mobile
Computers</title><author fullname="Charles E. Perkins" initials="C."
surname="Perkins"><organization>IBM, TJ Watson Research Center
</organization></author><author fullname="Pravin Bhagwat" initials="P."
surname="Bhagwat"><organization>Computer Science Department, University of
Maryland </organization></author><date month="August"
year="1994"/></front><seriesInfo name="Proceedings" value="of the ACM SIGCOMM
'94 Conference on Communications Architectures, Protocols and Applications,
London, UK, pp. 234-244"/></reference><reference anchor="Perkins99"
quote-title="true"><front><title>Ad hoc On-Demand Distance Vector (AODV)
Routing</title><author fullname="Charles E. Perkins" initials="C."
surname="Perkins"><organization/></author><author fullname="Elizabeth M. Royer"
initials="E." surname="Royer"><organization>University of
California</organization></author><date month="February"
year="1999"/></front><seriesInfo name="Proceedings" value="of the 2nd IEEE
Workshop on Mobile Computing Systems and Applications, New Orleans, LA, pp.
90-100"/></reference><!--<?rfc include="reference.I-D.chakeres-manet-manetid"
?> <?rfc include="reference.I-D.clausen-lln-loadng" ?> --></references><!--This
document was prepared using Pandoc2rfc, https://github.com/miekg/pandoc2rfc
--><section title="Features Required of IP" anchor="IPreqs"
toc="default"><t>AODVv2 needs the following: </t><t><list
style="symbols"><t>information that IP routes are requested </t><t>information
that packets are flowing </t><t>the ability to queue packets
</t></list></t><t>A reactive protocol reacts when a route is needed. A route is
requested when an application tries to send a packet. The fundamental concept
of reactive routing is to avoid creating routes that are not needed. The
trigger for route discovery is an application trying to send a packet. If a
route is not available to forward the packet, the packet is queued while the
route is requested. </t></section><section title="Multi-homing Considerations"
anchor="multihome" toc="default"><t>Multi-homing is not supported by the AODVv2
specification. The coordination between multiple AODVv2 routers to distribute
routing information correctly for a shared address is not defined.
</t><t>Previous work indicates that it can be supported by expanding the
sequence number to include the AODVv2 router's IP address as a parsable field
of the SeqNum. Without this, comparing sequence numbers would not work to
evaluate freshness. Even when the IP address is included, there is no good way
to compare sequence numbers from different IP addresses, but a handling node
can determine whether the two given sequence numbers are comparable. If the
route table can store multiple routes for the same destination, then
multi-homing can work with sequence numbers augmented by IP addresses.
</t><t>This non-normative information is provided simply to document the
results of previous efforts to enable multi-homing. The intention is to
simplify the task of future specification if multihoming becomes necessary for
reactive protocol operation. </t></section><section title="Router Client
Relocation" anchor="change_address_location" toc="default"><t>Only one AODVv2
router within a MANET SHOULD be responsible for a particular address at any
time. If two AODVv2 routers dynamically shift the advertisement of a network
prefix, correct AODVv2 routing behavior must be observed. The AODVv2 router
adding the new network prefix must wait for any existing routing information
about this network prefix to be purged from the network, i.e., it must wait at
least MAX_SEQNUM_LIFETIME after the previous AODVv2 router's last SeqNum update
for this network prefix. </t></section><section title="Example Algorithms for
AODVv2 Operations" anchor="algorithms" toc="default"><t>The following
subsections show example algorithms for protocol operations required by AODVv2.
AODVv2 requires general algorithms for manipulating and comparing table
entries, and algorithms specific to each message type. </t><t>Processing for
messages follows the following general outline: </t><t><list
style="numbers"><t>Receive incoming message. </t><t>Update route table as
appropriate. </t><t>Respond as needed, often regenerating the incoming message
with updated information. </t></list></t><t>Once the route table has been
updated, the information contained there is known to be the most recent
available information for any fields in the outgoing message. For this reason,
the algorithms are written as if outgoing message field values are assigned
from the route table information, even though it is often equally appropriate
to use fields from the incoming message. </t><t>The following table indicates
the field names used in subsequent sections to describe the AODVv2 algorithms.
</t><texttable anchor="rteproperties" align="center" title="Notation used in
Appendix" suppress-title="false" style="full"><ttcol align="left">Parameter
</ttcol><ttcol align="left">Description </ttcol><c>RteMsg </c><c>A route
message (inRREQ/outRREQ/inRREP/outRREP) </c><c>RteMsg.HopLimit </c><c>Hop limit
for the message </c><c>RteMsg.HopCount </c><c>Hop count for the message
</c><c>RteMsg.AckReq </c><c>True/False, optional in RREP
</c><c>RteMsg.MetricType </c><c>The type of metric included, optional
</c><c>RteMsg.OrigAddr </c><c>Address of source of queued data
</c><c>RteMsg.TargAddr </c><c>Address route is requested for
</c><c>RteMsg.OrigPrefixLen </c><c>Prefix length of OrigAddr, optional
</c><c>RteMsg.TargPrefixLen </c><c>Prefix length of TargAddr, optional
</c><c>RteMsg.OrigSeqNum </c><c>SeqNum of OrigAddr, in RREQ only
</c><c>RteMsg.TargSeqNum </c><c>SeqNum of TargAddr, in RREP, optional in RREQ
</c><c>RteMsg.OrigMetric </c><c>Metric to OrigAddr, in RREQ only
</c><c>RteMsg.TargMetric </c><c>Metric to TargAddr, in RREP only
</c><c>RteMsg.ValidityTime </c><c>Time limit for route advertised
</c><c>RteMsg.NbrIP </c><c>Sender of the RteMsg </c><c>RteMsg.Netif
</c><c>Interface on which the RteMsg arrived </c><c>AdvRte </c><c>Derived from
a RteMsg (see <xref target="processingrte" pageno="false" format="default"/>)
</c><c>AdvRte.Address </c><c>Route destination address
</c><c>AdvRte.PrefixLength </c><c>Route destination prefix length
</c><c>AdvRte.SeqNum </c><c>SeqNum associated with route
</c><c>AdvRte.MetricType </c><c>MetricType associated with route
</c><c>AdvRte.Metric </c><c>Advertised metric of route </c><c>AdvRte.Cost
</c><c>Cost from receiving router </c><c>AdvRte.ValidityTime </c><c>Time limit
for route advertised </c><c>AdvRte.NextHopIP </c><c>Sender of the RteMsg
</c><c>AdvRte.NextHopIntf </c><c>Interface on which the RteMsg arrived
</c><c>AdvRte.HopCount </c><c>Number of hops traversed </c><c>AdvRte.HopLimit
</c><c>Allowed number of hops remaining </c><c>Route </c><c>A route table entry
(see <xref target="rte" pageno="false" format="default"/>) </c><c>Route.Address
</c><c>Route destination address </c><c>Route.PrefixLength </c><c>Route
destination prefix length </c><c>Route.SeqNum </c><c>SeqNum associated with
route </c><c>Route.NextHop </c><c>Address of router which advertised the route
</c><c>Route.NextHopInterface </c><c>Interface on which next hop is reachable
</c><c>Route.LastUsed </c><c>Time this route was last used for packet
forwarding </c><c>Route.LastSeqNumUpdate </c><c>Time the SeqNum of the route
was last updated </c><c>Route.ExpirationTime </c><c>Time at which the route
will expire </c><c>Route.MetricType </c><c>MetricType associated with route
</c><c>Route.Metric </c><c>Cost from receiving router </c><c>Route.State
</c><c>Active/Idle/Invalid </c><c>Route.Precursors </c><c>Optional (see <xref
target="precursor" pageno="false" format="default"/>) </c><c>RERR </c><c>Route
Error message (inRERR/outRERR) </c><c>RERR.HopLimit </c><c>Hop limit for the
message </c><c>RERR.PktSource </c><c>Source address of packet which triggered
RERR </c><c>RERR.AddressList[] </c><c>List of unreachable route addresses
</c><c>RERR.PrefixLengthList[] </c><c>List of PrefixLengths for AddressList
</c><c>RERR.SeqNumList[] </c><c>List of SeqNums for AddressList
</c><c>RERR.MetricTypeList[] </c><c>MetricType for the invalid routes
</c><c>RERR.Netif </c><c>Interface on which the RERR arrived
</c></texttable><t></t><section title="General Operations"
anchor="sub-algorithms" toc="default"><section title="Check_Route_State"
anchor="check_route_state" toc="default"><figure title=""
suppress-title="false" align="left" alt="" width="" height=""><artwork
xml:space="preserve" name="" type="" align="left" alt="" width="" height="">
/* Update the state of the route entry based on timeouts. Return
whether the route can be used for forwarding a packet. */

Check_Route_State(route)
{
if (CurrentTime &gt; route.ExpirationTime)
route.State := Invalid;
if ((CurrentTime - route.LastUsed &gt; ACTIVE_INTERVAL + MAX_IDLETIME)
AND (route.State != Unconfirmed)
AND (route.ExpirationTime == MAX_TIME)) //not a timed route
route.State := Invalid;
if ((CurrentTime - route.LastUsed &gt; ACTIVE_INTERVAL)
AND (route.State != Unconfirmed)
AND (route.ExpirationTime == MAX_TIME)) //not a timed route
route.State := Idle;
if ((CurrentTime - route.LastSeqNumUpdate &gt; MAX_SEQNUM_LIFETIME)
AND (route.State == Invalid OR route.State == Unconfirmed))
/* remove route from route table */
if ((CurrentTime - route.LastSeqNumUpdate &gt; MAX_SEQNUM_LIFETIME)
AND (route.State != Invalid)
route.SeqNum := 0;

if (route still exists AND route.State != Invalid
AND Route.State != Unconfirmed)
return TRUE;
else
return FALSE;
}
</artwork></figure></section><section title="Process_Routing_Info"
anchor="Process_Routing_Info" toc="default"><t>(See <xref target="test"
pageno="false" format="default"/>) </t><figure title="" suppress-title="false"
align="left" alt="" width="" height=""><artwork xml:space="preserve" name=""
type="" align="left" alt="" width="" height="">
/* Compare incoming route information to stored route, and if better,
use to update stored route. */

Process_Routing_Info (advRte)
{
rte := Fetch_Route_Table_Entry (advRte);
if (!rte exists)
{
rte := Create_Route_Table_Entry(advRte);
return rte;
}

if (AdvRte.SeqNum &gt; Route.SeqNum /* stored route is stale */
OR
(AdvRte.SeqNum == Route.SeqNum /* same SeqNum */
AND
((Route.State == Invalid AND LoopFree(advRte, rte))
/* advRte can repair stored */
OR AdvRte.Cost &lt; Route.Metric))) /* advRte is better */
{
if (advRte is from a RREQ)
rte := Create_Route_Table_Entry(advRte);
else
Update_Route_Table_Entry (rte, advRte);
}
return rte;
}
</artwork></figure></section><section title="Fetch_Route_Table_Entry"
anchor="Fetch_Route_Table_Entry" toc="default"><figure title=""
suppress-title="false" align="left" alt="" width="" height=""><artwork
xml:space="preserve" name="" type="" align="left" alt="" width="" height="">
/* Lookup a route table entry matching an advertised route */

Fetch_Route_Table_Entry (advRte)
{
foreach (rteTableEntry in rteTable)
{
if (rteTableEntry.Address == advRte.Address
AND rteTableEntry.MetricType == advRte.MetricType)
return rteTableEntry;
}
return null;
}

/* Lookup a route table entry matching address and metric type */

Fetch_Route_Table_Entry (destination, metricType)
{
foreach (rteTableEntry in rteTable)
{
if (rteTableEntry.Address == destination
AND rteTableEntry.MetricType == metricType)
return rteTableEntry;
}
return null;
}
</artwork></figure></section><section title="Update_Route_Table_Entry"
anchor="Update_Route_Table_Entry" toc="default"><figure title=""
suppress-title="false" align="left" alt="" width="" height=""><artwork
xml:space="preserve" name="" type="" align="left" alt="" width="" height="">
/* Update a route table entry using AdvRte in received RteMsg */

Update_Route_Table_Entry (rte, advRte);
{
rte.SeqNum := advRte.SeqNum;
rte.NextHop := advRte.NextHopIp;
rte.NextHopInterface := advRte.NextHopIntf;
rte.LastUsed := CurrentTime;
rte.LastSeqNumUpdate := CurrentTime;
if (validityTime)
rte.ExpirationTime := CurrentTime + advRte.ValidityTime;
else
rte.ExpirationTime := MAX_TIME;

rte.Metric := advRte.Cost;
if (rte.State == Invalid)
rte.State := Idle (if advRte is from RREP);
or Unconfirmed (if advRte is from RREQ);
}
</artwork></figure></section><section title="Create_Route_Table_Entry"
anchor="Create_Route_Table_Entry" toc="default"><figure title=""
suppress-title="false" align="left" alt="" width="" height=""><artwork
xml:space="preserve" name="" type="" align="left" alt="" width="" height="">
/* Create a route table entry from address and prefix length */

Create_Route_Table_Entry (address, prefixLength, seqNum, metricType)
{
rte := allocate_memory();
rte.Address := address;
rte.PrefixLength := prefixLength;
rte.SeqNum := seqNum;
rte.MetricType := metricType;
}


/* Create a route table entry from the advertised route */

Create_Route_Table_Entry(advRte)
{
rte := allocate_memory();

rte.Address := advRte.Address;
if (advRte.PrefixLength)
rte.PrefixLength := advRte.PrefixLength;
else
rte.PrefixLength := maxPrefixLenForAddressFamily;

rte.SeqNum := advRte.SeqNum;
rte.NextHop := advRte.NextHopIp;
rte.NextHopInterface := advRte.NextHopIntf;
rte.LastUsed := CurrentTime;
rte.LastSeqNumUpdate := CurrentTime;
if (validityTime)
rte.ExpirationTime := CurrentTime + advRte.ValidityTime;
else
rte.ExpirationTime := MAX_TIME;
rte.MetricType := advRte.MetricType;
rte.Metric := advRte.Metric;
rte.State := Idle (if advRte is from RREP);
or Unconfirmed (if advRte is from RREQ);
}
</artwork></figure></section><section title="LoopFree" anchor="LoopFree"
toc="default"><figure title="" suppress-title="false" align="left" alt=""
width="" height=""><artwork xml:space="preserve" name="" type="" align="left"
alt="" width="" height="">
/* Return TRUE if the route advRte is LoopFree compared to rte */

LoopFree(advRte, rte)
{
if (advRte.Cost &lt;= rte.Cost)
return TRUE;
else
return FALSE;
}
</artwork></figure></section><section title="Fetch_Rte_Msg_Table_Entry"
anchor="Fetch_Rte_Msg_Table_Entry" toc="default"><figure title=""
suppress-title="false" align="left" alt="" width="" height=""><artwork
xml:space="preserve" name="" type="" align="left" alt="" width="" height="">
/* Find an entry in the RteMsg table matching the given
message's msg-type, OrigAddr, TargAddr, MetricType */

Fetch_Rte_Msg_Table_Entry (rteMsg)
{
foreach (entry in RteMsgTable)
{
if (entry.msg-type == rteMsg.msg-type
AND entry.OrigAddr == rteMsg.OrigAddr
AND entry.TargAddr == rteMsg.TargAddr
AND entry.MetricType == rteMsg.MetricType)
return entry;
}
return NULL;
}
</artwork></figure></section><section title="Update_Rte_Msg_Table"
anchor="Update_Rte_Msg_Table" toc="default"><t>(See <xref target="rtemsgtable"
pageno="false" format="default"/>) </t><figure title="" suppress-title="false"
align="left" alt="" width="" height=""><artwork xml:space="preserve" name=""
type="" align="left" alt="" width="" height="">
/* Update the multicast route message suppression table based on the
received RteMsg, return true if it was created or the SeqNum was
updated (i.e. it needs to be regenerated) */

Update_Rte_Msg_Table(rteMsg)
{
/* search for a comparable entry */
entry := Fetch_Rte_Msg_Table_Entry(rteMsg);

/* if there is none, create one */
if (entry does not exist)
{
entry.MessageType := rteMsg.msg_type;
entry.OrigAddr := rteMsg.OrigAddr;
entry.TargAddr := rteMsg.TargAddr;
entry.OrigSeqNum := rteMsg.origSeqNum; // (if present)
entry.TargSeqNum := rteMsg.targSeqNum; // (if present)
entry.MetricType := rteMsg.MetricType;
entry.Metric := rteMsg.OrigMetric; // (for RREQ)
or rteMsg.TargMetric; // (for RREP)
entry.Timestamp := CurrentTime;
return TRUE;
}

/* if current entry is stale */
if (
(rteMsg.msg-type == RREQ AND entry.OrigSeqNum &lt; rteMsg.OrigSeqNum)
OR
(rteMsg.msg-type == RREP AND entry.TargSeqNum &lt; rteMsg.TargSeqNum))
{
entry.OrigSeqNum := rteMsg.OrigSeqNum; // (if present)
entry.TargSeqNum := rteMsg.TargSeqNum; // (if present)
entry.Timestamp := CurrentTime;
return TRUE;
}

/* if received rteMsg is stale */
if (
(rteMsg.msg-type == RREQ AND entry.OrigSeqNum &gt; rteMsg.OrigSeqNum)
OR
(rteMsg.msg-type == RREP AND entry.TargSeqNum &gt; rteMsg.TargSeqNum))
{
entry.Timestamp := CurrentTime;
return FALSE;
}

/* if same SeqNum but rteMsg has lower metric */
if (entry.Metric &gt; rteMsg.Metric)
entry.Metric := rteMsg.Metric;

entry.Timestamp := CurrentTime;
return FALSE;
}
</artwork></figure></section><section title="Build_RFC_5444_Message_Header"
anchor="Build_RFC_5444_Message_Header" toc="default"><figure title=""
suppress-title="false" align="left" alt="" width="" height=""><artwork
xml:space="preserve" name="" type="" align="left" alt="" width="" height="">
/* This pseudocode shows possible RFC 5444 actions, and would not
be performed by the AODVv2 implementation. It is shown only to
provide more understanding about the AODVv2 message that will be
constructed by RFC 5444.
MAL := Message Address Length
MF := Message Flags
Size := number of octets in MsgHdr, AddrBlk, AddrTLVs */

Build_RFC_5444_Message_Header (msgType, Flags, AddrFamily, Size,
hopLimit, hopCount, tlvLength)
{
/* Build RFC 5444 message header fields */
msg-type := msgType;
MF := Flags;
MAL := 3 or 15; // for IPv4 or IPv6
msg-size := Size;
msg-hop-limit := hopLimit;
if (hopCount != 0) /* if hopCount is 0, do not include */
msg-hop-count := hopCount;
msg.tlvs-length := tlvLength;
}
</artwork></figure></section></section><section title="RREQ Operations"
anchor="rreq-algorithms" toc="default"><section title="Generate_RREQ"
anchor="Generate_RREQ" toc="default"><figure title="" suppress-title="false"
align="left" alt="" width="" height=""><artwork xml:space="preserve" name=""
type="" align="left" alt="" width="" height="">
/* Generate a route request message to find a route from OrigAddr
to TargAddr using the given MetricType
origAddr := IP address of Router Client which generated the
packet to be forwarded
origPrefix := prefix length associated with the Router Client
targAddr := destination IP address in the packet to be forwarded
targSeqNum := sequence number in existing route to targAddr
mType := metric type for the requested route */

Generate_RREQ(origAddr, origPrefix, targAddr, targSeqNum, mType)
{
/* Increment sequence number in nonvolatile storage */
mySeqNum := (1 + mySeqNum);

/* Marshall parameters */
outRREQ.HopLimit := MAX_HOPCOUNT;
outRREQ.HopCount := 0; // if included
outRREQ.MetricType := mType; //include if not DEFAULT_METRIC_TYPE
outRREQ.OrigAddr := origAddr;
outRREQ.TargAddr := targAddr;
outRREQ.OrigPrefixLen := origPrefix; //include if not address length
outRREQ.OrigSeqNum := mySeqNum;
outRREQ.TargSeqNum := targSeqNum; //included if available
outRREQ.OrigMetric := Route[OrigAddr].Metric; //zero by default
outRREQ.ValidityTime := limit for route to OrigAddr; //if required

/* Build Address Blk using prefix length information from
outRREQ.OrigPrefixLen if necessary */
AddrBlk := {outRREQ.OrigAddr, outRREQ.TargAddr};

/* Include sequence numbers in appropriate Address Block TLVs */
/* OrigSeqNum Address Block TLV */
origSeqNumAddrBlkTlv.value := outRREQ.OrigSeqNum;
/* TargSeqNum Address Block TLV */
if (outRREQ.TargSeqNum is known)
targSeqNumAddrBlkTlv.value := outRREQ.TargSeqNum;

/* Build Metric Address Block TLV, include Metric AddrBlkTlv
Extension type if a non-default metric */
metricAddrBlkTlv.value := outRREQ.OrigMetric;
if (outRREQ.MetricType != DEFAULT_METRIC_TYPE)
metricAddrBlkTlv.typeExtension := outRREQ.MetricType;

if (outRREQ.ValidityTime is required)
{
/* Build VALIDITY_TIME Address Block TLV */
VALIDITY_TIMEAddrBlkTlv.value := outRREQ.ValidityTime;
}

Build_RFC_5444_Message_Header (RREQ, 4, IPv4 or IPv6, NN,
outRREQ.HopLimit, outRREQ.HopCount, tlvLength);

/* multicast RFC 5444 message to LL-MANET-Routers */
}
</artwork></figure></section><section title="Receive_RREQ"
anchor="Receive_RREQ" toc="default"><figure title="" suppress-title="false"
align="left" alt="" width="" height=""><artwork xml:space="preserve" name=""
type="" align="left" alt="" width="" height="">
/* Process a RREQ received on link L */

Receive_RREQ (inRREQ, L)
{
if (inRREQ.NbrIP present in blacklist)
{
if (blacklist_expiration_time &lt; CurrentTime)
return; // don't process or regenerate RREQ
else
remove nbrIP from blacklist;
}
if (inRREQ does not contain msg_hop_limit, OrigAddr,
TargAddr, OrigSeqNum, OrigMetric)
return;
if (inRREQ.OrigAddr and inRREQ.TargAddr are not valid routable
and unicast addresses)
return;
if (inRREQ.MetricType is present but an unknown value)
return;
if (inRREQ.OrigMetric &gt; MAX_METRIC[inRREQ.MetricType] - Cost(L))
return;

/* Extract inRREQ values */
advRte.Address := inRREQ.OrigAddr;
advRte.PrefixLength := inRREQ.OrigPrefixLen; (if present)
or the address length of advRte.Address;
advRte.SeqNum := inRREQ.OrigSeqNum;
advRte.MetricType := inRREQ.MetricType;
advRte.Metric := inRREQ.OrigMetric;
advRte.Cost := inRREQ.OrigMetric + Cost(L);
//according to the indicated MetricType
advRte.ValidityTime := inRREQ.ValidityTime; //if present
advRte.NextHopIP := inRREQ.NbrIP;
advRte.NextHopIntf := inRREQ.Netif;
advRte.HopCount := inRREQ.HopCount;
advRte.HopLimit := inRREQ.HopLimit;

rte := Process_Routing_Info (advRte);

/* Update the RteMsgTable and determine if the RREQ needs
to be regenerated */
regenerate := Update_Rte_Msg_Table(inRREQ);

if (inRREQ.TargAddr is in Router Client list)
Generate_RREP(inRREQ, rte);
else if (regenerate)
Regenerate_RREQ(inRREQ, rte);
}
</artwork></figure></section><section title="Regenerate_RREQ"
anchor="Regenerate_RREQ" toc="default"><figure title="" suppress-title="false"
align="left" alt="" width="" height=""><artwork xml:space="preserve" name=""
type="" align="left" alt="" width="" height="">
/* Called from receive_RREQ()
rte := the route to OrigAddr */

Regenerate_RREQ (inRREQ, rte)
{
outRREQ.HopLimit := inRREQ.HopLimit - 1;
if (outRREQ.HopLimit == 0)
return; // don't regenerate

if (inRREQ.HopCount exists)
{
if (inRREQ.HopCount &gt;= MAX_HOPCOUNT)
return; // don't regenerate
outRREQ.HopCount := inRREQ.HopCount + 1;
}

/* Marshall parameters */
outRREQ.MetricType := rte.MetricType;
outRREQ.OrigAddr := rte.Address;
outRREQ.TargAddr := inRREQ.TargAddr;
/* include prefix length if not equal to address length */
outRREQ.OrigPrefixLen := rte.PrefixLength;
outRREQ.OrigSeqNum := rte.SeqNum;
outRREQ.TargSeqNum := inRREQ.TargSeqNum; // if present
outRREQ.OrigMetric := rte.Metric;
outRREQ.ValidityTime := rte.ValidityTime;
or the time limit this router wishes to put on
route to OrigAddr

/* Build Address Block using prefix length information from
outRREQ.OrigPrefixLen if necessary */
AddrBlk := {outRREQ.OrigAddr, outRREQ.TargAddr};

/* Include sequence numbers in appropriate Address Block TLVs */
/* OrigSeqNum Address Block TLV */
origSeqNumAddrBlkTlv.value := outRREQ.OrigSeqNum;
/* TargSeqNum Address Block TLV */
if (outRREQ.TargSeqNum is known)
targSeqNumAddrBlkTlv.value := outRREQ.TargSeqNum;

/* Build Metric Address Block TLV, include Metric AddrBlkTlv
Extension type if a non-default metric */
metricAddrBlkTlv.value := outRREQ.OrigMetric;
if (outRREQ.MetricType != DEFAULT_METRIC_TYPE)
metricAddrBlkTlv.typeExtension := outRREQ.MetricType;

if (outRREQ.ValidityTime is required)
{
/* Build VALIDITY_TIME Address Block TLV */
VALIDITY_TIMEAddrBlkTlv.value := outRREQ.ValidityTime;
}
Build_RFC_5444_Message_Header (RREQ, 4, IPv4 or IPv6, NN,
outRREQ.HopLimit, outRREQ.HopCount, tlvLength);

/* Multicast RFC 5444 message to LL-MANET-Routers, or if
inRREQ was unicast, the message can be unicast to the next
hop on the route to TargAddr, if known */
}
</artwork></figure></section></section><section title="RREP Operations"
anchor="rrep-algorithms" toc="default"><section title="Generate_RREP"
anchor="Generate_RREP" toc="default"><figure title="" suppress-title="false"
align="left" alt="" width="" height=""><artwork xml:space="preserve" name=""
type="" align="left" alt="" width="" height="">
Generate_RREP(inRREQ, rte)
{
/* Increment sequence number in nonvolatile storage */
mySeqNum := (1 + mySeqNum);

/* Marshall parameters */
outRREP.HopLimit := inRREQ.HopCount;
outRREP.HopCount := 0;
/* Include the AckReq when:
- previous RREP does not seem to enable any data flow, OR
- when RREQ is received from same OrigAddr after RREP was
unicast to rte.NextHop */
outRREP.AckReq := TRUE or FALSE; //TRUE if acknowledgement required
/* if included, set timeout RREP_Ack_SENT_TIMEOUT */

if (rte.MetricType != DEFAULT_METRIC_TYPE)
outRREP.MetricType := rte.MetricType;
outRREP.OrigAddr := rte.Address;
outRREP.TargAddr := inRREQ.TargAddr;
outRREP.TargPrefixLen := rte.PrefixLength; //if not address length
outRREP.TargSeqNum := mySeqNum;
outRREP.TargMetric := Route[TargAddr].Metric;
//zero by default
outRREP.ValidityTime := limit for route to TargAddr; //if required

if (outRREP.AckReq == TRUE)
/* include AckReq Message TLV */

/* Build Address Block using prefix length information from
outRREP.TargPrefixLen if necessary */
AddrBlk := {outRREP.OrigAddr, outRREP.TargAddr};

/* TargSeqNum Address Block TLV */
targSeqNumAddrBlkTlv.value := outRREP.TargSeqNum;

/* Build Metric Address Block TLV include Metric AddrBlkTlv
Extension type if a non-default metric */
metricAddrBlkTlv.value := outRREP.TargMetric;
if (outRREP.MetricType != DEFAULT_METRIC_TYPE)
metricAddrBlkTlv.typeExtension := outRREP.MetricType;

if (outRREP.ValidityTime is required)
{
/* Build VALIDITY_TIME Address Block TLV */
VALIDITY_TIMEAddrBlkTlv.value := outRREP.ValidityTime;
}

Build_RFC_5444_Message_Header (RREP, 4, IPv4 or IPv6, NN,
outRREP.HopLimit, outRREQ.HopCount, tlvLength);

/* unicast RFC 5444 message to rte[OrigAddr].NextHop */
}
</artwork></figure></section><section title="Receive_RREP"
anchor="Receive_RREP" toc="default"><figure title="" suppress-title="false"
align="left" alt="" width="" height=""><artwork xml:space="preserve" name=""
type="" align="left" alt="" width="" height="">
/* Process a RREP received on link L */

Receive_RREP (inRREP, L)
{
if (inRREP.NbrIP present in blacklist)
{
if (blacklist_expiration_time &lt; CurrentTime)
return; // don't process or regenerate RREP
else
remove NbrIP from blacklist;
}

if (inRREP does not contain msg_hop_limit, OrigAddr,
TargAddr, TargSeqNum, TargMetric)
return;
if (inRREP.OrigAddr and inRREQ.TargAddr are not
valid routable and unicast addresses)
return;
if (inRREP.MetricType is present but an unknown value)
return;
if (inRREP.TargMetric &gt; MAX_METRIC[inRREP.MetricType] - Cost(L))
return;

/* Extract inRREP values */
advRte.Address := inRREP.TargAddr;
advRte.PrefixLength := inRREP.TargPrefixLen; //if present
or the address length of advRte.Address;
advRte.SeqNum := inRREP.TargSeqNum;
advRte.MetricType := inRREP.MetricType;
advRte.Metric := inRREP.TargMetric;
advRte.Cost := inRREP.TargMetric + Cost(L);
//according to the indicated MetricType
advRte.ValidityTime := inRREP.ValidityTime; //if present
advRte.NextHopIP := inRREP.NbrIP;
advRte.NextHopIntf := inRREP.Netif;
advRte.HopCount := inRREP.HopCount;
advRte.HopLimit := inRREP.HopLimit; //if included

rte := Process_Routing_Info (advRte);

` if (inRREP includes AckReq data element)
Generate_RREP_Ack(inRREP);

/* Update the RteMsgTable and determine if the RREP needs
to be regenerated */
regenerate := Update_Rte_Msg_Table(inRREP);

if (inRREP.TargAddr is in the Router Client list)
send_buffered_packets(rte); /* start to use the route */
else if (regenerate)
Regenerate_RREP(inRREP, rte);
}
</artwork></figure></section><section title="Regenerate_RREP"
anchor="Regenerate_RREP" toc="default"><figure title="" suppress-title="false"
align="left" alt="" width="" height=""><artwork xml:space="preserve" name=""
type="" align="left" alt="" width="" height="">
Regenerate_RREP(inRREP, rte)
{
if (rte does not exist)
{
Generate_RERR(inRREP);
return;
}

outRREP.HopLimit := inRREP.HopLimit - 1;
if (outRREP.HopLimit == 0) /* don't regenerate */
return;

if (inRREP.HopCount exists)
{
if (inRREP.HopCount &gt;= MAX_HOPCOUNT)
return; // don't regenerate the RREP
outRREP.HopCount := inRREP.HopCount + 1;
}

/* Marshall parameters */
/* Include the AckReq when:
- previous unicast RREP seems not to enable data flow, OR
- when RREQ is received from same OrigAddr after RREP
was unicast to rte.NextHop */
outRREP.AckReq := TRUE or FALSE; //TRUE if acknowledgement required
/* if included, set timeout RREP_Ack_SENT_TIMEOUT */

if (rte.MetricType != DEFAULT_METRIC_TYPE)
outRREP.MetricType := rte.MetricType;
outRREP.OrigAddr := inRREP.OrigAddr;
outRREP.TargAddr := rte.Address;
outRREP.TargPrefixLen := rte.PrefixLength; //if not address length
outRREP.TargSeqNum := rte.SeqNum;
outRREP.TargMetric := rte.Metric;
outRREP.ValidityTime := limit for route to TargAddr; //if required
outRREP.NextHop := rte.NextHop

if (outRREP.AckReq == TRUE)
/* include AckReq Message TLV */

/* Build Address Block using prefix length information from
outRREP.TargPrefixLen if necessary */
AddrBlk := {outRREP.OrigAddr, outRREP.TargAddr};

/* TargSeqNum Address Block TLV */
targSeqNumAddrBlkTlv.value := outRREP.TargSeqNum;

/* Build Metric Address Block TLV include Metric AddrBlkTlv
Extension type if a non-default metric */
metricAddrBlkTlv.value := outRREP.TargMetric;
if (outRREP.MetricType != DEFAULT_METRIC_TYPE)
metricAddrBlkTlv.typeExtension := outRREP.MetricType;

if (outRREP.ValidityTime is required)
{
/* Build VALIDITY_TIME Address Block TLV */
VALIDITY_TIMEAddrBlkTlv.value := outRREP.ValidityTime;
}

Build_RFC_5444_Message_Header (RREP, 4, IPv4 or IPv6, NN,
outRREP.HopLimit, 0, tlvLength);

/* unicast RFC 5444 message to rte[OrigAddr].NextHop */
}
</artwork></figure></section></section><section title="RREP_Ack Operations"
anchor="rrep_ack-algorithms" toc="default"><section title="Generate_RREP_Ack"
anchor="Generate_RREP_Ack" toc="default"><figure title=""
suppress-title="false" align="left" alt="" width="" height=""><artwork
xml:space="preserve" name="" type="" align="left" alt="" width="" height="">
/* To be sent when a received RREP includes the AckReq data element */

Generate_RREP_Ack(inRREP)
{
Build_RFC_5444_Message_Header (RREP_Ack, 4, IPv4 or IPv6, NN,
1, 0, 0);
/* unicast RFC 5444 message to inRREP.NbrIP */
}
</artwork></figure></section><section title="Receive_RREP_Ack"
anchor="Receive_RREP_Ack" toc="default"><figure title="" suppress-title="false"
align="left" alt="" width="" height=""><artwork xml:space="preserve" name=""
type="" align="left" alt="" width="" height="">
Receive_RREP_Ack(inRREP_Ack)
{
/* cancel timeout event for the node sending RREP_Ack */
}
</artwork></figure></section><section title="Timeout_RREP_Ack"
anchor="Timeout_RREP_Ack" toc="default"><figure title="" suppress-title="false"
align="left" alt="" width="" height=""><artwork xml:space="preserve" name=""
type="" align="left" alt="" width="" height="">
Timeout_RREP_Ack(outRREP)
{
if (numRetries &lt; RREP_RETRIES)
/* resend RREP and double the previous timeout */
else
/* insert unresponsive node into blacklist */
}
</artwork></figure></section></section><section title="RERR Operations"
anchor="rerr-algorithms" toc="default"><section title="Generate_RERR"
anchor="Generate_RERR" toc="default"><t>There are two parts to this function,
based on whether it was triggered by an undeliverable packet or a broken link
to neighboring AODVv2 router. </t><figure title="" suppress-title="false"
align="left" alt="" width="" height=""><artwork xml:space="preserve" name=""
type="" align="left" alt="" width="" height="">
/* Generate a Route Error message.
errorType := undeliverablePacket or brokenLink */

Generate_RERR(errorType, triggerPkt, brokenLinkNbrIp)
{
switch (errorType)
{
case (brokenLink):
doGenerate := FALSE;
num-broken-addr := 0;
precursors[] := new empty precursor list;
outRERR.HopLimit := MAX_HOPCOUNT;
/* find routes which are now Invalid */
foreach (rte in route table)
{
if (brokenLinkNbrIp == rte.NextHop
AND (rte.State == Active
OR
(rte.State == Idle AND ENABLE_IDLE_IN_RERR)))
{
if (rte.State == Active)
doGenerate := TRUE;
rte.State := Invalid;
precursors += rte.Precursors (if any);
outRERR.AddressList[num-broken-addr] := rte.Address;
outRERR.PrefixLengthList[num-broken-addr] :=
rte.PrefixLength;
outRERR.SeqNumList[num-broken-addr] := rte.SeqNum;
outRERR.MetricTypeList[num-broken-addr] := rte.MetricType
num-broken-addr := num-broken-addr + 1;
}
}
}
case (undeliverablePacket):
doGenerate := TRUE;
num-broken-addr := 1;
outRERR.HopLimit := MAX_HOPCOUNT;
outRERR.PktSource := triggerPkt.SrcIP;
or triggerPkt.TargAddr; //if pkt was a RREP
outRERR.AddressList[0] := triggerPkt.DestIP;
or triggerPkt.OrigAddr; //if pkt was RREP
/* optional to include outRERR.PrefixLengthList, outRERR.SeqNumList
and outRERR.MetricTypeList */
}

if (doGenerate == FALSE)
return;

if (triggerPkt exists)
{
/* Build PktSource Message TLV */
pktSourceMessageTlv.value := outRERR.PktSource;
}

/* The remaining steps add address, prefix length, sequence
number and metric type information for each unreachable address,
while conforming to the allowed MTU. If the MTU is reached, a new
message MUST be created. */

/* Build Address Block using prefix length information from
outRERR.PrefixLengthList[] if necessary */
AddrBlk := outRERR.AddressList[];

/* Optionally, add SeqNum Address Block TLV, including index values */
seqNumAddrBlkTLV := outRERR.SeqNumList[];

if (outRERR.MetricTypeList contains non-default MetricTypes)
/* include Metric Address Block TLVs with Type Extension set to
MetricType, including index values if necessary */
metricAddrBlkTlv.typeExtension := outRERR.MetricTypeList[];

Build_RFC_5444_Message_Header (RERR, 4, IPv4 or IPv6, NN,
outRERR.HopLimit, 0, tlvLength);

if (undeliverablePacket)
/* unicast outRERR to rte[outRERR.PktSource].NextHop */
else if (brokenLink)
/* unicast to precursors, or multicast to LL-MANET-Routers */
}
</artwork></figure></section><section title="Receive_RERR"
anchor="Receive_RERR" toc="default"><figure title="" suppress-title="false"
align="left" alt="" width="" height=""><artwork xml:space="preserve" name=""
type="" align="left" alt="" width="" height="">
Receive_RERR (inRERR)
{
if (inRERR does not contain msg_hop_limit and at least
one unreachable address)
return;

/* Extract inRERR values, copy relevant unreachable addresses,
their prefix lengths, and sequence numbers to outRERR */
num-broken-addr := 0;
precursors[] := new empty precursor list;
foreach (unreachableAddress in inRERR.AddressList)
{
if (unreachableAddress is not valid routable and unicast)
continue;
if (unreachableAddress MetricType is present but an unknown value)
return;

/* Find a matching route table entry, assume
DEFAULT_METRIC_TYPE if no MetricType included */
rte := Fetch_Route_Table_Entry (unreachableAddress,
unreachableAddress MetricType)
if (rte does not exist)
continue;
if (rte.State == Invalid)/* ignore already invalid routes */
continue;
if ((rte.NextHop != inRERR.NbrIP
OR
rte.NextHopInterface != inRERR.Netif)
AND (PktSource is not present OR is not a Router Client))
continue;
if (unreachableAddress SeqNum (if known) &lt; rte.SeqNum)
continue;

/* keep a note of all precursors of newly Invalid routes */
precursors += rte.Precursors; //if any

/* assume prefix length is address length if not included */
if (rte.PrefixLength != unreachableAddress prefixLength)
{
/* create new route with unreachableAddress information */
invalidRte := Create_Route_Table_Entry(unreachableAddress,
unreachableAddress PrefixLength,
unreachableAddress SeqNum,
unreachableAddress MetricType);
invalidRte.State := Invalid;

if (rte.PrefixLength &gt; unreachableAddress prefixLength)
expunge_route(rte);
rte := invalidRte;
}
else if (rte.PrefixLength == unreachableAddress prefixLength)
rte.State := Invalid;

outRERR.AddressList[num-broken-addr] := rte.Address;
outRERR.PrefixLengthList[num-broken-addr] := rte.PrefixLength;
outRERR.SeqNumList[num-broken-addr] := rte.SeqNum;
outRERR.MetricTypeList[num-broken-addr] := rte.MetricType;
num-broken-addr := num-broken-addr + 1;
}

if (num-broken-addr AND (PktSource is not present OR PktSource is not
a Router Client))
Regenerate_RERR(outRERR, inRERR, precursors);
}
</artwork></figure></section><section title="Regenerate_RERR"
anchor="Regenerate_RERR" toc="default"><figure title="" suppress-title="false"
align="left" alt="" width="" height=""><artwork xml:space="preserve" name=""
type="" align="left" alt="" width="" height="">
Regenerate_RERR (outRERR, inRERR, precursors)
{
/* Marshal parameters */
outRERR.HopLimit := inRERR.HopLimit - 1;
if (outRERR.HopLimit == 0) // don't regenerate
return;

outRERR.PktSource := inRERR.PktSource; //if included
/* AddressList[], SeqNumList[], and PrefixLengthList[] are
already up-to-date */

if (outRERR.PktSource exists)
{
/* Build PktSource Message TLV */
pktSourceMessageTlv.value := outRERR.PktSource;
}

/* Build Address Block using prefix length information from
outRERR.PrefixLengthList[] if necessary */
AddrBlk := outRERR.AddressList[];

/* Optionally, add SeqNum Address Block TLV, including index values */
seqNumAddrBlkTLV := outRERR.SeqNumList[];

if (outRERR.MetricTypeList contains non-default MetricTypes)
/* include Metric Address Block TLVs with Type Extension set to
MetricType, including index values if necessary */
metricAddrBlkTlv.typeExtension := outRERR.MetricTypeList[];

Build_RFC_5444_Message_Header (RERR, 4, IPv4 or IPv6, NN,
outRERR.HopLimit, 0, tlvLength);

if (outRERR.PktSource exists)
/* unicast RFC 5444 message to next hop towards
outRERR.PktSource */
else if (number of precursors == 1)
/* unicast RFC 5444 message to precursors[0] */
else if (number of precursors &gt; 1)
/* unicast RFC 5444 message to all precursors, or multicast
RFC 5444 message to RERR_PRECURSORS if preferable */
else
/* multicast RFC 5444 message to LL-MANET-Routers */
}
</artwork></figure></section></section></section><section title="AODVv2 Draft
Updates" anchor="aodvv2-draft-updates" toc="default"><section title="Changes
between revisions 9 and 10" anchor="changes-between-revisions-9-and-10"
toc="default"><t>This section lists the changes between AODVv2 revisions
...-09.txt and ...-10.txt. </t><t><list style="symbols"><t>Updated RFC 5444
Representation section to add "Address Type" TLV, which explicitly declares the
meaning of addresses in the RFC 5444 Address Block. </t><t>Relocated route
state definitions. Minor improvements to clarity throughout. </t><t>Updated
definition of timed routes. </t><t>More consistent use of OrigPrefixLen,
TargPrefixLen, and Invalid. </t><t>Mandated use of neighbor adjacency checking
and support of AckReq and RREP_Ack and clarified related text. </t><t>Changed
order of LoopFree checking and route cost comparisons in Evaluating Route
Information. </t><t>Updated structure of section on Applying Route Updates.
</t><t>Updated AckReq to include intended next hop address, and RREP to be
multicast if intended next hop is not a confirmed neighbor. </t><t>Clarified
that gateway router is not default router. </t></list></t></section><section
title="Changes between revisions 8 and 9"
anchor="changes-between-revisions-8-and-9" toc="default"><t>This section lists
the changes between AODVv2 revisions ...-08.txt and ...-09.txt. </t><t><list
style="symbols"><t>Numerous editorial improvements were made, including
relocation/removal/renaming/adding of some sections and text, collection and
tidying of scattered text on same topic, formatting made more consistent to
improve readability. </t><t>Removed mentions of precursors from main text,
except one mention in Route Table Entry. </t><t>Removed use of MIN_METRIC
which was not defined. </t><t>Changed Current_Time to CurrentTime for
consistency. </t><t>Changed OrigAddrMetric and TargAddrMetric to OrigMetric
and TargMetric respectively. </t><t>Updated Overview to simplify and provide a
broader summary. </t><t>Updated Terminology definitions, Data Elements tables
and combined sections. </t><t>Updated Applicability Statement to move some of
the non-applicability text and to simplify what remains. </t><t>Updated TLV
names to conform to existing naming style. </t><t>Updated Blacklist to be a
NeighborList to include neighbors that have confirmed bidirectional
connectivity. </t><t>Updated messages processed if router on blacklist and
which are indicators of bidirectional links. </t><t>Added RemoveTime to RteMsg
Table section. </t><t>Added short description of timed route to Route Table
Entry section but removed Route.Timed flag. Route is timed if its expiration
time is not MAX_TIME. </t><t>Added Unconfirmed route state for route to
OrigAddr learned from RREQ. </t><t>Updated AODVv2 Protocol Operations section
and subsections, including Initialization, Adjacency Monitoring, making
algorithms easier to read and making notation consistent, general improvements
to the text. </t><t>Updated Route Discovery, Retries and Buffering to include
a more complete description of the route discovery process. </t><t>Updated
wording relating to different metric types. </t><t>Added text regarding
control message limit in Message Transmission section. </t><t>Added short
explanation of positive/negative effects of buffering. </t><t>Simplified the
packet diagrams, since some of their contents was already explained in the text
below and then again as part of generation, reception and regeneration
processes. </t><t>Clarified some elements of the message content descriptions.
</t><t>Moved MetricType above MetricList in message sections, for consistency.
</t><t>Mirrored structure throughout AODVv2 Protocol Messages. </t><t>Changed
RREQ and RREP's use of Lists when only one entry is necessary. </t><t>Added
some pre-message-generation checks. </t><t>Ensured consistency in regeneration
(if msg-hop-limit is reduced to zero, do not regenerate). </t><t>Removed
statements about neighbors but added blacklist checks where necessary.
</t><t>Noted that RREQ retries should increase the SeqNum. </t><t>Added
statement that implementations SHOULD retry sending RREP. </t><t>Added text
explaining what happens if RREP is lost, regarding blacklisting and RREQ
retries. </t><t>Removed hop limit from RREP_Ack. Changed order of blacklist
check. </t><t>Updated RERR so that multiple metric types can be reported in
the same message. </t><t>Updated RERR reception processing to ensure PktSource
deletes the contained route. </t><t>Added text to show that if a router is the
destination of a RERR, the RERR is not regenerated. </t><t>Added text that
RERRs should not be created if the same RERR has recently been sent.
</t><t>Updated RFC 5444 overview and simplified/rearranged text in this
section. </t><t>Major update to RFC 5444 representation section </t><t>Updated
RERR's RFC 5444 representation so that PktSource is placed in Address Block,
and updated IANA section to make PktSource an Address Block TLV to indicate
which address is PktSource. </t><t>Described use of extension type in Metric
TLV to represent MetricType, and the interpretation when using the default
metric type. </t><t>Removed Multicast RREP as an optional feature.
</t><t>Updated Precursor Lists section to include options for precursor
information to store. </t><t>Updated Security Considerations.
</t></list></t></section><section title="Changes between revisions 7 and 8"
anchor="changes-between-revisions-7-and-8" toc="default"><t>This section lists
the changes between AODVv2 revisions ...-07.txt and ...-08.txt. </t><t><list
style="symbols"><t>MetricType is now an Address Block TLV. Minor changes to the
text. By using an extension type in the Metric TLV we can represent MetricType
more elegantly in the RFC 5444 message. </t><t>Updated Overview to be slightly
more concise. </t><t>Moved MetricType next to Metric when mentioned for better
flow. </t><t>Added text to Applicability to address comments on mailing list
regarding gateway behavior and NHDP HELLO messages. </t><t>Removed paragraph
in AODVv2 Message Transmission section regarding TTL. </t><t>Added reference
where precursors are mentioned in route table entry. </t><t>Added text to
bidirectionality explanation regarding NHDP HELLO messages and lower layer
triggers. </t><t>Clarified blacklist removal with SHOULD rather than MAY.
</t><t>Removed pseudo-code from section on evaluating incoming routing
information. </t><t>Clarified rules for expunging route entries on
memory-constrained devices. </t><t>Clarified the use of exponential backoff
for route discovery attempts. </t><t>Small updates to message sections.
Removed steps about checking if neighbors. </t><t>Renamed RFC 5444 parser to
multiplexer in Section 10. </t><t>Removed "optional feature" to include
multiple addresses in RERR. </t><t>Removed MetricType from the Message TLV
Type Specification. </t><t>Updated Security Considerations. </t><t>Added
reference to RFC 7182. </t><t>Small updates to message algorithms, including
moving MetricType from Message TLV to the Metric TLV in the Address Block TLV
Block, and only generating RERR if an Active route was made Invalid.
</t></list></t></section><section title="Changes between revisions 6 and 7"
anchor="changes-between-revisions-6-and-7" toc="default"><t>This section lists
the changes since AODVv2 revision ...-06.txt </t><t><list
style="symbols"><t>Added Victoria Mercieca as co-author. </t><t>Reorganized
protocol message descriptions into major subsections for each protocol message.
For protocol messages, organized processing into Generation, Reception, and
Regeneration subsections. </t><t>Separated RREQ and RREP message processing
description into separate major subsection which had previously been combined
into RteMsg description. </t><t>Enlarged RREQ Table function to include
similar processing for optional flooded RREP messages. The table name has been
correspondingly been changed to be the Table for Multicast RteMsgs.
</t><t>Moved sections for Multiple Interfaces and AODVv2 Control Message
Generation Limits to be major subsections of the AODVv2 Protocol Operations
section. </t><t>Reorganized the protocol message processing steps into the
subsections as previously described, adopting a more step-by-step presentation.
</t><t>Coalesced the router states Broken and Expired into a new combined
state named the Invalid state. No changes in processing are required for this.
</t><t>Merged the sections describing Next-hop Router Adjacency Monitoring and
Blacklists. </t><t>Specified that routes created during Route Discovery are
marked as Idle routes. If they are used for carrying data they become Active
routes. </t><t>Added Route.LastSeqNumUpdate information to route table, so
that route activity and sequence number validity can be tracked separately. An
active route can still forward traffic even if the sequence number has not been
refreshed within MAX_SEQNUM_LIFETIME. </t><t>Mandated implementation of
RREP_Ack as response to AckReq Message TLV in RREP messages. <vspace
blankLines="0"/>Added field to RREP_Ack to ensure correspondence to the correct
AckReq message. </t><t>Added explanations for what happens if protocol
constants are given different values on different AODVv2 routers.
</t><t>Specified that AODVv2 implementations are free to choose their own
heuristics for reducing multicast overhead, including RFC 6621. </t><t>Added
appendix to identify AODVv2 requirements from OS implementation of IP and ICMP.
</t><t>Deleted appendix showing example RFC 5444 packet formats.
</t><t>Clarification on the use of RFC 5497 VALIDITY_TIME. </t><t>In
Terminology, deleted superfluous definitions, added missing definitions.
</t><t>Numerous editorial improvements and clarifications.
</t></list></t></section><section title="Changes between revisions 5 and 6"
anchor="changes-between-revisions-5-and-6" toc="default"><t>This section lists
the changes between AODVv2 revisions ...-05.txt and ...-06.txt. </t><t><list
style="symbols"><t>Added Lotte Steenbrink as co-author. </t><t>Reorganized
section on Metrics to improve readability by putting specific topics into
subsections. </t><t>Introduced concept of data element, which is used to
clarify the method of enabling RFC 5444 representation for AODVv2 data
elements. A list of Data Elements was introduced in section 3, which provides a
better understanding of their role than was previously supplied by the table of
notational devices. </t><t>Replaced instances of OrigNode by OrigAddr whenever
the more specific meaning is appropriate. Similarly for instances of other node
versus address terminology. </t><t>Introduced concepts of PrefixLengthList and
MetricList in order to avoid use of index-based terminology such as OrigNdx and
TargNdx. </t><t>Added section 5, "AODVv2 Message Transmission", describing the
intended interface to RFC 5444. </t><t>Included within the main body of the
specification the mandatory setting of the TLV flag thassingleindex for TLVs
OrigSeqNum and TargSeqNum. </t><t>Removed the Route.Timed state. Created a new
flag for route table entries known as Route.Timed. This flag can be set when
the route is in the active state. Previous description would require that the
route table entry be in two states at the same time, which seems to be
misleading. The new flag is used to clarify other specification details for
Timed routes. </t><t>Created table 3 to show the correspondence between AODVv2
data elements and RFC 5444 message components. </t><t>Replaced "invalid"
terminology by the more specific terms "broken" or "expired" where appropriate.
</t><t>Eliminated the instance of duplicate specification for inclusion of
OrigNode (now, OrigAddr) in the message. </t><t>Corrected the terminology to
be Mid instead of Tail for the trailing address bits of OrigAddr and TargAddr
for the example message formats in the appendices. </t><t>Repaired remaining
instances of phraseology that could be construed as indicating that AODV only
supports a single network interface. </t><t>Numerous editorial improvements
and clarifications. </t></list></t></section><section title="Changes between
revisions 4 and 5" anchor="changes-between-revisions-4-and-5"
toc="default"><t>This section lists the changes between AODVv2 revisions
...-04.txt and ...-05.txt. </t><t><list style="symbols"><t>Normative text
moved out of definitions into the relevant section of the body of the
specification. </t><t>Editorial improvements and improvements to consistent
terminology were made. Replaced "retransmit" by the slightly more accurate term
"regenerate". </t><t>Issues were resolved as discussed on the mailing list.
</t><t>Changed definition of LoopFree as suggested by Kedar Namjoshi and
Richard Trefler to avoid the failure condition that they have described. In
order to make understanding easier, replaced abstract parameters R1 by RteMsg
and R2 by Route to reduce the level of abstraction when the function LoopFree
is discussed. </t><t>Added text to clarify that different metrics may have
different data types and different ranges of acceptable values. </t><t>Added
text to section "RteMsg Structure" to emphasize the proper use of RFC 5444.
</t><t>Included within the main body of the specification the mandatory setting
of the TLV flag thassingleindex for TLVs OrigSeqNum and TargSeqNum.
</t><t>Made more extensive use of the AdvRte terminology, in order to better
distinguish between the incoming RREQ or RREP message (i.e., RteMsg) versus the
route advertised by the RteMsg (i.e., AdvRte).
</t></list></t></section><section title="Changes between revisions 3 and 4"
anchor="changes-between-revisions-3-and-4" toc="default"><t>This section lists
the changes between AODVv2 revisions ...-03.txt and ...-04.txt. </t><t><list
style="symbols"><t>An appendix was added to exhibit algorithmic code for
implementation of AODVv2 functions. </t><t>Numerous editorial improvements and
improvements to consistent terminology were made. Terminology related to prefix
lengths was made consistent. Some items listed in "Notational Conventions" were
no longer used, and so deleted. </t><t>Issues were resolved as discussed on
the mailing list. </t><t>Appropriate instances of "may" were changed to "MAY".
</t><t>Definition inserted for "upstream". </t><t>Route.Precursors included
as an *optional* route table field </t><t>Reworded text to avoid use of
"relevant". </t><t>Deleted references to "DestOnly" flag. </t><t>Refined
statements about MetricType TLV to allow for omission when MetricType ==
HopCount. </t><t>Bulletized list in section 8.1 </t><t>ENABLE_IDLE_UNREACHABLE
renamed to be ENABLE_IDLE_IN_RERR </t><t>Transmission and subscription to
LL-MANET-Routers converted to MUST from SHOULD.
</t></list></t></section><section title="Changes between revisions 2 and 3"
anchor="changes-between-revisions-2-and-3" toc="default"><t>This section lists
the changes between AODVv2 revisions ...-02.txt and ...-03.txt. </t><t><list
style="symbols"><t>The "Added Node" feature was removed. This feature was
intended to enable additional routing information to be carried within a RREQ
or a RREP message, thus increasing the amount of topological information
available to nodes along a routing path. However, enlarging the packet size to
include information which might never be used can increase congestion of the
wireless medium. The feature can be included as an optional feature at a later
date when better algorithms are understood for determining when the inclusion
of additional routing information might be worthwhile. </t><t>Numerous
editorial improvements and improvements to consistent terminology were made.
Instances of OrigNodeNdx and TargNodeNdx were replaced by OrigNdx and TargNdx,
to be consistent with the terminology shown in <xref target="conventions"
pageno="false" format="default"/>. </t><t>Example RREQ and RREP message
formats shown in the Appendices were changed to use OrigSeqNum and TargSeqNum
message TLVs instead of using the SeqNum message TLV. </t><t>Inclusion of the
OrigNode's SeqNum in the RREP message is not specified. The processing rules
for the OrigNode's SeqNum were incompletely specified in previous versions of
the draft, and very little benefit is foreseen for including that information,
since reverse path forwarding is used for the RREP. </t><t>Additional
acknowledgements were included, and contributors names were alphabetized.
</t><t>Definitions in the Terminology section capitalize the term to be
defined. </t><t>Uncited bibliographic entries deleted. </t><t>Ancient
"Changes" sections were deleted. </t></list></t></section></section> </back>
</rfc>

Other related posts: