Mobile Ad hoc Networks Working Group | C. Perkins |
Internet-Draft | Futurewei |
Intended status: Standards Track | S. Ratliff |
Expires: April 15, 2016 | Idirect |
J. Dowdell | |
Airbus Defence and Space | |
L. Steenbrink | |
HAW Hamburg, Dept. Informatik | |
V. Mercieca | |
Airbus Defence and Space | |
October 13, 2015 |
Ad Hoc On-demand Distance Vector Routing Version 2 (AODVv2)
draft-ietf-manet-aodvv2-12
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.
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 15, 2016.
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 (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.
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 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].
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:
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 |
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 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.
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.
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.
Router Client Table entries MUST contain:
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.
A neighbor table MUST be maintained with information about neighboring AODVv2 routers which are used in discovered routes.
Neighbor Table entries MUST contain:
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 procedure in Section 6.1 to safely resume routing operations with a new sequence number.
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:
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.
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:
There are four possible states for an AODVv2 route:
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.
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.
AODVv2 enables the use of multiple metric types. Each route discovery attempt indicates the metric type which is requested for the route. Only one metric type may be used in each route discovery attempt. However, routes to a single destination might be requested for different metric types. The decision of which of these routes to use for forwarding is outside the scope of AODVv2.
For each MetricType, AODVv2 requires:
AODVv2 currently supports cost metrics where Cost(R) is strictly increasing, by defining:
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.
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.
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:
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.
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.
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:
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.
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:
When the link to the neighbor is determined to be bidirectional, the Neighbor Table entry is updated as follows:
When the link to the neighbor is determined to be uni-directional, the Neighbor Table entry is updated as follows:
When the Neighbor.ResetTime is reached, the Neighbor Table entry is updated as follows:
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.
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:
AODVv2 needs to send signals to the forwarding plane:
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.
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.
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:
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.
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 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.
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:
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:
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.
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:
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:
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:
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:
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.
Route maintenance involves monitoring and updating route state, handling route timeouts and reporting routes that become Invalid.
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).
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:
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:
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:
Route table entries are updated when Neighbor State is updated:
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.
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.
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
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:
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.
Upon receiving an RREQ, an AODVv2 router performs the following steps:
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 the limit, the message should be sent if the priorities in Section 6.5 allow it.
The procedure for RREQ regeneration is as follows:
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.
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:
+-----------------------------------------------------------------+ | 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
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:
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.
Upon receiving an RREP, an AODVv2 router performs the following steps:
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:
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.
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.
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.
Upon receiving an RREP_Ack, an AODVv2 router performs the following steps:
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
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:
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:
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.
Upon receiving an RERR, an AODVv2 router performs the following steps:
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:
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.
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:
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.
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. |
An RREQ contains no Message TLVs.
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> |
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.
Data Element | TLV Type | Extension Type | Value |
---|---|---|---|
None | ADDRESS_TYPE | 0 | ADDRTYPE_ORIGADDR |
OrigSeqNum | SEQ_NUM | 0 | Sequence Number of RREQ_Gen, the router which initiated route discovery. |
OrigMetric /MetricType | PATH_METRIC | MetricType | Metric value for the route to OrigAddr, using MetricType. |
ValidityTime | VALIDITY_TIME | 0 | ValidityTime for route to OrigAddr. |
Data Element | TLV Type | Extension Type | Value |
---|---|---|---|
None | ADDRESS_TYPE | 0 | ADDRTYPE_TARGADDR |
TargSeqNum | SEQ_NUM | 0 | The last known TargSeqNum for TargAddr. |
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. |
An RREP contains no Message TLVs.
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> |
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.
Data Element | TLV Type | Extension Type | Value |
---|---|---|---|
None | ADDRESS_TYPE | 0 | ADDRTYPE_ORIGADDR |
Data Element | TLV Type | Extension Type | Value |
---|---|---|---|
None | ADDRESS_TYPE | 0 | ADDRTYPE_TARGADDR |
TargSeqNum | SEQ_NUM | 0 | Sequence number of RREP_Gen, the router which created the RREP. |
TargMetric /MetricType | PATH_METRIC | MetricType | Metric value for the route to TargAddr, using MetricType. |
ValidityTime | VALIDITY_TIME | 0 | ValidityTime for route to TargAddr. |
Data Element | TLV Type | Extension Type | Value |
---|---|---|---|
None | ADDRESS_TYPE | 0 | ADDRTYPE_INTEND |
Data Element | Header Field | Value |
---|---|---|
None | <msg-type> | RREP_Ack |
An RREP_Ack contains no Message TLVs.
An RREP_Ack contains no Address Block.
An RREP_Ack contains no Address Block TLV Block.
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. |
An RERR contains no Message TLVs.
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 |
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.
Data Element | TLV Type | Extension Type | Value |
---|---|---|---|
PktSource | ADDRESS_TYPE | 0 | ADDRTYPE_PKTSOURCE |
Data Element | TLV Type | Extension Type | Value |
---|---|---|---|
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. |
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.
/-------------------------\ / +----------------+ \ / | 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.
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.
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.
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:
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.
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].
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].
AODVv2 uses various parameters which can be grouped into the following categories:
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.
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 |
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.
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) |
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:
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 |
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 |
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.
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) |
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 |
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 |
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.
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) |
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 (octets) | Reference |
---|---|---|---|
PATH_METRIC | 10 (TBD) | depends on MetricType | Section 7 |
SEQ_NUM | 11 (TBD) | 2 | Section 7 |
ADDRESS_TYPE | 15 (TBD) | 1 | Section 8 |
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.
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 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 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.
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.
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.
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.
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 |
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 |
The HopCount MetricType defines:
General AODVv2 operations involve the comparisons of incoming and current data, and updates to local data sets.
/* 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; }
(See Section 6.7.1)
/* 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; }
/* 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; }
/* 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); }
/* 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); }
/* Return TRUE if the route advRte is LoopFree compared to rte */ LoopFree(advRte, rte) { if (advRte.Cost <= rte.Cost) return TRUE; else return FALSE; }
/* 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; }
(See Section 4.5)
/* Update the multicast route message suppression table based on the received RteMsg, return true if it was created or the SeqNum was updated (i.e. it needs to be regenerated) */ Update_Rte_Msg_Table(rteMsg) { /* search for a comparable entry */ entry := Fetch_Rte_Msg_Table_Entry(rteMsg); /* if there is none, create one */ if (entry does not exist) { entry.MessageType := rteMsg.msg_type; entry.OrigAddr := rteMsg.OrigAddr; entry.TargAddr := rteMsg.TargAddr; entry.OrigSeqNum := rteMsg.origSeqNum; // (if present) 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; }
Processing for messages follows the following general outline:
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.
/* 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; }
/* 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 */ }
/* Process a RREQ received on link L */ Receive_RREQ (inRREQ, L) { if (inRREQ.NbrIP present in blacklist) { if (blacklist_expiration_time < CurrentTime) return; // don't process or regenerate RREQ else remove nbrIP from blacklist; } if (inRREQ does not contain msg_hop_limit, OrigAddr, TargAddr, OrigSeqNum, OrigMetric) return; if (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); }
/* Called from receive_RREQ() rte := the route to OrigAddr */ Regenerate_RREQ (inRREQ, rte) { outRREQ.HopLimit := inRREQ.HopLimit - 1; if (outRREQ.HopLimit == 0) return; // don't regenerate if (inRREQ.HopCount exists) { if (inRREQ.HopCount >= MAX_HOPCOUNT) return; // don't regenerate outRREQ.HopCount := inRREQ.HopCount + 1; } /* Marshall parameters */ outRREQ.MetricType := rte.MetricType; outRREQ.OrigAddr := rte.Address; outRREQ.TargAddr := inRREQ.TargAddr; /* include prefix length if not equal to address length */ outRREQ.OrigPrefixLen := rte.PrefixLength; outRREQ.OrigSeqNum := rte.SeqNum; outRREQ.TargSeqNum := inRREQ.TargSeqNum; // if present outRREQ.OrigMetric := rte.Metric; outRREQ.ValidityTime := rte.ValidityTime; or the time limit this router wishes to put on route to OrigAddr /* Build Address Block using prefix length information from outRREQ.OrigPrefixLen if necessary */ AddrBlk := {outRREQ.OrigAddr, outRREQ.TargAddr}; /* Include sequence numbers in appropriate Address Block TLVs */ /* OrigSeqNum Address Block TLV */ origSeqNumAddrBlkTlv.value := outRREQ.OrigSeqNum; /* TargSeqNum Address Block TLV */ if (outRREQ.TargSeqNum is known) targSeqNumAddrBlkTlv.value := outRREQ.TargSeqNum; /* Build Metric Address Block TLV, include Metric AddrBlkTlv Extension type if a non-default metric */ metricAddrBlkTlv.value := outRREQ.OrigMetric; if (outRREQ.MetricType != DEFAULT_METRIC_TYPE) metricAddrBlkTlv.typeExtension := outRREQ.MetricType; 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 */ }
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 */ }
/* 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) 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); }
Regenerate_RREP(inRREP, rte) { if (rte does not exist) { Generate_RERR(inRREP); return; } outRREP.HopLimit := inRREP.HopLimit - 1; if (outRREP.HopLimit == 0) /* don't regenerate */ return; if (inRREP.HopCount exists) { if (inRREP.HopCount >= MAX_HOPCOUNT) return; // don't regenerate the RREP outRREP.HopCount := inRREP.HopCount + 1; } /* 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 */ }
/* 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 */ }
Receive_RREP_Ack(inRREP_Ack) { /* cancel timeout event for the node sending RREP_Ack */ }
Timeout_RREP_Ack(outRREP) { if (numRetries < RREP_RETRIES) /* resend RREP and double the previous timeout */ else /* insert unresponsive node into blacklist */ }
There are two parts to this function, based on whether it was triggered by an undeliverable packet or a broken link to neighboring AODVv2 router.
/* Generate a Route Error message. errorType := undeliverablePacket or brokenLink */ Generate_RERR(errorType, triggerPkt, brokenLinkNbrIp) { switch (errorType) { case (brokenLink): doGenerate := FALSE; num-broken-addr := 0; 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 */ }
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) < 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); }
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 */ }
This section lists the changes between AODVv2 revisions ...-11.txt and ...-12.txt.
This section lists the changes between AODVv2 revisions ...-10.txt and ...-11.txt.
This section lists the changes between AODVv2 revisions ...-09.txt and ...-10.txt.
This section lists the changes between AODVv2 revisions ...-08.txt and ...-09.txt.
This section lists the changes between AODVv2 revisions ...-07.txt and ...-08.txt.
This section lists the changes since AODVv2 revision ...-06.txt
This section lists the changes between AODVv2 revisions ...-05.txt and ...-06.txt.
This section lists the changes between AODVv2 revisions ...-04.txt and ...-05.txt.
This section lists the changes between AODVv2 revisions ...-03.txt and ...-04.txt.
This section lists the changes between AODVv2 revisions ...-02.txt and ...-03.txt.