[aodvv2-discuss] Draft 12

  • From: Victoria Mercieca <vmercieca0@xxxxxxxxx>
  • To: "aodvv2-discuss@xxxxxxxxxxxxx" <aodvv2-discuss@xxxxxxxxxxxxx>
  • Date: Mon, 12 Oct 2015 15:44:27 +0100

Hi all,

I did manage to proofread the document and made a few small changes to the
version 12d I emailed previously. Here's 12e (labelled simply as 12), txt
and xml files.

I will await any last minute feedback... and if no-one else has posted it
to MANET overnight, I guess I'll do it tomorrow morning?

Kind regards,
Vicky.




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


Ad Hoc On-demand Distance Vector Routing Version 2 (AODVv2)
draft-ietf-manet-aodvv2-12

Abstract

The Ad Hoc On-demand Distance Vector Version 2 (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 April 14, 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 April 14, 2016 [Page 1]

Internet-Draft AODVv2 October 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 . . . . . . . . . . . . . . . . . . . 9
4. Data Structures . . . . . . . . . . . . . . . . . . . . . . . 10
4.1. Interface List . . . . . . . . . . . . . . . . . . . . . 10
4.2. Router Client Table . . . . . . . . . . . . . . . . . . . 10
4.3. Neighbor Table . . . . . . . . . . . . . . . . . . . . . 11
4.4. Sequence Numbers . . . . . . . . . . . . . . . . . . . . 12
4.5. Multicast Route Message Table . . . . . . . . . . . . . . 13
4.6. Route Table . . . . . . . . . . . . . . . . . . . . . . . 14
5. Metrics . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
6. AODVv2 Protocol Operations . . . . . . . . . . . . . . . . . 17
6.1. Initialization . . . . . . . . . . . . . . . . . . . . . 17
6.2. Adjacency Monitoring . . . . . . . . . . . . . . . . . . 17
6.3. Neighbor Table Update . . . . . . . . . . . . . . . . . . 19
6.4. Interaction with Forwarding Plane . . . . . . . . . . . . 20
6.5. Message Transmission . . . . . . . . . . . . . . . . . . 21
6.6. Route Discovery, Retries and Buffering . . . . . . . . . 22
6.7. Processing Received Route Information . . . . . . . . . . 24
6.7.1. Evaluating Route Information . . . . . . . . . . . . 25
6.7.2. Applying Route Updates . . . . . . . . . . . . . . . 27
6.8. Suppressing Redundant Messages Using the Multicast Route
Message Table . . . . . . . . . . . . . . . . . . . . . . 28
6.9. Route Maintenance . . . . . . . . . . . . . . . . . . . . 30
6.9.1. Route State . . . . . . . . . . . . . . . . . . . . . 31
6.9.2. Reporting Invalid Routes . . . . . . . . . . . . . . 33
7. AODVv2 Protocol Messages . . . . . . . . . . . . . . . . . . 33
7.1. Route Request (RREQ) Message . . . . . . . . . . . . . . 34
7.1.1. RREQ Generation . . . . . . . . . . . . . . . . . . . 35
7.1.2. RREQ Reception . . . . . . . . . . . . . . . . . . . 36
7.1.3. RREQ Regeneration . . . . . . . . . . . . . . . . . . 37
7.2. Route Reply (RREP) Message . . . . . . . . . . . . . . . 38
7.2.1. RREP Generation . . . . . . . . . . . . . . . . . . . 40
7.2.2. RREP Reception . . . . . . . . . . . . . . . . . . . 41
7.2.3. RREP Regeneration . . . . . . . . . . . . . . . . . . 43
7.3. Route Reply Acknowledgement (RREP_Ack) Message . . . . . 44
7.3.1. RREP_Ack Generation . . . . . . . . . . . . . . . . . 44
7.3.2. RREP_Ack Reception . . . . . . . . . . . . . . . . . 45



Perkins, et al. Expires April 14, 2016 [Page 2]

Internet-Draft AODVv2 October 2015


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



Perkins, et al. Expires April 14, 2016 [Page 3]

Internet-Draft AODVv2 October 2015


Appendix B. Router Client Relocation . . . . . . . . . . . . . . 71
Appendix C. Example Algorithms for AODVv2 Operations . . . . . . 72
C.1. HopCount MetricType . . . . . . . . . . . . . . . . . . . 73
C.2. General Operations . . . . . . . . . . . . . . . . . . . 74
C.2.1. Route Operations . . . . . . . . . . . . . . . . . . 74
C.2.2. LoopFree . . . . . . . . . . . . . . . . . . . . . . 77
C.2.3. Multicast Route Message Table Operations . . . . . . 78
C.3. Message Algorithms . . . . . . . . . . . . . . . . . . . 79
C.3.1. Build_RFC_5444_Message_Header . . . . . . . . . . . . 80
C.3.2. RREQ Operations . . . . . . . . . . . . . . . . . . . 80
C.3.3. RREP Operations . . . . . . . . . . . . . . . . . . . 84
C.3.4. RREP_Ack Operations . . . . . . . . . . . . . . . . . 88
C.3.5. RERR Operations . . . . . . . . . . . . . . . . . . . 88
Appendix D. AODVv2 Draft Updates . . . . . . . . . . . . . . . . 93
D.1. Changes between revisions 11 and 12 . . . . . . . . . . . 93
D.2. Changes between revisions 10 and 11 . . . . . . . . . . . 94
D.3. Changes between revisions 9 and 10 . . . . . . . . . . . 95
D.4. Changes between revisions 8 and 9 . . . . . . . . . . . . 95
D.5. Changes between revisions 7 and 8 . . . . . . . . . . . . 98
D.6. Changes between revisions 6 and 7 . . . . . . . . . . . . 99
D.7. Changes between revisions 5 and 6 . . . . . . . . . . . . 100
D.8. Changes between revisions 4 and 5 . . . . . . . . . . . . 101
D.9. Changes between revisions 3 and 4 . . . . . . . . . . . . 102
D.10. Changes between revisions 2 and 3 . . . . . . . . . . . . 103
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 104

1. Overview

The Ad Hoc On-demand Distance Vector Version 2 (AODVv2) routing
protocol (formerly named DYMO) enables on-demand, multihop unicast
routing among AODVv2 routers in mobile ad hoc networks (MANETs)
[RFC2501].

Compared to AODV [RFC3561], AODVv2 makes some features optional,
notably intermediate route replies, expanding ring search, and
precursor lists. Hello messages and local repair have been removed.
Message formats have been updated and made compliant with [RFC5444].
AODVv2 also provides a mechanism for the use of multiple metric
types.

The basic operations of the AODVv2 protocol are route discovery and
route maintenance.

Route discovery is performed when an AODVv2 router needs to forward
an IP 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, establishing a



Perkins, et al. Expires April 14, 2016 [Page 4]

Internet-Draft AODVv2 October 2015


route to both endpoints on all intermediate routers. A metric value
is included to represent the cost of the route contained within the
message.

AODVv2 uses sequence numbers to identify stale routing information,
and compares route metric values to determine if advertised routes
could form loops.

Route maintenance involves monitoring the router's links and routes
for changes. This includes confirming bidirectionality of links to
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 [RFC5444] Address
Blocks, Address Block TLVs, and Message TLVs.

Security for authentication of AODVv2 routers and encryption of
control messages is accomplished using the TIMESTAMP and ICV TLVs
defined 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 containing a list of IP addresses.

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

AckReq
An AODVv2 Data Element used in a Route Reply message to request
that the Route Reply message is acknowledged by returning a Route
Reply Ack message. This Data Element contains the address of the
AODVv2 router that should acknowledge the Route Reply message.

AdvRte
A route advertised in an incoming route message.

AODVv2 Router



Perkins, et al. Expires April 14, 2016 [Page 5]

Internet-Draft AODVv2 October 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 field used within AODVv2 protocol messages.

ENAR (External Network Access Router)
An AODVv2 router with an interface to an external, non-AODVv2
network.

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 indicating the metric type for a metric
value included in a message.

MetricTypeList
An AODVv2 Data Element used in a Route Error message, containing a
list of metric types associated with the addresses in the
AddressList of the message.

Neighbor
An AODVv2 router from which an AODVv2 message has been received.
Neighbors exchange routing information and attempt to verify
bidirectionality of the link to a neighbor before installing a
route via that neighbor.

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 containing the source IP address of the IP
packet triggering route discovery.

OrigMetric
An AODVv2 Data Element containing the metric value associated with
the route to the OrigAddr in a message.

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



Perkins, et al. Expires April 14, 2016 [Page 6]

Internet-Draft AODVv2 October 2015


OrigSeqNum
An AODVv2 Data Element used in a Route Request message, containing
the sequence number of the AODVv2 router which originated the
Route Request.

PktSource
An AODVv2 Data Element used in a Route Error message, containing
the source address of the IP packet which triggered the Route
Error message.

PrefixLengthList
An AODVv2 Data Element containing a list of routing prefix lengths
associated with the addresses in the AddressList of the message.

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
An address or address range configured on an AODVv2 router,
corresponding to one or more nodes which require that router to
initiate and respond to route discoveries on their behalf, so that
they can send and receive IP traffic to and from remote
destinations. The AODVv2 router's interface addresses are also
configured as Router Clients.

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

RREP_Gen (RREP Generating Router)
The AODVv2 router configured with TargAddr as a Router Client,
i.e., the router that creates the Route Reply message.

RREQ (Route Request)



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

Internet-Draft AODVv2 October 2015


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 a Router Client.

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

Sequence Number (SeqNum)
An AODVv2 Data Element containing the sequence number maintained
by an AODVv2 router to indicate freshness of route information.

SeqNumList
An AODVv2 Data Element containing a list of sequence numbers
associated with the addresses in the AddressList of a message.

TargAddr (Target Address)
An AODVv2 Data Element containing the destination address of the
IP packet triggering route discovery.

TargMetric
An AODVv2 Data Element containing the metric value associated with
the route to the TargAddr in a message.

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

TargSeqNum
An AODVv2 Data Element used in a Route Reply message, containing
the sequence number of the AODVv2 router which originated the
Route Reply.

Valid route
A route that can be used for forwarding.

Unreachable Address
An address reported in an RERR message, either the destination
address of an IP packet that could not be forwarded because a
valid route to the destination is not known, or the address on a
route which became Invalid.

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




Perkins, et al. Expires April 14, 2016 [Page 8]

Internet-Draft AODVv2 October 2015


ValidityTime
An AODVv2 Data Element containing the length of time the route
described by the message is offered.

The AODVv2 Data Elements are used to create AODVv2 messages. Their
contents are transferred into [RFC5444] formatted messages (see
Section 8) before sending.

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

+-----------------------+------------------------------------+
| Notation | Meaning |
+-----------------------+------------------------------------+
| Route[Address] | A route toward Address |
| Route[Address].Field | A field in a route toward Address |
| RteMsg.Field | A field in either RREQ or RREP |
+-----------------------+------------------------------------+

Table 1: Notational Conventions

3. Applicability Statement

The AODVv2 routing protocol is a reactive routing protocol. Certain
interactions with the forwarding plane are required, and these are
discussed in Section 6.4.

AODVv2 is designed for stub or disconnected mobile ad hoc networks,
i.e., non-transit networks or those not connected to the internet.
AODVv2 can, however, be configured to perform gateway functions when
attached to external networks, as discussed in Section 9.

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 IP 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.

Providing security for a reactive routing protocol can be difficult.
AODVv2 provides for message integrity and security against replay
attacks by using integrity check values, timestamps and sequence
numbers, as described in Section 13. If security associations can be
established, encryption can be used for AODVv2 messages to ensure
that only trusted routers participate in routing operations.

Since the route discovery process typically results in a route being
established in both directions along the same path, uni-directional



Perkins, et al. Expires April 14, 2016 [Page 9]

Internet-Draft AODVv2 October 2015


links are not suitable. AODVv2 will detect and exclude those links
from route discovery. The route discovered is optimised for the
requesting router, and the return path may not be the optimal route.

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), since
if a router loses its sequence number, there is a delay before the
router can resume full operations. This is described in Section 6.1.

AODVv2 supports routers with multiple interfaces, as long as each
interface configured for AODVv2 has a unicast IP address. A router
may use the same IP address on multiple interfaces. Address
assignment procedures are out of scope for AODVv2.

AODVv2 supports hosts with multiple interfaces, as long as each
interface is configured with its own unicast IP address. Multi-
homing of an IP address is not supported by AODVv2, and therefore a
Router Client, i.e. an IP Address, SHOULD NOT be served by more than
one AODVv2 router at any one time. Appendix A 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.

4. Data Structures

4.1. Interface List

If multiple interfaces of the AODVv2 router are configured for use by
AODVv2, a list of the interfaces SHOULD be configured in the
AODVv2_INTERFACES list.

4.2. Router Client Table

An AODVv2 router MUST provide route discovery services for its own
local applications and for other non-routing nodes that are reachable
without traversing another AODVv2 router. These nodes, and the
AODVv2 router itself, are referred to as Router Clients. An AODVv2




Perkins, et al. Expires April 14, 2016 [Page 10]

Internet-Draft AODVv2 October 2015


router will only originate Route Request and Route Reply messages on
behalf of configured Router Clients.

Router Client Table entries MUST contain:

RouterClient.IPAddress
An IP address or the start of an address range that requires route
discovery services from the AODVv2 router.

RouterClient.PrefixLength
The length, in bits, of the routing prefix associated with the
RouterClient.IPAddress. If a prefix length is included, the
AODVv2 router MUST provide connectivity for all addresses within
that prefix.

RouterClient.Cost
The cost associated with reaching this Router Client. This cost
will also appear as the metric in a route table entry for the
Router Client address.

The Router Client Table 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 Table.

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 address MUST NOT be served by more than one AODVv2
router at any one time, i.e. a Router Client of one AODVv2 router
MUST NOT be configured as a Router Client on another AODVv2 router
using the same Router Client IP address. Shifting responsibility for
a Router Client to a different AODVv2 router is discussed in
Appendix B.

4.3. Neighbor Table

A neighbor table MUST be maintained with information about
neighboring AODVv2 routers which are used in discovered routes.

Neighbor Table entries MUST contain:

Neighbor.IPAddress
An IP address of the neighboring router, learned from the source
IP address of a received route message.

Neighbor.State
The state of the adjacency with the neighbor (Confirmed, Unknown,
or Blacklisted). The Unknown state is the initial state. The



Perkins, et al. Expires April 14, 2016 [Page 11]

Internet-Draft AODVv2 October 2015


Confirmed state indicates that the link to the neighbor has been
confirmed as bidirectional. The Blacklisted state indicates that
the link to the neighbor is uni-directional. Section 6.2
discusses how to monitor adjacency.

Neighbor.ResetTime
When the State is Blacklisted, this time indicates the point at
which the State reverts to Unknown. By default this value is
calculated at the time the router is blacklisted and is equal to
CurrentTime + MAX_BLACKLIST_TIME. When the neighbor State is not
Blacklisted, this time is set to INFINITY_TIME.

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 RREQ and RREP messages created by an AODVv2 router include the
router's sequence number. Each AODVv2 router MUST ensure that its
sequence number is strictly increasing. It is incremented by one (1)
whenever an RREQ or RREP 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.

An AODVv2 router can only attach its own sequence number to
information about a route to one of its configured router clients.
All route messages regenerated by other routers retain the
originator's sequence number. Therefore, when two pieces of
information about a route are received, they both contain a sequence
number from the originating router. Comparing the sequence number
will identify which information is stale. The currently stored
sequence number is subtracted from the incoming sequence number. The
result of the subtraction is to be interpreted as a signed 16-bit
integer, and if less than zero, then the information in the AODVv2
message is stale and MUST be discarded.

As a consequence, loop freedom is assured.

An AODVv2 router SHOULD maintain its sequence number in persistent
storage. If the sequence number is lost, the router MUST follow the




Perkins, et al. Expires April 14, 2016 [Page 12]

Internet-Draft AODVv2 October 2015


procedure in Section 6.1 to safely resume routing operations with a
new sequence number.

4.5. Multicast Route Message Table

A route message (RteMsg) is either a Route Request or Route Reply
message. The Multicast Route Message Table is a conceptual table
which 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.

A Multicast Route Message Table entry MUST contain the following
information:

RteMsg.MessageType
Either RREQ or RREP.

RteMsg.OrigAddr
An IP address of the node which requires the route, i.e., the
source address of the IP packet triggering the route request.

RteMsg.OrigPrefixLen
The prefix length associated with OrigAddr.

RteMsg.TargAddr
An IP address of the target, i.e., the destination address of the
IP packet triggering the route request.

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.



Perkins, et al. Expires April 14, 2016 [Page 13]

Internet-Draft AODVv2 October 2015


RteMsg.RemoveTime
The time at which this entry MUST be removed, MAX_SEQNUM_LIFETIME
after the last update of RteMsg.OrigSeqNum for an RREQ, or
RteMsg.TargSeqNum for an RREP.

The Multicast Route Message Table is maintained so that no two
entries have the same MessageType, OrigAddr, TargAddr, and
MetricType. See Section 6.8 for details on updating this table.

4.6. Route Table

All AODVv2 routers MUST maintain a route table. The route table
entry is a conceptual data structure. Implementations MAY use any
internal representation but MUST contain the following information:

Route.Address
An address, which, when combined with Route.PrefixLength,
describes the set of destination addresses this route includes.

Route.PrefixLength
The prefix length, in bits, associated with Route.Address.

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

Route.NextHop
The source IP address of the message advertising the route to
Route.Address, i.e. 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 IP packets toward Route.Address.

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

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

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




Perkins, et al. Expires April 14, 2016 [Page 14]

Internet-Draft AODVv2 October 2015


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 IP packets.

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

Invalid
An Invalid route cannot be used for forwarding IP packets.
Invalid routes have sequence number information, which allows
incoming information to be assessed for freshness.

Unconfirmed
An Unconfirmed route cannot be used for forwarding IP 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.9.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 INFINITY_TIME.

5. Metrics

Metrics measure a cost or quality associated with a route or a link,
e.g., latency, delay, financial cost, energy, etc. Metric values are
reported in route messages, where the goal is to determine a route
between OrigAddr and TargAddr. In Route Request messages, the metric
describes the cost of the route from OrigAddr (the router client) to
the router sending the Route Request. The receiving router
calculates the cost from OrigAddr to itself, combining the metric
value from the message with knowledge of the link cost from the



Perkins, et al. Expires April 14, 2016 [Page 15]

Internet-Draft AODVv2 October 2015


sender to the receiver, i.e., the incoming link cost. This updated
route cost is included when regenerating the Route Request message.
In Route Reply messages, the metric reflects the cost of the route
from TargAddr (the router client) to the router sending the Route
Reply. Routes to OrigAddr and TargAddr are installed at intermediate
routers for the purposes of forwarding a Route Reply message and
subsequent data traffic between OrigAddr and TargAddr. Assuming link
metrics are symmetric, the cost of the routes to OrigAddr and
TargAddr installed at each router will be correct.

AODVv2 enables the use of multiple metric types. Each route
discovery attempt indicates which metric type is requested for the
route. For each MetricType, AODVv2 requires:

o A MetricType number, to indicate the metric type of a route.
MetricType numbers allocated are detailed in Section 11.6.

o A maximum value, denoted MAX_METRIC[MetricType]. If the cost of a
route exceeds MAX_METRIC[MetricType], the route is ignored.
AODVv2 cannot store routes that cost more than
MAX_METRIC[MetricType].

o A function for incoming link cost, denoted Cost(L). Using
incoming link costs means that the route learned has a path
optimized for the direction from OrigAddr to TargAddr.

o A function for route cost, denoted Cost(R).

o A function to analyze routes for potential loops, denoted
LoopFree(R1, R2). LoopFree verifies that a route R2 is not a sub-
section of another route R1. An AODVv2 router invokes LoopFree()
as part of the process in Section 6.7.1, when an advertised route
(R1) and an existing route (R2) have the same destination address,
metric type, and sequence number. LoopFree returns FALSE to
indicate that an advertised route is not to be used to update a
stored route, if it may cause a routing loop. In the case where
the existing route is Invalid, it is possible that the advertised
route includes the existing route and came from a router which did
not yet receive notification of the route becoming Invalid, so the
advertised route should not be used in case it forms a loop to a
broken route.

AODVv2 currently supports cost metrics where Cost(R) is strictly
increasing, by defining:

o Cost(R) := Sum of Cost(L) of each link in the route

o LoopFree(R1, R2) := ( Cost(R1) <= Cost(R2) )



Perkins, et al. Expires April 14, 2016 [Page 16]

Internet-Draft AODVv2 October 2015


Implementers MAY consider other metric types, but the definitions of
Cost and LoopFree functions for such types are undefined, and
interoperability issues need to be considered.

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 an AODVv2 router does not have
information about its previous sequence number, or if its sequence
number is lost at any point, the router resets its sequence number to
one (1). However, other AODVv2 routers may still hold sequence
number information that this router previously issued. Since
sequence number information is removed if there has been no update to
the sequence number in MAX_SEQNUM_LIFETIME, the initializing router
must wait for MAX_SEQNUM_LIFETIME before it creates any messages
containing its new 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 of that route discovery

o Regenerate a received RREQ or RREP

o Send an RREP_Ack

o Maintain valid routes in order that the forwarding process can
forward IP packets to Router Clients and to other routers

o Create, process and regenerate RERR messages

6.2. Adjacency Monitoring

AODVv2 routers MUST NOT establish routes over uni-directional links.
Consider the following. An RREQ is forwarded toward TargAddr, and
intermediate routers install a route to OrigAddr. If, at one of



Perkins, et al. Expires April 14, 2016 [Page 17]

Internet-Draft AODVv2 October 2015


those routers, the link to the next hop toward OrigAddr was uni-
directional, and this route was used to forward data traffic, the
data packets would be lost. Further, an RREP sent toward OrigAddr
using this link will not reach the next hop, and will therefore not
be regenerated, and will never reach RREQ_Gen, so end-to-end route
establishment will fail. AODVv2 routers MUST verify that the link to
the next hop is bidirectional when establishing a route, and before
allowing data traffic to be forwarded on that route. If
bidirectionality cannot be verified, this link MUST be excluded from
the route discovery procedure.

AODVv2 refers to a bidirectional link with a neighboring router as an
adjacency. AODVv2 routers do not need to monitor adjacency to all
neighboring AODVv2 routers at all times, but MUST determine if there
is an adjacency to the chosen next-hop AODVv2 router during route
discovery.

o For the next hop toward OrigAddr, the approach for testing
bidirectional connectivity 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. If a link to a neighbor is determined to be
unidirectional because a requested acknowledgement is not received
within RREP_Ack_SENT_TIMEOUT, the neighbor MUST be marked as
blacklisted (see below).

o For the next hop toward TargAddr, receipt of the Route Reply
message containing the route to TargAddr is confirmation of
bidirectionality, since a Route Reply message is a reply to a
Route Request message which previously crossed the link in the
opposite direction.

To assist with adjacency monitoring, a Neighbor Table (Section 4.3)
is maintained. Each entry contains a neighbor IP address and an
indication of the state of the adjacency with that neighbor (Unknown,
Blacklisted, or Confirmed). When an RREQ or RREP is received from an
IP address which does not already have an entry in the Neighbor
Table, a new entry is created as described in Section 6.3. While
neighbor state is Unknown, acknowledgement of RREP messages MUST be
requested. While neighbor state is Confirmed, the request for an
acknowledgement is unnecessary.

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

o NHDP HELLO Messages [RFC6130]




Perkins, et al. Expires April 14, 2016 [Page 18]

Internet-Draft AODVv2 October 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

If such an external process signals that the link is bidirectional,
the neighbor state MAY be set to Confirmed. If an external process
signals that a link is not bidirectional, the AODVv2 router MAY
update the matching Neighbor Table entry by changing the neighbor
state to Blacklisted. If an external process signals that the link
might not be bidirectional, and the neighbor state is currently
Confirmed, the state MAY be set to Unknown.

For example, receipt of a Neighborhood Discovery Protocol HELLO
message with the receiving router listed as a neighbor is a signal of
bidirectional connectivity. The AODVv2 router MAY update the
matching Neighbor Table entry by changing the neighbor state to
Confirmed.

Similarly, if AODVv2 receives notification of a timeout, for example,
from TCP or some other protocol, this may be due to a disconnection.
The AODVv2 router MAY update the matching Neighbor Table entry by
resetting the neighbor state to Unknown.

6.3. Neighbor Table Update

On receipt of an RREQ or RREP message, the neighbor table MUST be
checked for an entry with Neighbor.IPAddress which matches the source
IP address of the message. If no matching entry is found, a new
entry is created.

A new Neighbor Table entry is created as follows:

o Neighbor.IPAddress := Source IP address of the message

o Neighbor.State := Unknown

o Neighbor.ResetTime := INFINITY_TIME

When the link to the neighbor is determined to be bidirectional, the
Neighbor Table entry is updated as follows:




Perkins, et al. Expires April 14, 2016 [Page 19]

Internet-Draft AODVv2 October 2015


o Neighbor.State := Confirmed

When the link to the neighbor is determined to be uni-directional,
the Neighbor Table entry is updated as follows:

o Neighbor.State := Blacklisted

o Neighbor.ResetTime := CurrentTime + MAX_BLACKLIST_TIME

When the Neighbor.ResetTime is reached, the Neighbor Table entry is
updated as follows:

o Neighbor.State := Unknown

When a link to a neighbor is determined to be broken, the Neighbor
Table entry SHOULD be removed.

Route requests from neighbors with Neighbor.State set to Blacklisted
are ignored to avoid persistent IP packet loss or protocol failures.
However, the reset time allows the neighbor to again be allowed to
participate in route discoveries after MAX_BLACKLIST_TIME, in case
the link between the routers has become bidirectional.

6.4. Interaction with Forwarding Plane

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.

AODVv2 requires signals from the forwarding plane:

o A packet cannot be forwarded because a route is unavailable:
AODVv2 needs to know the source and destination IP addresses of
the packet, to determine whether it should initiate route
discovery, and include this information in a Route Request
message, or create a Route Error message.

o A packet is to be forwarded: AODVv2 needs to check the state of
the route to deal with timeouts. If the implementation uses
timers to enforce route timeouts, this signal is unnecessary.

o Packet forwarding failure occurs: AODVv2 needs to initiate route
error reports.

o Packet forwarding succeeds: AODVv2 needs to update the record of
when a route was last used to forward a packet.




Perkins, et al. Expires April 14, 2016 [Page 20]

Internet-Draft AODVv2 October 2015


AODVv2 needs to send signals to the forwarding plane:

o A route discovery is in progress: packets awaiting a route may be
buffered while route discovery is attempted.

o A route discovery was not attempted: any buffered packets
requiring that route should be discarded.

o A route discovery failed: any buffered packets requiring that
route should be discarded, and the source of the packet should be
notified that the destination is unreachable (using an ICMP
Destination Unreachable message).

o A route discovery succeeded: install a route which AODVv2 has
determined to be valid and begin transmitting any buffered
packets.

o A route has been lost: remove an installed route which AODVv2 has
determined to be invalid.

o A route has been updated: update an installed route when AODVv2
receives new information about the route.

These are conceptual signals, and can be implemented in various ways.
Conformant implementations of AODVv2 are not mandated to implement
the forwarding plane separately from the control plane or data plane;
these signals and interactions are identified simply as assistance
for implementers who may find them useful.

6.5. Message Transmission

AODVv2 sends [RFC5444] formatted messages using the parameters for
port number and IP protocol specified in [RFC5498]. Mapping of
AODVv2 Data Elements to [RFC5444] is detailed in Section 8.

Messages may travel a maximum of MAX_HOPCOUNT hops.

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.

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.





Perkins, et al. Expires April 14, 2016 [Page 21]

Internet-Draft AODVv2 October 2015


Implementations MAY choose to employ techniques to reduce the number
of multicast messages sent. Use of [RFC6621] in deployments is
recommended. Employing [RFC6621] in a subset of the operational
AODVv2 routers in a network, or configuring different algorithms on
different routers, will not cause interoperability issues, but will
reduce the effectiveness of the multicast reduction scheme.

When multiple interfaces are available, an AODVv2 router 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
SHOULD be limited (CONTROL_TRAFFIC_LIMIT) and administratively
configurable. To prioritize transmission of AODVv2 control messages
in order to respect the CONTROL_TRAFFIC_LIMIT:

o Highest priority SHOULD be given to RREP_Ack messages. This
allows learned routes to be confirmed as bidirectional and avoids
undesirable blacklisting of next hop routers.

o Second priority SHOULD be given to RERR messages for undeliverable
IP packets, so that broken routes that are still being used are
reported, and to avoid IP data packets being repeatedly forwarded
to AODVv2 routers which cannot forward to their destination.

o Third priority SHOULD be given to RREP messages in order that
RREQs do not time out.

o RREQ messages SHOULD be given priority over RERR messages for
newly invalidated routes, since the invalidated routes may not
still be in use, and if there is an attempt to use the route, a
new RERR message will be generated.

o Lowest priority SHOULD be given to RERR messages generated in
response to RREP messages which cannot be regenerated. In this
case the route request will be retried at a later point.

6.6. Route Discovery, Retries and Buffering

AODVv2's RREQ and RREP messages are used for route discovery. The
main difference between the two messages is that, usually, RREQ
messages are multicast to solicit an RREP, whereas RREP is unicast as
a response to the RREQ. The constants used in this section are
defined in Section 11.




Perkins, et al. Expires April 14, 2016 [Page 22]

Internet-Draft AODVv2 October 2015


When an AODVv2 router needs to forward an IP 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. Each new RREQ results in an
increment to the sequence number. The AODVv2 router is referred to
as RREQ_Gen.

IP packets awaiting a route MAY be buffered by RREQ_Gen. Buffering
of IP packets can have both positive and negative effects. 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.

Determining which packets to discard first when the buffer is full is
a matter of policy at each AODVv2 router. Routers without sufficient
memory available for buffering SHOULD have buffering disabled. 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. An 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. To reduce congestion in a network,
repeated attempts at route discovery for a particular target address
SHOULD utilize a binary exponential backoff: for each additional
attempt, the waiting time for receipt of the RREP is multiplied by 2.
If the requested route is not learned within the wait period, another
RREQ MAY be sent, up to a total of DISCOVERY_ATTEMPTS_MAX. This is
the same technique used in AODV [RFC3561].

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
unicasts it back toward RREQ_Gen using the potential 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 link is
unavailable in the direction toward OrigAddr, an RREP is not received
at the next hop, so cannot be regenerated, and it will never reach
RREQ_Gen. However, since routers monitor 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. Later, a



Perkins, et al. Expires April 14, 2016 [Page 23]

Internet-Draft AODVv2 October 2015


timeout occurs at RREQ_Gen, and a new RREQ MAY be regenerated. If
the new RREQ arrives via the blacklisted router, it will be ignored,
enabling the RREQ to discover a different path toward TargAddr.

Route discovery SHOULD be considered to have failed after
DISCOVERY_ATTEMPTS_MAX and the corresponding wait time for an RREP
response to the final RREQ, in order to avoid repeatedly generating
control traffic that is unlikely to discover a route. 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, to avoid generating more multicast messages which
are unlikely to discover a route. Any IP 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 packet, so that the application knows
about the failure. The source can 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 MUST process the message according to
Section 7. When a valid route is installed, the router can begin
sending the buffered IP packets. Any retry timers for the
corresponding RREQ MUST be cancelled.

During route discovery, all routers on the path learn a route to both
OrigAddr and TargAddr, so that routes are constructed in both
directions. The route is optimized for the forward route, and the
return route uses the same path in reverse.

6.7. 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.7.1. The route
table MAY then be updated according to Section 6.7.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 an existing route which matches AdvRte on address, prefix
length, and metric type.

AdvRte has the following properties:




Perkins, et al. Expires April 14, 2016 [Page 24]

Internet-Draft AODVv2 October 2015


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

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 := RteMsg.IPSourceAddress (an address of the router
from which the AdvRte was received)

o AdvRte.MetricType := RteMsg.MetricType

o AdvRte.Metric := RteMsg.Metric

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

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

6.7.1. Evaluating Route Information

An incoming route advertisement (AdvRte) is compared to existing
routes to determine whether the advertised route is to be used to
update the routing table. The incoming route information MUST be
processed as follows:

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

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

* If all matching routing table entries have State set to
Unconfirmed, AdvRte SHOULD be added to the routing table.
This may result in multiple Unconfirmed routes to the same
address. In this case, the best route from the set of
Unconfirmed routes SHOULD be used to forward future RREPs. If
the link to the next hop is found to be bidirectional, and the
Unconfirmed route becomes valid, any remaining Unconfirmed
routes which would not offer improvement MUST be expunged.




Perkins, et al. Expires April 14, 2016 [Page 25]

Internet-Draft AODVv2 October 2015


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

2. Compare sequence numbers using the technique described in
Section 4.4

* If AdvRte is more recent, AdvRte MUST be used to update the
routing table.

* If AdvRte is stale, 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)

* 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 4.

4. Compare route costs

* If AdvRte is better, it SHOULD be used to update the routing
table because it offers improvement. If it is not used to
update the existing route, the existing non-optimal route will
continue to be used, causing data flows to use a route with a
worse cost where this could have been avoided.

* If AdvRte is equal in cost and Route is Valid, AdvRte MAY be
used to update the routing table but will offer no
improvement.

* If AdvRte is worse 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.7.2 MUST be followed. If the route is not
used, non-optimal routes will remain in the routing table.






Perkins, et al. Expires April 14, 2016 [Page 26]

Internet-Draft AODVv2 October 2015


6.7.2. Applying Route Updates

If AdvRte is from an RREQ message, the next hop neighbor may not be
confirmed as adjacent (see Section 4.3). If Neighbor.State is
Unknown, the route to AdvRte.Address might not be viable, but it MUST
be stored to allow a corresponding RREP to be sent. However, the
route's State will be set to Unconfirmed to indicate that this route
SHOULD NOT yet be used to forward data, since the link may be uni-
directional and packet losses may occur. If a valid route already
exists for this destination, this Unconfirmed route SHOULD be stored
as an additional entry. If the link to the next hop is later
confirmed to be bidirectional, the route will offer improvement over
the existing valid route.

The route update is applied as follows:

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

2. If a matching route exists:

* If AdvRte has a different next hop to the existing route
(Route), and both 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 the next
hop can be confirmed as bidirectional. Continue processing
from Step 3 to create a new route.

* If AdvRte.NextHop's Neighbor.State is Unknown and Route.State
is Invalid, continue processing from Step 4 to update the
existing route (Route).

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

3. Create a route and initialize as follows:

* Route.Address := AdvRte.Address

* Route.PrefixLength := AdvRte.PrefixLength

* Route.MetricType := AdvRte.MetricType

4. Update the route as follows:

* Route.SeqNum := AdvRte.SeqNum

* Route.NextHop := AdvRte.NextHop



Perkins, et al. Expires April 14, 2016 [Page 27]

Internet-Draft AODVv2 October 2015


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

* Route.Metric := AdvRte.Cost

* Route.LastUsed := CurrentTime

* Route.LastSeqNumUpdate := CurrentTime

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

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

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

6. If an existing route changed from Invalid or Unconfirmed to
become Idle, any matching route table entries with worse metric
values SHOULD be expunged.

7. If this update results in a route with Route.State set to Active
or Idle, which matches an outstanding route request, the
associated route request retry timers can be cancelled and any
associated buffered IP packets MUST be forwarded.

6.8. Suppressing Redundant Messages Using the Multicast Route Message
Table

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 Route Message Table (Section 4.5).

To create a Multicast Route Message Table Entry:

o RteMsg.MessageType := RREQ or RREP

o RteMsg.OrigAddr := OrigAddr from the message

o RteMsg.OrigPrefixLen := the prefix length associated with OrigAddr

o RteMsg.TargAddr := TargAddr from the message



Perkins, et al. Expires April 14, 2016 [Page 28]

Internet-Draft AODVv2 October 2015


o RteMsg.TargPrefixLen := the prefix length associated with TargAddr

o RteMsg.OrigSeqNum := the sequence number associated with OrigAddr,
if present in the message

o RteMsg.TargSeqNum := the sequence number associated with TargAddr,
if present in the message

o RteMsg.MetricType := the metric type of the route requested

o RteMsg.Metric := the metric value associated with OrigAddr in an
RREQ or TargAddr in an RREP

o RteMsg.Timestamp := CurrentTime

o RteMsg.RemoveTime := CurrentTime + MAX_SEQNUM_LIFETIME

Entries in the Multicast Route Message Table 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. An entry
MUST be deleted when the sequence number is no longer valid, i.e.,
after MAX_SEQNUM_LIFETIME. Memory-constrained devices MAY remove the
entry before this time.

To update a Multicast Route Message Table Entry, set:

o RteMsg.OrigSeqNum := the sequence number associated with OrigAddr,
if present in the message

o RteMsg.TargSeqNum := the sequence number associated with TargAddr,
if present in the message

o RteMsg.Metric := the metric value associated with OrigAddr in an
RREQ or TargAddr in an RREP

o RteMsg.Timestamp := CurrentTime

o RteMsg.RemoveTime := CurrentTime + MAX_SEQNUM_LIFETIME

Received route messages are tested against previously received route
messages, and if determined to be redundant, regeneration or response
can be avoided.

To determine if a received message is redundant:

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




Perkins, et al. Expires April 14, 2016 [Page 29]

Internet-Draft AODVv2 October 2015


* If there is none, the message is not redundant.

* If there is an entry, continue to Step 2.

2. Compare sequence numbers using the technique described in
Section 4.4

* For RREQ messages, use OrigSeqNum of the entry for comparison.
For RREP messages, use TargSeqNum of the entry for comparison.

* If the entry has an older sequence number than the received
message, the message is not redundant.

* If the entry has a newer sequence number than the received
message, the message is redundant.

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

3. Compare the metric values

* If the entry has a Metric value that is worse than or equal to
the metric in the received message, the message is redundant.

* If the entry has a Metric value that is better than the metric
in the received message, the message is not redundant.

If the message is redundant, update the timestamp on the entry, since
matching route messages are still traversing the network and this
entry should be maintained. This message SHOULD NOT be regenerated
or responded to.

If the message is not redundant, create an entry or update the
existing entry. Where the message is determined not redundant before
Step 3, it MUST be regenerated or responded to. Where the message is
determined not redundant in Step 3, it MAY be suppressed to avoid
extra control traffic. However, since the processing of the message
will result in an update to the route table, the message SHOULD be
regenerated or responded to, to ensure other routers have up-to-date
information and the best metrics. If not regenerated, the best route
may not be found. Where necessary, regeneration or response is
performed using the processes in Section 7.

6.9. Route Maintenance

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





Perkins, et al. Expires April 14, 2016 [Page 30]

Internet-Draft AODVv2 October 2015


Before using a route to forward an IP packet, an AODVv2 router MUST
check firstly if there is a route, and secondly the status of the
route (Section 6.9.1). If the route exists and is valid, it MUST be
marked as Active and its LastUsed timestamp MUST be updated, before
forwarding the IP packet to the route's next hop. If there is no
valid route, and if the source address of the IP packet is a Router
Client, the RREQ generation procedure MUST be followed. Otherwise,
the absence of a route MUST be reported to the packet's source (see
Section 6.9.2).

6.9.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
MAY be examined and updated according to the rules below. If timers
are not used to prompt route state updates, route state MUST be
checked before IP packet forwarding and before any operation based on
route state.

The four possible states for an AODVv2 route are Active, Idle,
Invalid, and Unconfirmed:

Active
If Route.State is Active and the route is not timed (i.e., if
Route.ExpirationTime is INFINITY_TIME), Route.State MUST become
Idle if Route is not used to forward IP packets within
ACTIVE_INTERVAL. Route.State for a timed route (i.e.,
Route.ExpirationTime is not equal to INFINITY_TIME) remains Active
until its expiration time, after which it MUST become Invalid.

Idle
If Route.State is Idle, and the route is used to forward an IP
packet, Route.State MUST become Active. If the route is not used
to forward an IP packet within MAX_IDLETIME, Route.State MUST
become Invalid.

Invalid
If Route.State is Invalid, the route SHOULD be maintained until
MAX_SEQNUM_LIFETIME after Route.LastSeqNumUpdate, after which it
MUST be expunged. Route.SeqNum is used to classify future
information about Route.Address as stale or fresh.

Unconfirmed
If Route.State is Unconfirmed, the route MUST become Idle when an
adjacency with Route.NextHop is confirmed, or MUST be expunged if
the neighbor is blacklisted, or at MAX_SEQNUM_LIFETIME after
Route.LastSeqNumUpdate.




Perkins, et al. Expires April 14, 2016 [Page 31]

Internet-Draft AODVv2 October 2015


In all cases, if the time since Route.LastSeqNumUpdate exceeds
MAX_SEQNUM_LIFETIME, Route.SeqNum must be set to zero. This is
required to ensure that any AODVv2 routers following the
initialization procedure can safely begin routing functions using a
new sequence number, and that their messages will not be classified
as stale and ignored. A route with Route.State set to Active or Idle
can continue to be used to forward IP packets, but if Route.State
later becomes Invalid, the route MUST be expunged.

Appendix C.2.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 for Route.NextHop
MUST immediately have Route.State set to Invalid.

o If a Route Error (RERR) message containing the route is received,
either from Route.NextHop, or with PktSource set to a Router
Client address, Route.State MUST immediately be set to Invalid.

When Route.State changes from Unconfirmed to Idle as a result of the
adjacency with Route.NextHop being Confirmed (see Section 4.3), any
matching routes with metric values worse than Route.Metric MUST be
expunged.

Memory constrained devices MAY choose to expunge routes from the
AODVv2 route table before Route.ExpirationTime, but MUST adhere to
the following rules:

o An Active route MUST NOT be expunged, as this will result in
generation of a Route Error message followed by a necessary Route
Request to re-establish the route.

o An Idle route SHOULD NOT be expunged, as the route is still valid
for forwarding IP traffic, and if deleted, this could result in
dropped IP packets and a Route Request could be generated to re-
establish the route.

o Any Invalid route MAY be expunged; least recently used Invalid
routes SHOULD be expunged first, since these are less likely to be
reused.

o An Unconfirmed route MUST NOT be expunged if it was installed
within the last RREQ_WAIT_TIME, because it may correspond to a
route discovery in progress. A Route Reply message might be
received which needs to use the Route.NextHop information.
Otherwise, it MAY be expunged.



Perkins, et al. Expires April 14, 2016 [Page 32]

Internet-Draft AODVv2 October 2015


Route table entries are updated when Neighbor State is updated:

o While Neighbor.State is set to Unknown, any routes learned through
that neighbor are marked as Unconfirmed.

o When Neighbor.State is set to Confirmed, the Unconfirmed routes
using the neighbor as a next hop SHOULD be marked as valid (see
Section 6.9.1).

o When Neighbor.State is set to Blacklisted, any valid routes
installed which use that neighbor for their next hop are marked as
Invalid.

o When a Neighbor Table entry is removed, all routes using the
neighbor as next hop MUST be marked as Invalid.

6.9.2. Reporting Invalid Routes

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

An RERR message SHOULD also be sent when an AODVv2 router receives an
IP packet to forward on behalf of another router but does not have a
valid route for the destination of the packet.

An RERR message SHOULD also be sent when an AODVv2 router receives an
RREP message to regenerate, but the route to the OrigAddr in the RREP
has been lost and is marked as Invalid.

The packet or message triggering the RERR MUST be discarded.

Generation of an 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 [RFC5444] Message TLVs, Address Blocks, and
Address TLVs.





Perkins, et al. Expires April 14, 2016 [Page 33]

Internet-Draft AODVv2 October 2015


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 contents:

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

Figure 1: RREQ message contents

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 IP 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.

OrigSeqNum
The sequence number associated with OrigAddr.

TargSeqNum



Perkins, et al. Expires April 14, 2016 [Page 34]

Internet-Draft AODVv2 October 2015


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).

MetricType
The metric type associated with OrigMetric.

OrigMetric
The metric value 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

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

Before creating an RREQ, the router SHOULD check if an 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 IP 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. If approaching the
limit, the message should be sent if the priorities in Section 6.5
allow it.

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 is part of an address range configured as a Router
Client, set PrefixLengthList := {OrigPrefixLen, null}.




Perkins, et al. Expires April 14, 2016 [Page 35]

Internet-Draft AODVv2 October 2015


* Otherwise, omit PrefixLengthList.

5. For OrigSeqNum:

* Increment the router SeqNum 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 and set the type accordingly

8. Set OrigMetric := Route[OrigAddr].Metric, i.e., RouterClient.Cost

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 [RFC5444]
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 an 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.




Perkins, et al. Expires April 14, 2016 [Page 36]

Internet-Draft AODVv2 October 2015


3. 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)

* If not, ignore this RREQ for further processing.

4. Check that the MetricType is supported and configured for use

* 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.7.1

7. Check if the message is redundant by comparing to entries in the
Multicast Route Message table, following the procedure in
(Section 6.8)

* If redundant, ignore this RREQ for further processing.

* If not redundant, continue processing.

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

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

* If not, continue to RREQ regeneration.

7.1.3. RREQ Regeneration

By regenerating an RREQ, a router advertises that it will forward IP
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 might avoid regenerating an 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. If approaching




Perkins, et al. Expires April 14, 2016 [Page 37]

Internet-Draft AODVv2 October 2015


the limit, the message should be sent if the priorities in
Section 6.5 allow it.

The procedure for RREQ 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 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 time limit the previous AODVv2
router specified, or the time limit this router wishes to
impose, whichever is lower.

This AODVv2 message is used to create a corresponding [RFC5444]
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

When a Route Request message is received, requesting a route to a
Target Address which is configured as a Router Client, a Route Reply
message is sent in response. The RREP offers a route to the Target
Address.

The RREP is sent by unicast to the next hop router on the route to
OrigAddr, if there is a Confirmed entry in the Neighbor Table for the
next hop. 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 to request acknowledgement to confirm
the neighbor adjacency.

RREP messages have the following contents:



Perkins, et al. Expires April 14, 2016 [Page 38]

Internet-Draft AODVv2 October 2015


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

Figure 2: RREP message contents

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 to be multicast because the next
hop toward OrigAddr is a neighbor with Unknown state. It
indicates that an acknowledgement of 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 IP 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.

TargSeqNum



Perkins, et al. Expires April 14, 2016 [Page 39]

Internet-Draft AODVv2 October 2015


The sequence number associated with TargAddr.

MetricType
The metric type associated with TargMetric.

TargMetric
The metric value 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

An RREP is generated when an RREQ arrives requesting a route to one
of the AODVv2 router's Router Clients.

Before creating an 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 approaching the
limit, the message should be sent if the priorities in Section 6.5
allow it.

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 next hop
neighbor is already confirmed as adjacent, the AckReq Data Element
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.6 for RREQ retries. Adjacency confirmation MUST be
considered to have failed after the wait time for an 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 April 14, 2016 [Page 40]

Internet-Draft AODVv2 October 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 is part of an address range configured as a Router
Client, set PrefixLengthList := {null, TargPrefixLen}.

* Otherwise, omit PrefixLengthList.

6. For the TargSeqNum:

* Increment the router SeqNum as specified in Section 4.4.

* Set TargSeqNum := SeqNum.

7. Include the MetricType Data Element and set the type to match the
MetricType in the received RREQ message

8. Set TargMetric := Route[TargAddr].Metric, i.e., RouterClient.Cost

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 [RFC5444]
message (see Section 8). If there is a Confirmed entry in the
Neighbor Table for the next hop router on the route to OrigAddr, the
RREP is sent by unicast to the next hop. Otherwise, the RREP is sent
multicast to LL-MANET-Routers.

7.2.2. RREP Reception

Upon receiving an 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 Neighbor Table entry for this sender




Perkins, et al. Expires April 14, 2016 [Page 41]

Internet-Draft AODVv2 October 2015


SHOULD have State set to Confirmed since an RREP is an
indication of adjacency

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. Check that the MetricType is supported and configured for use

* If not, ignore this RREP for further processing.

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

* If it does, 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.7.1

* If the route to TargAddr fulfills a previously sent RREQ, any
associated timeouts will be cancelled and buffered IP 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
Multicast Route Message table (Section 6.8)

* If redundant, ignore this RREP for further processing.





Perkins, et al. Expires April 14, 2016 [Page 42]

Internet-Draft AODVv2 October 2015


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

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 IP 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
an 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 approaching
the limit, the message should be sent if the priorities in
Section 6.5 allow it.

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



Perkins, et al. Expires April 14, 2016 [Page 43]

Internet-Draft AODVv2 October 2015


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

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 time limit the previous AODVv2
router specified, or the time limit this router wishes to
impose, whichever is lower.

This AODVv2 message is used to create a corresponding [RFC5444]
message (see Section 8). If there is a Confirmed entry in the
Neighbor Table for the next hop router on the route to OrigAddr, the
RREP is sent by unicast to the next hop. Otherwise, the RREP is sent
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

An 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 an RREP_Ack. The [RFC5444]
representation is discussed in Section 8. The RREP_Ack is unicast,
by default, to the source IP address of the RREP message that
requested it.





Perkins, et al. Expires April 14, 2016 [Page 44]

Internet-Draft AODVv2 October 2015


7.3.2. RREP_Ack Reception

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

1. If an 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. An RERR
message has the following contents:

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

Figure 3: RERR message contents

RERR Data Elements

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

PktSource
The source address of the IP 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.




Perkins, et al. Expires April 14, 2016 [Page 45]

Internet-Draft AODVv2 October 2015


PrefixLengthList
The prefix lengths, in bits, associated with the routes no longer
available through RERR_Gen. These values indicate whether routes
represent a single device or an address range.

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

MetricTypeList
The metric types associated with the routes no longer available
through RERR_Gen.

7.4.1. RERR Generation

An 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 an IP packet arrives that cannot be forwarded because no valid
route exists for its destination, or if an RREP arrives which
cannot be regenerated because no route exists to OrigAddr, the
RERR generated MUST contain the PktSource Data Element and will
contain only one unreachable address. The contents of PktSource
and AddressList are set as follows:

* For an IP packet that cannot be forwarded, PktSource is set to
the source address of the IP packet, and the AddressList
contains the destination address of the IP packet.

* For an RREP message when 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 PktSource. The MetricTypeList MUST
also be included if a MetricType can be determined from the IP
packet or an existing Invalid route to PktSource.

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

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




Perkins, et al. Expires April 14, 2016 [Page 46]

Internet-Draft AODVv2 October 2015


o 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. 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.

An 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 IP 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. If approaching the
limit, the message should be sent if the priorities in Section 6.5
allow it.

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 IP packet triggering the RERR,
or the TargAddr of an RREP that cannot be regenerated toward
OrigAddr

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.





Perkins, et al. Expires April 14, 2016 [Page 47]

Internet-Draft AODVv2 October 2015


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

The AODVv2 message is used to create a corresponding [RFC5444]
message (see Section 8).

If the RERR is sent in response to an undeliverable IP packet or RREP
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 an 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 is supported and configured for use

* 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.




Perkins, et al. Expires April 14, 2016 [Page 48]

Internet-Draft AODVv2 October 2015


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.

* 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 existing route, if the
reported sequence number is determined to be newer using the
comparison technique described in Section 4.4.

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. If approaching the
limit, the message should be sent if the priorities in Section 6.5
allow it.

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





Perkins, et al. Expires April 14, 2016 [Page 49]

Internet-Draft AODVv2 October 2015


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.

* Insert the MetricType into MetricTypeList.

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

The AODVv2 message is used to create a corresponding [RFC5444]
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's route messages comprise Data
Elements that map to message elements in [RFC5444].

[RFC5444] provides a multiplexed transport for multiple protocols.
An [RFC5444] multiplexer MAY choose to optimize the content of
certain message elements to reduce control plane overhead.

A brief summary of the [RFC5444] 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






Perkins, et al. Expires April 14, 2016 [Page 50]

Internet-Draft AODVv2 October 2015


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

AODVv2 does not require access to the [RFC5444] packet header.

In the message header, AODVv2 uses <msg-hop-limit>, <msg-hop-count>,
<msg-type> and <msg-addr-length>. The <msg-addr-length> field
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).

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 by the [RFC5444] implementation.
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 an RERR. [RFC5444] maps this information to Address
Block TLVs associated with the relevant addresses in the Address
Block.

The following sections show how AODVv2 Data Elements are represented
in [RFC5444] messages. AODVv2 makes use of the VALIDITY_TIME TLV
from [RFC5497], and defines (in Section 12) a number of new TLVs.

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

8.1. Route Request Message Representation

8.1.1. Message Header













Perkins, et al. Expires April 14, 2016 [Page 51]

Internet-Draft AODVv2 October 2015


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

8.1.2. Message TLV Block

An RREQ contains no Message TLVs.

8.1.3. Address Block

An 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.

+-------------------------+------------------------------+
| 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 one or more 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















Perkins, et al. Expires April 14, 2016 [Page 52]

Internet-Draft AODVv2 October 2015


+--------------+---------------+------------+-----------------------+
| 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 value for the |
| /MetricType | | | route to OrigAddr, |
| | | | using MetricType. |
| ValidityTime | VALIDITY_TIME | 0 | ValidityTime for |
| | | | route to OrigAddr. |
+--------------+---------------+------------+-----------------------+

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. |
+------------+--------------+-------------+-------------------------+

8.2. Route Reply Message Representation

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, reduced by |
| | | number of hops traversed so far |
| | | by the message. |
| msg_hop_count | <msg-hop-count> | Number of hops traversed so far |
| | | by the message. |
+---------------+-----------------+---------------------------------+








Perkins, et al. Expires April 14, 2016 [Page 53]

Internet-Draft AODVv2 October 2015


8.2.2. Message TLV Block

An RREP contains no Message TLVs.

8.2.3. Address Block

An 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 one or more addresses
in the Address Block. The following sections show the TLVs that
apply to each address.

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











Perkins, et al. Expires April 14, 2016 [Page 54]

Internet-Draft AODVv2 October 2015


+--------------+---------------+------------+-----------------------+
| 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 value for the |
| /MetricType | | | route to TargAddr, |
| | | | using MetricType. |
| ValidityTime | VALIDITY_TIME | 0 | ValidityTime for |
| | | | route to TargAddr. |
+--------------+---------------+------------+-----------------------+

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. Route Reply Acknowledgement Message Representation

8.3.1. Message Header

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

8.3.2. Message TLV Block

An RREP_Ack contains no Message TLVs.

8.3.3. Address Block

An RREP_Ack contains no Address Block.

8.3.4. Address Block TLV Block

An RREP_Ack contains no Address Block TLV Block.






Perkins, et al. Expires April 14, 2016 [Page 55]

Internet-Draft AODVv2 October 2015


8.4. Route Error Message Representation

8.4.1. Message Header

+---------------+-----------------+---------------------------------+
| Data Element | Header Field | Value |
+---------------+-----------------+---------------------------------+
| None | <msg-type> | RERR |
| msg_hop_limit | <msg-hop-limit> | MAX_HOPCOUNT, reduced by number |
| | | of hops traversed so far by the |
| | | message. |
+---------------+-----------------+---------------------------------+

8.4.2. Message TLV Block

An RERR contains no Message TLVs.

8.4.3. Address Block

The Address Block in an RERR MAY contain PktSource, the source
address of the IP 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.

+------------------------------+------------------------------------+
| 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 one or more addresses
in the Address Block. The following sections show the TLVs that
apply to each type of address in the RERR.







Perkins, et al. Expires April 14, 2016 [Page 56]

Internet-Draft AODVv2 October 2015


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. |
+----------------+--------------+------------+----------------------+

9. Simple External Network Attachment

Figure 4 shows a stub (i.e., non-transit) network of AODVv2 routers
which is attached to an external network via a single External
Network Access Router (ENAR). The interface to the external network
MUST NOT be configured in the AODVv2_INTERFACES list.

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












Perkins, et al. Expires April 14, 2016 [Page 57]

Internet-Draft AODVv2 October 2015


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

Figure 4: Simple External Network Attachment Example

When an AODVv2 router within the AODVv2 MANET wants to discover a
route toward an address on the external network, it uses the normal
AODVv2 route discovery for that IP Destination Address. The ENAR
MUST respond to RREQ on behalf of all external network destinations,
i.e., destinations not on the configured 191.0.2.0/24 subnet. RREQs
for addresses inside the AODVv2 network, i.e. destinations on the
configured 191.0.2.0/24 subnet, are handled using the standard
processes described in Section 7.

When an IP packet from an address on the external network destined
for an address in the AODVv2 MANET reaches the ENAR, if the ENAR does
not have a route toward that exact destination it will perform normal
AODVv2 route discovery for that destination.

Configuring the ENAR as a default router is outside the scope of this
specification.

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.






Perkins, et al. Expires April 14, 2016 [Page 58]

Internet-Draft AODVv2 October 2015


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 an 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:

o Save the next hop on an existing route to the IP packet's source
address as the precursor. In this case, it is not guaranteed that
an 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 IP 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 IP packet,
determine which router forwarded the packet, and save the router
address as a precursor. This ensures that when an 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
IP packet.



Perkins, et al. Expires April 14, 2016 [Page 59]

Internet-Draft AODVv2 October 2015


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 an 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 an 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].

10.4. Message Aggregation Delay

The aggregation of multiple messages into a packet is specified in
[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




Perkins, et al. Expires April 14, 2016 [Page 60]

Internet-Draft AODVv2 October 2015


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 2: Timing Parameter Values

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.

If MAX_SEQNUM_LIFETIME was configured differently across the network,
and any of the routers lost their sequence number or rebooted, this
could result in their next route messages being classified as stale
at any AODVv2 router using a greater value for MAX_SEQNUM_LIFETIME.
This would delay route discovery from and to the re-initializing
router.







Perkins, et al. Expires April 14, 2016 [Page 61]

Internet-Draft AODVv2 October 2015


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.6 |
| 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] |
| INFINITY_TIME | [TBD] | Maximum expressible clock time |
| | | (Section 6.7.2) |
+------------------------+---------+--------------------------------+

Table 3: AODVv2 Constants

Note that <msg-hop-count> is an 8-bit field in the [RFC5444] message
header and therefore MAX_HOPCOUNT cannot be larger than 255.

MAX_METRIC[MetricType] MUST always be the maximum expressible metric
value of type MetricType. Field lengths associated with metric
values are found in Section 11.6.

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: Routers with higher values are likely to
be more successful at finding routes, at the cost of additional
control traffic.

o RREP_RETRIES: Routers with lower values are more likely to
blacklist neighbors when there is a

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

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






Perkins, et al. Expires April 14, 2016 [Page 62]

Internet-Draft AODVv2 October 2015


o INFINITY_TIME: No interoperability problems due to variations on
different routers, 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 router:

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

Table 4: 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 routers in the
network will not result in protocol errors, but poor performance may
result.

+----------------------+-----------+----------------+
| Name | Default | Description |
+----------------------+-----------+----------------+
| ENABLE_IDLE_IN_RERR | Disabled | Section 7.4.1 |
+----------------------+-----------+----------------+

Table 5: 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 April 14, 2016 [Page 63]

Internet-Draft AODVv2 October 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 6: Configuration for Optional Features

11.6. MetricType Allocation

The metric types used by AODVv2 are identified according to the
assignments in [RFC6551]. All implementations MUST use these values.

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

Table 7: AODVv2 Metric Types

11.7. AddressType Allocation

These values are used in the [RFC5444] Address Type TLV discussed in
Section 8. All implementations MUST use these values.

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

Table 8: AODVv2 Address Types





Perkins, et al. Expires April 14, 2016 [Page 64]

Internet-Draft AODVv2 October 2015


12. IANA Considerations

This section specifies several [RFC5444] message types and address
tlv-types required for AODVv2. A registry of metric types is
specified, in addition to a registry of address types.

12.1. RFC 5444 Message Types

This specification defines four Message Types, to be allocated from
the 0-223 range of the "Message Types" namespace defined in
[RFC5444], as specified in Table 9.

+-----------------------------------------+-----------+
| 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 9: AODVv2 Message Types

12.2. RFC 5444 Address Block TLV Types

This specification defines three Address Block TLV Types, to be
allocated from the "Address Block TLV Types" namespace defined in
[RFC5444], as specified in Table 10.

+------------------------+----------+---------------+---------------+
| 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 |
+------------------------+----------+---------------+---------------+

Table 10: AODVv2 Address Block TLV Types

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



Perkins, et al. Expires April 14, 2016 [Page 65]

Internet-Draft AODVv2 October 2015


(i.e. a route exists) is distributed via RREQ and RREP messages.
AODVv2 routers store the information contained in these messages in
order to properly forward IP packets, and they generally provide this
information to other AODVv2 routers. Negative routing information
(i.e. a route does not exist) is distributed via RERR messages.
AODVv2 routers process these messages and remove routes, and forward
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
route tables of routers 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



Perkins, et al. Expires April 14, 2016 [Page 66]

Internet-Draft AODVv2 October 2015


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 an RREQ message with false information is that traffic to
OrigAddr could be disrupted. Since RREQ is multicast and likely to
be received by all routers 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 an 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 an RREP_Ack message
with false information is that the route advertised to a target
address in an 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



Perkins, et al. Expires April 14, 2016 [Page 67]

Internet-Draft AODVv2 October 2015


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 an
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, Keyur Patel, Alexandru Petrescu,
Henning Rogge, Fransisco Ros, Pedro Ruiz, Christoph Sommer, Romain
Thouvenin, Richard Trefler, Jiazi Yi, Seung Yi, and Cong Yuan, for
their reviews of AODVv2 and DYMO, as well as numerous specification
suggestions.







Perkins, et al. Expires April 14, 2016 [Page 68]

Internet-Draft AODVv2 October 2015


15. References

15.1. Normative References

[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/
RFC2119, March 1997,
<http://www.rfc-editor.org/info/rfc2119>.

[RFC3561] Perkins, C., Belding-Royer, E., and S. Das, "Ad hoc On-
Demand Distance Vector (AODV) Routing", RFC 3561, DOI
10.17487/RFC3561, July 2003,
<http://www.rfc-editor.org/info/rfc3561>.

[RFC4291] Hinden, R. and S. Deering, "IP Version 6 Addressing
Architecture", RFC 4291, DOI 10.17487/RFC4291, February
2006, <http://www.rfc-editor.org/info/rfc4291>.

[RFC5082] Gill, V., Heasley, J., Meyer, D., Savola, P., Ed., and C.
Pignataro, "The Generalized TTL Security Mechanism
(GTSM)", RFC 5082, DOI 10.17487/RFC5082, October 2007,
<http://www.rfc-editor.org/info/rfc5082>.

[RFC5444] Clausen, T., Dearlove, C., Dean, J., and C. Adjih,
"Generalized Mobile Ad Hoc Network (MANET) Packet/Message
Format", RFC 5444, DOI 10.17487/RFC5444, February 2009,
<http://www.rfc-editor.org/info/rfc5444>.

[RFC5497] Clausen, T. and C. Dearlove, "Representing Multi-Value
Time in Mobile Ad Hoc Networks (MANETs)", RFC 5497, DOI
10.17487/RFC5497, March 2009,
<http://www.rfc-editor.org/info/rfc5497>.

[RFC5498] Chakeres, I., "IANA Allocations for Mobile Ad Hoc Network
(MANET) Protocols", RFC 5498, DOI 10.17487/RFC5498, March
2009, <http://www.rfc-editor.org/info/rfc5498>.

[RFC6551] Vasseur, JP., Ed., Kim, M., Ed., Pister, K., Dejean, N.,
and D. Barthel, "Routing Metrics Used for Path Calculation
in Low-Power and Lossy Networks", RFC 6551, DOI 10.17487/
RFC6551, March 2012,
<http://www.rfc-editor.org/info/rfc6551>.

[RFC7182] Herberg, U., Clausen, T., and C. Dearlove, "Integrity
Check Value and Timestamp TLV Definitions for Mobile Ad
Hoc Networks (MANETs)", RFC 7182, DOI 10.17487/RFC7182,
April 2014, <http://www.rfc-editor.org/info/rfc7182>.




Perkins, et al. Expires April 14, 2016 [Page 69]

Internet-Draft AODVv2 October 2015


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.

[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, S. and J. Macker, "Mobile Ad hoc Networking
(MANET): Routing Protocol Performance Issues and
Evaluation Considerations", RFC 2501, DOI 10.17487/
RFC2501, January 1999,
<http://www.rfc-editor.org/info/rfc2501>.

[RFC4193] Hinden, R. and B. Haberman, "Unique Local IPv6 Unicast
Addresses", RFC 4193, DOI 10.17487/RFC4193, October 2005,
<http://www.rfc-editor.org/info/rfc4193>.

[RFC4728] Johnson, D., Hu, Y., and D. Maltz, "The Dynamic Source
Routing Protocol (DSR) for Mobile Ad Hoc Networks for
IPv4", RFC 4728, DOI 10.17487/RFC4728, February 2007,
<http://www.rfc-editor.org/info/rfc4728>.

[RFC4861] Narten, T., Nordmark, E., Simpson, W., and H. Soliman,
"Neighbor Discovery for IP version 6 (IPv6)", RFC 4861,
DOI 10.17487/RFC4861, September 2007,
<http://www.rfc-editor.org/info/rfc4861>.

[RFC5148] Clausen, T., Dearlove, C., and B. Adamson, "Jitter
Considerations in Mobile Ad Hoc Networks (MANETs)", RFC
5148, DOI 10.17487/RFC5148, February 2008,
<http://www.rfc-editor.org/info/rfc5148>.







Perkins, et al. Expires April 14, 2016 [Page 70]

Internet-Draft AODVv2 October 2015


[RFC6130] Clausen, T., Dearlove, C., and J. Dean, "Mobile Ad Hoc
Network (MANET) Neighborhood Discovery Protocol (NHDP)",
RFC 6130, DOI 10.17487/RFC6130, April 2011,
<http://www.rfc-editor.org/info/rfc6130>.

[RFC6621] Macker, J., Ed., "Simplified Multicast Forwarding", RFC
6621, DOI 10.17487/RFC6621, May 2012,
<http://www.rfc-editor.org/info/rfc6621>.

[Sholander02]
Sholander, P., Coccoli, P., Oakes, T., and S. Swank, "A
Portable Software Implementation of a Hybrid MANET Routing
Protocol", 2002.

Appendix A. Multi-homing Considerations

Multi-homing is not supported by the AODVv2 specification. A Router
Client, i.e., an IP Address, can only be served by one AODVv2 router
at any time. The coordination between multiple AODVv2 routers to
distribute routing information correctly for a shared address is not
defined. See Appendix B for information about how to move a router
client to a different AODVv2 router.

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 B. 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.



Perkins, et al. Expires April 14, 2016 [Page 71]

Internet-Draft AODVv2 October 2015


Appendix C. 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, and sometimes values and algorithms specific to
each metric type.

The following table indicates the field names used in subsequent
sections and their meaning.

+-------------------------+-----------------------------------------+
| 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.7) |
| 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 |
| 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 |



Perkins, et al. Expires April 14, 2016 [Page 72]

Internet-Draft AODVv2 October 2015


| 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 11: Notation used in Appendix

C.1. HopCount MetricType

The HopCount MetricType defines:

o MAX_METRIC[HopCount] := MAX_HOPCOUNT. A constant defined in
Section 11.2. MAX_HOPCOUNT is also used to limit the number of
hops an AODVv2 message can travel, regardless of the MetricType in
use. It MUST be larger than the AODVv2 network diameter, in order
that AODVv2 protocol messages may reach their intended
destinations.

o Cost(L) := 1

o Cost(R) := Sum of 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 (OrigAddr if RREQ, TargAddr if RREP)

o LoopFree(R1, R2) := ( Cost(R1) <= Cost(R2) ). This is derived
from the fact that route cost increases with number of hops.
Therefore, an advertised route with higher cost than the
corresponding existing route could include the existing route as a




Perkins, et al. Expires April 14, 2016 [Page 73]

Internet-Draft AODVv2 October 2015


sub-section. Replacing the existing route with the advertised
route could form a routing loop.

C.2. General Operations

General AODVv2 operations involve the comparisons of incoming and
current data, and updates to local data sets.

C.2.1. Route Operations

C.2.1.1. Check_Route_State

/* 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 == INFINITY_TIME)) //not a timed route
route.State := Invalid;
if ((CurrentTime - route.LastUsed > ACTIVE_INTERVAL)
AND (route.State != Unconfirmed)
AND (route.ExpirationTime == INFINITY_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;
}

C.2.1.2. Process_Routing_Info

(See Section 6.7.1)







Perkins, et al. Expires April 14, 2016 [Page 74]

Internet-Draft AODVv2 October 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;
}

C.2.1.3. Fetch_Route_Table_Entry






















Perkins, et al. Expires April 14, 2016 [Page 75]

Internet-Draft AODVv2 October 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;
}

C.2.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 := INFINITY_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 April 14, 2016 [Page 76]

Internet-Draft AODVv2 October 2015


C.2.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 := INFINITY_TIME;
rte.MetricType := advRte.MetricType;
rte.Metric := advRte.Metric;
rte.State := Idle (if advRte is from RREP);
or Unconfirmed (if advRte is from RREQ);
}

C.2.2. LoopFree









Perkins, et al. Expires April 14, 2016 [Page 77]

Internet-Draft AODVv2 October 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;
}

C.2.3. Multicast Route Message Table Operations

C.2.3.1. 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;
}

C.2.3.2. 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;



Perkins, et al. Expires April 14, 2016 [Page 78]

Internet-Draft AODVv2 October 2015


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 < 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;
}

C.3. Message Algorithms

Processing for messages follows the following general outline:

1. Receive incoming message.

2. Update route table as appropriate.




Perkins, et al. Expires April 14, 2016 [Page 79]

Internet-Draft AODVv2 October 2015


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

After processing a message, the most recent information is stored in
the route table. For this reason, it is equally appropriate to set
outgoing message field values using route table information or using
fields from the incoming message.

C.3.1. Build_RFC_5444_Message_Header

/* 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;
}

C.3.2. RREQ Operations

C.3.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 */



Perkins, et al. Expires April 14, 2016 [Page 80]

Internet-Draft AODVv2 October 2015


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 */
}

C.3.2.2. Receive_RREQ

/* Process a RREQ received on link L */

Receive_RREQ (inRREQ, L)



Perkins, et al. Expires April 14, 2016 [Page 81]

Internet-Draft AODVv2 October 2015


{
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 (msg_hop_count > MAX_HOPCOUNT)
return;
if (msg_hop_limit < 0)
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 April 14, 2016 [Page 82]

Internet-Draft AODVv2 October 2015


}

C.3.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)



Perkins, et al. Expires April 14, 2016 [Page 83]

Internet-Draft AODVv2 October 2015


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 */
}

C.3.3. RREP Operations

C.3.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 := inRREQ.Address;
outRREP.TargAddr := rte.TargAddr;
outRREP.TargPrefixLen := rte.PrefixLength; //if not address length
outRREP.TargSeqNum := mySeqNum;
outRREP.TargMetric := rte.Metric;
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 */



Perkins, et al. Expires April 14, 2016 [Page 84]

Internet-Draft AODVv2 October 2015


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 */
}

C.3.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 (msg_hop_count > MAX_HOPCOUNT)
return;
if (msg_hop_limit < 0)
return;
if (inRREP.OrigAddr and inRREQ.TargAddr are not
valid routable and unicast addresses)
return;
if (inRREP.MetricType is present but an unknown value)



Perkins, et al. Expires April 14, 2016 [Page 85]

Internet-Draft AODVv2 October 2015


return;
if (inRREP.TargMetric > MAX_METRIC[inRREP.MetricType])
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);
}

C.3.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;




Perkins, et al. Expires April 14, 2016 [Page 86]

Internet-Draft AODVv2 October 2015


if (inRREP.HopCount exists)
{
if (inRREP.HopCount >= 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,



Perkins, et al. Expires April 14, 2016 [Page 87]

Internet-Draft AODVv2 October 2015


outRREP.HopLimit, 0, tlvLength);

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

C.3.4. RREP_Ack Operations

C.3.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 */
}

C.3.4.2. Receive_RREP_Ack

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

C.3.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 */
}

C.3.5. RERR Operations

C.3.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)
{



Perkins, et al. Expires April 14, 2016 [Page 88]

Internet-Draft AODVv2 October 2015


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;
}



Perkins, et al. Expires April 14, 2016 [Page 89]

Internet-Draft AODVv2 October 2015


/* 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 */
}

C.3.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,



Perkins, et al. Expires April 14, 2016 [Page 90]

Internet-Draft AODVv2 October 2015


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) < 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);
}







Perkins, et al. Expires April 14, 2016 [Page 91]

Internet-Draft AODVv2 October 2015


C.3.5.3. Regenerate_RERR

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 April 14, 2016 [Page 92]

Internet-Draft AODVv2 October 2015


Appendix D. AODVv2 Draft Updates

D.1. Changes between revisions 11 and 12

This section lists the changes between AODVv2 revisions ...-11.txt
and ...-12.txt.

o Avoided use of "node" and "subnet" where possible.

o Improved separation of data structure information from protocol
operation.

o Updated uses of the terms "IP address" and "packet" to be clearer.

o More consistent and accurate use of MUST, SHOULD, SHOULD NOT, and
MAY, and added explanations of consequences of not implementing
SHOULDs.

o Used consistent references to [RFC5444].

o Updated title to include "Version 2".

o Updated Overview to state differences from AODV, text about loop
freedom and RFC 7182 in Overview.

o Updated Terminology and removed the Data Element table. Gave
clearer definition of Router Client and Unreachable Address.

o Updated Applicability Statement to draw attention to requirements
of the forwarding plane, handling of uni-directional links, usage
of IP addresses on multiple interfaces, and description of gateway
functionality. Added note about penalty for not storing
persistent state.

o Updated Router Client section and added cost to Router Client
entry.

o Clarified that Neighbor Table needs only information on
neighboring routers on discovered routes.

o Updated Sequence Number section. Use only one sequence number per
router. Added description of sequence number comparison.

o Updated descriptions of route states.

o Improved clarity of Metrics section, generic metric instead of
hopcount, removed default metric type, added explanation of
LoopFree.



Perkins, et al. Expires April 14, 2016 [Page 93]

Internet-Draft AODVv2 October 2015


o Improved Initialization section.

o Major update to Adjacency Monitoring section. Made it clear that
if bidirectional connectivity is already confirmed, requesting
acknowledgement is unnecessary. Separated Neighbor Table Updates
into separate section.

o Updated description of message prioritization near the control
message generation limit.

o Updated wording regarding [RFC6621].

o Added description of backoff used for message retries.

o Improved description of how unidirectional links are handled.

o Improved text regarding creation of Unconfirmed route entries.

o Improved section on determining redundancy of received multicast
messages.

o Added section on interactions with the forwarding plane.

o Improved Route State section. Clarified action when Active route
expires. Separated information on expunging routes on memory
constrained routers.

o Updated RERR description to be clearer about triggers.

o Updated IANA section to include only newly defined Messages and
TLVs, and define an Unspecified value for AddressType.

o Updated references.

o Updated section on Gateway behaviour.

o Updated Appendix D to include more checks on msg_hop_limit and
msg_hop_count.

o Renamed MAX_TIME to INFINITY_TIME to make meaning clearer.

D.2. Changes between revisions 10 and 11

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

o Updated Simple Internet Attachment section to clarify behaviour of
IAR for incoming RREQ messages.



Perkins, et al. Expires April 14, 2016 [Page 94]

Internet-Draft AODVv2 October 2015


D.3. Changes between revisions 9 and 10

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

o Updated [RFC5444] Representation section to add "Address Type"
TLV, which explicitly declares the meaning of addresses in the
[RFC5444] 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.

D.4. 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.

o Changed OrigAddrMetric and TargAddrMetric to OrigMetric and
TargMetric respectively.



Perkins, et al. Expires April 14, 2016 [Page 95]

Internet-Draft AODVv2 October 2015


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.

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



Perkins, et al. Expires April 14, 2016 [Page 96]

Internet-Draft AODVv2 October 2015


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 [RFC5444] overview and simplified/rearranged text in this
section.

o Major update to [RFC5444] representation section

o Updated RERR's [RFC5444] 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.

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



Perkins, et al. Expires April 14, 2016 [Page 97]

Internet-Draft AODVv2 October 2015


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.

D.5. 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 [RFC5444] 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.

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

o Renamed [RFC5444] parser to multiplexer in Section 10.




Perkins, et al. Expires April 14, 2016 [Page 98]

Internet-Draft AODVv2 October 2015


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.

D.6. 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.

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





Perkins, et al. Expires April 14, 2016 [Page 99]

Internet-Draft AODVv2 October 2015


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 [RFC5444] 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.

D.7. 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 [RFC5444] 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.




Perkins, et al. Expires April 14, 2016 [Page 100]

Internet-Draft AODVv2 October 2015


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 [RFC5444].

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 [RFC5444] 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.

D.8. Changes between revisions 4 and 5

This section lists the changes between AODVv2 revisions ...-04.txt
and ...-05.txt.

o Normative text moved out of definitions into the relevant section
of the body of the specification.




Perkins, et al. Expires April 14, 2016 [Page 101]

Internet-Draft AODVv2 October 2015


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 [RFC5444].

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).

D.9. 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".

o Route.Precursors included as an *optional* route table field




Perkins, et al. Expires April 14, 2016 [Page 102]

Internet-Draft AODVv2 October 2015


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.

D.10. 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 1.

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 April 14, 2016 [Page 103]

Internet-Draft AODVv2 October 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 April 14, 2016 [Page 104]

Internet-Draft AODVv2 October 2015


Victoria Mercieca
Airbus Defence and Space
Celtic Springs
Newport, Wales NP10 8FZ
United Kingdom

Email: victoria.mercieca@xxxxxxxxxx












































Perkins, et al. Expires April 14, 2016 [Page 105]
<?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-12" ipr="trust200902"
obsoletes="" updates="" submissionType="IETF" xml:lang="en">
<front>
<title abbrev="AODVv2">Ad Hoc On-demand Distance Vector Routing Version 2
(AODVv2)</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 Ad Hoc On-demand Distance Vector
Version 2 (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 Ad Hoc On-demand Distance Vector Version
2 (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"/>. </t><t>Compared to AODV
<xref target="RFC3561" pageno="false" format="default"/>, AODVv2 makes some
features optional, notably intermediate route replies, expanding ring search,
and precursor lists. Hello messages and local repair have been removed. Message
formats have been updated and made compliant with <xref target="RFC5444"
pageno="false" format="default"/>. AODVv2 also provides a mechanism for the use
of multiple metric types. </t><t>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 an IP 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, establishing a
route to both endpoints on all intermediate routers. A metric value is included
to represent the cost of the route contained within the message. </t><t>AODVv2
uses sequence numbers to identify stale routing information, and compares route
metric values to determine if advertised routes could form loops. </t><t>Route
maintenance involves monitoring the router's links and routes for changes. This
includes confirming bidirectionality of links to 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 <xref target="RFC5444"
pageno="false" format="default"/> Address Blocks, Address Block TLVs, and
Message TLVs. </t><t>Security for authentication of AODVv2 routers and
encryption of control messages is accomplished using the TIMESTAMP and ICV TLVs
defined 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
containing a list of IP addresses. </t><t hangText="Adjacency"><vspace
blankLines="0"/>A bi-directional link between neighboring AODVv2 routers for
the purpose of routing information. </t><t hangText="AckReq"><vspace
blankLines="0"/>An AODVv2 Data Element used in a Route Reply message to request
that the Route Reply message is acknowledged by returning a Route Reply Ack
message. This Data Element contains the address of the AODVv2 router that
should acknowledge the Route Reply message. </t><t hangText="AdvRte"><vspace
blankLines="0"/>A route advertised in an incoming route message. </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
field used within AODVv2 protocol messages. </t><t hangText="ENAR (External
Network Access Router)"><vspace blankLines="0"/>An AODVv2 router with an
interface to an external, non-AODVv2 network. </t><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 indicating
the metric type for a metric value included in a message. </t><t
hangText="MetricTypeList"><vspace blankLines="0"/>An AODVv2 Data Element used
in a Route Error message, containing a list of metric types associated with the
addresses in the AddressList of the message. </t><t
hangText="Neighbor"><vspace blankLines="0"/>An AODVv2 router from which an
AODVv2 message has been received. Neighbors exchange routing information and
attempt to verify bidirectionality of the link to a neighbor before installing
a route via that neighbor. </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 containing the source
IP address of the IP packet triggering route discovery. </t><t
hangText="OrigMetric"><vspace blankLines="0"/>An AODVv2 Data Element containing
the metric value associated with the route to the OrigAddr in a message.
</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 used in a Route Request message,
containing the sequence number of the AODVv2 router which originated the Route
Request. </t><t hangText="PktSource"><vspace blankLines="0"/>An AODVv2 Data
Element used in a Route Error message, containing the source address of the IP
packet which triggered the Route Error message. </t><t
hangText="PrefixLengthList"><vspace blankLines="0"/>An AODVv2 Data Element
containing a list of routing prefix lengths associated with the addresses in
the AddressList of the message. </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"/>An address or address range configured on an AODVv2 router,
corresponding to one or more nodes which require that router to initiate and
respond to route discoveries on their behalf, so that they can send and receive
IP traffic to and from remote destinations. The AODVv2 router's interface
addresses are also configured as Router Clients. </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 configured with TargAddr as
a Router Client, 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 a Router Client. </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"/>An AODVv2 Data Element containing the sequence number
maintained by an AODVv2 router to indicate freshness of route information.
</t><t hangText="SeqNumList"><vspace blankLines="0"/>An AODVv2 Data Element
containing a list of sequence numbers associated with the addresses in the
AddressList of a message. </t><t hangText="TargAddr (Target Address)"><vspace
blankLines="0"/>An AODVv2 Data Element containing the destination address of
the IP packet triggering route discovery. </t><t hangText="TargMetric"><vspace
blankLines="0"/>An AODVv2 Data Element containing the metric value associated
with the route to the TargAddr in a message. </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 used in a Route Reply message,
containing the sequence number of the AODVv2 router which originated the Route
Reply. </t><t hangText="Valid route"><vspace blankLines="0"/>A route that can
be used for forwarding. </t><t hangText="Unreachable Address"><vspace
blankLines="0"/>An address reported in an RERR message, either the destination
address of an IP packet that could not be forwarded because a valid route to
the destination is not known, or the address on a route which became Invalid.
</t><t hangText="Upstream"><vspace blankLines="0"/>In the direction from
destination to source (from TargAddr to OrigAddr). </t><t
hangText="ValidityTime"><vspace blankLines="0"/>An AODVv2 Data Element
containing the length of time the route described by the message is offered.
</t></list></t><t>The AODVv2 Data Elements are used to create AODVv2 messages.
Their contents are transferred into <xref target="RFC5444" pageno="false"
format="default"/> formatted messages (see <xref target="represent"
pageno="false" format="default"/>) before sending. </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 toward Address
</c><c>Route[Address].Field </c><c>A field in a route toward Address
</c><c>RteMsg.Field </c><c>A field in either RREQ or RREP
</c></texttable><t></t></section><section title="Applicability Statement"
anchor="apply" toc="default"><t></t><t>The AODVv2 routing protocol is a
reactive routing protocol. Certain interactions with the forwarding plane are
required, and these are discussed in <xref target="fwdplane" pageno="false"
format="default"/>. </t><t>AODVv2 is designed for stub or disconnected mobile
ad hoc networks, i.e., non-transit networks or those not connected to the
internet. AODVv2 can, however, be configured to perform gateway functions when
attached to external networks, as discussed in <xref target="gateway"
pageno="false" format="default"/>. </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 IP 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>Providing security for a
reactive routing protocol can be difficult. AODVv2 provides for message
integrity and security against replay attacks by using integrity check values,
timestamps and sequence numbers, as described in <xref target="Security"
pageno="false" format="default"/>. If security associations can be established,
encryption can be used for AODVv2 messages to ensure that only trusted routers
participate in routing operations. </t><t>Since the route discovery process
typically results in a route being established in both directions along the
same path, uni-directional links are not suitable. AODVv2 will detect and
exclude those links from route discovery. The route discovered is optimised for
the requesting router, and the return path may not be the optimal route.
</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), since if a router loses its sequence number, there is a delay before
the router can resume full operations. This is described in <xref target="boot"
pageno="false" format="default"/>. </t><t>AODVv2 supports routers with
multiple interfaces, as long as each interface configured for AODVv2 has a
unicast IP address. A router may use the same IP address on multiple
interfaces. Address assignment procedures are out of scope for AODVv2.
</t><t>AODVv2 supports hosts with multiple interfaces, as long as each
interface is configured with its own unicast IP address. Multi-homing of an IP
address is not supported by AODVv2, and therefore a Router Client, i.e. an IP
Address, 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></section><section title="Data Structures"
anchor="data-structures" toc="default"><section title="Interface List"
anchor="interfaceslist" toc="default"><t>If multiple interfaces of the AODVv2
router are configured for use by AODVv2, a list of the interfaces SHOULD be
configured in the AODVv2_INTERFACES list. </t></section><section title="Router
Client Table" anchor="clients" toc="default"><t>An AODVv2 router MUST provide
route discovery services for its own local applications and for other
non-routing nodes that are reachable without traversing another AODVv2 router.
These nodes, and the AODVv2 router itself, are referred to as Router Clients.
An AODVv2 router will only originate Route Request and Route Reply messages on
behalf of configured Router Clients. </t><t>Router Client Table entries MUST
contain: </t><t><list style="hanging"><t
hangText="RouterClient.IPAddress"><vspace blankLines="0"/>An IP address or the
start of an address range that requires route discovery services from the
AODVv2 router. </t></list></t><t><list style="hanging"><t
hangText="RouterClient.PrefixLength"><vspace blankLines="0"/>The length, in
bits, of the routing prefix associated with the RouterClient.IPAddress. If a
prefix length is included, the AODVv2 router MUST provide connectivity for all
addresses within that prefix. </t><t hangText="RouterClient.Cost"><vspace
blankLines="0"/>The cost associated with reaching this Router Client. This cost
will also appear as the metric in a route table entry for the Router Client
address. </t></list></t><t>The Router Client Table 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 Table. </t><t>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 address
MUST NOT be served by more than one AODVv2 router at any one time, i.e. a
Router Client of one AODVv2 router MUST NOT be configured as a Router Client on
another AODVv2 router using the same Router Client IP address. 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 which are used in discovered routes.
</t><t>Neighbor Table entries MUST contain: </t><t><list style="hanging"><t
hangText="Neighbor.IPAddress"><vspace blankLines="0"/>An IP address of the
neighboring router, learned from the source IP address of a received route
message. </t><t hangText="Neighbor.State"><vspace blankLines="0"/>The state of
the adjacency with the neighbor (Confirmed, Unknown, or Blacklisted). The
Unknown state is the initial state. The Confirmed state indicates that the link
to the neighbor has been confirmed as bidirectional. The Blacklisted state
indicates that the link to the neighbor is uni-directional. <xref
target="adjacencymonitoring" pageno="false" format="default"/> discusses how to
monitor adjacency. </t><t hangText="Neighbor.ResetTime"><vspace
blankLines="0"/>When the State is Blacklisted, this time indicates the point at
which the State reverts to Unknown. By default this value is calculated at the
time the router is blacklisted and is equal to CurrentTime +
MAX_BLACKLIST_TIME. When the neighbor State is not Blacklisted, this time is
set to INFINITY_TIME. </t></list></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. </t><t>All RREQ and RREP messages created by an
AODVv2 router include the router's sequence number. Each AODVv2 router MUST
ensure that its sequence number is strictly increasing. It is incremented by
one (1) whenever an RREQ or RREP 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>An AODVv2 router can only
attach its own sequence number to information about a route to one of its
configured router clients. All route messages regenerated by other routers
retain the originator's sequence number. Therefore, when two pieces of
information about a route are received, they both contain a sequence number
from the originating router. Comparing the sequence number will identify which
information is stale. The currently stored sequence number is subtracted from
the incoming sequence number. The result of the subtraction is to be
interpreted as a signed 16-bit integer, and if less than zero, then the
information in the AODVv2 message is stale and MUST be discarded. </t><t>As a
consequence, loop freedom is assured. </t><t>An AODVv2 router SHOULD maintain
its sequence number in persistent storage. If the 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 or Route Reply message. The Multicast Route Message Table is a
conceptual table which 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. </t><t>A Multicast Route Message Table
entry MUST contain the following information: </t><t><list style="hanging"><t
hangText="RteMsg.MessageType"><vspace blankLines="0"/>Either RREQ or RREP.
</t><t hangText="RteMsg.OrigAddr"><vspace blankLines="0"/>An IP address of the
node which requires the route, i.e., the source address of the IP packet
triggering the route request. </t><t hangText="RteMsg.OrigPrefixLen"><vspace
blankLines="0"/>The prefix length associated with OrigAddr. </t><t
hangText="RteMsg.TargAddr"><vspace blankLines="0"/>An IP address of the target,
i.e., the destination address of the IP packet triggering the route request.
</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, MAX_SEQNUM_LIFETIME after the last
update of RteMsg.OrigSeqNum for an RREQ, or RteMsg.TargSeqNum for an RREP.
</t></list></t><t>The Multicast Route Message Table is maintained so that no
two entries have the same MessageType, OrigAddr, TargAddr, and MetricType. See
<xref target="suppress" pageno="false" format="default"/> for details on
updating this table. </t></section><section title="Route Table" anchor="rte"
toc="default"><t>All AODVv2 routers MUST maintain a route table. The route
table entry is a conceptual data structure. Implementations MAY use any
internal representation but MUST contain the following information:
</t><t><list style="hanging"><t hangText="Route.Address"><vspace
blankLines="0"/>An address, which, when combined with Route.PrefixLength,
describes the set of destination addresses this route includes. </t><t
hangText="Route.PrefixLength"><vspace blankLines="0"/>The prefix length, in
bits, associated with Route.Address. </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. </t><t
hangText="Route.NextHop"><vspace blankLines="0"/>The source IP address of the
message advertising the route to Route.Address, i.e. 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 IP packets toward Route.Address. </t><t hangText="Route.LastUsed"><vspace
blankLines="0"/>The time this route was last used to forward an IP 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 IP 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 IP packets. </t><t
hangText="Invalid"><vspace blankLines="0"/>An Invalid route cannot be used for
forwarding IP packets. Invalid routes have sequence number information, which
allows incoming information to be assessed for freshness. </t><t
hangText="Unconfirmed"><vspace blankLines="0"/>An Unconfirmed route cannot be
used for forwarding IP packets. It is a route learned from a Route Request
which has not yet been confirmed as bidirectional. </t></list></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
INFINITY_TIME. </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.
Metric values are reported in route messages, where the goal is to determine a
route between OrigAddr and TargAddr. In Route Request messages, the metric
describes the cost of the route from OrigAddr (the router client) to the router
sending the Route Request. The receiving router calculates the cost from
OrigAddr to itself, combining the metric value from the message with knowledge
of the link cost from the sender to the receiver, i.e., the incoming link cost.
This updated route cost is included when regenerating the Route Request
message. In Route Reply messages, the metric reflects the cost of the route
from TargAddr (the router client) to the router sending the Route Reply. Routes
to OrigAddr and TargAddr are installed at intermediate routers for the purposes
of forwarding a Route Reply message and subsequent data traffic between
OrigAddr and TargAddr. Assuming link metrics are symmetric, the cost of the
routes to OrigAddr and TargAddr installed at each router will be correct.
</t><t>AODVv2 enables the use of multiple metric types. Each route discovery
attempt indicates which metric type is requested for the route. For each
MetricType, AODVv2 requires: </t><t><list style="symbols"><t>A MetricType
number, to indicate the metric type of a route. MetricType numbers allocated
are detailed in <xref target="metric-type" pageno="false" format="default"/>.
</t><t>A maximum value, denoted MAX_METRIC[MetricType]. If the cost of a route
exceeds MAX_METRIC[MetricType], the route is ignored. AODVv2 cannot store
routes that cost more than MAX_METRIC[MetricType]. </t><t>A function for
incoming link cost, denoted Cost(L). Using incoming link costs means that the
route learned has a path optimized for the direction from OrigAddr to TargAddr.
</t><t>A function for route cost, denoted Cost(R). </t><t>A function to
analyze routes for potential loops, denoted LoopFree(R1, R2). LoopFree verifies
that a route R2 is not a sub-section of another route R1. An AODVv2 router
invokes LoopFree() as part of the process in <xref target="test" pageno="false"
format="default"/>, when an advertised route (R1) and an existing route (R2)
have the same destination address, metric type, and sequence number. LoopFree
returns FALSE to indicate that an advertised route is not to be used to update
a stored route, if it may cause a routing loop. In the case where the existing
route is Invalid, it is possible that the advertised route includes the
existing route and came from a router which did not yet receive notification of
the route becoming Invalid, so the advertised route should not be used in case
it forms a loop to a broken route. </t></list></t><t>AODVv2 currently supports
cost metrics where Cost(R) is strictly increasing, by defining: </t><t><list
style="symbols"><t>Cost(R) := Sum of Cost(L) of each link in the route
</t><t>LoopFree(R1, R2) := ( Cost(R1) &lt;= Cost(R2) )
</t></list></t><t>Implementers MAY consider other metric types, but the
definitions of Cost and LoopFree functions for such types are undefined, and
interoperability issues need to be considered. </t></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 an AODVv2 router does not have
information about its previous sequence number, or if its sequence number is
lost at any point, the router resets its sequence number to one (1). However,
other AODVv2 routers may still hold sequence number information that this
router previously issued. Since sequence number information is removed if there
has been no update to the sequence number in MAX_SEQNUM_LIFETIME, the
initializing router must wait for MAX_SEQNUM_LIFETIME before it creates any
messages containing its new 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 of
that route discovery </t><t>Regenerate a received RREQ or RREP </t><t>Send an
RREP_Ack </t><t>Maintain valid routes in order that the forwarding process can
forward IP packets to Router Clients and to other routers </t><t>Create,
process and regenerate RERR messages </t></list></t></section><section
title="Adjacency Monitoring" anchor="adjacencymonitoring"
toc="default"><t>AODVv2 routers MUST NOT establish routes over uni-directional
links. Consider the following. An RREQ is forwarded toward TargAddr, and
intermediate routers install a route to OrigAddr. If, at one of those routers,
the link to the next hop toward OrigAddr was uni-directional, and this route
was used to forward data traffic, the data packets would be lost. Further, an
RREP sent toward OrigAddr using this link will not reach the next hop, and will
therefore not be regenerated, and will never reach RREQ_Gen, so end-to-end
route establishment will fail. AODVv2 routers MUST verify that the link to the
next hop is bidirectional when establishing a route, and before allowing data
traffic to be forwarded on that route. If bidirectionality cannot be verified,
this link MUST be excluded from the route discovery procedure. </t><t>AODVv2
refers to a bidirectional link with a neighboring router as an adjacency.
AODVv2 routers do not need to monitor adjacency to all neighboring AODVv2
routers at all times, but MUST determine if there is an adjacency to the chosen
next-hop AODVv2 router during route discovery. </t><t><list
style="symbols"><t>For the next hop toward OrigAddr, the approach for testing
bidirectional connectivity 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"/>. If a link to a
neighbor is determined to be unidirectional because a requested acknowledgement
is not received within RREP_Ack_SENT_TIMEOUT, the neighbor MUST be marked as
blacklisted (see below). </t><t>For the next hop toward TargAddr, receipt of
the Route Reply message containing the route to TargAddr is confirmation of
bidirectionality, since a Route Reply message is a reply to a Route Request
message which previously crossed the link in the opposite direction.
</t></list></t><t>To assist with adjacency monitoring, a Neighbor Table (<xref
target="nbrlist" pageno="false" format="default"/>) is maintained. Each entry
contains a neighbor IP address and an indication of the state of the adjacency
with that neighbor (Unknown, Blacklisted, or Confirmed). When an RREQ or RREP
is received from an IP address which does not already have an entry in the
Neighbor Table, a new entry is created as described in <xref target="nbrupdate"
pageno="false" format="default"/>. While neighbor state is Unknown,
acknowledgement of RREP messages MUST be requested. While neighbor state is
Confirmed, the request for an acknowledgement is unnecessary. </t><t>When
routers perform other operations such as those from the list below, these MAY
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>If such an external process signals that the link is
bidirectional, the neighbor state MAY be set to Confirmed. If an external
process signals that a link is not bidirectional, the AODVv2 router MAY update
the matching Neighbor Table entry by changing the neighbor state to
Blacklisted. If an external process signals that the link might not be
bidirectional, and the neighbor state is currently Confirmed, the state MAY be
set to Unknown. </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. The AODVv2 router MAY update the matching
Neighbor Table entry by changing the neighbor state to Confirmed.
</t><t>Similarly, if AODVv2 receives notification of a timeout, for example,
from TCP or some other protocol, this may be due to a disconnection. The AODVv2
router MAY update the matching Neighbor Table entry by resetting the neighbor
state to Unknown. </t></section><section title="Neighbor Table Update"
anchor="nbrupdate" toc="default"><t>On receipt of an RREQ or RREP message, the
neighbor table MUST be checked for an entry with Neighbor.IPAddress which
matches the source IP address of the message. If no matching entry is found, a
new entry is created. </t><t>A new Neighbor Table entry is created as follows:
</t><t><list style="symbols"><t>Neighbor.IPAddress := Source IP address of the
message </t><t>Neighbor.State := Unknown </t><t>Neighbor.ResetTime :=
INFINITY_TIME </t></list></t><t>When the link to the neighbor is determined to
be bidirectional, the Neighbor Table entry is updated as follows: </t><t><list
style="symbols"><t>Neighbor.State := Confirmed </t></list></t><t>When the link
to the neighbor is determined to be uni-directional, the Neighbor Table entry
is updated as follows: </t><t><list style="symbols"><t>Neighbor.State :=
Blacklisted </t><t>Neighbor.ResetTime := CurrentTime + MAX_BLACKLIST_TIME
</t></list></t><t>When the Neighbor.ResetTime is reached, the Neighbor Table
entry is updated as follows: </t><t><list style="symbols"><t>Neighbor.State :=
Unknown </t></list></t><t>When a link to a neighbor is determined to be broken,
the Neighbor Table entry SHOULD be removed. </t><t>Route requests from
neighbors with Neighbor.State set to Blacklisted are ignored to avoid
persistent IP packet loss or protocol failures. However, the reset time allows
the neighbor to again be allowed to participate in route discoveries after
MAX_BLACKLIST_TIME, in case the link between the routers has become
bidirectional. </t></section><section title="Interaction with Forwarding
Plane" anchor="fwdplane" toc="default"><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. </t><t>AODVv2 requires signals from the forwarding plane:
</t><t><list style="symbols"><t>A packet cannot be forwarded because a route is
unavailable: AODVv2 needs to know the source and destination IP addresses of
the packet, to determine whether it should initiate route discovery, and
include this information in a Route Request message, or create a Route Error
message. </t><t>A packet is to be forwarded: AODVv2 needs to check the state
of the route to deal with timeouts. If the implementation uses timers to
enforce route timeouts, this signal is unnecessary. </t><t>Packet forwarding
failure occurs: AODVv2 needs to initiate route error reports. </t><t>Packet
forwarding succeeds: AODVv2 needs to update the record of when a route was last
used to forward a packet. </t></list></t><t>AODVv2 needs to send signals to
the forwarding plane: </t><t><list style="symbols"><t>A route discovery is in
progress: packets awaiting a route may be buffered while route discovery is
attempted. </t><t>A route discovery was not attempted: any buffered packets
requiring that route should be discarded. </t><t>A route discovery failed: any
buffered packets requiring that route should be discarded, and the source of
the packet should be notified that the destination is unreachable (using an
ICMP Destination Unreachable message). </t><t>A route discovery succeeded:
install a route which AODVv2 has determined to be valid and begin transmitting
any buffered packets. </t><t>A route has been lost: remove an installed route
which AODVv2 has determined to be invalid. </t><t>A route has been updated:
update an installed route when AODVv2 receives new information about the route.
</t></list></t><t>These are conceptual signals, and can be implemented in
various ways. Conformant implementations of AODVv2 are not mandated to
implement the forwarding plane separately from the control plane or data plane;
these signals and interactions are identified simply as assistance for
implementers who may find them useful. </t></section><section title="Message
Transmission" anchor="MsgXmit" toc="default"><t>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 <xref
target="RFC5444" pageno="false" format="default"/> is detailed in <xref
target="represent" pageno="false" format="default"/>. </t><t>Messages may
travel a maximum of MAX_HOPCOUNT hops. </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>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>Implementations MAY
choose to employ techniques to reduce the number of multicast messages sent.
Use of <xref target="RFC6621" pageno="false" format="default"/> in deployments
is recommended. Employing <xref target="RFC6621" pageno="false"
format="default"/> in a subset of the operational AODVv2 routers in a network,
or configuring different algorithms on different routers, will not cause
interoperability issues, but will reduce the effectiveness of the multicast
reduction scheme. </t><t>When multiple interfaces are available, an AODVv2
router 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 SHOULD be limited
(CONTROL_TRAFFIC_LIMIT) and administratively configurable. To prioritize
transmission of AODVv2 control messages in order to respect the
CONTROL_TRAFFIC_LIMIT: </t><t><list style="symbols"><t>Highest priority SHOULD
be given to RREP_Ack messages. This allows learned routes to be confirmed as
bidirectional and avoids undesirable blacklisting of next hop routers.
</t><t>Second priority SHOULD be given to RERR messages for undeliverable IP
packets, so that broken routes that are still being used are reported, and to
avoid IP data packets being repeatedly forwarded to AODVv2 routers which cannot
forward to their destination. </t><t>Third priority SHOULD be given to RREP
messages in order that RREQs do not time out. </t><t>RREQ messages SHOULD be
given priority over RERR messages for newly invalidated routes, since the
invalidated routes may not still be in use, and if there is an attempt to use
the route, a new RERR message will be generated. </t><t>Lowest priority SHOULD
be given to RERR messages generated in response to RREP messages which cannot
be regenerated. In this case the route request will be retried at a later
point. </t></list></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. The main difference between the two
messages is that, usually, RREQ messages are multicast to solicit an 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 an IP 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"/>. Each new RREQ results in an increment to the
sequence number. The AODVv2 router is referred to as RREQ_Gen. </t><t>IP
packets awaiting a route MAY be buffered by RREQ_Gen. Buffering of IP packets
can have both positive and negative effects. 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>Determining which packets to discard first when
the buffer is full is a matter of policy at each AODVv2 router. Routers without
sufficient memory available for buffering SHOULD have buffering disabled. 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. An 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. To
reduce congestion in a network, repeated attempts at route discovery for a
particular target address SHOULD utilize a binary exponential backoff: for each
additional attempt, the waiting time for receipt of the RREP is multiplied by
2. If the requested route is not learned within the wait period, another RREQ
MAY be sent, up to a total of DISCOVERY_ATTEMPTS_MAX. This is the same
technique used in AODV <xref target="RFC3561" pageno="false"
format="default"/>. </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 unicasts it back toward RREQ_Gen
using the potential 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 link is unavailable in the direction
toward OrigAddr, an RREP is not received at the next hop, so cannot be
regenerated, and it 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. Later, a
timeout occurs at RREQ_Gen, and a new RREQ MAY be regenerated. If the new RREQ
arrives via the blacklisted router, it will be ignored, enabling the RREQ to
discover a different path toward TargAddr. </t><t>Route discovery SHOULD be
considered to have failed after DISCOVERY_ATTEMPTS_MAX and the corresponding
wait time for an RREP response to the final RREQ, in order to avoid repeatedly
generating control traffic that is unlikely to discover a route. 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, to avoid generating more multicast messages which are unlikely to
discover a route. Any IP 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 packet, so that the
application knows about the failure. The source can 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 MUST process 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 IP packets. Any retry timers for the
corresponding RREQ MUST be cancelled. </t><t>During route discovery, all
routers on the path learn a route to both OrigAddr and TargAddr, so that routes
are constructed in both directions. The route is optimized for the forward
route, and the return route uses the same path in reverse.
</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 an
existing route which matches AdvRte on address, prefix length, and metric type.
</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 := RteMsg.IPSourceAddress (an address of the router
from which the AdvRte was received) </t><t>AdvRte.MetricType :=
RteMsg.MetricType </t><t>AdvRte.Metric := RteMsg.Metric </t><t>AdvRte.Cost :=
Cost(R) using the cost function associated with the route's metric type, i.e.
Cost(R) = AdvRte.Metric + Cost(L), as described in <xref target="metrics"
pageno="false" format="default"/>, where L is the link from the advertising
router. </t><t>AdvRte.ValidityTime := RteMsg.ValidityTime, if included
</t></list></t><section title="Evaluating Route Information" anchor="test"
toc="default"><t>An incoming route advertisement (AdvRte) is compared to
existing routes to determine whether the advertised route is to 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 route (Route) matching
AdvRte's address, prefix length and metric type <list style="symbols"><t>If no
matching route exists, AdvRte MUST be used to update the routing table.
Multiple routes to the same destination may exist with different metric types.
</t><t>If all matching routing table entries have State set to Unconfirmed,
AdvRte SHOULD be added to the routing table. This may result in multiple
Unconfirmed routes to the same address. In this case, the best route from the
set of Unconfirmed routes SHOULD be used to forward future RREPs. If the link
to the next hop is found to be bidirectional, and the Unconfirmed route becomes
valid, any remaining Unconfirmed routes which would not offer improvement MUST
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
using the technique described in <xref target="seqnum" pageno="false"
format="default"/> <list style="symbols"><t>If AdvRte is more recent, AdvRte
MUST be used to update the routing table. </t><t>If AdvRte is stale, 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="metrics" 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 4. </t></list> </t><t>Compare route
costs <list style="symbols"><t>If AdvRte is better, it SHOULD be used to update
the routing table because it offers improvement. If it is not used to update
the existing route, the existing non-optimal route will continue to be used,
causing data flows to use a route with a worse cost where this could have been
avoided. </t><t>If AdvRte is equal in cost and Route is Valid, AdvRte MAY be
used to update the routing table but will offer no improvement. </t><t>If
AdvRte is worse 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"/> MUST be followed. If the route is not used,
non-optimal routes will remain in the routing table. </t></section><section
title="Applying Route Updates" anchor="update_rte" toc="default"><t>If AdvRte
is from an 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 to AdvRte.Address might not be viable, but
it MUST be stored to allow a corresponding RREP to be sent. However, the
route's State will be set to Unconfirmed to indicate that this route SHOULD NOT
yet be used to forward data, since the link may be uni-directional and packet
losses may occur. If a valid route already exists for this destination, this
Unconfirmed route SHOULD be stored as an additional entry. If the link to the
next hop is later confirmed to be bidirectional, the route will offer
improvement over the existing valid route. </t><t>The route update is applied
as follows: </t><t><list style="numbers"><t>If no existing route matches AdvRte
on address, prefix length and metric type, continue to Step 3 and create a new
route. </t><t>If a matching route exists: <list style="symbols"><t>If AdvRte
has a different next hop to the existing route (Route), and both
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
the next hop can be confirmed as bidirectional. Continue processing from Step 3
to create a new route. </t><t>If AdvRte.NextHop's Neighbor.State is Unknown
and Route.State is Invalid, continue processing from Step 4 to update the
existing route (Route). </t><t>If AdvRte.NextHop's Neighbor.State is
Confirmed, continue processing from Step 4 to update the existing route.
</t></list> </t><t>Create a route and initialize as follows: <list
style="symbols"><t>Route.Address := AdvRte.Address </t><t>Route.PrefixLength :=
AdvRte.PrefixLength </t><t>Route.MetricType := AdvRte.MetricType </t></list>
</t><t>Update the route 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
INFINITY_TIME </t></list> </t><t>If a new route was created, or if the existing
Route.State is Invalid or Unconfirmed, update the route as follows: <list
style="symbols"><t>Route.State := Unconfirmed (if the next hop's Neighbor.State
is Unknown) or Idle (if the next hop's Neighbor.State is Confirmed) </t></list>
</t><t>If an existing route changed from Invalid or Unconfirmed to become Idle,
any matching route table entries with worse metric values SHOULD be expunged.
</t><t>If this update results in a route with Route.State set to Active or
Idle, which matches an outstanding route request, the associated route request
retry timers can be cancelled and any associated buffered IP packets MUST be
forwarded. </t></list></t></section></section><section title="Suppressing
Redundant Messages Using the Multicast Route Message Table" 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 Route Message Table (<xref
target="rtemsgtable" pageno="false" format="default"/>). </t><t>To create a
Multicast Route Message Table Entry: </t><t><list
style="symbols"><t>RteMsg.MessageType := RREQ or RREP </t><t>RteMsg.OrigAddr :=
OrigAddr from the message </t><t>RteMsg.OrigPrefixLen := the prefix length
associated with OrigAddr </t><t>RteMsg.TargAddr := TargAddr from the message
</t><t>RteMsg.TargPrefixLen := the prefix length associated with TargAddr
</t><t>RteMsg.OrigSeqNum := the sequence number associated with OrigAddr, if
present in the message </t><t>RteMsg.TargSeqNum := the sequence number
associated with TargAddr, if present in the message </t><t>RteMsg.MetricType :=
the metric type of the route requested </t><t>RteMsg.Metric := the metric value
associated with OrigAddr in an RREQ or TargAddr in an RREP
</t><t>RteMsg.Timestamp := CurrentTime </t><t>RteMsg.RemoveTime := CurrentTime
+ MAX_SEQNUM_LIFETIME </t></list></t><t>Entries in the Multicast Route Message
Table 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. An entry MUST be deleted when the sequence number is no longer valid,
i.e., after MAX_SEQNUM_LIFETIME. Memory-constrained devices MAY remove the
entry before this time. </t><t>To update a Multicast Route Message Table
Entry, set: </t><t><list style="symbols"><t>RteMsg.OrigSeqNum := the sequence
number associated with OrigAddr, if present in the message
</t><t>RteMsg.TargSeqNum := the sequence number associated with TargAddr, if
present in the message </t><t>RteMsg.Metric := the metric value associated with
OrigAddr in an RREQ or TargAddr in an RREP </t><t>RteMsg.Timestamp :=
CurrentTime </t><t>RteMsg.RemoveTime := CurrentTime + MAX_SEQNUM_LIFETIME
</t></list></t><t>Received route messages are tested against previously
received route messages, and if determined to be redundant, regeneration or
response can be avoided. </t><t>To determine if a received message is
redundant: </t><t><list style="numbers"><t>Search for an entry in the Multicast
Route Message Table with the same MessageType, OrigAddr, TargAddr, and
MetricType <list style="symbols"><t>If there is none, the message is not
redundant. </t><t>If there is an entry, continue to Step 2. </t></list>
</t><t>Compare sequence numbers using the technique described in <xref
target="seqnum" pageno="false" format="default"/> <list style="symbols"><t>For
RREQ messages, use OrigSeqNum of the entry for comparison. For RREP messages,
use TargSeqNum of the entry for comparison. </t><t>If the entry has an older
sequence number than the received message, the message is not redundant.
</t><t>If the entry has a newer sequence number than the received message, the
message is redundant. </t><t>If the entry has the same sequence number,
continue to Step 3. </t></list> </t><t>Compare the metric values <list
style="symbols"><t>If the entry has a Metric value that is worse than or equal
to the metric in the received message, the message is redundant. </t><t>If the
entry has a Metric value that is better than the metric in the received
message, the message is not redundant. </t></list> </t></list></t><t>If the
message is redundant, update the timestamp on the entry, since matching route
messages are still traversing the network and this entry should be maintained.
This message SHOULD NOT be regenerated or responded to. </t><t>If the message
is not redundant, create an entry or update the existing entry. Where the
message is determined not redundant before Step 3, it MUST be regenerated or
responded to. Where the message is determined not redundant in Step 3, it MAY
be suppressed to avoid extra control traffic. However, since the processing of
the message will result in an update to the route table, the message SHOULD be
regenerated or responded to, to ensure other routers have up-to-date
information and the best metrics. If not regenerated, the best route may not be
found. Where necessary, regeneration or response is performed using the
processes in <xref target="aodv_msgs" pageno="false" format="default"/>.
</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 an IP packet, an AODVv2 router MUST
check firstly if there is a route, and secondly the status of the route (<xref
target="routestatechanges" pageno="false" format="default"/>). If the route
exists and is valid, it MUST be marked as Active and its LastUsed timestamp
MUST be updated, before forwarding the IP packet to the route's next hop. If
there is no valid route, and if the source address of the IP packet is a Router
Client, the RREQ generation procedure MUST be followed. Otherwise, the absence
of a route 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 MAY be examined and updated according to the
rules below. If timers are not used to prompt route state updates, route state
MUST be checked before IP 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: </t><t><list style="hanging"><t
hangText="Active"><vspace blankLines="0"/>If Route.State is Active and the
route is not timed (i.e., if Route.ExpirationTime is INFINITY_TIME),
Route.State MUST become Idle if Route is not used to forward IP packets within
ACTIVE_INTERVAL. Route.State for a timed route (i.e., Route.ExpirationTime is
not equal to INFINITY_TIME) remains Active until its expiration time, after
which it MUST become Invalid. </t><t hangText="Idle"><vspace
blankLines="0"/>If Route.State is Idle, and the route is used to forward an IP
packet, Route.State MUST become Active. If the route is not used to forward an
IP packet within MAX_IDLETIME, Route.State MUST become Invalid. </t><t
hangText="Invalid"><vspace blankLines="0"/>If Route.State is Invalid, the route
SHOULD be maintained until MAX_SEQNUM_LIFETIME after Route.LastSeqNumUpdate,
after which it MUST be expunged. Route.SeqNum is used to classify future
information about Route.Address as stale or fresh. </t><t
hangText="Unconfirmed"><vspace blankLines="0"/>If Route.State is Unconfirmed,
the route MUST become Idle when an adjacency with Route.NextHop is confirmed,
or MUST be expunged if the neighbor is blacklisted, or at MAX_SEQNUM_LIFETIME
after Route.LastSeqNumUpdate. </t></list></t><t>In all cases, if the time
since Route.LastSeqNumUpdate exceeds MAX_SEQNUM_LIFETIME, Route.SeqNum must be
set to zero. This is required to ensure that any AODVv2 routers following the
initialization procedure can safely begin routing functions using a new
sequence number, and that their messages will not be classified as stale and
ignored. A route with Route.State set to Active or Idle can continue to be used
to forward IP packets, but if Route.State later becomes Invalid, the route MUST
be expunged. </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
for Route.NextHop MUST immediately have Route.State set to Invalid. </t><t>If
a Route Error (RERR) message containing the route is received, either from
Route.NextHop, or with PktSource set to a Router Client address, Route.State
MUST immediately be set to Invalid. </t></list></t><t>When Route.State changes
from Unconfirmed to Idle as a result of the adjacency with Route.NextHop being
Confirmed (see <xref target="nbrlist" pageno="false" format="default"/>), any
matching routes with metric values worse than Route.Metric MUST be expunged.
</t><t>Memory constrained devices MAY choose to expunge routes from the AODVv2
route table before Route.ExpirationTime, but MUST adhere to the following
rules: </t><t><list style="symbols"><t>An Active route MUST NOT be expunged, as
this will result in generation of a Route Error message followed by a necessary
Route Request to re-establish the route. </t><t>An Idle route SHOULD NOT be
expunged, as the route is still valid for forwarding IP traffic, and if
deleted, this could result in dropped IP packets and a Route Request could be
generated to re-establish the route. </t><t>Any Invalid route MAY be expunged;
least recently used Invalid routes SHOULD be expunged first, since these are
less likely to be reused. </t><t>An Unconfirmed route MUST NOT be expunged if
it was installed within the last RREQ_WAIT_TIME, because it may correspond to a
route discovery in progress. A Route Reply message might be received which
needs to use the Route.NextHop information. Otherwise, it MAY be expunged.
</t></list></t><t>Route table entries are updated when Neighbor State is
updated: </t><t><list style="symbols"><t>While Neighbor.State is set to
Unknown, any routes learned through that neighbor are marked as Unconfirmed.
</t><t>When Neighbor.State is set to Confirmed, the Unconfirmed routes using
the neighbor as a next hop SHOULD be marked as valid (see <xref
target="routestatechanges" pageno="false" format="default"/>). </t><t>When
Neighbor.State is set to Blacklisted, any valid routes installed which use that
neighbor for their next hop are marked as Invalid. </t><t>When a Neighbor
Table entry is removed, all routes using the neighbor as next hop MUST be
marked as Invalid. </t></list></t></section><section title="Reporting Invalid
Routes" anchor="brokenrerr" toc="default"><t>When Route.State changes from
Active to Invalid as a result of a broken link or a received Route Error (RERR)
message, other routers SHOULD be informed by sending an RERR message containing
details of the invalidated route. </t><t>An RERR message SHOULD also be sent
when an AODVv2 router receives an IP packet to forward on behalf of another
router but does not have a valid route for the destination of the packet.
</t><t>An RERR message SHOULD also be sent when an AODVv2 router receives an
RREP message to regenerate, but the route to the OrigAddr in the RREP has been
lost and is marked as Invalid. </t><t>The packet or message triggering the
RERR MUST be discarded. </t><t>Generation of an 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 <xref
target="RFC5444" pageno="false" format="default"/> 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 contents: </t><figure anchor="RREQ_elem"
align="center" title="RREQ message contents" 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 |
+-----------------------------------------------------------------+
| OrigMetric |
+-----------------------------------------------------------------+
| ValidityTime (optional) |
+-----------------------------------------------------------------+
</artwork></figure><t></t><t>RREQ Data Elements </t><t><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 IP 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. </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 metric type associated with
OrigMetric. </t><t hangText="OrigMetric"><vspace blankLines="0"/>The metric
value 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><section title="RREQ
Generation" anchor="RREQ_gen" toc="default"><t>An RREQ is generated when an IP
packet needs to be forwarded for a Router Client, and no valid route currently
exists for the packet's destination. </t><t>Before creating an RREQ, the
router SHOULD check if an 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 IP 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. If approaching the
limit, the message should be sent if the priorities in <xref target="MsgXmit"
pageno="false" format="default"/> allow it. </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 is part of an
address range configured as a Router Client, set PrefixLengthList :=
{OrigPrefixLen, null}. </t><t>Otherwise, omit PrefixLengthList. </t></list>
</t><t>For OrigSeqNum: <list style="symbols"><t>Increment the router SeqNum 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 and set the type accordingly
</t><t>Set OrigMetric := Route[OrigAddr].Metric, i.e., RouterClient.Cost
</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 <xref target="RFC5444" pageno="false" format="default"/> 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 an 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>Check that the MetricType is supported and
configured for use <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 Multicast Route Message table, following the procedure in (<xref
target="suppress" pageno="false" format="default"/>) <list
style="symbols"><t>If redundant, ignore this RREQ for further processing.
</t><t>If not redundant, continue processing. </t></list> </t><t>Check if the
TargAddr belongs to one of the Router Clients <list style="symbols"><t>If so,
generate an 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 an RREQ, a router advertises that it will
forward IP 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 might avoid regenerating an
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. If approaching the limit, the message should be sent if the priorities
in <xref target="MsgXmit" pageno="false" format="default"/> allow it.
</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 time limit the previous
AODVv2 router specified, or the time limit this router wishes to impose,
whichever is lower. </t></list> </t></list></t><t>This AODVv2 message is used
to create a corresponding <xref target="RFC5444" pageno="false"
format="default"/> 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>When a Route Request message is received,
requesting a route to a Target Address which is configured as a Router Client,
a Route Reply message is sent in response. The RREP offers a route to the
Target Address. </t><t>The RREP is sent by unicast to the next hop router on
the route to OrigAddr, if there is a Confirmed entry in the Neighbor Table for
the next hop. 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 to request acknowledgement to confirm the neighbor adjacency.
</t><t>RREP messages have the following contents: </t><figure anchor="figRREP"
align="center" title="RREP message contents" 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 |
+-----------------------------------------------------------------+
| TargMetric |
+-----------------------------------------------------------------+
| ValidityTime (optional) |
+-----------------------------------------------------------------+
</artwork></figure><t></t><t>RREP Data Elements </t><t><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 to be multicast
because the next hop toward OrigAddr is a neighbor with Unknown state. It
indicates that an acknowledgement of 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 IP 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. </t><t
hangText="TargSeqNum"><vspace blankLines="0"/>The sequence number associated
with TargAddr. </t><t hangText="MetricType"><vspace blankLines="0"/>The metric
type associated with TargMetric. </t><t hangText="TargMetric"><vspace
blankLines="0"/>The metric value 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><section title="RREP Generation" anchor="RREP_gen"
toc="default"><t>An RREP is generated when an RREQ arrives requesting a route
to one of the AODVv2 router's Router Clients. </t><t>Before creating an 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 approaching the limit, the message should be sent if the priorities
in <xref target="MsgXmit" pageno="false" format="default"/> allow it.
</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
next hop neighbor is already confirmed as adjacent, the AckReq Data Element 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 an 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 is part
of an address range configured as a Router Client, set PrefixLengthList :=
{null, TargPrefixLen}. </t><t>Otherwise, omit PrefixLengthList. </t></list>
</t><t>For the TargSeqNum: <list style="symbols"><t>Increment the router SeqNum
as specified in <xref target="seqnum" pageno="false" format="default"/>.
</t><t>Set TargSeqNum := SeqNum. </t></list> </t><t>Include the MetricType
Data Element and set the type to match the MetricType in the received RREQ
message </t><t>Set TargMetric := Route[TargAddr].Metric, i.e.,
RouterClient.Cost </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 <xref target="RFC5444" pageno="false" format="default"/>
message (see <xref target="represent" pageno="false" format="default"/>). If
there is a Confirmed entry in the Neighbor Table for the next hop router on the
route to OrigAddr, the RREP is sent by unicast to the next hop. Otherwise, the
RREP is sent multicast to LL-MANET-Routers. </t></section><section title="RREP
Reception" anchor="RREP_rcv" toc="default"><t>Upon receiving an 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 Neighbor
Table entry for this sender SHOULD have State set to Confirmed since an 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>Check that the MetricType is supported
and configured for use <list style="symbols"><t>If not, ignore this RREP for
further processing. </t></list> </t><t>Verify that the cost of the advertised
route does not exceed the maximum allowed metric value for the metric type
(Metric &lt;= MAX_METRIC[MetricType] - Cost(L)) <list style="symbols"><t>If it
does, 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 IP 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
Multicast Route Message 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
Multicast Route Message 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 IP 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 an 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. If approaching the limit, the message should be sent if the
priorities in <xref target="MsgXmit" pageno="false" format="default"/> allow
it. </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 time limit the previous AODVv2 router specified, or
the time limit this router wishes to impose, whichever is lower. </t></list>
</t></list></t><t>This AODVv2 message is used to create a corresponding <xref
target="RFC5444" pageno="false" format="default"/> message (see <xref
target="represent" pageno="false" format="default"/>). If there is a Confirmed
entry in the Neighbor Table for the next hop router on the route to OrigAddr,
the RREP is sent by unicast to the next hop. Otherwise, the RREP is sent
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>An 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 an RREP_Ack. The <xref target="RFC5444" pageno="false"
format="default"/> representation is discussed in <xref target="represent"
pageno="false" format="default"/>. The RREP_Ack is unicast, by default, to the
source IP address of the RREP message that requested it.
</t></section><section title="RREP_Ack Reception" anchor="RREP_Ack_rcv"
toc="default"><t>Upon receiving an RREP_Ack, an AODVv2 router performs the
following steps: </t><t><list style="numbers"><t>If an 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. An RERR message has the following contents: </t><figure
anchor="figRERRstruct" align="center" title="RERR message contents"
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 |
+-----------------------------------------------------------------+
</artwork></figure><t></t><t>RERR Data Elements </t><t><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 address of the IP
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. These values indicate whether routes represent a single device or an
address range. </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 metric
types associated with the routes no longer available through RERR_Gen.
</t></list></t><section title="RERR Generation" anchor="RERR_gen"
toc="default"><t>An 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 an
IP packet arrives that cannot be forwarded because no valid route exists for
its destination, or if an RREP arrives which cannot be regenerated because no
route exists to OrigAddr, the RERR generated MUST contain the PktSource Data
Element and will contain only one unreachable address. The contents of
PktSource and AddressList are set as follows: <list style="symbols"><t>For an
IP packet that cannot be forwarded, PktSource is set to the source address of
the IP packet, and the AddressList contains the destination address of the IP
packet. </t><t>For an RREP message when 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
PktSource. The MetricTypeList MUST also be included if a MetricType can be
determined from the IP packet or an existing Invalid route to PktSource.
<vspace blankLines="1"/> RERR_Gen MUST discard the IP packet or RREP message
that triggered generation of the RERR. <vspace blankLines="1"/> In order to
avoid flooding the network with RERR messages when a stream of IP packets to an
unreachable address arrives, an AODVv2 router SHOULD determine whether an 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. 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"/> An 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 IP 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. If approaching the limit, the message should be
sent if the priorities in <xref target="MsgXmit" pageno="false"
format="default"/> allow it. </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 IP packet triggering the RERR, or the
TargAddr of an RREP that cannot be regenerated toward OrigAddr </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. </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 <xref
target="RFC5444" pageno="false" format="default"/> message (see <xref
target="represent" pageno="false" format="default"/>). </t><t>If the RERR is
sent in response to an undeliverable IP packet or RREP 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 an 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 is supported and configured for
use </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 existing route, if the reported
sequence number is determined to be newer using the comparison technique
described in <xref target="seqnum" pageno="false" format="default"/>.
</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. If approaching the limit,
the message should be sent if the priorities in <xref target="MsgXmit"
pageno="false" format="default"/> allow it. </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. </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 <xref
target="RFC5444" pageno="false" format="default"/> 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's route messages comprise Data Elements that map to
message elements in <xref target="RFC5444" pageno="false" format="default"/>.
</t><t><xref target="RFC5444" pageno="false" format="default"/> provides a
multiplexed transport for multiple protocols. An <xref target="RFC5444"
pageno="false" format="default"/> multiplexer MAY choose to optimize the
content of certain message elements to reduce control plane overhead. </t><t>A
brief summary of the <xref target="RFC5444" pageno="false" format="default"/>
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, or with
a contiguous set of addresses, or with a single address in the Address Block
</t></list></t><t>AODVv2 does not require access to the <xref target="RFC5444"
pageno="false" format="default"/> 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;. The &lt;msg-addr-length&gt; field 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 by the <xref
target="RFC5444" pageno="false" format="default"/> implementation. 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 an RERR. <xref target="RFC5444"
pageno="false" format="default"/> maps this information to Address Block TLVs
associated with the relevant addresses in the Address Block. </t><t>The
following sections show how AODVv2 Data Elements are represented in <xref
target="RFC5444" pageno="false" format="default"/> messages. AODVv2 makes use
of the VALIDITY_TIME TLV from <xref target="RFC5497" pageno="false"
format="default"/>, and defines (in <xref target="IANA" pageno="false"
format="default"/>) a number of new TLVs. </t><t>Where the extension type of a
TLV is set to zero, this is the default <xref target="RFC5444" pageno="false"
format="default"/> value and the extension type will not be included in the
message. </t><section title="Route Request Message Representation"
anchor="route-request-message-representation" 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, reduced by number of hops traversed so far by the message.
</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>An RREQ
contains no Message TLVs. </t></section><section title="Address Block"
anchor="address-block" toc="default"><t>An 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 one or more 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 value 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></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="Route Reply
Message Representation" anchor="route-reply-message-representation"
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, reduced by number of hops traversed so far by the message.
</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>An RREP
contains no Message TLVs. </t></section><section title="Address Block"
anchor="address-block-1" toc="default"><t>An 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 one or more 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 value 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></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="Route Reply Acknowledgement Message Representation"
anchor="route-reply-acknowledgement-message-representation"
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>An
RREP_Ack contains no Message TLVs. </t></section><section title="Address
Block" anchor="address-block-2" toc="default"><t>An RREP_Ack contains no
Address Block. </t></section><section title="Address Block TLV Block"
anchor="address-block-tlv-block-2" toc="default"><t>An RREP_Ack contains no
Address Block TLV Block. </t></section></section><section title="Route Error
Message Representation" anchor="route-error-message-representation"
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, reduced by number of hops
traversed so far by the message. </c></texttable></section><section
title="Message TLV Block" anchor="message-tlv-block-3" toc="default"><t>An RERR
contains no Message TLVs. </t></section><section title="Address Block"
anchor="address-block-3" toc="default"><t>The Address Block in an RERR MAY
contain PktSource, the source address of the IP 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 one or more 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></section></section></section></section><section
title="Simple External Network 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 an
external network via a single External Network Access Router (ENAR). The
interface to the external network MUST NOT be configured in the
AODVv2_INTERFACES list. </t><t>As in any externally-attached network, AODVv2
routers and Router Clients that wish to be reachable from hosts on the external
network MUST have IP addresses within the ENAR's routable and topologically
correct prefix (i.e., 191.0.2.0/24 in <xref target="net_top" pageno="false"
format="default"/>). This AODVv2 network and subnets within it will be
advertised to the external network using procedures which are out of scope for
this specification. </t><figure anchor="net_top" align="center" title="Simple
External Network 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
| | ENAR | /191.0.2.0/24
| | AODVv2 Router| /
| | 191.0.2.1 |/ /---------------\
| | serving net +------+ External \
| | 191.0.2.0/24 | \ Network /
| +-----+--------+ \---------------/
| +----------------+ |
| | 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 an address on the external network, it uses
the normal AODVv2 route discovery for that IP Destination Address. The ENAR
MUST respond to RREQ on behalf of all external network destinations, i.e.,
destinations not on the configured 191.0.2.0/24 subnet. RREQs for addresses
inside the AODVv2 network, i.e. destinations on the configured 191.0.2.0/24
subnet, are handled using the standard processes described in <xref
target="aodv_msgs" pageno="false" format="default"/>. </t><t>When an IP packet
from an address on the external network destined for an address in the AODVv2
MANET reaches the ENAR, if the ENAR does not have a route toward that exact
destination it will perform normal AODVv2 route discovery for that destination.
</t><t>Configuring the ENAR as a default router is outside the scope of this
specification. </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 an 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 IP packet's source address as the
precursor. In this case, it is not guaranteed that an 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 IP 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 IP packet, determine which router forwarded the packet, and save the
router address as a precursor. This ensures that when an 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 IP 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 an 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 an 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 <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><t>If MAX_SEQNUM_LIFETIME
was configured differently across the network, and any of the routers lost
their sequence number or rebooted, this could result in their next route
messages being classified as stale at any AODVv2 router using a greater value
for MAX_SEQNUM_LIFETIME. This would delay route discovery from and to the
re-initializing router. </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>INFINITY_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 <xref target="RFC5444" pageno="false"
format="default"/> message header and therefore MAX_HOPCOUNT cannot be larger
than 255. </t><t>MAX_METRIC[MetricType] MUST always be the maximum expressible
metric value of type MetricType. Field lengths associated with metric values
are found in <xref target="metric-type" pageno="false" format="default"/>.
</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: Routers with higher values are
likely to be more successful at finding routes, at the cost of additional
control traffic. </t><t>RREP_RETRIES: Routers with lower values are more
likely to blacklist neighbors when there is a </t><t>MAX_METRIC[MetricType]: No
interoperability problems due to variations on different routers, but routers
with lower values may exhibit overly restrictive behavior during route
comparisons. temporary fluctuation in link quality. </t><t>MAX_HOPCOUNT:
Routers with a value too small would not be able to discover routes to distant
addresses. </t><t>INFINITY_TIME: No interoperability problems due to
variations on different routers, 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 router: </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>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 routers
in the network will not result in protocol errors, but poor performance may
result. </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>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 title="MetricType Allocation"
anchor="metric-type" toc="default"><t>The metric types used by AODVv2 are
identified according to the assignments in <xref target="RFC6551"
pageno="false" format="default"/>. All implementations MUST use these values.
</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 Value Size
</ttcol><c>Unassigned </c><c>0 </c><c>Undefined </c><c>Hop Count </c><c>3 [TBD]
</c><c>1 octet </c><c>Unallocated </c><c>9 - 254 </c><c>TBD </c><c>Reserved
</c><c>255 </c><c>Undefined </c></texttable><t></t></section><section
title="AddressType Allocation" anchor="address-type" toc="default"><t>These
values are used in the <xref target="RFC5444" pageno="false" format="default"/>
Address Type TLV discussed in <xref target="represent" pageno="false"
format="default"/>. All implementations MUST use these values. </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><c>ADDRTYPE_UNSPECIFIED </c><c>255
</c></texttable><t></t></section></section><section title="IANA Considerations"
anchor="IANA" toc="default"><t>This section specifies several <xref
target="RFC5444" pageno="false" format="default"/> message types and address
tlv-types required for AODVv2. A registry of metric types is specified, in
addition to a registry of address types. </t><section title="RFC 5444 Message
Types" anchor="msgtype" toc="default"><t>This specification defines four
Message Types, to be allocated from the 0-223 range of the "Message Types"
namespace defined in <xref target="RFC5444" pageno="false" format="default"/>,
as specified in <xref target="msgtypes" pageno="false" format="default"/>.
</t><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"><t>This specification defines three
Address Block TLV Types, to be allocated from the "Address Block TLV Types"
namespace defined in <xref target="RFC5444" pageno="false" format="default"/>,
as specified in <xref target="addrtlvtypes" pageno="false" format="default"/>.
</t><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></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. AODVv2 routers store the information contained in these messages in
order to properly forward IP packets, and they generally provide this
information to other AODVv2 routers. Negative routing information (i.e. a route
does not exist) is distributed via RERR messages. AODVv2 routers process these
messages and remove routes, and forward 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 routers 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 an RREQ message with false information is that traffic to OrigAddr
could be disrupted. Since RREQ is multicast and likely to be received by all
routers 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 an
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 an RREP_Ack message with false information is that the route advertised
to a target address in an 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 an 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, Keyur Patel, Alexandru Petrescu, Henning Rogge, Fransisco Ros, Pedro
Ruiz, Christoph Sommer, Romain Thouvenin, Richard Trefler, Jiazi Yi, Seung Yi,
and Cong Yuan, for their reviews of AODVv2 and DYMO, as well as numerous
specification suggestions. </t></section> </middle>
<back><references title="Normative References"><reference anchor="RFC2119"
target="http://www.rfc-editor.org/info/rfc2119";><front><title>Key words for use
in RFCs to Indicate Requirement Levels</title><author initials="S."
surname="Bradner" fullname="S. Bradner"><organization/></author><date
year="1997" month="March"/><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. This document specifies an Internet Best
Current Practices for the Internet Community, and requests discussion and
suggestions for improvements.</t></abstract></front><seriesInfo name="BCP"
value="14"/><seriesInfo name="RFC" value="2119"/><seriesInfo name="DOI"
value="10.17487/RFC2119"/></reference><reference anchor="RFC3561"
target="http://www.rfc-editor.org/info/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"/><seriesInfo name="DOI"
value="10.17487/RFC3561"/></reference><reference anchor="RFC4291"
target="http://www.rfc-editor.org/info/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.</t><t>This document obsoletes
RFC 3513, "IP Version 6 Addressing Architecture".
[STANDARDS-TRACK]</t></abstract></front><seriesInfo name="RFC"
value="4291"/><seriesInfo name="DOI"
value="10.17487/RFC4291"/></reference><reference anchor="RFC5082"
target="http://www.rfc-editor.org/info/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" role="editor"><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"/><seriesInfo name="DOI"
value="10.17487/RFC5082"/></reference><reference anchor="RFC5444"
target="http://www.rfc-editor.org/info/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"/><seriesInfo name="DOI"
value="10.17487/RFC5444"/></reference><reference anchor="RFC5497"
target="http://www.rfc-editor.org/info/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"/><seriesInfo name="DOI"
value="10.17487/RFC5497"/></reference><reference anchor="RFC5498"
target="http://www.rfc-editor.org/info/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"/><seriesInfo name="DOI"
value="10.17487/RFC5498"/></reference><reference anchor="RFC6551"
target="http://www.rfc-editor.org/info/rfc6551";><front><title>Routing Metrics
Used for Path Calculation in Low-Power and Lossy Networks</title><author
initials="JP." surname="Vasseur" fullname="JP. Vasseur"
role="editor"><organization/></author><author initials="M." surname="Kim"
fullname="M. Kim" role="editor"><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"/><seriesInfo name="DOI"
value="10.17487/RFC6551"/></reference><reference anchor="RFC7182"
target="http://www.rfc-editor.org/info/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"/><seriesInfo name="DOI"
value="10.17487/RFC7182"/></reference></references><references
title="Informative References"><reference anchor="RFC2501"
target="http://www.rfc-editor.org/info/rfc2501";><front><title>Mobile Ad hoc
Networking (MANET): Routing Protocol Performance Issues and Evaluation
Considerations</title><author initials="S." surname="Corson" fullname="S.
Corson"><organization/></author><author initials="J." surname="Macker"
fullname="J. Macker"><organization/></author><date year="1999"
month="January"/><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. This memo
provides information for the Internet
community.</t></abstract></front><seriesInfo name="RFC"
value="2501"/><seriesInfo name="DOI"
value="10.17487/RFC2501"/></reference><reference anchor="RFC4193"
target="http://www.rfc-editor.org/info/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"/><seriesInfo name="DOI"
value="10.17487/RFC4193"/></reference><reference anchor="RFC4728"
target="http://www.rfc-editor.org/info/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"/><seriesInfo name="DOI"
value="10.17487/RFC4728"/></reference><reference anchor="RFC4861"
target="http://www.rfc-editor.org/info/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"/><seriesInfo name="DOI"
value="10.17487/RFC4861"/></reference><reference anchor="RFC5148"
target="http://www.rfc-editor.org/info/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"/><seriesInfo name="DOI"
value="10.17487/RFC5148"/></reference><reference anchor="RFC6130"
target="http://www.rfc-editor.org/info/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"/><seriesInfo name="DOI"
value="10.17487/RFC6130"/></reference><reference anchor="RFC6621"
target="http://www.rfc-editor.org/info/rfc6621";><front><title>Simplified
Multicast Forwarding</title><author initials="J." surname="Macker" fullname="J.
Macker" role="editor"><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"/><seriesInfo name="DOI"
value="10.17487/RFC6621"/></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><!--<reference anchor="Baumann07"> <front> <title>A Survey
on Routing Metrics TIK Report 262</title> <author fullname="Rainer Baumann"
initials="R." surname="Baumann"> </author> <author fullname="Simon Heimlicher"
initials="S." surname="Heimlicher"> </author> <author fullname="Mario Strasser"
initials="M." surname="Strasser"> </author> <author fullname="Andreas Weibel"
initials="A." surname="Weibel"> </author> <date month="" year="2007"/> </front>
</reference> --><reference anchor="Sholander02"
quote-title="true"><front><title>A Portable Software Implementation of a Hybrid
MANET Routing Protocol</title><author fullname="Peter Sholander" initials="P."
surname="Sholander"/><author fullname="Paul Coccoli" initials="P."
surname="Coccoli"/><author fullname="Tracey Oakes" initials="T."
surname="Oakes"/><author fullname="Sean Swank" initials="S."
surname="Swank"/><date month="" year="2002"/></front></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="Multi-homing Considerations" anchor="multihome"
toc="default"><t>Multi-homing is not supported by the AODVv2 specification. A
Router Client, i.e., an IP Address, can only be served by one AODVv2 router at
any time. The coordination between multiple AODVv2 routers to distribute
routing information correctly for a shared address is not defined. See <xref
target="change_address_location" pageno="false" format="default"/> for
information about how to move a router client to a different AODVv2 router.
</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, and sometimes values and
algorithms specific to each metric type. </t><t>The following table indicates
the field names used in subsequent sections and their meaning. </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="HopCount MetricType"
anchor="hopcount-metrictype" toc="default"><t>The HopCount MetricType defines:
</t><t><list style="symbols"><t>MAX_METRIC[HopCount] := MAX_HOPCOUNT. A
constant defined in <xref target="constants" pageno="false" format="default"/>.
MAX_HOPCOUNT is also used to limit the number of hops an AODVv2 message can
travel, regardless of the MetricType in use. It MUST be larger than the AODVv2
network diameter, in order that AODVv2 protocol messages may reach their
intended destinations. </t><t>Cost(L) := 1 </t><t>Cost(R) := Sum of 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 (OrigAddr if RREQ, TargAddr if RREP)
</t><t>LoopFree(R1, R2) := ( Cost(R1) &lt;= Cost(R2) ). This is derived from
the fact that route cost increases with number of hops. Therefore, an
advertised route with higher cost than the corresponding existing route could
include the existing route as a sub-section. Replacing the existing route with
the advertised route could form a routing loop.
</t></list></t></section><section title="General Operations"
anchor="sub-algorithms" toc="default"><t>General AODVv2 operations involve the
comparisons of incoming and current data, and updates to local data sets.
</t><section title="Route Operations" anchor="route-operations"
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 == INFINITY_TIME)) //not a timed route
route.State := Invalid;
if ((CurrentTime - route.LastUsed &gt; ACTIVE_INTERVAL)
AND (route.State != Unconfirmed)
AND (route.ExpirationTime == INFINITY_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 := INFINITY_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 := INFINITY_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><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="Multicast Route Message Table
Operations" anchor="multicast-route-message-table-operations"
toc="default"><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></section><section title="Message
Algorithms" anchor="message-algorithms" toc="default"><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>After processing a message, the
most recent information is stored in the route table. For this reason, it is
equally appropriate to set outgoing message field values using route table
information or using fields from the incoming message. </t><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 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 (msg_hop_count &gt; MAX_HOPCOUNT)
return;
if (msg_hop_limit &lt; 0)
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 := inRREQ.Address;
outRREP.TargAddr := rte.TargAddr;
outRREP.TargPrefixLen := rte.PrefixLength; //if not address length
outRREP.TargSeqNum := mySeqNum;
outRREP.TargMetric := rte.Metric;
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 (msg_hop_count &gt; MAX_HOPCOUNT)
return;
if (msg_hop_limit &lt; 0)
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])
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><section
title="AODVv2 Draft Updates" anchor="aodvv2-draft-updates"
toc="default"><section title="Changes between revisions 11 and 12"
anchor="changes-between-revisions-11-and-12" toc="default"><t>This section
lists the changes between AODVv2 revisions ...-11.txt and ...-12.txt.
</t><t><list style="symbols"><t>Avoided use of "node" and "subnet" where
possible. </t><t>Improved separation of data structure information from
protocol operation. </t><t>Updated uses of the terms "IP address" and "packet"
to be clearer. </t><t>More consistent and accurate use of MUST, SHOULD, SHOULD
NOT, and MAY, and added explanations of consequences of not implementing
SHOULDs. </t><t>Used consistent references to <xref target="RFC5444"
pageno="false" format="default"/>. </t><t>Updated title to include "Version
2". </t><t>Updated Overview to state differences from AODV, text about loop
freedom and RFC 7182 in Overview. </t><t>Updated Terminology and removed the
Data Element table. Gave clearer definition of Router Client and Unreachable
Address. </t><t>Updated Applicability Statement to draw attention to
requirements of the forwarding plane, handling of uni-directional links, usage
of IP addresses on multiple interfaces, and description of gateway
functionality. Added note about penalty for not storing persistent state.
</t><t>Updated Router Client section and added cost to Router Client entry.
</t><t>Clarified that Neighbor Table needs only information on neighboring
routers on discovered routes. </t><t>Updated Sequence Number section. Use only
one sequence number per router. Added description of sequence number
comparison. </t><t>Updated descriptions of route states. </t><t>Improved
clarity of Metrics section, generic metric instead of hopcount, removed default
metric type, added explanation of LoopFree. </t><t>Improved Initialization
section. </t><t>Major update to Adjacency Monitoring section. Made it clear
that if bidirectional connectivity is already confirmed, requesting
acknowledgement is unnecessary. Separated Neighbor Table Updates into separate
section. </t><t>Updated description of message prioritization near the control
message generation limit. </t><t>Updated wording regarding <xref
target="RFC6621" pageno="false" format="default"/>. </t><t>Added description
of backoff used for message retries. </t><t>Improved description of how
unidirectional links are handled. </t><t>Improved text regarding creation of
Unconfirmed route entries. </t><t>Improved section on determining redundancy
of received multicast messages. </t><t>Added section on interactions with the
forwarding plane. </t><t>Improved Route State section. Clarified action when
Active route expires. Separated information on expunging routes on memory
constrained routers. </t><t>Updated RERR description to be clearer about
triggers. </t><t>Updated IANA section to include only newly defined Messages
and TLVs, and define an Unspecified value for AddressType. </t><t>Updated
references. </t><t>Updated section on Gateway behaviour. </t><t>Updated
Appendix D to include more checks on msg_hop_limit and msg_hop_count.
</t><t>Renamed MAX_TIME to INFINITY_TIME to make meaning clearer.
</t></list></t></section><section title="Changes between revisions 10 and 11"
anchor="changes-between-revisions-10-and-11" toc="default"><t>This section
lists the changes between AODVv2 revisions ...-10.txt and ...-11.txt.
</t><t><list style="symbols"><t>Updated Simple Internet Attachment section to
clarify behaviour of IAR for incoming RREQ messages.
</t></list></t></section><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 <xref target="RFC5444" pageno="false"
format="default"/> Representation section to add "Address Type" TLV, which
explicitly declares the meaning of addresses in the <xref target="RFC5444"
pageno="false" format="default"/> 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 <xref target="RFC5444" pageno="false" format="default"/>
overview and simplified/rearranged text in this section. </t><t>Major update
to <xref target="RFC5444" pageno="false" format="default"/> representation
section </t><t>Updated RERR's <xref target="RFC5444" pageno="false"
format="default"/> 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 <xref target="RFC5444" pageno="false" format="default"/>
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 <xref target="RFC5444" pageno="false"
format="default"/> 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 <xref
target="RFC5444" pageno="false" format="default"/> 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 <xref target="RFC5444" pageno="false"
format="default"/> 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 <xref target="RFC5444" pageno="false" format="default"/>.
</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 <xref
target="RFC5444" pageno="false" format="default"/> 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 <xref target="RFC5444" pageno="false"
format="default"/>. </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: