<?xml version="1.0" encoding="US-ASCII"?>

<?rfc toc="yes"?>
<?rfc tocompact="yes"?>
<?rfc tocdepth="4"?>
<?rfc tocindent="yes"?>
<?rfc symrefs="yes"?>
<!-- use symbolic references tags, i.e, [RFC2119] instead of [1] -->
<?rfc sortrefs="yes" ?>
<!-- sort the reference entries alphabetically -->
<!-- control vertical white space
     (using these PIs as follows is recommended by the RFC Editor) -->
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc compact="yes" ?>
<!-- do not start each main section on a new page -->
<?rfc subcompact="no" ?>
<!-- keep one blank line between list items -->
<?rfc strict="yes" ?>
<!-- give errors regarding ID-nits and DTD validation -->
<rfc category="std" docName="draft-perkins-manet-aodvv2-04" ipr="trust200902"
	submissionType="IETF" consensus="true"
        xmlns:xi="http://www.w3.org/2001/XInclude">
  <front>
    <title abbrev="AODVv2">
	Ad Hoc On-demand Distance Vector Version 2 (AODVv2) Routing</title>

    <author fullname="Charles E. Perkins" initials="C.E." surname="Perkins">
      <organization abbrev="Blue Meadow Networks">
                            Blue Meadow Networks</organization>
      <address>
        <postal>
          <street>12450 Blue Meadow Ct</street>
          <city>Saratoga</city>
          <code>95070</code>
          <region>CA</region>
          <country>USA</country>
        </postal>
        <phone>+1-408-223-9223</phone>
        <email>charliep@computer.org</email>
      </address>
    </author>
    <author fullname="John Dowdell" initials="J." surname="Dowdell">
      <organization>Airbus Defence and Space</organization>
      <address>
        <postal>
          <street>Celtic Springs</street>
          <city>Newport, Wales</city>
<!-- (50) Postal address part filled in, but not used: <region>: Wales -->
<!--      <region>Wales</region>  -->
          <code>NP10 8FZ</code>
          <country>United Kingdom</country>
        </postal>
        <email>john.dowdell.ietf@gmail.com</email>
      </address>
    </author>
    <author fullname="Lotte Steenbrink" initials="L." surname="Steenbrink">
      <organization>Freie Universitaet Berlin</organization>
      <address>
        <postal>
          <street>Kaiserswerther Str. 16-18</street>
          <city>D-14195 Berlin</city>
          <country>Germany</country>
        </postal>
        <email>lotte.steenbrink@fu-berlin.de</email>
      </address>
    </author>
    <author fullname="Victoria Pritchard" initials="V." surname="Pritchard">
      <organization>Airbus Defence and Space</organization>
      <address>
        <postal>
          <street>Celtic Springs</street>
          <city>Newport, Wales</city>
<!--           <region>Wales</region>  -->
          <code>NP10 8FZ</code>
          <country>United Kingdom</country>
        </postal>
        <email>pritchardv0@gmail.com</email>
      </address>
    </author>

    <date year=""/>

    <area>Routing</area>
    <keyword>RFC</keyword>
    <keyword>Request for Comments</keyword>
    <keyword>I-D</keyword>
    <keyword>Internet-Draft</keyword>
    <keyword>XML</keyword>
    <keyword>reactive protocol</keyword>
	<abstract>
<!-- This document was prepared using Pandoc2rfc, https://github.com/miekg/pandoc2rfc -->

  
<t>
  The Ad Hoc On-demand Distance Vector Version 2 (AODVv2) routing
  protocol is intended for use by mobile routers in wireless, multihop
  networks. AODVv2 determines unicast routes among AODVv2 routers within
  the network in an on-demand fashion.
  
</t>

	</abstract>
	</front>
	<middle>
<!-- This document was prepared using Pandoc2rfc, https://github.com/miekg/pandoc2rfc -->

  



<section title="Overview" anchor="overview">
  
  <t>
    The Ad hoc On-Demand Distance Vector Version 2 (AODVv2) protocol
    enables dynamic, multihop routing between participating mobile
    routers wishing to establish and maintain an ad hoc network. The
    basic operations of the AODVv2 protocol are route discovery and
    route maintenance. AODVv2 does not require nodes to maintain routes
    to destinations that are not in active communication. AODVv2 allows
    mobile nodes to respond to link breakages and changes in network
    connectivity.
  </t>
  <section title="Distance Vector Routing Protocols" anchor="dv">
    
    <t>
      AODVv2 is a distance-vector routing protocol, which means that
      routes are stored with information about the next hop (vector for
      forwarding) and the metric or cost of using the route (a
      "distance" to the destination along that route).
      Typically, if multiple routes to a particular destination are
      available to be selected, the route with the least cost (e.g.,
      shortest distance) is chosen for the purpose of forwarding packets
      to that destination. Distance-vector (Bellman-Ford) routing
      protocols were historically vulnerable to what became known as the
      "counting to infinity" problem. That problem causes
      routes to grow quickly worse over time, and results from a
      router's inability to detect out-of-sequence routing updates and
      subsequent retransmission of stale information. AODVv2 uses
      sequence numbers to assure detection of stale routing information,
      as was done previously in DSDV and as described in
      <xref target="Perkins94"/>. The operation of AODVv2 is
      consequently loop-free and offers quick convergence when the ad
      hoc network topology changes (typically, when a node moves in the
      network). When links break, AODVv2 causes the affected set of
      nodes to be notified so that they are able to invalidate the
      routes using the broken link.
    </t>
    <t>
      AODVv2 stores a destination sequence number for each route entry.
      The destination sequence number is created by the destination to
      be included along with any route information it sends to
      requesting nodes. Using destination sequence numbers ensures loop
      freedom and is simple to program. Given the choice between two
      routes to a destination, a requesting node is required to select
      the one with the greatest sequence number.
    </t>
    
  </section>
  <section title="Basic Protocol Mechanisms" anchor="basic">
    
    <t>
      The basic protocol mechanisms are as follows. AODVv2 is a reactive
      protocol, meaning that route discovery is initiated only when a
      route to the target is needed (i.e. when a router's client has
      data to send (see <xref target="clients"/>)). For this
      purpose, AODVv2 uses Route Request (RREQ) and Route Reply (RREP)
      messages as follows: an RREQ is distributed across the network.
      Routers (other than the target) receiving the RREQ retransmit it
      and also store a reverse route back to the originator of the RREQ.
    </t>
    <figure anchor="rreq_flood" align="center" title="Flooding a RREQ through the network"><artwork align="center">
  :  /  \ :
  | /    \|                \
- S ----- A ---...          \              M-----D
  |      / \           /-----J---...      /
  :     /   \ /       /      /|\         /
        :   -B-------/      / : \       /
             |                   K-----L--....
             :                   |    /|
</artwork></figure>
    <t>
      
    </t>
    <t>
      In figure <xref target="rreq_flood"/>, node 'S' needs to
      discover a route to a desired destination node 'D'. S generates a
      RREQ to be flooded throughout the network. The RREQ traverses
      nodes A, B, J, K, L, and M before finally arriving at the target
      node D. The RREQ will also most likely be received and
      retransmitted by many other nodes in the network. Each
      intermediate node that receives the RREQ stores a reverse route
      back to node S so that communication between S and D can be
      established in case that intermediate node receives a RREP in
      response to the RREQ.
    </t>
    <t>
      When the target receives the RREQ, it answers with an RREP, which
      is then relayed back to the originator along the path stored by
      the intermediate routers. A metric value is included within the
      messages to indicate the cost of the route.
    </t>
    <figure anchor="rrep_reverse" align="center" title="D sends a RREP back to the node S"><artwork align="center">
 S &lt;--- A &lt;--- B &lt;--- J &lt;--- K &lt;--- L &lt;--- M &lt;--- D
</artwork></figure>
    <t>
      
    </t>
    <t>
      In figure <xref target="rrep_reverse"/>, node 'D' transmits
      a RREP back towards S. Node M has stored a route back to S by way
      of node L. Node L has stored a route back to S by way of node K,
      and so on. Also, each node that receives the RREP uses the
      information in the RREP to store a route to node 'D'. For
      instance, the RREP contains the metric describing the cost of the
      route from an intermediate node X to node D, as well as
      information about the next hop towards D -- namely, the node which
      transmitted the RREP to X.
    </t>
    <t>
      AODVv2 uses sequence numbers as described above to identify stale
      routing information, and compares route metric values to determine
      if advertised routes could form loops. Route maintenance includes
      confirming bidirectionality of links to next-hop AODVv2 routers,
      managing route timeouts, using Route Error (RERR) messages to
      inform other routers of broken links, and reacting to received
      Route Error messages.
    </t>
    <t>
      AODVv2 requires indications to be exchanged between AODVv2 and the
      forwarding subsystem for the following conditions:
    </t>
    <t><list style="symbols">
      <t>
        
          a packet needs to be forwarded and a route needs to be
          discovered (this happens because of the on-demand nature of
          AODVv2)
        
      </t>
      <t>
        
          packet forwarding fails, in order to report a route error
        
      </t>
      <t>
        
          packet forwarding succeeds, in order to manage route timeouts.
        
      </t>
    </list></t>
    <t>
      Security for authentication of AODVv2 routers and encryption of
      control messages is accomplished using the TIMESTAMP and ICV TLVs
      defined in <xref target="RFC7182"/>.
      
    </t>
  </section>
  <section title="Comparison to RFC 3561" anchor="compare">
    
    <t>
      AODVv2 operates in a fashion very similar to
      AODV<xref target="RFC3561"/>. The mechanism for route
      discovery is basically the same, so that similar performance
      results can be expected. Compared to AODV, AODVv2 has moved some
      features out of the scope of the document, notably intermediate
      route replies, and expanding ring search. However, this document
      has been designed to allow specification of those features in a
      separate document.
    </t>
    <t>
      AODVv2 control messages are defined as sets of data. As described
      in <xref target="represent"/>, these sets of data can be
      mapped to message elements using the Generalized MANET
      Packet/Message Format defined in <xref target="RFC5444"/>
      and sent using the parameters in <xref target="RFC5498"/>.
      Additional refinements have been made for route timeouts and state
      management. Other mappings for the sets of data for the control
      messages are possible.
    </t>
    <t>
      Compared to AODV<xref target="RFC3561"/>, the following
      protocol mechanisms have changed:
    </t>
    <t><list style="symbols">
      <t>
        
          Verification of link bidirectionality has been substantially
          improved
        
      </t>
      <t>
        
          Alternate metrics may be used to determine route quality
        
      </t>
      <t>
        
          Support for multiple interfaces has been improved
        
      </t>
      <t>
        
          Support for multi-interface IP addresses has been added
        
      </t>
      <t>
        
          A new security model allowing end to end integrity checks has
          been added
        
      </t>
      <t>
        
          Message formats have been updated and made compliant with
          <xref target="RFC5444"/>.
        
      </t>
      <t>
        
          Hello messages and local repair have been removed.
        
      </t>
      <t>
        
          Multihoming is supported.
        
      </t>
    </list></t>
    <t>
      AODVv2 has not been designed to be interoperable with AODV.
      However, it would be straightforward to allow both protocols to be
      used in the same ad hoc network as long as compatible metrics were
      used.
    </t>
  </section>
</section>
<section title="Terminology" anchor="term">
  
  <t>
    The key words "MUST", "MUST NOT",
    "REQUIRED", "SHALL", "SHALL NOT",
    "SHOULD", "SHOULD NOT", "RECOMMENDED",
    "NOT RECOMMENDED", "MAY", and
    "OPTIONAL" in this document are to be interpreted as
    described in <xref target="RFC2119"/>. The names of the
    protocol messages in AODVv2 are chosen to conform to the names of
    the similar protocol messages in <xref target="RFC3561"/>. In
    addition, this document uses terminology from
    <xref target="RFC5444"/>, and defines the following terms:
  </t>
  <t><list style="hanging">
    <t hangText="Address Block">
        
          <vspace/>An AddressList along with address type for each
          address (see <xref target="represent"/>).
        
      </t>
    <t hangText="AddressList">
        
          <vspace/>A list of IP addresses as used in AODVv2 messages.
          The IP address family is determined, for instance, by
          parameter choice in <xref target="RFC5444"/>, or other
          shim layer between AODVv2 and the network layer.
        
      </t>
    <t hangText="AckReq">
        
          <vspace/>Used in a Route Reply Acknowledgement message to
          indicate that a Route Reply Acknowledgement is expected in
          return (see <xref target="rrep_ack_msgs"/>).
        
      </t>
    <t hangText="AdvRte">
        
          <vspace/>A route advertised in an incoming route message (RREQ
          or RREP).
        
      </t>
    <t hangText="AODVv2 Router">
        
          <vspace/>An IP addressable device in the ad hoc network that
          performs the AODVv2 protocol operations specified in this
          document.
        
      </t>
    <t hangText="CurrentTime">
        
          <vspace/>The current time as maintained by the AODVv2 router.
        
      </t>
  </list></t>
  
  
  
  <t><list style="hanging">
    <t hangText="Invalid route">
        
          <vspace/>A route that cannot be used for forwarding but still
          contains useful sequence number information.
        
      </t>
    <t hangText="LocalRoute">
        
          <vspace/>An entry in the Local Route Set as defined in
          <xref target="rte"/>.
        
      </t>
    <t hangText="MANET">
        
          <vspace/>A Mobile Ad Hoc Network as defined in
          <xref target="RFC2501"/>.
        
      </t>
    <t hangText="MetricType">
        
          <vspace/>The metric type for a metric value included in a
          message (see <xref target="iana-metric-type"/>).
        
      </t>
    <t hangText="MetricTypeList">
        
          <vspace/>A list of metric types associated with the addresses
          in the AddressList of a Route Error message.
        
      </t>
    <t hangText="Neighbor">
        
          <vspace/>An AODVv2 router from which an RREQ or RREP message
          has been received. Neighbors exchange routing information and
          verify bidirectionality of the link to a neighbor before
          installing a route via that neighbor into the Local Route Set.
        
      </t>
    <t hangText="OrigAddr">
        
          <vspace/>The source IP address of the IP packet triggering
          route discovery.
        
      </t>
    <t hangText="OrigMetric">
        
          <vspace/>The metric value associated with the route to
          OrigPrefix.
        
      </t>
    <t hangText="OrigPrefix">
        
          <vspace/>The prefix configured in the Router Client Set entry
          which includes OrigAddr.
        
      </t>
    <t hangText="OrigPrefixLen">
        
          <vspace/>The prefix length, in bits, configured in the Router
          Client Set entry which includes OrigAddr.
        
      </t>
    <t hangText="OrigSeqNum">
        
          <vspace/>The sequence number of the AODVv2 router which
          originated the Route Request on behalf of OrigAddr.
        
      </t>
    <t hangText="PktSource">
        
          <vspace/>The source address of the IP packet that triggered a
          Route Error message.
        
      </t>
    <t hangText="PrefixLengthList">
        
          <vspace/>A list of routing prefix lengths associated with the
          addresses in the AddressList of a message.
        
      </t>
    <t hangText="Reactive">
        
          <vspace/>Performed only in reaction to specific events. In
          AODVv2, routes are requested only when data packets need to be
          forwarded. In this document, "reactive" is
          synonymous with "on-demand".
        
      </t>
    <t hangText="RERR (Route Error)">
        
          <vspace/>The AODVv2 message type used to indicate that an
          AODVv2 router does not have a valid LocalRoute toward one or
          more destinations.
        
      </t>
    <t hangText="RERR_Gen (RERR Generating Router)">
        
          <vspace/>The AODVv2 router generating a Route Error message.
        
      </t>
    <t hangText="RerrMsg (RERR Message)">
        
          <vspace/>A Route Error (RERR) message.
        
      </t>
    <t hangText="Routable Unicast IP Address">
        
          <vspace/>A unicast IP address that is scoped sufficiently to
          be forwarded by a router. Globally-scoped unicast IP addresses
          and Unique Local Addresses (ULAs)
          <xref target="RFC4193"/> are examples of routable
          unicast IP addresses.
        
      </t>
    <t hangText="Router Client">
        
          <vspace/>An address within an address range configured on an
          AODVv2 router, on behalf of which that router will initiate
          and respond to route discoveries. These addresses may be used
          by the AODVv2 router itself or by devices that are reachable
          without traversing another AODVv2 router.
        
      </t>
    <t hangText="RREP (Route Reply)">
        
          <vspace/>The AODVv2 message type used to reply to a Route
          Request message.
        
      </t>
    <t hangText="RREP_Gen (RREP Generating Router)">
        
          <vspace/>The AODVv2 router that generates the Route Reply
          message, i.e., the router configured with TargAddr as a Router
          Client.
        
      </t>
    <t hangText="RREQ (Route Request)">
        
          <vspace/>The AODVv2 message type used to discover a route to
          TargAddr and distribute information about a route to
          OrigPrefix.
        
      </t>
    <t hangText="RREQ_Gen (RREQ Generating Router)">
        
          <vspace/>The AODVv2 router that generates the Route Request
          message, i.e., the router configured with OrigAddr as a Router
          Client.
        
      </t>
    <t hangText="RteMsg (Route Message)">
        
          <vspace/>A Route Request (RREQ) or Route Reply (RREP) message.
        
      </t>
    <t hangText="SeqNum">
        
          <vspace/>The sequence number maintained by an AODVv2 router to
          indicate freshness of route information.
        
      </t>
    <t hangText="SeqNumList">
        
          <vspace/>A list of sequence numbers associated with the
          addresses in the AddressList of a message.
        
      </t>
    <t hangText="TargAddr">
        
          <vspace/>The target address of a route request, i.e., the
          destination address of the IP packet triggering route
          discovery.
        
      </t>
    <t hangText="TargMetric">
        
          <vspace/>The metric value associated with the route to
          TargPrefix.
        
      </t>
    <t hangText="TargPrefix">
        
          <vspace/>The prefix configured in the Router Client Set entry
          which includes TargAddr.
        
      </t>
    <t hangText="TargPrefixLen">
        
          <vspace/>The prefix length, in bits, configured in the Router
          Client Set entry which includes TargAddr.
        
      </t>
    <t hangText="TargSeqNum">
        
          <vspace/>The sequence number of the AODVv2 router which
          originated the Route Reply on behalf of TargAddr.
        
      </t>
    <t hangText="Unreachable Address">
        
          <vspace/>An address reported in a Route Error message, as
          described in <xref target="RERR_gen"/>.
        
      </t>
    <t hangText="Upstream">
        
          <vspace/>In the direction from destination to source (from
          TargAddr to OrigAddr).
        
      </t>
    <t hangText="Valid route">
        
          <vspace/>A route that can be used for forwarding.
        
      </t>
  </list></t>
  <t>
    This document uses the notational conventions in
    <xref target="conventions"/> to simplify the text.
  </t>
  <texttable anchor="conventions" align="center" title="Notational Conventions">
    
      
      
      
        
          <ttcol align="left">
            Notation
          </ttcol>
          <ttcol align="left">
            Meaning
          </ttcol>
        
      
      
        
          <c>
            Route[Address]
          </c>
          <c>
            A route toward Address
          </c>
        
        
          <c>
            Route[Address].Field
          </c>
          <c>
            A field in a route toward Address
          </c>
        
        
          <c>
            McMsg.Field
          </c>
          <c>
            A field in a Multicast Message entry
          </c>
        
        
          <c>
            RteMsg.Field
          </c>
          <c>
            A field in either RREQ or RREP
          </c>
        
        
          <c>
            RerrMsg.Field
          </c>
          <c>
            A field in a RERR
          </c>
        
      
    
  </texttable>
  <t>
    
  </t>
</section>
<section title="Applicability Statement" anchor="apply">
  
  <t>
    The AODVv2 routing protocol is a reactive routing protocol designed
    for use in mobile ad hoc wireless networks, and may also be useful
    in networks where the nodes are not mobile but economical route
    maintenance is still required. A reactive protocol only sends
    messages to discover a route when there is data to send on that
    route. This requires an interaction with the forwarding plane, to
    indicate when a packet is to be forwarded, in case reactive route
    discovery is needed. The set of signals exchanged between AODVv2 and
    the forwarding plane are discussed in
    <xref target="fwdplane"/>.
  </t>
  <t>
    AODVv2 is designed for stub or disconnected mobile ad hoc networks,
    i.e., non-transit networks or those not connected to the internet.
    AODVv2 routers can, however, be configured to perform gateway
    functions when attached to external networks, as discussed in
    <xref target="gateway"/>.
  </t>
  <t>
    AODVv2 handles a wide variety of mobility and traffic patterns by
    determining routes on-demand. In networks with a large number of
    routers, AODVv2 is best suited for relatively sparse traffic
    scenarios where each router forwards IP packets to a small
    percentage of destination addresses in the network. In such cases
    fewer routes are needed, and far less control traffic is produced.
    In large networks with dense traffic patterns, AODVv2 control
    messages may cause a broadcast storm, overwhelming the network with
    control messages. The transmission priorities described in
    <xref target="MsgXmit"/> prioritize route maintenance traffic
    over route discovery traffic.
  </t>
  <t>
    Data packets may be buffered until a route to their destination is
    available, as described in <xref target="route_discovery"/>.
  </t>
  <t>
    AODVv2 is well suited to reactive scenarios such as emergency and
    disaster relief, where the ability to communicate might be more
    important than being assured of secure operations. For many other ad
    hoc networking applications, in which insecure operation could
    negate the value of establishing communication paths, it is
    important for neighboring AODVv2 routers to establish security
    associations with one another.
  </t>
  <t>
    AODVv2 provides for message integrity and security against replay
    attacks by using integrity check values, timestamps and sequence
    numbers, as described in <xref target="Security"/>. When
    security associations have been established, encryption can be used
    for AODVv2 messages to ensure that only trusted routers participate
    in routing operations.
  </t>
  <t>
    The AODVv2 route discovery process aims for a route to be
    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 optimized for the
    requesting router, and the return path may not be the optimal route.
  </t>
  
  
  
  <t>
    AODVv2 is applicable to memory constrained devices, since only a
    little routing state is maintained in each AODVv2 router. AODVv2
    routes that are not needed for forwarding data do not need to be
    maintained.
  </t>
  
  <t>
    AODVv2 supports routers with multiple interfaces and multiple IP
    addresses per interface. A router may also use the same IP address
    on multiple interfaces. AODVv2 requires only that each interface
    configured for AODVv2 has at least one unicast IP address (see
    <xref target="interfaceslist"/>). Address assignment
    procedures are out of scope for AODVv2.
  </t>
  
  <t>
    AODVv2 supports Router Clients with multiple interfaces, as long as
    each Client interface is configured with its own unicast IP address.
  </t>
  
  <t>
    The routing algorithm in AODVv2 has been operated at layers other
    than the network layer, using layer-appropriate addresses.
  </t>
  
  
  
  
  
  
  
  
</section>
<section title="Data Structures" anchor="data-structures">
  
  
  <section title="Network Interfaces used by AODVv2" anchor="interfaceslist">
    
    <t>
      AODVv2 has to maintain information about all network interfaces
      configured for sending or receiving AODVv2 messages. Any interface
      with an IP address can be used. Multiple interfaces on a single
      router can be used. Multiple interfaces on the same router may be
      configured with the same IP address; in this case, sufficient
      information about those network interfaces has to be maintained by
      the AODVv2 router in order to determine which of them has received
      an incoming AODVv2 message. For instance, it is often possible to
      determine the incoming interface by inspecting the MAC address of
      the layer-2 frame header.
    </t>
    
  </section>
  <section title="Router Client Set" anchor="clients">
    
    <t>
      An AODVv2 router discovers routes for its own local applications
      and also for its Router Clients that are reachable without
      traversing another AODVv2 router. The addresses used by these
      devices, and the AODVv2 router itself, are configured in the
      Router Client Set. An AODVv2 router will only originate Route
      Request and Route Reply messages on behalf of its configured
      Router Client addresses.
    </t>
    <t>
      Router Client Set entries are configured manually or by mechanisms
      out of scope for this document. Each client's entry contains:
    </t>
    <t><list style="hanging">
      <t hangText="RouterClient.IPAddress">
          
            <vspace/>An IP address or the start of an address range that
            requires route discovery services from the AODVv2 router.
          
        </t>
      <t hangText="RouterClient.PrefixLength">
          
            <vspace/>The length, in bits, of the routing prefix
            associated with the RouterClient.IPAddress. If the prefix
            length is not equal to the address length of
            RouterClient.IPAddress, the AODVv2 router MUST participate
            in route discovery on behalf of all addresses within that
            prefix.
          
        </t>
      <t hangText="RouterClient.Cost">
          
            <vspace/>The cost associated with reaching the client's
            address or address range.
          
        </t>
    </list></t>
  </section>
  <section title="Neighbor Set" anchor="nbrlist">
    
    <t>
      A Neighbor Set is used to maintain information about neighboring
      AODVv2 routers. Neighbor Set entries are stored when AODVv2
      messages are received. If the Neighbor is chosen as a next hop on
      an installed route, the link to the Neighbor is tested for
      bidirectionality; the result is stored in the Neighbor Set.
    </t>
    <t>
      Neighbor Set entries MUST contain:
    </t>
    <t><list style="hanging">
      <t hangText="Neighbor.IPAddress">
          
            <vspace/>An IP address of the neighboring router.
          
        </t>
      <t hangText="Neighbor.State">
          
            <vspace/>Indicates whether the link to the neighbor is
            bidirectional. There are three possible states: CONFIRMED,
            HEARD, and BLACKLISTED. HEARD is the initial state.
            CONFIRMED indicates that the link to the neighbor has been
            confirmed as bidirectional. BLACKLISTED indicates that the
            link to the neighbor is being treated as uni-directional.
            <xref target="nexthopmonitoring"/> discusses how to
            monitor link bidirectionality.
          
        </t>
      <t hangText="Neighbor.Timeout">
          
            <vspace/>Indicates the time at which the Neighbor.State
            should be updated:
          
        </t>
    </list></t>
    <t><list style="symbols">
      <t>
        
          If the value of Neighbor.State is BLACKLISTED, this indicates
          the time at which Neighbor.State will revert to HEARD. This
          value is calculated at the time the router is blacklisted and
          by default is equal to CurrentTime + MAX_BLACKLIST_TIME.
        
      </t>
      <t>
        
          If Neighbor.State is HEARD, and an RREP_Ack has been requested
          from the neighbor, it indicates the time at which
          Neighbor.State will be set to BLACKLISTED, if an RREP_Ack has
          not been received.
        
      </t>
      <t>
        
          If the value of Neighbor.State is HEARD and no RREP_Ack has
          been requested, or if Neighbor.State is CONFIRMED, this time
          is set to INFINITY_TIME.
        
      </t>
    </list></t>
    <t><list style="hanging">
      <t hangText="Neighbor.Interface">
          
            <vspace/>The interface on which the link to the neighbor was
            established.
          
        </t>
    </list></t>
    
    
    <t><list style="hanging">
      <t hangText="Neighbor.AckSeqNum">
          
            <vspace/>The next sequence number to use for the TIMESTAMP
            value in an RREP_Ack request, in order to detect replay of
            an RREP_Ack response. AckSeqNum is initialized to a random
            value.
          
        </t>
      <t hangText="Neighbor.HeardRERRSeqNum">
          
            <vspace/>The last heard sequence number used as the
            TIMESTAMP value in a RERR received from this neighbor, saved
            in order to detect replay of a RERR message. HeardRERRSeqNum
            is initialized to zero.
          
        </t>
    </list></t>
    
    <t>
      See <xref target="securing-rrepack"/> and
      <xref target="securing-rerr"/> for more information on how
      Neighbor.AckSeqNum and Neighbor.HeardRERRSeqNum are used.
    </t>
  </section>
  <section title="Sequence Numbers" anchor="seqnum">
    
    <t>
      Sequence Numbers enable AODVv2 routers to determine the temporal
      order of route discovery messages that originate from a AODVv2
      router, and thus to identify stale routing information so that it
      can be discarded. The sequence number fulfills the same roles as
      the "Destination Sequence Number" of DSDV
      <xref target="Perkins94"/>, and the AODV Sequence Number in
      <xref target="RFC3561"/>. The sequence numbers from two
      different routers are not comparable; route discovery messages
      with sequence numbers belonging to two different routers cannot be
      compared to determine temporal ordering.
    </t>
    <t>
      Each AODVv2 router in the network MUST maintain its own sequence
      number. All RREQ and RREP messages created by an AODVv2 router
      include the router's sequence number, reported as a 16-bit
      unsigned integer. Each AODVv2 router MUST ensure that its sequence
      number is strictly increasing, and that 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) to achieve wrap around.
      The value zero (0) is reserved to indicate that the router's
      sequence number is unknown.
    </t>
    <t>
      An AODVv2 router MUST use its sequence number only on behalf of
      its configured Router Clients; route messages forwarded by other
      routers retain the originator's sequence number.
    </t>
    <t>
      To determine if newly received information is stale and therefore
      redundant compared to other information originated by the same
      router, the sequence number attached to the information is
      compared to the sequence number of existing information about the
      same route. The comparison is carried out by subtracting the
      existing sequence number from the newly received sequence number,
      using unsigned arithmetic. The result of the subtraction is to be
      interpreted as a signed 16-bit integer.
    </t>
    <t><list style="symbols">
      <t>
        
          If the result is negative, the newly received information is
          considered older than the existing information and therefore
          stale and redundant and MUST therefore be discarded.
        
      </t>
      <t>
        
          If the result is positive, the newly received information is
          newer than the existing information and is not considered
          stale or redundant and MUST therefore be processed.
        
      </t>
      <t>
        
          If the result is zero, the newly received information is not
          considered stale, and therefore MUST be processed further in
          case the new information offers a better route (see
          <xref target="test"/> and
          <xref target="suppress"/>).
        
      </t>
    </list></t>
    
    <t>
      Along with the algorithm in <xref target="test"/>,
      maintaining temporal ordering ensures loop freedom.
    </t>
    <t>
      An AODVv2 router SHOULD maintain its sequence number in persistent
      storage. 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 (by default, on the order of minutes) before the router
      can resume full operations. If the sequence number is lost, the
      router MUST follow the procedure in <xref target="reboot"/>
      to safely resume routing operations with a new sequence number.
    </t>
  </section>
  <section title="Local Route Set" anchor="rte">
    
    <t>
      All AODVv2 routers MUST maintain a Local Route Set, containing
      information obtained from AODVv2 route messages. The Local Route
      Set may be considered to be stored separately from the forwarding
      plane's routing table (referred to as Routing Information Base
      (RIB)), which may be updated by other routing protocols operating
      on the AODVv2 router as well. The Routing Information Base is
      updated using information from the Local Route Set. Alternatively,
      if the information specified below can be added to RIB entries,
      implementations MAY choose to modify the Routing Information Base
      directly instead of maintaining a dedicated Local Route Set. In
      this case, since the route table entry is accessed whenever a
      packet uses the route, the LastUsed (see below) field can be
      tested to determine the state of the route, including whether or
      not the route has timed out. For example, if CurrentTime is less
      than LocalRoute.LastUsed + ACTIVE_INTERVAL + MAX_IDLETIME, a valid
      route can still be used to forward the packet. Otherwise, the
      route has timed out, and the state of the route MUST be changed to
      be Invalid. When this method of managing route timeouts can be
      used, AODVv2 does not otherwise require the implementation to
      maintain a timer interrupt. This may be considered an
      "on-demand" method for managing route timeouts.
    </t>
    <t>
      Routes obtained from AODVv2 route messages are referred to in this
      document as LocalRoutes, and MUST contain the following
      information:
    </t>
    <t><list style="hanging">
      <t hangText="LocalRoute.Address">
          
            <vspace/>An address, which, when combined with
            LocalRoute.PrefixLength, describes the set of destination
            addresses for which this route enables forwarding.
          
        </t>
      <t hangText="LocalRoute.PrefixLength">
          
            <vspace/>The prefix length, in bits, associated with
            LocalRoute.Address.
          
        </t>
      <t hangText="LocalRoute.SeqNum">
          
            <vspace/>The sequence number associated with
            LocalRoute.Address, obtained from the last route message
            that successfully updated this entry.
          
        </t>
      <t hangText="LocalRoute.NextHop">
          
            <vspace/>The source IP address of the IP packet containing
            the AODVv2 message advertising the route to
            LocalRoute.Address, i.e., an IP address of the AODVv2 router
            used for the next hop on the path toward LocalRoute.Address.
          
        </t>
      <t hangText="LocalRoute.NextHopInterface">
          
            <vspace/>The interface used to send IP packets toward
            LocalRoute.Address.
          
        </t>
      <t hangText="LocalRoute.LastUsed">
          
            <vspace/>If this route is installed in the Routing
            Information Base, the time it was last used to forward an IP
            packet. If not, the time at which the LocalRoute was
            created.
          
        </t>
      <t hangText="LocalRoute.LastSeqNumUpdate">
          
            <vspace/>The time LocalRoute.SeqNum was last updated.
          
        </t>
      <t hangText="LocalRoute.MetricType">
          
            <vspace/>The type of metric associated with this route. See
            <xref target="metrics"/> for information about
            AODVv2's handling of multiple metric types.
          
        </t>
      <t hangText="LocalRoute.Metric">
          
            <vspace/>The cost of the route toward LocalRoute.Address
            expressed in units consistent with LocalRoute.MetricType.
          
        </t>
      <t hangText="LocalRoute.Precursors (optional feature)">
          
            <vspace/>A list of upstream neighbors using the route (see
            <xref target="precursor"/>).
          
        </t>
      <t hangText="LocalRoute.SeqNoRtr">
          
            <vspace/>If nonzero, the IP address of the router that
            originated the Sequence Number for this route.
          
        </t>
      <t hangText="LocalRoute.State">
          
            <vspace/>The last known state (Unconfirmed, Idle, Active, or
            Invalid) of the route.
          
        </t>
    </list></t>
    <t>
      There are four possible states for a LocalRoute:
    </t>
    <t><list style="hanging">
      <t hangText="Unconfirmed">
          
            <vspace/>A route obtained from a Route Request message,
            which has not yet been confirmed as bidirectional. It MUST
            NOT be stored in the RIB to forward general data-plane
            traffic, but it can be used to transmit RREP packets along
            with a request for bidirectional link verification. An
            Unconfirmed route is not otherwise considered a valid route.
            This state is only used for routes obtained through RREQ
            messages.
          
        </t>
      <t hangText="Idle">
          
            <vspace/>A route that has been confirmed to be
            bidirectional, but has not been used in the last
            ACTIVE_INTERVAL. It can be used for forwarding IP packets,
            and therefore it is considered a valid route.
          
        </t>
      <t hangText="Active">
          
            <vspace/>A valid route that has been used for forwarding IP
            packets during the last ACTIVE_INTERVAL.
          
        </t>
      <t hangText="Invalid">
          
            <vspace/>A route that has expired or has broken. It MUST NOT
            be used for forwarding IP packets. Invalid routes contain
            the destination's sequence number, which may be useful when
            assessing freshness of incoming routing information.
          
        </t>
    </list></t>
    <t>
      If the Local Route Set is stored separately from the RIB, then
      routes are added to the RIB when LocalRoute.State becomes Active,
      and removed from the RIB when LocalRoute.State becomes Invalid.
      Changes to LocalRoute state are detailed in
      <xref target="routestatechanges"/>.
    </t>
  </section>
  <section title="Multicast Message Set" anchor="mcmsgtable">
    
    <t>
      Multicast RREQ messages SHOULD be tested for redundancy to avoid
      unnecessary processing and forwarding.
    </t>
    <t>
      The Multicast Message Set is a conceptual set which contains
      information about previously received multicast messages, so that
      incoming messages can be compared with previously received
      messages to determine if the incoming information is redundant or
      stale, so that the router can avoid sending redundant control
      traffic.
    </t>
    <t>
      Multicast Message Set entries contain the following information:
    </t>
    <t><list style="hanging">
      <t hangText="McMsg.OrigPrefix">
          
            <vspace/>The prefix associated with OrigAddr, the source
            address of the IP packet triggering the RREQ.
          
        </t>
      <t hangText="McMsg.OrigPrefixLen">
          
            <vspace/>The prefix length associated with McMsg.OrigPrefix,
            from the Router Client Set entry on RREQ_Gen which includes
            OrigAddr.
          
        </t>
      <t hangText="McMsg.TargPrefix">
          
            <vspace/>The prefix associated with TargAddr, the
            destination address of the IP packet triggering the route
            request. In an RREQ this MUST be set to TargAddr.
          
        </t>
      <t hangText="McMsg.OrigSeqNum">
          
            <vspace/>The sequence number associated with the route to
            OrigPrefix, if RteMsg is an RREQ.
          
        </t>
      <t hangText="McMsg.TargSeqNum">
          
            <vspace/>The sequence number associated with the route to
            TargPrefix.
          
        </t>
      <t hangText="McMsg.MetricType">
          
            <vspace/>The metric type of the route requested.
          
        </t>
      <t hangText="McMsg.Metric">
          
            <vspace/>The metric value received in the RteMsg.
          
        </t>
      <t hangText="McMsg.Timestamp">
          
            <vspace/>The last time this Multicast Message Set entry was
            updated.
          
        </t>
      <t hangText="McMsg.RemovalTime">
          
            <vspace/>The time at which this entry MUST be removed from
            the Multicast Route Message Set.
          
        </t>
    </list></t>
    
    <t><list style="hanging">
      <t hangText="McMsg.Interface">
          
            <vspace/>The interface on which the message was received.
          
        </t>
      <t hangText="McMsg.SeqNoRtr">
          
            <vspace/>If nonzero, the IP address of the router that
            originated the Sequence Number for this route.
          
        </t>
    </list></t>
    <t>
      The Multicast Message Set is maintained so that no two entries
      have the same OrigPrefix, OrigPrefixLen, TargPrefix, and
      MetricType. See <xref target="suppress"/> for details about
      updating this set.
    </t>
  </section>
  <section title="Route Error (RERR) Set" anchor="rerrtable">
    
    <t>
      Each RERR message sent because no route exists for packet
      forwarding SHOULD be recorded in a conceptual set called the Route
      Error (RERR) Set. Each entry contains the following information:
    </t>
    <t><list style="hanging">
      <t hangText="RerrMsg.Timeout">
          
            <vspace/>The time after which the entry SHOULD be deleted.
          
        </t>
      <t hangText="RerrMsg.UnreachableAddress">
          
            <vspace/>The UnreachableAddress reported in the AddressList
            of the RERR.
          
        </t>
      <t hangText="RerrMsg.PktSource:">
          
            <vspace/>The PktSource of the RERR (see
            <xref target="term"/>).
          
        </t>
    </list></t>
    <t>
      See <xref target="suppressrerr"/> for instructions on how
      to update the set.
    </t>
  </section>
</section>
<section title="Metrics" anchor="metrics">
  
  <t>
    Metrics measure a cost or quality associated with a route or a link,
    e.g., latency, delay, financial cost, energy, etc. Metric values are
    reported in Route Request and Route Reply messages.
  </t>
  <t>
    In Route Request messages, the metric describes the cost of the
    route from OrigPrefix to the router transmitting the Route Request.
    For RREQ_Gen, this is the cost associated with the Router Client Set
    entry which includes OrigAddr. For routers which forward the RREQ,
    this is the cost from OrigPrefix to the forwarding router, combining
    the metric value from the received RREQ 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 forwarding the
    Route Request message, and used to install a route to OrigPrefix.
  </t>
  <t>
    Similarly, in Route Reply messages, the metric reflects the cost of
    the route from TargPrefix to the router transmitting the Route
    Reply. For RREP_Gen, this is the cost associated with the Router
    Client Set entry which includes TargAddr. For routers which forward
    the RREP, this is the cost from TargPrefix to the forwarding router,
    combining the metric value from the received RREP 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
    forwarding the Route Reply message, and used to install a route to
    TargPrefix.
  </t>
  <t>
    When link metrics are symmetric, the cost of the routes installed in
    the Local Route Set at each router will be correct. This assumption
    is often inexact, but calculating incoming/outgoing metric data is
    outside of scope of this document. The route discovered is good for
    the requesting router, but the return path may not be the optimal
    route.
  </t>
  
  
  
  <t>
    AODVv2 enables the use of multiple metric types. Each route
    discovery attempt indicates the metric type which is requested for
    the route. Multiple valid routes may exist in the Local Route Set
    for the same address and prefix length but for different metric
    types. More than one route to a particular address and prefix length
    MUST NOT exist in the Routing Information Base unless each packet
    can be inspected to determine which route in the RIB has the proper
    metric type as required for that packet. Otherwise, only one route
    at a time to a particular address and prefix length may exist in the
    RIB. The algorithm used to inspect the packet and make the
    determination about which the routes should be installed in the
    Routing Information Base is outside the scope of AODVv2.
  </t>
  
  <t>
    For each MetricType, AODVv2 requires:
  </t>
  <t><list style="symbols">
    <t>
      
        A MetricType number, to indicate the metric type of a route.
        Currently allocated MetricType numbers are listed in
        <xref target="iana-metric-type"/>.
      
    </t>
    <t>
      
        A maximum value, denoted MAX_METRIC[MetricType]. This MUST
        always be the maximum expressible metric value of type
        MetricType. Field lengths associated with metric values are
        found in <xref target="iana-metric-type"/>. If the cost
        of a route exceeds MAX_METRIC[MetricType], the route cannot be
        stored and is ignored.
      
    </t>
    <t>
      
        A function for incoming link cost, denoted Cost(L). Using
        incoming link costs means that the route obtained has a metric
        accurate for the direction back towards the originating router.
      
    </t>
    <t>
      
        A function for route cost, denoted Cost(R).
      
    </t>
    <t>
      
        A function to analyze routes for potential loops based on metric
        information, denoted LoopFree(R1, R2). LoopFree verifies that a
        route R2 is not a sub-section of another route R1. An AODVv2
        router invokes LoopFree() as part of the process in
        <xref target="test"/>, when an advertised route (R1) and
        an existing LocalRoute (R2) have the same destination address,
        metric type, and sequence number. LoopFree returns FALSE to
        indicate that an advertised route is not to be used to update a
        stored LocalRoute, as it may cause a routing loop. In the case
        where the existing LocalRoute is Invalid, it is possible that
        the advertised route includes the existing LocalRoute and came
        from a router which did not yet receive notification of the
        route becoming Invalid, so the advertised route should not be
        used to update the Local Route Set, in case it forms a loop to a
        broken route.
      
    </t>
  </list></t>
  <t>
    AODVv2 currently supports cost metrics where Cost(R) is strictly
    increasing, by defining:
  </t>
  <t><list style="symbols">
    <t>
      
        Cost(R) := Sum of Cost(L) of each link in the route
      
    </t>
    <t>
      
        LoopFree(R1, R2) := ( Cost(R1) &lt;= Cost(R2) )
      
    </t>
  </list></t>
  <t>
    Implementers MAY consider metric types that are not strictly
    increasing, but the definitions of Cost and LoopFree functions for
    such types are undefined, and interoperability issues need to be
    considered.
  </t>
</section>
<section title="AODVv2 Protocol Operations" anchor="aodv_ops">
  
  <t>
    AODVv2 protocol operations include:
  </t>
  <t><list style="symbols">
    <t>
      
        managing sequence numbers,
      
    </t>
    <t>
      
        monitoring next hop AODVv2 routers on discovered routes and
        updating the Neighbor Set,
      
    </t>
    <t>
      
        performing route discovery and dealing with requests from other
        routers,
      
    </t>
    <t>
      
        processing incoming route information and updating the Local
        Route Set,
      
    </t>
    <t>
      
        updating the Multicast Message Set and suppressing redundant
        messages, and
      
    </t>
    <t>
      
        reporting broken routes.
      
    </t>
  </list></t>
  <t>
    These processes are discussed in detail in the following sections.
  </t>
  
  <section title="Reinitialization" anchor="reboot">
    
    <t>
      When an AODVv2 router does not have information about its previous
      sequence number, or if its sequence number is lost at any point,
      the router reinitializes 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 re-initializing router MUST
      wait for MAX_SEQNUM_LIFETIME before it creates any messages
      containing its new sequence number. Nevertheless, the
      re-initializing router can still participate in creating routes as
      an intermediate router.
    </t>
    <t>
      During this wait period, the router is permitted to do the
      following:
    </t>
    <t><list style="symbols">
      <t>
        
          Process information in a received RREQ or RREP message to
          obtain a route to the originator or target of that route
          discovery
        
      </t>
      <t>
        
          Forward a received RREQ or RREP
        
      </t>
      <t>
        
          Send an RREP_Ack
        
      </t>
      <t>
        
          Maintain valid routes in the Local Route Set
          
        
      </t>
      <t>
        
          Create, process and forward RERR messages
        
      </t>
    </list></t>
  </section>
  <section title="Next Hop Monitoring" anchor="nexthopmonitoring">
    
    <t>
      To ensure AODVv2 routers do not establish routes over
      uni-directional links, AODVv2 routers MUST verify that the link to
      the next hop router is bidirectional before marking a route as
      valid in the Local Route Set.
    </t>
    <t>
      AODVv2 provides a mechanism for testing bidirectional connectivity
      during route discovery, and blacklisting routers where
      bidirectional connectivity is not available. AODVv2 treats
      blacklisted routers as ineligible to be receivers of RREPs; then,
      a route through a different neighbor might be discovered. A route
      is not to be used for forwarding until the link to the next hop is
      confirmed to be bidirectional. AODVv2 routers do not need to
      monitor bidirectionality of links to neighboring routers which are
      not used as next hops on routes in the Local Route Set.
    </t>
    <t><list style="symbols">
      <t>
        
          Bidirectional connectivity to upstream routers can be tested
          by requesting acknowledgement of RREP messages, i.e., by
          including an AckReq element to indicate that an
          acknowledgement is requested. This MUST be answered by sending
          an RREP_Ack in response. Receipt of an RREP_Ack within
          RREP_Ack_SENT_TIMEOUT demonstrates that bidirectional
          connectivity exists. Otherwise, the link is considered to be
          unidirectional. All AODVv2 routers MUST support this process,
          which is explained in <xref target="rrep_ack_msgs"/>.
          
        
      </t>
      <t>
        
          Receipt of an RREP message containing the route to TargAddr
          confirms bidirectionality to the downstream router, since an
          RREP message is a reply to an RREQ message which previously
          crossed the link in the opposite direction.
        
      </t>
    </list></t>
    <t>
      To assist with next hop monitoring, a Neighbor Set
      (<xref target="nbrlist"/>) is maintained. When an RREQ or
      RREP is received, an AODVv2 router searches for an entry in the
      Neighbor Set where all of the following conditions are met:
    </t>
    <t><list style="symbols">
      <t>
        
          Neighbor.IPAddress == IP address from which the RREQ or RREP
          was received
        
      </t>
      <t>
        
          Neighbor.Interface == Interface on which the RREQ or RREP was
          received.
        
      </t>
    </list></t>
    <t>
      If no such entry exists, a new entry is created as described in
      <xref target="nbrupdate"/>. While the value of
      Neighbor.State is HEARD, acknowledgement of RREP messages sent to
      that neighbor MUST be requested. If an acknowledgement is
      requested but not received within the timeout period,
      Neighbor.State for that neighbor MUST be set to BLACKLISTED. If an
      acknowledgement is received within the timeout period,
      Neighbor.State is set to CONFIRMED. When the value of
      Neighbor.State is CONFIRMED, the request for an acknowledgement of
      any other RREP message is unnecessary. AODVv2 does not require
      periodic or continuous recertification of bidirectionality.
    </t>
    
    <t>
      There are many external mechanisms that can provide indications of
      connectivity. Among them are the following:
    </t>
    <t><list style="symbols">
      <t>
        
          MAC layer protocol assuring bidirectional links (for example,
          <xref target="dot11"/>)
        
      </t>
      <t>
        
          Route timeout (see <xref target="routestatechanges"/>)
        
      </t>
      <t>
        
          Lower layer triggers indicating message reception or change in
          link status (see, for example,
          <xref target="RFC8175"/>)
        
      </t>
      <t>
        
          Listening for AODVv2 messages from neighbors even when
          destined to another IP address
        
      </t>
      <t>
        
          Receipt of a Neighborhood Discovery Protocol HELLO message
          with the receiving router listed as a neighbor
          <xref target="RFC6130"/>
        
      </t>
      <t>
        
          TCP<xref target="RFC0793"/> timeouts (although TCP
          takes a while to signal failure)
        
      </t>
    </list></t>
    <t>
      If the MAC layer, or such an external process as listed above,
      signals that the link to a neighbor is bidirectional, the AODVv2
      router MAY update the matching Neighbor Set entry by changing the
      value of Neighbor.State to CONFIRMED. If an external process
      signals that a link is not bidirectional, then the value of
      Neighbor.State MAY be changed to BLACKLISTED.
    </t>
  </section>
  <section title="Neighbor Set Update" anchor="nbrupdate">
    
    <t>
      On receipt of an RREQ or RREP message, the Neighbor Set MUST be
      checked for an entry with Neighbor.IPAddress which matches the
      source IP address of a packet containing the AODVv2 message. If no
      matching entry is found, a new entry is created.
    </t>
    <t>
      A new Neighbor Set entry is created as follows:
    </t>
    <t><list style="symbols">
      <t>
        
          Neighbor.IPAddress := Source IP address of the received route
          message
        
      </t>
      <t>
        
          Neighbor.State := HEARD
        
      </t>
      <t>
        
          Neighbor.Timeout := INFINITY_TIME
        
      </t>
      <t>
        
          Neighbor.Interface := the interface on which the RREQ or RREP
          was received.
        
      </t>
      <t>
        
          Neighbor.AckSeqNum := a random value
        
      </t>
      <t>
        
          Neighbor.HeardRERRSeqNum := 0
          
          (see <xref target="interfaceslist"/>).
        
      </t>
    </list></t>
    <t>
      When an RREP_Ack request is sent to a neighbor, the Neighbor Set
      entry is updated as follows:
    </t>
    <t><list style="symbols">
      <t>
        
          Neighbor.Timeout := CurrentTime + RREP_Ack_SENT_TIMEOUT
        
      </t>
    </list></t>
    <t>
      When a received message is one of the following:
    </t>
    <t><list style="symbols">
      <t>
        
          an RREP which answers an RREQ sent within RREQ_WAIT_TIME over
          the same interface as Neighbor.Interface
        
      </t>
      <t>
        
          an RREP_Ack response received from a Neighbor with
          Neighbor.State set to HEARD, where Neighbor.Timeout &gt;
          CurrentTime
          
        
      </t>
    </list></t>
    <t>
      then the link to the neighbor is bidirectional and the Neighbor
      Set entry is updated as follows:
    </t>
    <t><list style="symbols">
      <t>
        
          Neighbor.State := CONFIRMED
          
        
      </t>
      <t>
        
          Neighbor.Timeout := INFINITY_TIME
        
      </t>
    </list></t>
    <t>
      If the Neighbor.Timeout is reached and Neighbor.State is HEARD,
      then an RREP_Ack response has not been received from the neighbor
      within RREP_Ack_SENT_TIMEOUT of sending the RREP_Ack request. The
      link is considered to be uni-directional and the Neighbor Set
      entry is updated as follows:
    </t>
    <t><list style="symbols">
      <t>
        
          Neighbor.State := BLACKLISTED
        
      </t>
      <t>
        
          Neighbor.Timeout := CurrentTime + MAX_BLACKLIST_TIME
        
      </t>
    </list></t>
    <t>
      When the Neighbor.Timeout is reached and Neighbor.State is
      BLACKLISTED, the Neighbor Set entry is updated as follows:
    </t>
    <t><list style="symbols">
      <t>
        
          Neighbor.State := HEARD
        
      </t>
      <t>
        
          Neighbor.Timeout := INFINITY_TIME
        
      </t>
    </list></t>
    <t>
      If an external mechanism reports a link as broken, the Neighbor
      Set entry MUST be removed.
    </t>
    <t>
      Route requests (RREQs) from neighbors with Neighbor.State set to
      BLACKLISTED MUST be ignored, to avoid persistent IP packet loss or
      protocol failures. Neighbor.Timeout allows the neighbor to again
      be allowed to participate in route discoveries after
      MAX_BLACKLIST_TIME, in case the link between the routers has
      become bidirectional.
    </t>
  </section>
  <section title="Interaction with the Forwarding Plane" anchor="fwdplane">
    
    <t>
      The signals described in the following are conceptual in nature,
      and can be implemented in various ways. The following descriptions
      of these signals and interactions are intended to assist
      implementers who may find them useful. Implementations of AODVv2
      do not have to implement the forwarding plane separately from the
      control plane or data plane. By keeping track of success or
      failure of packet forwarding, AODV can avoid unnecessary route
      discovery operations, while still invalidating routes as early as
      possible to avoid transmitting packets over failed routes.
    </t>
    <t>
      AODVv2 makes use of the following signals:
    </t>
    <t><list style="symbols">
      <t>
        
          A packet cannot be forwarded because a route is unavailable:
          AODVv2 needs to know the source and destination IP addresses
          of the packet. If the source of the packet is configured as a
          Router Client, the router MUST initiate route discovery to the
          destination. Otherwise, the router SHOULD create a Route Error
          message.
        
      </t>
      <t>
        
          A packet is to be forwarded: AODVv2 needs to check the state
          of the entry in the Local Route Set to ensure that the route
          is still valid.
        
      </t>
      <t>
        
          Packet forwarding succeeds: AODVv2 needs to update the record
          of when a route was last used to forward a packet, i.e.
          LocalRoute.LastUsed := CurrentTime(see
          <xref target="update_rte"/>).
        
      </t>
      <t>
        
          Packet forwarding failure occurs: AODVv2 needs to create a
          Route Error message.
        
      </t>
    </list></t>
    <t>
      AODVv2 sends signals to the conceptual forwarding plane when:
    </t>
    <t><list style="symbols">
      <t>
        
          A route discovery is in progress: buffering might be
          configured for packets requiring a route, while route
          discovery is attempted (see
          <xref target="route_discovery"/>).
        
      </t>
      <t>
        
          A route discovery failed: any buffered packets requiring that
          route should be discarded, and the source of the packet SHOULD
          be notified that the destination is unreachable (using an ICMP
          Destination Unreachable message
          <xref target="RFC4443"/>). Route discovery fails if an
          RREQ cannot be generated because the control message
          generation limit has been reached (see
          <xref target="MsgXmit"/>), or if an RREP is not
          received within RREQ_WAIT_TIME (see
          <xref target="route_discovery"/>). 
        
      </t>
      <t>
        
          A route discovery succeeded: install a corresponding route
          into the Routing Information Base and begin transmitting any
          buffered packets.
        
      </t>
      <t>
        
          A route has been made invalid: for the affected destination,
          remove the corresponding next hop from the Routing Information
          Base.
        
      </t>
      <t>
        
          A route has been updated: update the corresponding route in
          the Routing Information Base.
        
      </t>
      <t>
        
          If routes with more than one metric type are available to a
          destination, a way to identify the route that is allowable for
          the metric type associated with forwarding the incoming
          packet.
        
      </t>
    </list></t>
  </section>
  <section title="Message Transmission" anchor="MsgXmit">
    
    <t>
      AODVv2 sends <xref target="RFC5444"/> formatted messages
      using the parameters for port number and IP protocol specified in
      <xref target="RFC5498"/>. Mapping of AODVv2 data to
      <xref target="RFC5444"/> messages is detailed in
      <xref target="represent"/>. AODVv2 multicast messages are
      sent to the link-local multicast address LL-MANET-Routers
      <xref target="RFC5498"/>. All AODVv2 routers MUST subscribe
      to LL-MANET-Routers on all AODVv2 interfaces
      <xref target="RFC5498"/> to receive AODVv2 messages. Such
      messages MAY be transmitted via unicast. For example, this may
      occur for certain link-types (non-broadcast media), for manually
      configured router adjacencies, or in order to improve robustness.
    </t>
    <t>
      When multiple interfaces are available, 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, (see <xref target="interfaceslist"/>).
    </t>
    
    <t>
      To avoid congestion, each AODVv2 router's rate of message
      generation SHOULD be administratively configurable and
      rate-limited (CONTROL_TRAFFIC_LIMIT). Messages SHOULD NOT be sent
      more frequently than one message per (1 / CONTROL_TRAFFIC_LIMIT)th
      of a second. If this threshold is reached, messages MUST be sent
      based on their priority:
    </t>
    <t><list style="symbols">
      <t>
        
          Highest priority SHOULD be given to RREP_Ack messages. This
          allows links between routers to be confirmed as bidirectional
          and avoids undesired blacklisting of next hop routers.
        
      </t>
      <t>
        
          Second priority SHOULD be given to RERR messages for
          undeliverable IP packets. This avoids repeated forwarding of
          packets over broken routes that are still in use by other
          routers.
        
      </t>
      <t>
        
          Third priority SHOULD be given to RREP messages in order that
          RREQs do not time out.
        
      </t>
      <t>
        
          Fourth priority SHOULD be given to RREQ messages.
        
      </t>
      <t>
        
          Fifth priority SHOULD be given to RERR messages for newly
          invalidated routes.
        
      </t>
      <t>
        
          Lowest priority SHOULD be given to RERR messages generated in
          response to RREP messages which cannot be forwarded. In this
          case the route request will be retried at a later point.
        
      </t>
    </list></t>
    
    
    <t>
      To implement the congestion control, a queue length is set. If the
      queue is full, in order to queue a new message, a message of lower
      priority must be removed from the queue. If this is not possible,
      the new message MUST be discarded. The queue should be sorted in
      order of message priority
    </t>
  </section>
  <section title="Route Discovery, Retries and Buffering" anchor="route_discovery">
    
    <t>
      AODVv2's RREQ and RREP messages are used for route discovery. RREQ
      messages are multicast to solicit an RREP, whereas RREP are
      unicast. The constants used in this section are defined in
      <xref target="param"/>.
    </t>
    <t>
      When an AODVv2 router needs to forward an IP packet (with source
      address OrigAddr and destination address TargAddr) from one of its
      Router Clients, it needs a route to TargAddr in its Routing
      Information Base. If no route exists, the AODVv2 router (RREQ_Gen)
      generates and multicasts a Route Request message (RREQ), on all
      configured interfaces, containing information about the source and
      destination. The procedure for this is described in
      <xref target="RREQ_gen"/>. Each generated RREQ results in
      an increment to the router's sequence number. The AODVv2 router
      generating an RREQ is referred to as RREQ_Gen.
    </t>
    
    <t>
      Buffering might be configured for IP packets awaiting a route for
      forwarding by RREQ_Gen, if sufficient memory is available.
      Buffering of IP packets might have both positive and negative
      effects. TCP connection establishment will benefit if packets are
      queued while route discovery is performed
      <xref target="Koodli01"/>, but real-time traffic, voice,
      and scheduled delivery may suffer if packets are buffered and
      subjected to delays. Recommendations for appropriate buffer
      methods are out of scope for this specification. Determining which
      packets to discard first when the buffer is full is a matter of
      policy. Using different (or no) buffer methods might affect
      performance but does not affect interoperability.
    </t>
    <t>
      RREQ_Gen awaits reception of a Route Reply message (RREP)
      containing a route toward TargAddr. This can be achieved by
      monitoring the entry in the Multicast Message Set that corresponds
      to the generated RREQ. When CurrentTime exceeds McMsg.Timestamp +
      RREQ_WAIT_TIME and no RREP has been received, RREQ_Gen will retry
      the route discovery.
    </t>
    <t>
      To reduce congestion in a network, repeated attempts at route
      discovery for a particular target address utilize a binary
      exponential backoff: for each additional attempt, the time to wait
      for receipt of the RREP is multiplied by 2. If the requested route
      is not discovered within the wait period, another RREQ is sent, up
      to a total of DISCOVERY_ATTEMPTS_MAX. This is the same technique
      used in AODV <xref target="RFC3561"/>.
    </t>
    <t>
      Through the use of bidirectional link monitoring and blacklists
      (see <xref target="nexthopmonitoring"/>), uni-directional
      links on an initially selected route will be ignored on subsequent
      route discovery attempts.
    </t>
    <t>
      After DISCOVERY_ATTEMPTS_MAX and the corresponding wait time for
      an RREP response to the final RREQ, route discovery is considered
      to have failed. If an attempted route discovery has failed,
      RREQ_Gen SHOULD wait at least RREQ_HOLDDOWN_TIME before attempting
      another route discovery to the same destination, in order to avoid
      repeatedly generating control traffic that is unlikely to discover
      a route. Any IP packets buffered for TargAddr are also dropped,
      and a Destination Unreachable ICMP message (Type 3) with a code of
      1 (Host Unreachable Error) MUST be sent to the source of the
      packet so that the application knows about the failure.
    </t>
    <t>
      If RREQ_Gen does receive a route message containing a route to
      TargAddr within the timeout, it processes the message according to
      <xref target="aodv_msgs"/>. When a valid LocalRoute entry
      is created in the Local Route Set, the route is also installed in
      the Routing Information Base, and the router will begin sending
      the buffered IP packets. Any retry timers for the corresponding
      RREQ are then cancelled.
    </t>
    <t>
      During route discovery, all routers on the path obtain a route to
      both OrigPrefix and TargPrefix, so that routes are constructed in
      both directions. The route is optimized for the forward route.
    </t>
    
    
    
  </section>
  <section title="Processing Received Route Information" anchor="processingrte">
    
    <t>
      A Route Request (RREQ) contains a route to OrigPrefix, and a Route
      Reply (RREP) contains a route to TargPrefix. Incoming information
      is checked to verify that it offers an improvement to existing
      information and that it would not create a routing loop, as
      explained in <xref target="test"/>. If these checks pass,
      and if sufficient memory is available, refer to
      <xref target="update_rte"/> for details about how to update
      the Local Route Set.
    </t>
    <t>
      RteMsg denotes the received route message (RREP or RREQ), AdvRte
      denotes the route defined by the information within the RteMsg,
      and LocalRoute denotes an existing entry in the Local Route Set
      which matches the address, prefix length, metric type, and
      SeqNoRtr of the AdvRte.
    </t>
    <t>
      AdvRte contains the following information extracted from the
      RteMsg:
    </t>
    <t><list style="symbols">
      <t>
        
          AdvRte.Address := RteMsg.OrigPrefix (in RREQ) or
          RteMsg.TargPrefix (in RREP)
        
      </t>
      <t>
        
          AdvRte.PrefixLength := RteMsg.OrigPrefixLen (in RREQ) or
          RteMsg.TargPrefixLen (in RREP). If no prefix length was
          included in RteMsg, prefix length is the address length, in
          bits, of RteMsg.OrigPrefix (in RREQ) or RteMsg.TargPrefix (in
          RREP)
        
      </t>
      <t>
        
          AdvRte.SeqNum := RteMsg.OrigSeqNum (in RREQ) or
          RteMsg.TargSeqNum (in RREP)
        
      </t>
      <t>
        
          AdvRte.NextHop := the IP source address of the RteMsg (an
          address of the sending interface of the router from which the
          RteMsg was received)
        
      </t>
      <t>
        
          AdvRte.MetricType := RteMsg.MetricType
        
      </t>
      <t>
        
          AdvRte.Metric := RteMsg.Metric
        
      </t>
      <t>
        
          AdvRte.Cost := Cost(R) using the cost function associated with
          the route's metric type. For cost metrics as described in
          <xref target="metrics"/>, Cost(R) = AdvRte.Metric +
          Cost(L), where L is the link from the advertising router
        
      </t>
      <t>
        
          AdvRte.SeqNoRtr := the IP address in the AddressList of type
          SeqNoRtr if one exists, otherwise 0
        
      </t>
    </list></t>
    <section title="Evaluating Route Information" anchor="test">
      
      <t>
        An incoming advertised route (AdvRte) is compared to existing
        LocalRoutes to determine whether the advertised route is to be
        used to update the AODVv2 Local Route Set. The incoming route
        information MUST be processed as follows:
      </t>
      <t><list style="numbers">
        <t>
          
            Search for LocalRoutes in the Local Route Set matching
            AdvRte's Address, PrefixLength, MetricType, and SeqNoRtr
            (the AODVv2 router address corresponding to the sequence
            number).
          
          <list style="symbols">
            <t>
              
                If no matching LocalRoute exists, AdvRte MUST be used to
                update the Local Route Set and no further checks are
                required.
              
            </t>
            <t>
              
                If matching LocalRoutes are found, continue to the next
                step.
              
            </t>
          </list>
        </t>
        <t>
          
            Compare sequence numbers using the technique described in
            <xref target="seqnum"/>
          
          <list style="symbols">
            <t>
              
                If AdvRte is more recent than all matching LocalRoutes,
                AdvRte MUST be used to update the Local Route Set and no
                further checks are required.
              
            </t>
            <t>
              
                If AdvRte is stale, AdvRte MUST NOT be used to update
                the Local Route Set. Ignore AdvRte for further
                processing.
              
            </t>
            <t>
              
                If the sequence numbers are equal, continue to the next
                step.
              
            </t>
          </list>
        </t>
        <t>
          
            Test AdvRte against all matching LocalRoutes to ensure that
            a routing loop is not created (see
            <xref target="metrics"/>).
          
          <list style="symbols">
            <t>
              
                If LoopFree(AdvRte, LocalRoute) returns FALSE, ignore
                AdvRte for further processing. AdvRte MUST NOT be used
                to update the Local Route Set because using the incoming
                information might cause a routing loop.
              
            </t>
            <t>
              
                If LoopFree(AdvRte, LocalRoute) returns TRUE, continue
                to the next step.
              
            </t>
          </list>
        </t>
        <t>
          
            Compare route costs
          
          <list style="symbols">
            <t>
              
                If AdvRte is better than all matching LocalRoutes, it
                MUST be used to update the Local Route Set because it
                offers improvement.
                
              
            </t>
            <t>
              
                If AdvRte is equal in cost and LocalRoute is valid,
                AdvRte SHOULD NOT be used to update the Local Route Set
                because it will offer no improvement.
              
            </t>
            <t>
              
                If AdvRte is worse and LocalRoute is valid, ignore
                AdvRte for further processing. AdvRte MUST NOT be used
                to update the Local Route Set because it does not offer
                any improvement.
              
            </t>
            <t>
              
                If AdvRte is not better (i.e., it is worse or equal) but
                LocalRoute is Invalid, AdvRte SHOULD be used to update
                the Local Route Set because it can safely repair the
                existing Invalid LocalRoute.
              
            </t>
          </list>
        </t>
      </list></t>
      <t>
        If the advertised route is to be used to update the Local Route
        Set, the procedure in <xref target="update_rte"/> MUST be
        followed. If not, non-optimal routes will remain in the Local
        Route Set.
      </t>
      <t>
        For information on how to apply these changes to the Routing
        Information Base, see <xref target="rte"/>.
      </t>
    </section>
    <section title="Applying Route Updates" anchor="update_rte">
      
      <t>
        After determining that AdvRte is to be used to update the Local
        Route Set (as described in <xref target="test"/>), the
        following procedure applies.
      </t>
      <t>
        If AdvRte is obtained from an RREQ message, the link to the next
        hop neighbor may not be confirmed as bidirectional (see
        <xref target="nbrlist"/>). If there is no existing
        matching route in the Local Route Set, AdvRte MUST be installed
        to allow a corresponding RREP to be sent. If a matching entry
        already exists, and the link to the neighbor can be confirmed as
        bidirectional, AdvRte offers potential improvement.
      </t>
      
      <t>
        The route update is applied as follows:
      </t>
      <t><list style="numbers">
        <t>
          
            If no existing entry in the Local Route Set matches AdvRte's
            address, prefix length, metric type and SeqNoRtr, continue
            to Step 4 and create a new entry in the Local Route Set.
          
        </t>
        <t>
          
            If two matching LocalRoutes exist in the Local Route Set,
            one is a valid route, and one is an Unconfirmed route,
            AdvRte may offer further improvement to the Unconfirmed
            route, or may offer an update to the valid route.
          
          <list style="symbols">
            <t>
              
                If AdvRte.NextHop's Neighbor.State is HEARD, the
                advertised route may offer improvement to the existing
                valid route, if the link to the next hop can be
                confirmed as bidirectional. Continue processing from
                Step 5 to update the existing Unconfirmed LocalRoute.
              
            </t>
            <t>
              
                If AdvRte.NextHop's Neighbor.State is CONFIRMED, the
                advertised route offers an update or improvement to the
                existing valid route. Continue processing from Step 5 to
                update the existing valid LocalRoute.
              
            </t>
          </list>
        </t>
        <t>
          
            If only one matching LocalRoute exists in the Local Route
            Set:
          
          <list style="symbols">
            <t>
              
                If AdvRte.NextHop's Neighbor.State is CONFIRMED,
                continue processing from Step 5 to update the existing
                LocalRoute.
              
            </t>
            <t>
              
                If AdvRte.NextHop's Neighbor.State is HEARD, AdvRte may
                offer improvement the existing LocalRoute, if the link
                to AdvRte.NextHop can be confirmed as bidirectional.
              
            </t>
            <t>
              
                If LocalRoute.State is Unconfirmed, AdvRte is an
                improvement to an existing Unconfirmed route. Continue
                processing from Step 5 to update the existing
                LocalRoute.
              
            </t>
            <t>
              
                If LocalRoute.State is Invalid, AdvRte can replace the
                existing LocalRoute. Continue processing from Step 5 to
                update the existing LocalRoute.
              
            </t>
            <t>
              
                If LocalRoute.State is Active or Idle, AdvRte SHOULD be
                stored as an additional entry in the Local Route Set,
                with LocalRoute.State set to Unconfirmed. Continue
                processing from Step 4 to create a new LocalRoute.
              
            </t>
          </list>
        </t>
        <t>
          
            Create an entry in the Local Route Set and initialize as
            follows:
          
          <list style="symbols">
            <t>
              
                LocalRoute.Address := AdvRte.Address
              
            </t>
            <t>
              
                LocalRoute.PrefixLength := AdvRte.PrefixLength
              
            </t>
            <t>
              
                LocalRoute.MetricType := AdvRte.MetricType
              
            </t>
          </list>
        </t>
        <t>
          
            Update the LocalRoute as follows:
          
          <list style="symbols">
            <t>
              
                LocalRoute.SeqNum := AdvRte.SeqNum
              
            </t>
            <t>
              
                LocalRoute.NextHop := AdvRte.NextHop
              
            </t>
            <t>
              
                LocalRoute.NextHopInterface := interface on which RteMsg
                was received
              
            </t>
            <t>
              
                LocalRoute.Metric := AdvRte.Cost
              
            </t>
            <t>
              
                LocalRoute.LastUsed := CurrentTime
              
            </t>
            <t>
              
                LocalRoute.LastSeqNumUpdate := CurrentTime
              
            </t>
            <t>
              
                LocalRoute.SeqNoRtr := AdvRte.SeqNoRtr
              
            </t>
          </list>
        </t>
        <t>
          
            If a new LocalRoute was created, or if the existing
            LocalRoute.State is Invalid or Unconfirmed, update
            LocalRoute as follows:
          
          <list style="symbols">
            <t>
              
                LocalRoute.State := Unconfirmed (if the next hop's
                Neighbor.State is HEARD)
              
            </t>
            <t>
              
                LocalRoute.State := Idle (if the next hop's
                Neighbor.State is CONFIRMED)
              
            </t>
          </list>
        </t>
        <t>
          
            If an existing LocalRoute.State changed from Invalid or
            Unconfirmed to become Idle, any matching Unconfirmed
            LocalRoute with worse metric value SHOULD be expunged.
          
        </t>
        <t>
          
            If an existing LocalRoute was updated with a better metric
            value, any matching Unconfirmed LocalRoute with worse metric
            value SHOULD be expunged.
          
        </t>
        <t>
          
            If this update results in LocalRoute.State of Active or
            Idle, which matches a route request which is still in
            progress, the associated route request retry timers MUST be
            cancelled. 
          
        </t>
      </list></t>
      <t>
        If this update to the Local Route Set results in two LocalRoutes
        to the same address, the best LocalRoute will be Unconfirmed. In
        order to improve the route used for forwarding, the router
        SHOULD try to determine if the link to the next hop of that
        LocalRoute is bidirectional, by using that LocalRoute to forward
        future RREPs and request acknowledgements (see
        <xref target="RREP_gen"/> and
        <xref target="rrep_ack_msgs"/>.
      </t>
    </section>
  </section>
  <section title="Suppressing Redundant Messages (Multicast Message Set)" anchor="suppress">
    
    <t>
      When route messages are flooded in a MANET, an AODVv2 router may
      receive several instances of the same message. Forwarding every
      one of these would provide little additional benefit, while
      generating unnecessary signaling traffic and consequently
      additional interference. There have been a number of variations of
      AODV (e.g., <xref target="I-D.ietf-roll-aodv-rpl"/>), that
      have specified multicast for flooding RREP messages as well as
      RREQ messages. Since, in this document, suppression techniques are
      only needed for RREQ messages, multicast RREP messages are not
      considered. However, the technique involved is almost identical,
      and can be handled by substituting "RteMsg" instead of
      RREQ in the following text.
    </t>
    <t>
      Each AODVv2 router stores information about recently received RREQ
      messages in the AODVv2 Multicast Message Set
      (<xref target="mcmsgtable"/>).
    </t>
    <t>
      In this section, an entry in the Multicast Message Set will be
      called a "multicast entry" for short. Each multicast
      entry SHOULD be maintained for at least RteMsg_ENTRY_TIME after
      the last Timestamp update in order to account for long-lived RREQs
      traversing the network. An entry MUST be deleted when the sequence
      number is no longer valid, i.e., after MAX_SEQNUM_LIFETIME.
      Memory-constrained devices MAY remove the entry before this time.
    </t>
    
    
    <t>
      Received RREQs are tested against multicast entries containing
      information about previously received RREQs. A multicast entry is
      considered to be compatible with a received RREQ, or another
      multicast entry, if they both contain the same OrigPrefix,
      OrigPrefixLen, TargPrefix, and MetricType. A multicast entry is
      considered to be comparable with a received RREQ, or another
      multicast entry, if they are compatible and if, in addition, they
      both have the same SeqNoRtr. These terms will be used in the
      following algorithm determining how to process a received RREQ,
      and whether or not the RREQ is redundant.
    </t>
    <t>
      If the received message is determined to be redundant, no
      forwarding or response to the message is needed. A message is
      considered to be redundant if either (a) a comparable newer (as
      determined by the OrigSeqNum) entry has already been received with
      information about the source and destination addresses of the
      route discovery operation or (b) it cannot be determined whether
      the message is newer compared to existing entries, but the
      received message metric value is not any better than metric values
      in compatible multicast entries.
    </t>
    
    <t>
      To use the received RREQ to update the Multicast Message Set, and
      to determine whether or not the received RREQ requires additional
      processing as specified in <xref target="aodv_msgs"/>,
      perform the following steps:
    </t>
    <t><list style="numbers">
      <t>
        
          First, search for a comparable multicast entry. If there is no
          such entry, then create a new entry as follows:
        
        <list style="symbols">
          <t>
            
              McMsg.OrigPrefix := OrigPrefix from the RREQ
            
          </t>
          <t>
            
              McMsg.OrigPrefixLen := the prefix length associated with
              OrigPrefix
            
          </t>
          <t>
            
              McMsg.TargPrefix := TargPrefix from the message
            
          </t>
          <t>
            
              McMsg.SeqNoRtr := the SeqNoRtr associated with RREQ if
              present, otherwise the sequence number associated with
              OrigPrefix 
            
          </t>
          <t>
            
              McMsg.OrigSeqNum := the sequence number associated with
              OrigPrefix  
            
          </t>
          <t>
            
              McMsg.Metric := the metric value associated with
              OrigPrefix in the received RREQ
            
          </t>
          <t>
            
              McMsg.MetricType := the metric type associated with
              McMsg.Metric
            
          </t>
          <t>
            
              McMsg.Interface := the network interface on which the RREQ
              was received.
            
          </t>
          <t>
            
              McMsg.Timestamp := CurrentTime
            
          </t>
          <t>
            
              McMsg.RemovalTime := CurrentTime + MAX_SEQNUM_LIFETIME
            
          </t>
        </list>
      </t>
      <t>
        
          Otherwise, if there is a comparable multicast entry, first
          update the timing information:
        
        <list style="symbols">
          <t>
            
              McMsg.Timestamp := CurrentTime
            
          </t>
          <t>
            
              McMsg.RemovalTime := CurrentTime + MAX_SEQNUM_LIFETIME
            
          </t>
        </list>
        <vspace blankLines="1"/>
          Then compare sequence numbers using the technique described in
          <xref target="seqnum"/>:
        
        <list style="symbols">
          <t>
            
              If the multicast entry is newer compared to the received
              RREQ, drop the RREQ and discontinue processing.
            
          </t>
          <t>
            
              Otherwise, if the sequence numbers are the same, and the
              metric value for the multicast entry is no worse than the
              metric value in the received RREQ, drop the RREQ and
              discontinue processing.
            
          </t>
        </list>
        <vspace blankLines="1"/>
          Otherwise the RREQ is newer than the multicast entry or has a
          better metric. Continue as follows:
        
        <list style="symbols">
          <t>
            
              McMsg.OrigSeqNum := the sequence number associated with
              OrigPrefix  
            
          </t>
          <t>
            
              McMsg.Metric := the metric value associated with
              OrigPrefix in the received RREQ
            
          </t>
        </list>
      </t>
      <t>
        
          Compare the metric values for any other compatible entries
          with the updated multicast entry containing the information
          from the received RREQ. If any other compatible entry has a
          metric as good or better than that from the received RREQ,
          then drop the RREQ and discontinue processing.
        
      </t>
    </list></t>
    <t>
      If processing for the RREQ has not been discontinued according to
      the above instructions, then continue processing the message as
      specified in <xref target="RREQ_fwd"/>.
    </t>
  </section>
  <section title="Suppressing Redundant Route Error Messages (Route Error Set)" anchor="suppressrerr">
    
    <t>
      In order to avoid flooding the network with RERR messages when a
      stream of IP packets to an unreachable address arrives, an AODVv2
      router SHOULD avoid creating duplicate messages by determining
      whether an equivalent RERR has recently been sent. This is
      achieved with the help of the Route Error Set (see
      <xref target="rerrtable"/>).
    </t>
    <t>
      To determine if a RERR should be created:
    </t>
    <t><list style="numbers">
      <t>
        
          Search for an entry in the Route Error Set where:
        
        <list style="symbols">
          <t>
            
              RerrMsg.UnreachableAddress == UnreachableAddress to be
              reported
            
          </t>
          <t>
            
              RerrMsg.PktSource == PktSource to be included in the RERR
            
          </t>
        </list>
        <vspace blankLines="1"/>
          If a matching entry is found, no further processing is
          required and the RERR SHOULD NOT be sent.
        
      </t>
      <t>
        
          If no matching entry is found, a new entry with the following
          properties is created, and the RERR is created and sent as
          described in <xref target="RERR_gen"/>:
        
        <list style="symbols">
          <t>
            
              RerrMsg.Timeout := CurrentTime + RERR_TIMEOUT
            
          </t>
          <t>
            
              RerrMsg.UnreachableAddress == UnreachableAddress to be
              reported
            
          </t>
          <t>
            
              RerrMsg.PktSource == PktSource to be included in the RERR.
            
          </t>
        </list>
      </t>
    </list></t>
  </section>
  <section title="Local Route Set Maintenance" anchor="route_maint">
    
    <t>
      Route maintenance involves the following operations:
    </t>
    <t><list style="symbols">
      <t>
        
          monitoring LocalRoutes in the Local Route Set,
        
      </t>
      <t>
        
          updating LocalRoute.State to handle route timeouts,
        
      </t>
      <t>
        
          (for possibly unidirectional links) confirming a route to
          OrigAddr,
        
      </t>
      <t>
        
          reporting routes that become Invalid.
        
      </t>
    </list></t>
    <section title="LocalRoute State Changes" anchor="routestatechanges">
      
      <t>
        During normal operation, AODVv2 does not require explicit
        timeouts to manage the lifetime of a valid route. At any time,
        any LocalRoute MAY be examined and updated according to the
        rules below. In case a Routing Information Base is used for
        forwarding, the corresponding RIB entry MUST be updated as soon
        as the state of a LocalRoute.State changes. Otherwise, if timers
        are not used to prompt updates of LocalRoute.State, the
        LocalRoute.State MUST be checked before IP packet forwarding and
        before any operation based on LocalRoute.State.
      </t>
      <t>
        Route timeout behaviour is as follows:
      </t>
      <t><list style="symbols">
        <t>
          
            An Unconfirmed route MUST be expunged at MAX_SEQNUM_LIFETIME
            after LocalRoute.LastSeqNumUpdate.
          
        </t>
        <t>
          
            An Idle route MUST be marked as Active when used to forward
            an IP packet.
          
        </t>
        <t>
          
            If an Idle route is not used to forward an IP packet within
            MAX_IDLETIME, LocalRoute.State MUST be set to Invalid.
          
        </t>
        <t>
          
            An Invalid route SHOULD remain in the Local Route Set, since
            LocalRoute.SeqNum is used to classify future information
            about LocalRoute.Address as stale or fresh.
          
        </t>
        <t>
          
            In all cases, if the time since LocalRoute.LastSeqNumUpdate
            exceeds MAX_SEQNUM_LIFETIME, LocalRoute.SeqNum must be set
            to 0. This is required so that any AODVv2 routers following
            the re-initialization procedure (see
            <xref target="reboot"/>) can safely begin routing
            functions using a new sequence number. A LocalRoute with
            LocalRoute.State set to Active or Idle can remain in the
            Local Route Set after the sequence number has been set to 0,
            for example if the route is reliably carrying traffic. If
            LocalRoute.State is Invalid, or later becomes Invalid, the
            LocalRoute MUST be expunged from the Local Route Set.
          
        </t>
      </list></t>
      
      <t>
        LocalRoutes can become Invalid before a timeout occurs, as
        follows:
      </t>
      <t><list style="symbols">
        <t>
          
            If an external mechanism reports a link as broken, all
            LocalRoutes using that link for LocalRoute.NextHop MUST
            immediately have LocalRoute.State set to Invalid.
          
        </t>
        <t>
          
            LocalRoute.State MUST immediately be set to Invalid if a
            Route Error (RERR) message is received where:
          
          <list style="symbols">
            <t>
              
                The sender is LocalRoute.NextHop, or PktSource is a
                Router Client address
              
            </t>
            <t>
              
                There is an Address in AddressList which matches
                LocalRoute.Address, and:
              
              <list style="symbols">
                <t>
                  
                    The prefix length associated with this Address, if
                    any, matches LocalRoute.PrefixLength
                  
                </t>
                <t>
                  
                    The sequence number associated with this Address, if
                    any, is newer or equal to LocalRoute.SeqNum (see
                    <xref target="seqnum"/>)
                  
                </t>
                <t>
                  
                    The metric type associated with this Address matches
                    LocalRoute.MetricType
                  
                </t>
              </list>
            </t>
          </list>
        </t>
      </list></t>
      <t>
        A LocalRoute can be confirmed by inferring connectivity to
        OrigAddr.
      </t>
      <t><list style="symbols">
        <t>
          
            When an AODVv2 router sends an RREP to OrigAddr for
            destination TargAddr, and subsequently the AODVv2 router
            receives a packet from OrigAddr with destination TargAddr,
            the AODVv2 router infers that the route to OrigAddr has been
            confirmed. The corresponding state for LocalRoute.OrigAddr
            is changed to Active.
          
        </t>
      </list></t>
      <t>
        LocalRoutes are updated when Neighbor.State is updated:
      </t>
      <t><list style="symbols">
        <t>
          
            While the value of Neighbor.State is set to HEARD, any
            routes in the Local Route Set using that neighbor as a next
            hop MUST have LocalRoute.State set to Unconfirmed.
          
        </t>
      </list></t>
      
      <t><list style="symbols">
        <t>
          
            When the value of Neighbor.State is set to BLACKLISTED, any
            valid routes in the Local Route Set using that neighbor for
            their next hop MUST have LocalRoute.State set to Invalid.
          
        </t>
        <t>
          
            When a Neighbor Set entry is removed, all routes in the
            Local Route Set using that neighbor as next hop MUST have
            LocalRoute.State set to Invalid.
          
        </t>
      </list></t>
      <t>
        Memory constrained devices MAY choose to expunge routes from the
        AODVv2 Local Route Set at other times, but MUST adhere to the
        following rules:
      </t>
      <t><list style="symbols">
        <t>
          
            An Active route MUST NOT be expunged, as it is in use. If
            deleted, IP traffic forwarded to this router would prompt
            generation of a Route Error message, necessitating a Route
            Request to be generated by the originator's router to
            re-establish the route.
          
        </t>
        <t>
          
            An Idle route SHOULD NOT be expunged, as it is still valid
            for forwarding IP traffic. If deleted, this could result in
            dropped IP packets and a Route Request could be multicasted
            to re-establish the route.
          
        </t>
        <t>
          
            Any Invalid route MAY be expunged. Least recently used
            Invalid routes SHOULD be expunged first, since the sequence
            number information is less likely to be useful.
          
        </t>
        <t>
          
            An Unconfirmed route MUST NOT be expunged if it was
            installed within the last RREQ_WAIT_TIME, because it may
            correspond to a route discovery in progress. A Route Reply
            message might be received which needs to use the
            LocalRoute.NextHop information. Otherwise, it MAY be
            expunged.
          
        </t>
      </list></t>
    </section>
    <section title="Reporting Invalid Routes" anchor="brokenrerr">
      
      <t>
        When LocalRoute.State changes from Active to Invalid as a result
        of a broken link or a received Route Error (RERR) message, other
        AODVv2 routers MUST be informed by sending an RERR message
        containing details of the invalidated route.
      </t>
      <t>
        An RERR message MUST also be sent when an AODVv2 router receives
        an RREP message to forward, but the LocalRoute to the OrigAddr
        in the RREP is not available or is marked as Invalid.
      </t>
      <t>
        A packet or message triggering the RERR MUST be discarded.
      </t>
      <t>
        Generation of an RERR message is described in
        <xref target="RERR_gen"/>.
      </t>
    </section>
  </section>
</section>
<section title="AODVv2 Protocol Messages" anchor="aodv_msgs">
  
  <t>
    AODVv2 defines four message types: Route Request (RREQ), Route Reply
    (RREP), Route Reply Acknowledgement (RREP_Ack), and Route Error
    (RERR).
  </t>
  <t>
    Each AODVv2 message is defined as a set of data. Rules for the
    generation, reception and forwarding of each message type are
    described in the following sections.
    <xref target="represent"/> discusses how the data is mapped
    to <xref target="RFC5444"/> Message TLVs, Address Blocks, and
    Address TLVs.
  </t>
  <section title="Route Request (RREQ) Message" anchor="RREQ_msgs">
    
    <t>
      Route Request messages are used in route discovery operations to
      request a route to a specified target address. RREQ messages have
      the following contents:
    </t>
    <figure anchor="RREQ_elem" align="center" title="RREQ message contents"><artwork align="center">
+-----------------------------------------------------------------+
|                          msg_hop_limit                          |
+-----------------------------------------------------------------+
|                           AddressList                           |
+-----------------------------------------------------------------+
|                   PrefixLengthList (optional)                   |
+-----------------------------------------------------------------+
|                OrigSeqNum, (optional) TargSeqNum                |
+-----------------------------------------------------------------+
|                           MetricType                            |
+-----------------------------------------------------------------+
|                           OrigMetric                            |
+-----------------------------------------------------------------+
</artwork></figure>
    <t>
      
    </t>
    <t><list style="hanging">
      <t hangText="msg_hop_limit">
          
            <vspace/>The remaining number of hops allowed for
            dissemination of the RREQ message.
          
        </t>
      <t hangText="AddressList">
          
            <vspace/>Contains:
          
          <list style="symbols">
            <t>
              
                OrigPrefix, from the Router Client Set entry which
                includes OrigAddr, the source address of the IP packet
                for which a route is requested,
              
            </t>
            <t>
              
                TargPrefix, set to TargAddr, the destination address of
                the IP packet for which a route is requested, and
              
            </t>
            <t>
              
                Optionally, if RouterClient.SeqNoRtr is true, the IP
                address of OrigRtr -- i.e., the router that originated
                the Sequence Number for this RREQ.
              
            </t>
          </list>
        </t>
      <t hangText="PrefixLengthList">
          
            <vspace/>Contains OrigPrefixLen, i.e., the length, in bits,
            of the prefix associated with the Router Client Set entry
            which includes OrigAddr. If omitted, the prefix length is
            equal to OrigAddr's address length in bits.
          
        </t>
      <t hangText="OrigSeqNum">
          
            <vspace/>The sequence number associated with OrigPrefix.
          
        </t>
      <t hangText="TargSeqNum">
          
            <vspace/>A sequence number associated with an existing
            Invalid route to TargAddr. This MAY be included if
            available.
          
        </t>
      <t hangText="MetricType">
          
            <vspace/>The metric type associated with OrigMetric.
          
        </t>
      <t hangText="OrigMetric">
          
            <vspace/>The metric value associated with the route to
            OrigPrefix, as determined by the sender of the message.
          
        </t>
    </list></t>
    <section title="RREQ Generation" anchor="RREQ_gen">
      
      <t>
        An RREQ is generated to discover a route when an IP packet needs
        to be forwarded for a Router Client, and no valid route
        currently exists for the packet's destination in the Routing
        Information Base.
      </t>
      <t>
        If the limit for the rate of AODVv2 control message generation
        has been reached, no message SHOULD be generated
        <xref target="MsgXmit"/>. Before creating an RREQ, the
        router SHOULD check the Multicast Message Set to see if a
        compatible RREQ has already 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,
        incoming IP packets awaiting this route SHOULD be buffered until
        the route discovery is completed.
      </t>
      <t>
        To generate the RREQ, the router (referred to as RREQ_Gen)
        follows this procedure:
      </t>
      <t><list style="numbers">
        <t>
          
            Set msg_hop_limit := MAX_HOPCOUNT
          
        </t>
        <t>
          
            Set AddressList := {OrigPrefix, TargPrefix}
          
        </t>
        <t>
          
            For the PrefixLengthList:
          
          <list style="symbols">
            <t>
              
                If OrigAddr is part of an address range configured as a
                Router Client, set PrefixLengthList :=
                {RouterClient.PrefixLength, null}.
              
            </t>
            <t>
              
                Otherwise, omit PrefixLengthList.
              
            </t>
            <t>
              
                If RouterClient.SeqNoRtr is nonzero, then add the
                router's own IP address to AddressList, with AddressType
                SeqNoRtr.
              
            </t>
          </list>
        </t>
        <t>
          
            For OrigSeqNum:
          
          <list style="symbols">
            <t>
              
                Increment the router Sequence Number as specified in
                <xref target="seqnum"/>.
              
            </t>
            <t>
              
                Set OrigSeqNum := router Sequence Number.
              
            </t>
          </list>
        </t>
        <t>
          
            For TargSeqNum:
          
          <list style="symbols">
            <t>
              
                If an Invalid route exists in the Local Route Set
                matching TargAddr using longest prefix matching and has
                a valid sequence number, set TargSeqNum :=
                LocalRoute.SeqNum.
              
            </t>
            <t>
              
                If no Invalid route exists in the Local Route Set
                matching TargAddr, or the route doesn't have a sequence
                number, omit TargSeqNum.
              
            </t>
          </list>
        </t>
        <t>
          
            Include MetricType and set the type accordingly
          
        </t>
        <t>
          
            Find the Router Client Set entry where
            RouterClient.IPAddress == OrigPrefix:
          
          <list style="symbols">
            <t>
              
                Set OrigMetric := RouterClient.Cost
              
            </t>
          </list>
        </t>
      </list></t>
      <t>
        This AODVv2 message is used to create a corresponding
        <xref target="RFC5444"/> message (see
        <xref target="represent"/>) which is handed to the
        RFC5444 multiplexer for further processing. By default, the
        multiplexer is instructed to multicast RREQ messages to
        LL-MANET-Routers on all interfaces configured for AODVv2
        operation.
      </t>
      
    </section>
    <section title="RREQ Reception" anchor="RREQ_rcv">
      
      <t>
        Upon receiving a Route Request, an AODVv2 router performs the
        following steps:
      </t>
      <t><list style="numbers">
        <t>
          
            Check and update the Neighbor Set according to
            <xref target="nbrupdate"/>
          
          <list style="symbols">
            <t>
              
                If the sender has Neighbor.State set to BLACKLISTED,
                ignore this RREQ for further processing.
              
            </t>
          </list>
        </t>
        <t>
          
            Verify that the message contains the required data:
            msg_hop_limit, OrigPrefix, TargPrefix, OrigSeqNum, and
            OrigMetric, and that OrigPrefix and TargPrefix are valid
            address prefixes
          
          <list style="symbols">
            <t>
              
                If not, ignore this RREQ for further processing.
              
            </t>
          </list>
        </t>
        <t>
          
            Check that the MetricType is supported and configured for
            use
          
          <list style="symbols">
            <t>
              
                If so, continue to the next numbered step.
              
            </t>
            <t>
              
                Otherwise, if the TargPrefix matches an entry in the
                Router Client Set, send an ICMP Destination Unreachable
                message to the source with Code value set to
                "Metric Type Mismatch" (see
                <xref target="iana-icmpv6_code"/>).
              
            </t>
            <t>
              
                Ignore this RREQ for further processing.
              
            </t>
          </list>
        </t>
        <t>
          
            Determine whether the cost of the advertised route will
            exceed the maximum allowed metric value for the metric type
            (Metric &lt;= MAX_METRIC[MetricType] - Cost(L))
          
          <list style="symbols">
            <t>
              
                If it will, ignore this RREQ for further processing.
              
            </t>
          </list>
        </t>
        <t>
          
            Process the route to OrigPrefix as specified in
            <xref target="processingrte"/>
          
        </t>
        <t>
          
            Determine whether or not the information in the message is
            redundant, by following the procedure in
            <xref target="suppress"/>; if redundant, ignore this
            RREQ for further processing.
          
        </t>
        <t>
          
            Check if the TargPrefix matches an entry in the Router
            Client Set
          
          <list style="symbols">
            <t>
              
                If so, generate an RREP as specified in
                <xref target="RREP_gen"/>.
              
            </t>
            <t>
              
                If not, continue to RREQ forwarding
                <xref target="RREP_fwd"/>.
              
            </t>
          </list>
        </t>
      </list></t>
    </section>
    <section title="RREQ Forwarding" anchor="RREQ_fwd">
      
      <t>
        Forwarding or responding to a RteMsg provides up-to-date
        information and improved metrics to other routers. If a RteMsg
        is not forwarded, routes needed by applications may not be
        discovered.
      </t>
      <t>
        By forwarding an RREQ, a router advertises that it will forward
        IP packets to the OrigPrefix contained in the RREQ according to
        the information enclosed. The router MAY choose not to forward
        the RREQ, for example if the router is heavily loaded or low on
        energy and therefore unwilling to advertise routing capability
        for more traffic. This could, however, decrease connectivity in
        the network or result in non-optimal paths.
      </t>
      <t>
        The RREQ MUST NOT be forwarded if the received msg_hop_limit =
        1, or if the limit for the rate of AODVv2 control message
        generation has been reached. Otherwise, the RREQ is updated and
        forwarded as follows:
      </t>
      <t><list style="numbers">
        <t>
          
            Set msg_hop_limit := received msg_hop_limit - 1
          
        </t>
        <t>
          
            Set OrigMetric := LocalRoute[OrigPrefix].Metric
          
        </t>
      </list></t>
      <t>
        This modified RREQ is handed to the
        <xref target="RFC5444"/> multiplexer for further
        processing. By default, the multiplexer is instructed to
        multicast the message to LL-MANET-Routers on all interfaces
        configured for AODVv2 operation.
      </t>
      
    </section>
  </section>
  <section title="Route Reply (RREP) Message" anchor="RREP_msgs">
    
    <t>
      When a Route Request message is received, requesting a route to a
      target address (TargAddr) which is configured as part of a Router
      Client Set entry, a Route Reply message is sent in response. The
      RREP offers a route to TargPrefix.
    </t>
    <t>
      RREP messages have the following contents:
    </t>
    <figure anchor="figRREP" align="center" title="RREP message contents"><artwork align="center">
+-----------------------------------------------------------------+
|                          msg_hop_limit                          |
+-----------------------------------------------------------------+
|                           AddressList                           |
+-----------------------------------------------------------------+
|                   PrefixLengthList (optional)                   |
+-----------------------------------------------------------------+
|                           TargSeqNum                            |
+-----------------------------------------------------------------+
|                           MetricType                            |
+-----------------------------------------------------------------+
|                           TargMetric                            |
+-----------------------------------------------------------------+
</artwork></figure>
    <t>
      
    </t>
    <t><list style="hanging">
      <t hangText="msg_hop_limit">
          
            <vspace/>The remaining number of hops allowed for
            dissemination of the RREP message.
          
        </t>
      <t hangText="AddressList">
          
            <vspace/>Contains:
          
          <list style="symbols">
            <t>
              
                OrigPrefix, from the Router Client entry which includes
                OrigAddr, the source address of the IP packet for which
                a route is requested
              
            </t>
            <t>
              
                TargPrefix, set to TargAddr, the destination address of
                the IP packet for which a route is requested.
              
            </t>
            <t>
              
                Optionally, if RouterClient.SeqNoRtr is true, the IP
                address of TargRtr -- i.e., the router that originated
                the Sequence Number for this RREP.
              
            </t>
          </list>
        </t>
      <t hangText="PrefixLengthList">
          
            <vspace/>Contains TargPrefixLen, i.e., the length, in bits,
            of the prefix associated with the Router Client Set entry
            which includes TargAddr. If omitted, the prefix length is
            equal to TargAddr's address length, in bits.
          
        </t>
      <t hangText="TargSeqNum">
          
            <vspace/>The sequence number associated with TargPrefix.
          
        </t>
      <t hangText="MetricType">
          
            <vspace/>The metric type associated with TargMetric.
          
        </t>
      <t hangText="TargMetric">
          
            <vspace/>The metric value associated with the route to
            TargPrefix, as seen from the sender of the message.
          
        </t>
    </list></t>
    <section title="RREP Generation" anchor="RREP_gen">
      
      <t>
        A Route Reply message is generated when a Route Request for a
        Router Client of the AODVv2 router arrives. This is the case
        when RteMsg.TargPrefix matches an entry in the Router Client Set
        of the AODVv2 router.
      </t>
      <t>
        Before creating an RREP, the router SHOULD check whether
        
        CONTROL_TRAFFIC_LIMIT has been reached. If so, the RREP SHOULD
        NOT be created.
      </t>
      <t>
        The RREP will traverse the path of the route to OrigPrefix. If
        the best route to OrigPrefix in the Local Route Set is
        Unconfirmed, the link to the next hop neighbor is not yet
        confirmed as bidirectional (see
        <xref target="nexthopmonitoring"/>). In this case an
        RREP_Ack MUST also be sent as described in
        <xref target="rrep_ack_msgs"/>, in order to request an
        acknowledgement message from the next hop router to prove that
        the link is bidirectional. If the best route to OrigPrefix in
        the Local Route Set is valid, the link to the next hop neighbor
        is already confirmed as bidirectional, and no acknowledgement is
        required.
      </t>
      <t>
        Implementations MAY allow a number of retries of the RREP if a
        requested acknowledgement is not received within
        RREP_Ack_SENT_TIMEOUT, doubling the timeout with each retry, up
        to a maximum of RREP_RETRIES, using the same exponential backoff
        described in <xref target="route_discovery"/> for RREQ
        retries. The acknowledgement MUST be considered to have failed
        after the wait time for an RREP_Ack response to the final RREP.
      </t>
      <t>
        To generate the RREP, the router (also referred to as RREP_Gen)
        follows this procedure:
      </t>
      <t><list style="numbers">
        <t>
          
            Set msg_hop_limit := MAX_HOPCOUNT - msg_hop_limit from the
            received RREQ message
          
        </t>
        <t>
          
            Set AddressList := {OrigPrefix, TargPrefix}
          
          <list style="symbols">
            <t>
              
                If RouterClient.SeqNoRtr is nonzero, then add the
                router's own IP address to AddressList, with AddressType
                SeqNoRtr.
              
            </t>
          </list>
        </t>
        <t>
          
            For the PrefixLengthList:
          
          <list style="symbols">
            <t>
              
                If TargAddr is part of an address range configured as a
                Router Client, set PrefixLengthList := {null,
                RouterClient.PrefixLength}.
              
            </t>
            <t>
              
                Otherwise, omit PrefixLengthList.
              
            </t>
          </list>
        </t>
        <t>
          
            For the TargSeqNum:
          
          <list style="symbols">
            <t>
              
                Increment the router Sequence Number as specified in
                <xref target="seqnum"/>.
              
            </t>
            <t>
              
                Set TargSeqNum := router Sequence Number.
              
            </t>
          </list>
        </t>
        <t>
          
            Include MetricType and set the type to match the MetricType
            in the received RREQ message.
          
        </t>
        <t>
          
            Set TargMetric := RouterClient.Cost for the Router Client
            Set entry which includes TargAddr.
          
        </t>
      </list></t>
      <t>
        This AODVv2 message is used to create a corresponding
        <xref target="RFC5444"/> message (see
        <xref target="represent"/>) which is handed to the
        RFC5444 multiplexer for further processing. The multiplexer is
        instructed to unicast the RREP to
        LocalRoute[OrigPrefix].NextHop. The RREP MUST be sent over
        LocalRoute[OrigPrefix].NextHopInterface.
      </t>
    </section>
    <section title="RREP Reception" anchor="RREP_rcv">
      
      <t>
        Upon receiving a Route Reply, an AODVv2 router performs the
        following steps:
      </t>
      <t><list style="numbers">
        <t>
          
            Verify that the message contains the required data:
            msg_hop_limit, OrigPrefix, TargPrefix, TargSeqNum, and
            TargMetric, and that OrigPrefix and TargPrefix are valid
            addresses
          
          <list style="symbols">
            <t>
              
                If not, ignore this RREP for further processing.
              
            </t>
          </list>
        </t>
        <t>
          
            Check that the MetricType is supported and configured for
            use
          
          <list style="symbols">
            <t>
              
                If not, ignore this RREP for further processing.
                
              
            </t>
          </list>
        </t>
        <t>
          
            If this RREP does not correspond to an RREQ generated or
            forwarded in the last RREQ_WAIT_TIME, ignore for further
            processing.
          
        </t>
        <t>
          
            If the Multicast Message Set does not contain an entry
            where:
          
        </t>
      </list></t>
      <t><list style="symbols">
        <t>
          
            McMsg.OrigPrefix == RREP.OrigPrefix
          
        </t>
        <t>
          
            McMsg.OrigPrefixLen == RREP.OrigPrefixLen
          
        </t>
        <t>
          
            McMsg.TargAddr exists within RREP.TargPrefix
          
        </t>
        <t>
          
            McMsg.OrigSeqNum &lt;= RREP.OrigSeqNum
            
            
          
        </t>
        <t>
          
            McMsg.SeqNoRtr = RREP.SeqNoRtr
          
        </t>
        <t>
          
            McMsg.MetricType == RREP.MetricType
          
        </t>
        <t>
          
            McMsg.Timestamp &gt; CurrentTime - RREQ_WAIT_TIME
          
        </t>
        <t>
          
            McMsg.Interface == The interface on which the RREP was
            received
          
        </t>
      </list></t>
      <t>
        then, ignore this RREP for further processing, since it does not
        correspond to a previously sent RREQ. Otherwise continue as
        follows:
      </t>
      <t><list style="numbers">
        <t>
          
            Update the Neighbor Set according to
            <xref target="nbrupdate"/>
            
            
          
        </t>
        <t>
          
            Determine whether the cost of the advertised route exceeds
            the maximum allowed metric value for the metric type (Metric
            &lt;= MAX_METRIC[MetricType] - Cost(L))
          
          <list style="symbols">
            <t>
              
                If it does, ignore this RREP for further processing.
              
            </t>
          </list>
        </t>
        <t>
          
            Process the route to TargPrefix as specified in
            <xref target="processingrte"/>
          
        </t>
        <t>
          
            Determine whether the message is redundant by comparing to
            entries in the Multicast Message Set
            (<xref target="suppress"/>)
          
          <list style="symbols">
            <t>
              
                If redundant, ignore this RREP for further processing.
              
            </t>
            <t>
              
                If not redundant, save the information in the Multicast
                Message Set to identify future redundant RREP messages
                and continue processing.
              
            </t>
          </list>
        </t>
        <t>
          
            Determine whether the OrigPrefix matches an entry in the
            Router Client Set
          
          <list style="symbols">
            <t>
              
                If so, no further processing is necessary.
              
            </t>
            <t>
              
                If not, continue to the next step.
              
            </t>
          </list>
        </t>
        <t>
          
            Determine whether a valid (Active or Idle) or Unconfirmed
            LocalRoute exists to OrigPrefix
          
          <list style="symbols">
            <t>
              
                If so, continue to RREP forwarding
                <xref target="RREP_fwd"/>.
              
            </t>
            <t>
              
                If not, a Route Error message SHOULD be transmitted
                toward TargPrefix according to
                <xref target="RERR_gen"/>; the RREP MUST be
                discarded and not forwarded.
              
            </t>
          </list>
        </t>
      </list></t>
    </section>
    <section title="RREP Forwarding" anchor="RREP_fwd">
      
      <t>
        A received Route Reply message is forwarded toward OrigPrefix.
        By forwarding the RREP, a router advertises that it has a route
        to TargPrefix.
      </t>
      <t>
        The RREP MUST NOT be forwarded if the received msg_hop_limit =
        1, or if CONTROL_TRAFFIC_LIMIT has been reached. Otherwise, the
        router MUST forward the RREP.
        
      </t>
      <t>
        The procedure for RREP forwarding is as follows:
      </t>
      <t><list style="numbers">
        <t>
          
            Set msg_hop_limit := received msg_hop_limit - 1
          
        </t>
        <t>
          
            If the link to the next hop router toward OrigAddr is not
            known to be bidirectional, also verify bidirectionality (see
            <xref target="nexthopmonitoring"/>).
          
        </t>
        <t>
          
            Set TargMetric := LocalRoute[TargPrefix].Metric
          
        </t>
      </list></t>
      <t>
        This modified message is handed to the
        <xref target="RFC5444"/> multiplexer for further
        processing. The multiplexer is instructed to unicast the RREP to
        LocalRoute[OrigPrefix].NextHop. The RREP MUST be sent over
        LocalRoute[OrigPrefix].NextHopInterface.
      </t>
    </section>
  </section>
  <section title="Route Reply Acknowledgement (RREP_Ack) Message" anchor="rrep_ack_msgs">
    
    <t>
      The Route Reply Acknowledgement is used as both a request and a
      response message to test bidirectionality of a link over which a
      Route Reply has also been sent. The router which forwards the RREP
      MUST send a Route Reply Acknowledgement message to the intended
      next hop, if the link to the next hop neighbor is not yet
      confirmed as bidirectional.
    </t>
    <t>
      The receiving router MUST then reply with a Route Reply
      Acknowledgement response message.
    </t>
    <t>
      When the Route Reply Acknowledgement response message is received
      by the sender of the RREP, it confirms that the link between the
      two routers is bidirectional (see
      <xref target="nexthopmonitoring"/>).
    </t>
    <t>
      If the Route Reply Acknowledgement is not received within
      RREP_Ack_SENT_TIMEOUT, the link is determined to be
      unidirectional. 
    </t>
    <figure anchor="figRREP_Ack" align="center" title="RREP_Ack message contents"><artwork align="center">
+-----------------------------------------------------------------+
|                        AckReq (optional)                        |
+-----------------------------------------------------------------+
</artwork></figure>
    <t>
      
    </t>
    <section title="RREP_Ack Request Generation" anchor="RREP_Ack_gen">
      
      <t>
        An RREP_Ack MUST be generated if a Route Reply is sent over a
        link which is not known to be bidirectional. It includes an
        AckReq element to indicate that it is a request for
        acknowledgement.
      </t>
      <t>
        The RREP_Ack SHOULD NOT be generated if the limit for the rate
        of AODVv2 control message generation has been reached.
      </t>
      <t>
        The <xref target="RFC5444"/> representation of the
        RREP_Ack is discussed in <xref target="represent"/>.
      </t>
      <t>
        RREP_Ack requests MUST be unicast to
        LocalRoute[OrigPrefix].NextHop via
        LocalRoute[OrigPrefix].NextHopInterface. The multiplexer SHOULD
        be instructed to send the RREP_Ack in the same
        <xref target="RFC5444"/> packet as the RREP.
      </t>
      <t>
        The Neighbor Set entry for LocalRoute[OrigPrefix].NextHop MUST
        also be updated to indicate that an RREP_Ack is required (see
        <xref target="nbrupdate"/>).
      </t>
      
    </section>
    <section title="RREP_Ack Reception" anchor="RREP_Ack_rcv">
      
      <t>
        Upon receiving an RREP_Ack, an AODVv2 router performs the
        following steps:
      </t>
      <t><list style="numbers">
        <t>
          
            Determine whether an AckReq element is included:
          
          <list style="symbols">
            <t>
              
                If so, create an RREP_Ack Response as described in
                <xref target="RREP_Ack_Resp"/>. No further
                processing is required.
              
            </t>
            <t>
              
                If not, continue to the next step.
              
            </t>
          </list>
        </t>
        <t>
          
            Determine whether the Neighbor Set contains an entry where:
          
          <list style="symbols">
            <t>
              
                Neighbor.IPAddress == IP source address of the RREP_Ack
                message
              
            </t>
            <t>
              
                Neighbor.State == HEARD
              
            </t>
            <t>
              
                Neighbor.Timeout &lt; CurrentTime
              
            </t>
            <t>
              
                Neighbor.Interface matches the interface on which the
                RREP_Ack was received
              
            </t>
          </list>
          <vspace blankLines="1"/>
            If no such entry is found, the RREP_Ack was not expected; no
            actions are required and processing ends. Otherwise, the
            router sets Neighbor.Timeout to INFINITY_TIME, and
            processing continues to the next step.
          
        </t>
        <t>
          
            Update the Neighbor Set according to
            <xref target="nbrupdate"/>, including updating routes
            using this Neighbor as LocalRoute.NextHop.
          
        </t>
      </list></t>
    </section>
    <section title="RREP_Ack Response Generation" anchor="RREP_Ack_Resp">
      
      <t>
        An RREP_Ack response MUST be generated if a received RREP_Ack
        includes an AckReq, unless the limit for the rate of AODVv2
        control message generation has been reached in which case the
        RREP_Ack response SHOULD NOT be generated.
      </t>
      <t>
        There is no further data in an RREP_Ack response. The
        <xref target="RFC5444"/> representation is discussed in
        <xref target="represent"/>. In this case, the multiplexer
        is instructed to unicast the RREP_Ack to the source IP address
        of the RREP_Ack message that requested it, over the same
        interface on which the RREP_Ack was received.
      </t>
    </section>
  </section>
  <section title="Route Error (RERR) Message" anchor="RERR_msgs">
    
    <t>
      A Route Error message is generated by an AODVv2 router to notify
      other AODVv2 routers about routes that are no longer available. An
      RERR message has the following contents:
    </t>
    <figure anchor="figRERRstruct" align="center" title="RERR message contents"><artwork align="center">
+-----------------------------------------------------------------+
|                       PktSource (optional)                      |
+-----------------------------------------------------------------+
|                           AddressList                           |
+-----------------------------------------------------------------+
|                   PrefixLengthList (optional)                   |
+-----------------------------------------------------------------+
|                       SeqNumList (optional)                     |
+-----------------------------------------------------------------+
|                          MetricTypeList                         |
+-----------------------------------------------------------------+
</artwork></figure>
    <t>
      
    </t>
    <t><list style="hanging">
      <t hangText="PktSource">
          
            <vspace/>The source address of the IP packet triggering the
            RERR. If the RERR is triggered by a broken link, PktSource
            is not required.
          
        </t>
      <t hangText="AddressList">
          
            <vspace/>The addresses of the routes not available through
            RERR_Gen.
          
        </t>
      <t hangText="PrefixLengthList">
          
            <vspace/>The prefix lengths, in bits, associated with the
            routes not available through RERR_Gen. These values indicate
            whether routes represent a single device or an address
            range.
          
        </t>
      <t hangText="SeqNumList">
          
            <vspace/>The sequence numbers (where known) of the routes
            not available through RERR_Gen.
          
        </t>
      <t hangText="MetricTypeList">
          
            <vspace/>The metric types associated with the routes not
            available through RERR_Gen.
          
        </t>
    </list></t>
    <section title="RERR Generation" anchor="RERR_gen">
      
      <t>
        A Route Error message is generated when an AODVv2 router (also
        referred to as RERR_Gen) needs to report that a destination is
        not reachable. There are three events that cause this response:
      </t>
      <t><list style="symbols">
        <t>
          
            When an IP packet that has been forwarded from another
            router, but there is no valid route in the Routing
            Information Base for its destination, the source of the
            packet needs to be informed that the route to the
            destination of the packet does not exist. The RERR generated
            MUST include PktSource set to the source address of the IP
            packet, and MUST contain only one unreachable address in the
            AddressList, i.e., the destination address of the IP packet.
            RERR_Gen MUST discard the IP packet that triggered
            generation of the RERR. The prefix length, sequence number
            and metric type SHOULD be included if known from an existing
            Invalid LocalRoute to the unreachable address.
          
        </t>
        <t>
          
            When an RREP message cannot be forwarded because there is no
            valid LocalRoute to OrigPrefix, RREP_Gen needs to be
            informed that the route to OrigPrefix does not exist. The
            RERR generated MUST include PktSource set to the TargPrefix
            of the RREP, and MUST contain only one unreachable address
            in the AddressList, the OrigPrefix from the RREP. RERR_Gen
            MUST discard the RREP message that triggered generation of
            the RERR. The prefix length, sequence number and metric type
            SHOULD be included if known from an Invalid LocalRoute to
            the unreachable address.
          
        </t>
      </list></t>
      
      <t><list style="symbols">
        <t>
          
            When a link breaks, multiple LocalRoutes may become Invalid,
            and the RERR generated MAY contain multiple unreachable
            addresses. The RERR MUST include MetricTypeList. PktSource
            is omitted. All previously Active LocalRoutes that used the
            broken link MUST be reported. The AddressList, SeqNumList,
            and MetricTypeList will contain entries for each LocalRoute
            which has become Invalid. PrefixLengthList will be included
            if needed to report invalid routes to a non-default prefix.
            An RERR message is only sent if an Active LocalRoute becomes
            Invalid, though an AODVv2 router MAY also include Idle
            LocalRoutes that become Invalid if the configuration
            parameter ENABLE_IDLE_IN_RERR is set (see
            <xref target="other"/>).
          
          
        </t>
      </list></t>
      <t>
        The RERR SHOULD NOT be generated if CONTROL_TRAFFIC_LIMIT has
        been reached. The RERR also SHOULD NOT be generated if it is a
        duplicate, as determined by
        <xref target="suppressrerr"/>.
      </t>
      <t>
        Incidentally, if an AODVv2 router receives an ICMP error packet
        to or from the address of one of its Router Clients, it forwards
        the ICMP packet in the same way as any other IP packet, and will
        not generate any RERR message based on the contents of the ICMP
        packet.
      </t>
      <t>
        To generate the RERR, the router follows this procedure:
      </t>
      <t><list style="numbers">
        <t>
          
            If necessary, include PktSource and set the value as given
            above
          
        </t>
        <t>
          
            For each LocalRoute that needs to be reported:
          
          <list style="symbols">
            <t>
              
                Insert LocalRoute.Address into the AddressList.
              
            </t>
            <t>
              
                Insert LocalRoute.PrefixLength into PrefixLengthList, if
                known and not equal to the address length.
              
            </t>
            <t>
              
                Insert LocalRoute.SeqNum into SeqNumList, if known.
              
            </t>
            <t>
              
                Insert LocalRoute.MetricType into MetricTypeList.
              
            </t>
          </list>
        </t>
      </list></t>
      <t>
        The AODVv2 message is used to create a corresponding
        <xref target="RFC5444"/> message (see
        <xref target="represent"/>).
      </t>
      <t>
        If the RERR is sent in response to an undeliverable IP packet or
        RREP message (i.e., if PktSource is included), the RERR SHOULD
        be sent unicast to the next hop on the route to PktSource. It
        MUST be sent over the same interface on which the undeliverable
        IP packet was received. If there is no route to PktSource, the
        RERR SHOULD be multicast to LL-MANET-Routers. If the RERR is
        sent in response to a broken link, i.e., PktSource is not
        included, the RERR is, by default, multicast to
        LL-MANET-Routers.
      </t>
      <t>
        <xref target="precursor"/> describes processing steps
        when the optional precursor lists feature is implemented.
      </t>
      
      
    </section>
    <section title="RERR Reception" anchor="RERR_rcv">
      
      <t>
        Upon receiving a Route Error, an AODVv2 router performs the
        following steps:
      </t>
      
      
      
      <t><list style="numbers">
        <t>
          
            Determine whether the message contains at least one
            unreachable address; if not, ignore this RERR for further
            processing. Otherwise continue as follows:
          
        </t>
        <t>
          
            For each address in the AddressList, check that:
          
          <list style="symbols">
            <t>
              
                The address is valid (routable and unicast).
              
            </t>
            <t>
              
                The MetricType is supported and configured for use.
              
            </t>
            <t>
              
                There is a LocalRoute with the same MetricType matching
                the address using longest prefix matching.
              
            </t>
            <t>
              
                Either the LocalRoute's next hop is the sender of the
                RERR and the next hop interface is the interface on
                which the RERR was received, or PktSource is present in
                the RERR and is a Router Client address.
              
            </t>
            <t>
              
                The unreachable address' sequence number is either
                unknown, or is no less than the LocalRoute's sequence
                number.
              
            </t>
          </list>
          <vspace blankLines="1"/>
            If any of the above are false the address does not match a
            LocalRoute and MUST NOT be processed or regenerated in a
            RERR.
          
          <vspace blankLines="1"/>
            If all of the above are true, the LocalRoute which matches
            the unreachable address MUST be marked as Invalid.
            Otherwise, regeneration of the RERR proceeds as follows. If
            the LocalRoute was previously Active, it MUST be reported in
            a regenerated RERR. If the LocalRoute was previously Idle,
            it MAY be reported in a regenerated RERR, if
            ENABLE_IDLE_IN_RERR is configured. The Local Route Set MUST
            be updated according to these rules:
          
          <list style="symbols">
            <t>
              
                If the LocalRoute's prefix length is the same as the
                unreachable address' prefix length, set LocalRoute.State
                to Invalid.
              
            </t>
            <t>
              
                If the LocalRoute's prefix length is longer than the
                unreachable address' prefix length, the LocalRoute MUST
                be expunged from the Local Route Set, since it is a
                sub-route of the route which is reported to be Invalid.
              
            </t>
            <t>
              
                If the prefix length is different, create a new
                LocalRoute with the unreachable address, and its prefix
                length and sequence number, and set LocalRoute.State to
                Invalid. These Invalid routes are retained to avoid
                processing stale messages.
              
            </t>
            <t>
              
                Update the sequence number on the existing LocalRoute,
                if the reported sequence number is determined to be
                newer using the comparison method described in
                <xref target="seqnum"/>.
              
            </t>
          </list>
        </t>
        <t>
          
            If there are previously Active LocalRoutes that MUST be
            reported, regenerate the RERR as detailed in
            <xref target="RERR_regen"/>.
          
        </t>
      </list></t>
    </section>
    <section title="RERR Regeneration" anchor="RERR_regen">
      
      <t>
        The Route Error message SHOULD NOT be regenerated if
        CONTROL_TRAFFIC_LIMIT has been reached.
      </t>
      <t>
        The procedure for RERR regeneration is as follows:
      </t>
      <t><list style="numbers">
        <t>
          
            If PktSource was included in the received RERR, and
            PktSource is not a Router Client, copy it into the
            regenerated RERR
          
        </t>
        <t>
          
            For each LocalRoute that needs to be reported as identified
            in <xref target="RERR_gen"/>:
          
          <list style="symbols">
            <t>
              
                Insert LocalRoute.Address into the AddressList.
              
            </t>
            <t>
              
                Insert LocalRoute.PrefixLength into PrefixLengthList, if
                known and not equal to the address length.
              
            </t>
            <t>
              
                Insert LocalRoute.SeqNum into SeqNumList, if known.
              
            </t>
            <t>
              
                Insert LocalRoute.MetricType into MetricTypeList.
              
            </t>
          </list>
        </t>
      </list></t>
      <t>
        The AODVv2 message is used to create a corresponding
        <xref target="RFC5444"/> message (see
        <xref target="represent"/>). If the RERR contains
        PktSource, the regenerated RERR SHOULD be sent unicast to the
        next hop on the LocalRoute to PktSource. It MUST be sent over
        the same interface on which the undeliverable IP packet was
        received. If there is no route to PktSource, or PktSource is a
        Router Client, it SHOULD be multicast to LL-MANET-Routers. If
        the RERR is sent in response to a broken link, the RERR is, by
        default, multicast to LL-MANET-Routers.
      </t>
    </section>
  </section>
</section>
<section title="RFC 5444 Representation" anchor="represent">
  
  <t>
    AODVv2 specifies that all control messages between routers MUST use
    the Generalized Mobile Ad Hoc Network Packet/Message Format
    <xref target="RFC5444"/>, and therefore AODVv2's route
    messages comprise data which is mapped to message elements in
    <xref target="RFC5444"/>.
  </t>
  <t>
    <xref target="RFC5444"/> provides a multiplexed transport for
    multiple protocols. An <xref target="RFC5444"/>
    implementation MAY choose to optimize the content of certain
    elements during message creation to reduce control message overhead.
  </t>
  <t>
    A brief summary of the <xref target="RFC5444"/> format:
  </t>
  <t><list style="numbers">
    <t>
      
        A packet contains zero or more messages
      
    </t>
    <t>
      
        A message contains a Message Header, one Message TLV Block, zero
        or more Address Blocks, and one Address Block TLV Block per
        Address Block
      
    </t>
    <t>
      
        The Message TLV Block contains zero or more Message TLVs
      
    </t>
    <t>
      
        An Address Block TLV Block includes zero or more Address Block
        TLVs
      
    </t>
    <t>
      
        Each TLV value in an Address Block TLV Block can be associated
        with all of the addresses, or with a contiguous set of
        addresses, or with a single address in the Address Block
      
    </t>
  </list></t>
  <t>
    AODVv2 does not require access to the
    <xref target="RFC5444"/> packet header.
  </t>
  <t>
    In the message header, AODVv2 uses &lt;msg-type&gt;,
    &lt;msg-hop-limit&gt; and &lt;msg-addr-length&gt;. The
    &lt;msg-addr-length&gt; field indicates the length of any addresses
    in the message, using &lt;msg-addr-length&gt; := (address length in
    octets - 1), i.e. 3 for IPv4 and 15 for IPv6.
  </t>
  <t>
    The addresses in an Address Block MAY appear in any order, and
    values in a TLV in the Address Block TLV Block must be associated
    with the correct address in the Address Block by the
    <xref target="RFC5444"/> 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 matches the order of values in other data lists,
    e.g., the order of SeqNums in the SeqNumList in an RERR.
    <xref target="RFC5444"/> maps this information to Address
    Block TLVs associated with the relevant addresses in the Address
    Block.
  </t>
  <t>
    Each address included in the Address Block is identified as
    OrigPrefix, TargPrefix, PktSource, SeqNoRtr, or Unreachable Address
    by including an ADDRESS_TYPE TLV in the Address Block TLV Block.
  </t>
  <t>
    The following sections show how AODVv2 data is represented in
    <xref target="RFC5444"/> messages. In
    <xref target="iana-addrtlvspec"/>, AODVv2 defines several new
    TLVs.
  </t>
  
  <t>
    Where the extension type of a TLV is set to zero, this is the
    default <xref target="RFC5444"/> value and the extension type
    will not be included in the message.
  </t>
  <section title="Route Request Message Representation" anchor="route-request-message-representation">
    
    <section title="Message Header" anchor="message-header">
      
      <texttable>
        
          
          
          
          
            
              <ttcol align="left">
                Data
              </ttcol>
              <ttcol align="left">
                Header Field
              </ttcol>
              <ttcol align="left">
                Value
              </ttcol>
            
          
          
            
              <c>
                None
              </c>
              <c>
                &lt;msg-type&gt;
              </c>
              <c>
                RREQ
              </c>
            
            
              <c>
                msg_hop_limit
              </c>
              <c>
                &lt;msg-hop-limit&gt;
              </c>
              <c>
                MAX_HOPCOUNT, reduced by number of hops traversed so far
                by the message.
              </c>
            
          
        
      </texttable>
    </section>
    <section title="Message TLV Block" anchor="message-tlv-block">
      
      <t>
        AODVv2 does not define any Message TLVs for an RREQ message.
      </t>
    </section>
    <section title="Address Block" anchor="address-block">
      
      <t>
        An RREQ contains OrigPrefix and TargPrefix, and each of these
        addresses has an associated prefix length. If the prefix length
        has not been included in the AODVv2 message, it is equal to the
        address length in bits.
      </t>
      <texttable>
        
          
          
          
            
              <ttcol align="left">
                Data
              </ttcol>
              <ttcol align="left">
                Address Block
              </ttcol>
            
          
          
            
              <c>
                OrigPrefix/OrigPrefixLen
              </c>
              <c>
                &lt;address&gt; + &lt;prefix-length&gt;
              </c>
            
            
              <c>
                TargPrefix/TargPrefixLen
              </c>
              <c>
                &lt;address&gt; + &lt;prefix-length&gt;
              </c>
            
            
              <c>
                SeqNoRtr/PrefixLen
              </c>
              <c>
                &lt;address&gt; + &lt;prefix-length&gt;
              </c>
            
          
        
      </texttable>
    </section>
    <section title="Address Block TLV Block" anchor="address-block-tlv-block">
      
      <t>
        Address Block TLVs are always associated with one or more
        addresses in the Address Block. The following sections show the
        TLVs that apply to each address.
      </t>
      <section title="Address Block TLVs for OrigPrefix" anchor="address-block-tlvs-for-origprefix">
        
        <texttable>
          
            
            
            
            
            
              
                <ttcol align="left">
                  Data
                </ttcol>
                <ttcol align="left">
                  TLV Type
                </ttcol>
                <ttcol align="left">
                  Extension Type
                </ttcol>
                <ttcol align="left">
                  Value
                </ttcol>
              
            
            
              
                <c>
                  None
                </c>
                <c>
                  ADDRESS_TYPE
                </c>
                <c>
                  0
                </c>
                <c>
                  ORIGPREFIX
                </c>
              
              
                <c>
                  OrigSeqNum
                </c>
                <c>
                  SEQ_NUM
                </c>
                <c>
                  0
                </c>
                <c>
                  Sequence number of RREQ_Gen, the router which
                  initiated route discovery.
                </c>
              
              
                <c>
                  OrigMetric /MetricType
                </c>
                <c>
                  PATH_METRIC
                </c>
                <c>
                  MetricType
                </c>
                <c>
                  Metric value for the route to OrigPrefix, using
                  MetricType.
                </c>
              
            
          
        </texttable>
      </section>
      <section title="Address Block TLVs for TargPrefix" anchor="address-block-tlvs-for-targprefix">
        
        <texttable>
          
            
            
            
            
            
              
                <ttcol align="left">
                  Data
                </ttcol>
                <ttcol align="left">
                  TLV Type
                </ttcol>
                <ttcol align="left">
                  Extension Type
                </ttcol>
                <ttcol align="left">
                  Value
                </ttcol>
              
            
            
              
                <c>
                  None
                </c>
                <c>
                  ADDRESS_TYPE
                </c>
                <c>
                  0
                </c>
                <c>
                  TARGPREFIX
                </c>
              
              
                <c>
                  TargSeqNum
                </c>
                <c>
                  SEQ_NUM
                </c>
                <c>
                  0
                </c>
                <c>
                  The last known TargSeqNum for TargPrefix.
                </c>
              
            
          
        </texttable>
      </section>
    </section>
  </section>
  <section title="Route Reply Message Representation" anchor="route-reply-message-representation">
    
    <section title="Message Header" anchor="message-header-1">
      
      <texttable>
        
          
          
          
          
            
              <ttcol align="left">
                Data
              </ttcol>
              <ttcol align="left">
                Header Field
              </ttcol>
              <ttcol align="left">
                Value
              </ttcol>
            
          
          
            
              <c>
                None
              </c>
              <c>
                &lt;msg-type&gt;
              </c>
              <c>
                RREP
              </c>
            
            
              <c>
                msg_hop_limit
              </c>
              <c>
                &lt;msg-hop-limit&gt;
              </c>
              <c>
                MAX_HOPCOUNT - msg_hop_limit from the corresponding
                RREQ, reduced by number of hops traversed so far by the
                message.
              </c>
            
          
        
      </texttable>
    </section>
    <section title="Message TLV Block" anchor="message-tlv-block-1">
      
      <t>
        AODVv2 does not define any Message TLVs for an RREP message.
      </t>
    </section>
    <section title="Address Block" anchor="rrep_addrblk">
      
      <t>
        An RREP contains OrigPrefix and TargPrefix, and each of these
        addresses has an associated prefix length. If the prefix length
        has not been included in the AODVv2 message, it is equal to the
        address length in bits.
      </t>
      <texttable>
        
          
          
          
            
              <ttcol align="left">
                Data
              </ttcol>
              <ttcol align="left">
                Address Block
              </ttcol>
            
          
          
            
              <c>
                OrigPrefix/OrigPrefixLen
              </c>
              <c>
                &lt;address&gt; + &lt;prefix-length&gt;
              </c>
            
            
              <c>
                TargPrefix/TargPrefixLen
              </c>
              <c>
                &lt;address&gt; + &lt;prefix-length&gt;
              </c>
            
            
              <c>
                SeqNoRtr/PrefixLen
              </c>
              <c>
                &lt;address&gt; + &lt;prefix-length&gt;
              </c>
            
          
        
      </texttable>
    </section>
    <section title="Address Block TLV Block" anchor="address-block-tlv-block-1">
      
      <t>
        Address Block TLVs are always associated with one or more
        addresses in the Address Block. The following sections show the
        TLVs that apply to each address.
      </t>
      <section title="Address Block TLVs for OrigPrefix" anchor="address-block-tlvs-for-origprefix-1">
        
        <texttable>
          
            
            
            
            
            
              
                <ttcol align="left">
                  Data
                </ttcol>
                <ttcol align="left">
                  TLV Type
                </ttcol>
                <ttcol align="left">
                  Extension Type
                </ttcol>
                <ttcol align="left">
                  Value
                </ttcol>
              
            
            
              
                <c>
                  None
                </c>
                <c>
                  ADDRESS_TYPE
                </c>
                <c>
                  0
                </c>
                <c>
                  ORIGPREFIX
                </c>
              
            
          
        </texttable>
      </section>
      <section title="Address Block TLVs for TargPrefix" anchor="address-block-tlvs-for-targprefix-1">
        
        <texttable>
          
            
            
            
            
            
              
                <ttcol align="left">
                  Data
                </ttcol>
                <ttcol align="left">
                  TLV Type
                </ttcol>
                <ttcol align="left">
                  Extension Type
                </ttcol>
                <ttcol align="left">
                  Value
                </ttcol>
              
            
            
              
                <c>
                  None
                </c>
                <c>
                  ADDRESS_TYPE
                </c>
                <c>
                  0
                </c>
                <c>
                  TARGPREFIX
                </c>
              
              
                <c>
                  TargSeqNum
                </c>
                <c>
                  SEQ_NUM
                </c>
                <c>
                  0
                </c>
                <c>
                  Sequence number of RREP_Gen, the router which created
                  the RREP.
                </c>
              
              
                <c>
                  TargMetric /MetricType
                </c>
                <c>
                  PATH_METRIC
                </c>
                <c>
                  MetricType
                </c>
                <c>
                  Metric value for the route to TargPrefix, using
                  MetricType.
                </c>
              
            
          
        </texttable>
      </section>
    </section>
  </section>
  <section title="Route Reply Acknowledgement Message Representation" anchor="route-reply-acknowledgement-message-representation">
    
    <section title="Message Header" anchor="message-header-2">
      
      <texttable>
        
          
          
          
          
            
              <ttcol align="left">
                Data
              </ttcol>
              <ttcol align="left">
                Header Field
              </ttcol>
              <ttcol align="left">
                Value
              </ttcol>
            
          
          
            
              <c>
                None
              </c>
              <c>
                &lt;msg-type&gt;
              </c>
              <c>
                RREP_Ack
              </c>
            
          
        
      </texttable>
    </section>
    <section title="Message TLV Block" anchor="message-tlv-block-2">
      
      <t>
        AODVv2 defines an AckReq Message TLV, included when an
        acknowledgement of this message is required, in order to monitor
        adjacency, as described in
        <xref target="nexthopmonitoring"/>.
      </t>
      <texttable>
        
          
          
          
          
          
            
              <ttcol align="left">
                Data
              </ttcol>
              <ttcol align="left">
                TLV Type
              </ttcol>
              <ttcol align="left">
                Extension Type
              </ttcol>
              <ttcol align="left">
                Value
              </ttcol>
            
          
          
            
              <c>
                AckReq
              </c>
              <c>
                ACK_REQ
              </c>
              <c>
                0
              </c>
              <c>
                None
              </c>
            
          
        
      </texttable>
    </section>
    <section title="Address Block" anchor="address-block-1">
      
      <t>
        AODVv2 does not define an Address Block for an RREP_Ack message.
      </t>
    </section>
    <section title="Address Block TLV Block" anchor="address-block-tlv-block-2">
      
      <t>
        AODVv2 does not define any Address Block TLVs for an RREP_Ack
        message.
      </t>
    </section>
  </section>
  <section title="Route Error Message Representation" anchor="route-error-message-representation">
    
    <t>
      Route Error Messages MAY be split into multiple
      <xref target="RFC5444"/> messages when the desired contents
      would exceed the MTU. However, all of the resulting messages MUST
      have the same message header as described below. If PktSource is
      included in the AODVv2 message, it MUST be included in all of the
      resulting <xref target="RFC5444"/> messages.
    </t>
    <section title="Message Header" anchor="message-header-3">
      
      <texttable>
        
          
          
          
          
            
              <ttcol align="left">
                Data
              </ttcol>
              <ttcol align="left">
                Header Field
              </ttcol>
              <ttcol align="left">
                Value
              </ttcol>
            
          
          
            
              <c>
                None
              </c>
              <c>
                &lt;msg-type&gt;
              </c>
              <c>
                RERR
              </c>
            
          
        
      </texttable>
    </section>
    <section title="Message TLV Block" anchor="message-tlv-block-3">
      
      <t>
        AODVv2 does not define any Message TLVs for an RERR message.
      </t>
    </section>
    <section title="Address Block" anchor="address-block-2">
      
      <t>
        The Address Block in an RERR MAY contain PktSource, the source
        address of the IP packet triggering RERR generation, as detailed
        in <xref target="RERR_msgs"/>. The prefix length
        associated with PktSource is equal to the address length in
        bits.
      </t>
      <t>
        Address Block always contains one address per route that is no
        longer valid, and each address has an associated prefix length.
        If a prefix length has not been included for this address, it is
        equal to the address length in bits.
      </t>
      <texttable>
        
          
          
          
            
              <ttcol align="left">
                Data
              </ttcol>
              <ttcol align="left">
                Address Block
              </ttcol>
            
          
          
            
              <c>
                PktSource
              </c>
              <c>
                &lt;address&gt; + &lt;prefix-length&gt; for PktSource
              </c>
            
            
              <c>
                AddressList/PrefixLengthList
              </c>
              <c>
                &lt;address&gt; + &lt;prefix-length&gt; for each
                unreachable address in AddressList
              </c>
            
          
        
      </texttable>
    </section>
    <section title="Address Block TLV Block" anchor="address-block-tlv-block-3">
      
      <t>
        Address Block TLVs are always associated with one or more
        addresses in the Address Block. The following sections show the
        TLVs that apply to each type of address in the RERR.
      </t>
      <section title="Address Block TLVs for PktSource" anchor="address-block-tlvs-for-pktsource">
        
        <texttable>
          
            
            
            
            
            
              
                <ttcol align="left">
                  Data
                </ttcol>
                <ttcol align="left">
                  TLV Type
                </ttcol>
                <ttcol align="left">
                  Extension Type
                </ttcol>
                <ttcol align="left">
                  Value
                </ttcol>
              
            
            
              
                <c>
                  PktSource
                </c>
                <c>
                  ADDRESS_TYPE
                </c>
                <c>
                  0
                </c>
                <c>
                  PKTSOURCE
                </c>
              
            
          
        </texttable>
      </section>
      <section title="Address Block TLVs for Unreachable Addresses" anchor="address-block-tlvs-for-unreachable-addresses">
        
        <texttable>
          
            
            
            
            
            
              
                <ttcol align="left">
                  Data
                </ttcol>
                <ttcol align="left">
                  TLV Type
                </ttcol>
                <ttcol align="left">
                  Extension Type
                </ttcol>
                <ttcol align="left">
                  Value
                </ttcol>
              
            
            
              
                <c>
                  None
                </c>
                <c>
                  ADDRESS_TYPE
                </c>
                <c>
                  0
                </c>
                <c>
                  UNREACHABLE
                </c>
              
              
                <c>
                  SeqNumList
                </c>
                <c>
                  SEQ_NUM
                </c>
                <c>
                  0
                </c>
                <c>
                  Sequence number associated with invalid route to the
                  unreachable address.
                </c>
              
              
                <c>
                  MetricTypeList
                </c>
                <c>
                  PATH_METRIC
                </c>
                <c>
                  MetricType
                </c>
                <c>
                  None. Extension Type set to MetricType of the route to
                  the unreachable address.
                </c>
              
            
          
        </texttable>
      </section>
    </section>
  </section>
</section>
<section title="Simple External Network Attachment" anchor="gateway">
  
  <t>
    <xref target="net_top"/> shows a stub (i.e., non-transit)
    network of AODVv2 routers which is attached to an external network
    (i.e., a network not using AODVv2) via a single External Network
    Access Router (ENAR).
  </t>
  <t>
    As in any externally-attached network, AODVv2 routers and Router
    Clients that wish to be reachable from the external network MUST
    have IP addresses within the ENAR's routable and topologically
    correct prefix (e.g., 191.0.2.0/24 in
    <xref target="net_top"/>). This AODVv2 network and networks
    attached to routers within it will be advertised to the external
    network using other routing protocols or procedures which are out of
    scope for this specification.
  </t>
  <figure anchor="net_top" align="center" title="Simple External Network Attachment Example"><artwork align="center">
  /-------------------------\
 / +----------------+        \
/  |  AODVv2 Router |         \
|  |  191.0.2.2/32  |         |
|  +----------------+         |            Routable
|                       +-----+--------+   Prefix
|                       |     ENAR     |  /191.0.2.0/24
|                       | AODVv2 Router| /
|                       |  191.0.2.1   |/      /---------------\
|                       | serving net  +------+    External     \
|                       | 191.0.2.0/24 |      \     Network     /
|                       +-----+--------+       \---------------/
|         +----------------+  |
|         |  AODVv2 Router |  |
|         |  191.0.2.3/32  |  |
\         +----------------+  /
 \                           /
  \-------------------------/
</artwork></figure>
  <t>
    
  </t>
  <t>
    When an AODVv2 router within the AODVv2 MANET wants to discover a
    route toward an address on the external network, it uses the normal
    AODVv2 route discovery for that IP Destination Address.
  </t>
  <t>
    The ENAR MUST respond to RREQ on behalf of all external network
    destinations, that is, destinations which are not on the configured
    191.0.2.0 /24 network. The ENAR MUST NOT respond with a TargPrefix
    and TargPrefixLen which includes any of the networks configured as
    part of the AODVv2 network. Sending a Route Request for a gateway is
    not currently supported.
  </t>
  
  <t>
    If more than one gateway is configured to serve the same external
    network, each such gateway MUST configure that external network as a
    Router Client with its IP address as the value of SeqNoRtr for the
    RouterClient. AODVv2 messages SHOULD NOT be transmitted to routers
    in the External Network.
  </t>
  <t>
    RREQs for addresses inside the AODVv2 network, e.g. destinations on
    the configured 191.0.2.0/24 network, are handled using the standard
    processes described in <xref target="aodv_msgs"/>. Note that
    AODVv2 does not currently support route discovery for prefixes that
    do not equal address length, but RREPs do advertise the prefix on
    which TargAddr resides.
    
  </t>
  <t>
    When an IP packet from an address on the external network destined
    for an address in the AODVv2 MANET reaches the ENAR, if the ENAR
    does not have a route toward that destination in its Routing
    Information Base, it will perform normal AODVv2 route discovery for
    that destination.
  </t>
  <t>
    Configuring the ENAR as a default router is outside the scope of
    this specification.
  </t>
</section>
<section title="Precursor Lists" anchor="precursor">
  
  <t>
    This section specifies an interoperable, optional enhancement to
    AODVv2 enabling more economical Route Error notifications.
  </t>
  <t>
    There can be several sources of traffic for a certain destination.
    Each source of traffic and each upstream router between the
    forwarding AODVv2 router and the traffic source is known as a
    "precursor" for the destination. For each destination, an
    AODVv2 router MAY choose to keep track of precursors that have
    provided traffic for that destination. Route Error messages about
    that destination can then be sent unicast to these precursors
    instead of multicast to all AODVv2 routers.
  </t>
  <t>
    Since an RERR will be regenerated if it comes from a next hop on a
    valid LocalRoute, 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 any available route. Therefore, the options for saving
    precursor information are as follows:
  </t>
  <t><list style="symbols">
    <t>
      
        Save the next hop on an existing route to the IP packet's source
        address as the precursor. In this case, it is not guaranteed
        that an RERR that is sent will follow the reverse of the
        source's route. In rare situations, this may prevent the route
        from being invalidated at the source of the data traffic.
      
    </t>
    <t>
      
        Save the IP packet's source address as the precursor. In this
        case, the RERR can be sent along any existing route to the
        source of the data traffic, and SHOULD include PktSource to
        ensure that the route will be invalidated at the source of the
        traffic, in case the RERR does not follow the reverse of the
        source's route.
      
    </t>
    <t>
      
        By inspecting the MAC address of each forwarded IP packet,
        determine which router forwarded the packet, and save the router
        address as a precursor. This ensures that when an RERR is sent
        to the precursor router, the route will be invalidated at that
        router, and the RERR will be regenerated toward the source of
        the IP packet.
      
    </t>
  </list></t>
  <t>
    During normal operation, each AODVv2 router maintaining precursor
    lists for a LocalRoute must update the precursor list whenever it
    uses this route to forward traffic to the destination. Precursors
    are classified as Active if traffic has recently been forwarded by
    the precursor. The precursor is marked with a timestamp to indicate
    the time it last forwarded traffic on this route.
  </t>
  <t>
    When an AODVv2 router detects that one or more LocalRoutes are
    broken, it MAY notify each Active precursor using a unicast Route
    Error message instead of creating multicast traffic. Unicast is
    applicable when there are few Active precursors compared to the
    number of neighboring AODVv2 routers. However, the default multicast
    behavior is still preferable when there are many precursors, since
    fewer message transmissions are required.
  </t>
  <t>
    When an AODVv2 router supporting precursor lists receives an RERR
    message, it SHOULD identify the list of its own affected Active
    precursors for the routes in the RERR, and choose to send a unicast
    RERR to those, rather than send a multicast RERR.
  </t>
  <t>
    When a LocalRoute is expunged, any precursor list associated with it
    MUST also be expunged.
  </t>
</section>
<section title="Application of RFC 7182 to AODVv2" anchor="securing">
  
  <t>
    Implementations of AODVv2 MUST support ICV TLVs using
    type-extensions 1 and 2, hash-function AES-CCM, and cryptographic
    function AES-CCM, both as defined in
    <xref target="RFC7251"/>.  An
    ICV MUST be included with every message. The ICV value MAY be
    truncated as specified in <xref target="RFC7182"/>.
  </t>
  <t>
    Since the msg-hop-limit and PATH_METRIC values are mutable when
    included in AODVv2 messages, these values are set to zero before
    calculating an ICV. This means that these values are not protected
    end-to-end and are therefore susceptible to manipulation. This form
    of attack is described in
    <xref target="security-integrity-mitm"/>.
  </t>
  <t>
    Implementations of AODVv2 MUST support a TIMESTAMP TLV using
    type-extension 0. The timestamp used is a sequence number, and
    therefore the length of the &lt;TIMESTAMP-value&gt; field matches
    the AODVv2 sequence number defined in
    <xref target="seqnum"/>. The TIMESTAMP TLV MUST be included
    in RREP_Ack and RERR messages.
  </t>
  <t>
    When more than one message is included in an RFC5444 packet, using a
    single ICV Packet TLV or single TIMESTAMP Packet TLV is more
    efficient than including ICV and TIMESTAMP Message TLVs in each
    message created. If the RFC5444 multiplexer is capable of adding the
    Packet TLVs, it SHOULD be instructed to include the Packet TLVs in
    packets containing AODVv2 messages. However, if the multiplexer is
    not capable of adding the Packet TLVs, the TLVs MUST be included as
    Message TLVs in each AODVv2 message in the packet.
  </t>
  <t>
    After message generation, but before transmission, the ICV and
    TIMESTAMP TLVs MUST be added according to each message type as
    detailed in the following sections. The following steps list the
    procedure to be performed:
  </t>
  <t><list style="numbers">
    <t>
      
        If the TIMESTAMP is to be included, depending on AODVv2 message
        type as specified below, add the TIMESTAMP TLV.
      
      <list style="symbols">
        <t>
          
            When a TIMESTAMP Packet TLV is being added, the Packet TLV
            Block size field MUST be updated.
          
        </t>
        <t>
          
            When a TIMESTAMP Message TLV is being added, the Message TLV
            Block size field MUST be updated.
          
        </t>
      </list>
    </t>
    <t>
      
        The considerations in Section 8 and section 9 of
        <xref target="RFC7182"/> are followed, removing existing
        ICV TLVs and adjusting the size and flags fields as appropriate:
      
      <list style="symbols">
        <t>
          
            When an ICV Packet TLV is being added, existing ICV Packet
            TLVs MUST be removed and the Packet TLV Block size MUST be
            updated. If the Packet TLV Block now contains no TLVs, the
            phastlv bit in the &lt;pkt-flags&gt; field in the Packet
            Header MUST be cleared.
          
        </t>
        <t>
          
            When an ICV Message TLV is being added, existing ICV Message
            TLVs are removed and the Message TLV Block Size MUST be
            updated.
          
        </t>
      </list>
    </t>
    <t>
      
        Mutable fields in the message must have their mutable values set
        to zero before calculating the ICV.
      
      <list style="symbols">
        <t>
          
            If the msg-hop-limit field is included in the
            <xref target="RFC5444"/> message header,
            msg-hop-limit MUST be set to zero before calculating the
            ICV.
          
        </t>
        <t>
          
            If a PATH_METRIC TLV is included, any values present in the
            TLV MUST be set to zero before calculating the ICV value.
          
        </t>
      </list>
    </t>
    <t>
      
        Depending on the message type, the ICV is calculated over the
        appropriate fields (as specified in sections
        <xref target="securing-rreq"/>,
        <xref target="securing-rrep"/>,
        <xref target="securing-rrepack"/> and
        <xref target="securing-rerr"/>) to include the fields
        &lt;hash-function&gt;, &lt;cryptographic-function&gt;,
        &lt;key-id-length&gt;, and, if present, &lt;key-id&gt; (in that
        order), followed by the entire packet or message. This value MAY
        be truncated (as specified in <xref target="RFC7182"/>).
      
    </t>
    <t>
      
        Add the ICV TLV, updating size fields as necessary.
      
    </t>
    <t>
      
        The changes made in Step 2 and Step 3 are reversed to re-add any
        existing ICV TLVs, re-adjust the relevant size and flags fields,
        and set the msg-hop-limit and PATH_METRIC TLV values.
      
    </t>
  </list></t>
  <t>
    On message reception, and before message processing, verification of
    the received message MUST take place:
  </t>
  <t><list style="numbers">
    <t>
      
        The considerations in Section 8 and Section 9 of
        <xref target="RFC7182"/> are followed, removing existing
        ICV TLVs and adjusting the size and flags fields as appropriate.
      
      <list style="symbols">
        <t>
          
            When verifying the ICV value in an ICV Packet TLV, all ICV
            Packet TLVs present in the Packet TLV Block MUST be removed
            before calculating the ICV, and the Packet TLV Block size
            MUST be updated. If there are no remaining Packet TLVs, the
            Packet TLV Block MUST be removed and the phastlv bit in the
            &lt;pkt-flags&gt; field MUST be cleared.
          
        </t>
        <t>
          
            When verifying the ICV value in an ICV Message TLV, all ICV
            Message TLVs present in the Message TLV Block MUST be
            removed before calculating the ICV, and the Message TLV
            Block size MUST be updated.
          
        </t>
      </list>
    </t>
    <t>
      
        Mutable fields in the message MUST have their mutable values set
        to zero before calculating the ICV.
      
      <list style="symbols">
        <t>
          
            If the msg-hop-limit field is included in the
            <xref target="RFC5444"/> message header,
            msg-hop-limit MUST be set to zero before calculating the
            ICV.
          
        </t>
        <t>
          
            If a PATH_METRIC TLV is included, any values present in the
            TLV MUST be set to zero before calculating the ICV value.
          
        </t>
      </list>
    </t>
    <t>
      
        The ICV is calculated following the considerations in Section
        12.2 of [RFC7182], to include the fields &lt;hash-function&gt;,
        &lt;cryptographic-function&gt;, &lt;key-id-length&gt;, and, if
        present, &lt;key-id&gt; (in that order), followed by the entire
        packet or message.
      
      <list style="symbols">
        <t>
          
            If the received ICV value is truncated, the calculated ICV
            value MUST also be truncated (as specified in
            <xref target="RFC7182"/>), before comparing.
          
        </t>
        <t>
          
            If the ICV value calculated from the received message or
            packet does not match the value of &lt;ICV-data&gt; in the
            received message or packet, the validation fails and the
            AODVv2 message MUST be discarded and NOT processed or
            forwarded.
          
        </t>
        <t>
          
            If the ICV values do match, the values set to zero before
            calculating the ICV are reset to the received values, and
            processing continues to Step 4.
          
        </t>
      </list>
    </t>
    <t>
      
        Verification of a received TIMESTAMP value MUST be performed.
        The procedure depends on message type as specified in the
        following sub sections.
      
      <list style="symbols">
        <t>
          
            If the TIMESTAMP value in the received message is not valid,
            the AODVv2 message MUST be discarded and NOT processed or
            forwarded.
          
        </t>
        <t>
          
            If the TIMESTAMP value is valid, processing continues as
            defined in Section 7.
          
        </t>
      </list>
    </t>
  </list></t>
  
  <section title="RREQ Generation and Reception" anchor="securing-rreq">
    
    <t>
      Since OrigPrefix is included in the RREQ, the ICV can be
      calculated and verified using the <xref target="RFC5444"/>
      contents.The ICV TLV has type extension := 1. Inclusion of an ICV
      TLV message integrity and endpoint authentication, because trusted
      routers MUST hold the shared key in order to calculate the ICV
      value, both to include when creating a message, and to validate
      the message by checking that the ICV is correct.
    </t>
    <t>
      Since RREQ_Gen's sequence number is incremented for each new RREQ,
      replay protection is already afforded and no extra TIMESTAMP TLV
      is required.
    </t>
    <t>
      After message generation and before message transmission:
    </t>
    <t><list style="numbers">
      <t>
        
          Add the ICV TLV as described above.
        
      </t>
    </list></t>
    <t>
      On message reception and before message processing:
    </t>
    <t><list style="numbers">
      <t>
        
          Verify the received ICV value as described above.
        
      </t>
      <t>
        
          Verification of the sequence number is handled according to
          Section 7.
        
      </t>
    </list></t>
  </section>
  <section title="RREP Generation and Reception" anchor="securing-rrep">
    
    <t>
      Since TargPrefix is included in the RREP, the ICV can be
      calculated and verified using the <xref target="RFC5444"/>
      contents. The ICV TLV has type extension 1. Inclusion of an ICV
      provides message integrity and endpoint authentication, because
      trusted routers MUST hold a valid key in order to calculate the
      ICV value, both to include when creating a message, and to
      validate the message by checking that the ICV is correct.
    </t>
    <t>
      Since RREP_Gen's sequence number is incremented for each new RREP,
      replay protection is already afforded and no extra TIMESTAMP TLV
      is required.
    </t>
    <t>
      After message generation and before message transmission:
    </t>
    <t><list style="numbers">
      <t>
        
          Add the ICV TLV as described above.
        
      </t>
    </list></t>
    <t>
      On message reception and before message processing:
    </t>
    <t><list style="numbers">
      <t>
        
          Verify the received ICV value as described above.
        
      </t>
      <t>
        
          Verification of the sequence number is handled according to
          Section 7.
        
      </t>
    </list></t>
  </section>
  <section title="RREP_Ack Generation and Reception" anchor="securing-rrepack">
    
    <t>
      Since no sequence number is included in the RREP_Ack, a TIMESTAMP
      TLV MUST be included to protect against replay attacks. The value
      in the TIMESTAMP TLV is set as follows:
    </t>
    <t><list style="symbols">
      <t>
        
          For RREP_Ack request, use Neighbor.AckSeqNum.
        
      </t>
      <t>
        
          For RREP_Ack response, use the sequence number from the
          TIMESTAMP TLV in the received RREP_Ack request.
        
      </t>
    </list></t>
    <t>
      Since no addresses are included in the RREP_Ack, and the receiver
      of the RREP_Ack uses the source IP address of a received RREP_Ack
      to identify the sender, the ICV MUST be calculated using the
      message contents and the IP source address. The ICV TLV has type
      extension := 2 in order to accomplish this. This provides message
      integrity and endpoint authentication, because trusted routers
      MUST hold the correct key in order to calculate the ICV value.
    </t>
    <t>
      After message generation and before message transmission:
    </t>
    <t><list style="numbers">
      <t>
        
          Add the TIMESTAMP TLV and ICV TLV as described above.
        
      </t>
    </list></t>
    <t>
      On message reception and before message processing:
    </t>
    <t><list style="numbers">
      <t>
        
          Verify the received ICV value as described above.
        
      </t>
      <t>
        
          Verify the received TIMESTAMP value by comparing the sequence
          number in the value field of the TIMESTAMP TLV as follows:
        
        <list style="symbols">
          <t>
            
              For a received RREP_Ack request, there is no need to
              verify the timestamp value. Proceed to message processing
              as defined in Section 7.
            
          </t>
          <t>
            
              For a received RREP_Ack response, compare with the
              Neighbor.AckSeqNum of the Neighbor Set entry for sender of
              the RREP_Ack request.
            
          </t>
          <t>
            
              If the sequence number does not match, the AODVv2 message
              MUST be discarded. Otherwise, Neighbor.AckSeqNum is
              incremented by 1 and processing continues according to
              Section 7.
            
          </t>
        </list>
      </t>
    </list></t>
  </section>
  <section title="RERR Generation and Reception" anchor="securing-rerr">
    
    <t>
      Since the sender's sequence number is not contained in the RERR, a
      TIMESTAMP TLV MUST be included to protect against replay attacks.
      The value in the TIMESTAMP TLV is set by incrementing and using
      RERR_Gen's sequence number.
    </t>
    <t>
      Since the receiver of the RERR MUST use the source IP address of
      the RERR to identify the sender, the ICV MUST be calculated using
      the message contents and the IP source address. The ICV TLV has
      type extension := 2 in order to accomplish this. This provides
      message integrity and endpoint authentication, because trusted
      routers MUST hold the shared key in order to calculate the ICV
      value.
    </t>
    <t>
      After message generation and before message transmission:
    </t>
    <t><list style="numbers">
      <t>
        
          Add the TIMESTAMP TLV and ICV TLV as described above.
        
      </t>
    </list></t>
    <t>
      On message reception and before message processing:
    </t>
    <t><list style="numbers">
      <t>
        
          Verify the received ICV value as described above.
        
      </t>
      <t>
        
          Verify the received TIMESTAMP value by comparing the sequence
          number in the value field of the TIMESTAMP TLV with the
          Neighbor.HeardRERRSeqNum. If the sequence number in the
          message is lower than the stored value, the AODVv2 message
          MUST be discarded. Otherwise, the Neighbor.HeardRERRSeqNum
          MUST be set to the received value and processing continues
          according to Section 7.
        
      </t>
    </list></t>
    
    
    
  </section>
</section>
<section title="Configuration" anchor="param">
  
  <t>
    AODVv2 uses various parameters which can be grouped into the
    following categories:
  </t>
  <t><list style="symbols">
    <t>
      
        Timers
      
    </t>
    <t>
      
        Protocol constants
      
    </t>
    <t>
      
        Administrative parameters and controls
      
    </t>
  </list></t>
  <t>
    This section show the parameters along with their definitions and
    default values (if any).
  </t>
  <t>
    Note that several fields have limited size (bits or bytes). These
    sizes and their encoding may place specific limitations on the
    values that can be set.
  </t>
  <section title="Timers" anchor="timers">
    
    <t>
      AODVv2 requires certain timing information to be associated with
      Local Route Set entries and message replies. The default values
      are as follows:
    </t>
    <texttable anchor="timer-tbl" align="center" title="Timing Parameter Values">
      
        
        
        
          
            <ttcol align="left">
              Name
            </ttcol>
            <ttcol align="left">
              Default Value
            </ttcol>
          
        
        
          
            <c>
              ACTIVE_INTERVAL
            </c>
            <c>
              5 second
            </c>
          
          
            <c>
              MAX_IDLETIME
            </c>
            <c>
              200 seconds
            </c>
          
          
            <c>
              MAX_BLACKLIST_TIME
            </c>
            <c>
              200 seconds
            </c>
          
          
            <c>
              MAX_SEQNUM_LIFETIME
            </c>
            <c>
              300 seconds
            </c>
          
          
            <c>
              RERR_TIMEOUT
            </c>
            <c>
              3 seconds
            </c>
          
          
            <c>
              RteMsg_ENTRY_TIME
            </c>
            <c>
              12 seconds
            </c>
          
          
            <c>
              RREQ_WAIT_TIME
            </c>
            <c>
              2 seconds
            </c>
          
          
            <c>
              RREP_Ack_SENT_TIMEOUT
            </c>
            <c>
              1 second
            </c>
          
          
            <c>
              RREQ_HOLDDOWN_TIME
            </c>
            <c>
              10 seconds
            </c>
          
        
      
    </texttable>
    <t>
      
    </t>
    <t>
      The above timing parameter values have worked well for small and
      medium well-connected networks with moderate topology changes. The
      timing parameters SHOULD be administratively configurable.
      Ideally, for networks with frequent topology changes the AODVv2
      parameters SHOULD be adjusted using experimentally determined
      values or dynamic adaptation. For example, in networks with
      infrequent topology changes MAX_IDLETIME MAY be set to a much
      larger value. If the values were configured differently, the
      following consequences may be observed:
    </t>
    <t><list style="symbols">
      <t>
        
          If MAX_SEQNUM_LIFETIME was configured differently across the
          network, and any of the routers lost their sequence number,
          this could result in their next route messages being
          classified as stale at any AODVv2 router using a greater value
          for MAX_SEQNUM_LIFETIME. This would delay route discovery from
          and to the re-initializing router.
        
      </t>
      <t>
        
          Routers with lower values for ACTIVE_INTERVAL + MAX_IDLETIME
          will invalidate routes more quickly and free resources used to
          maintain them. This can affect bursty traffic flows which have
          quiet periods longer than ACTIVE_INTERVAL + MAX_IDLETIME. A
          route which has timed out due to perceived inactivity is not
          reported. When the bursty traffic resumes, it would cause a
          RERR to be generated, and the traffic itself would be dropped.
          This route would be removed from all upstream routers, even if
          those upstream routers had larger ACTIVE_INTERVAL or
          MAX_IDLETIME values. A new route discovery would be required
          to re-establish the route, causing extra routing protocol
          traffic and disturbance to the bursty traffic.
        
      </t>
      <t>
        
          Routers with lower values for MAX_BLACKLIST_TIME would allow
          neighboring routers to participate in route discovery sooner
          than routers with higher values. This could result in failed
          route discoveries if un-blacklisted links are still
          uni-directional. Since RREQs are retried, this would not
          affect success of route discovery unless this value was so
          small as to un-blacklist the router before the RREQ is
          retried. This value need not be consistent across the network
          since it is used for maintaining a 1-hop blacklist. However it
          MUST be greater than RREQ_WAIT_TIME; the default value is much
          larger.
        
      </t>
      <t>
        
          Routers with lower values for RERR_TIMEOUT may create more
          RERR messages than routers with higher values. This value
          should be large enough that a RERR will reach all routers
          using the route reported within it before the timer expires,
          so that no further data traffic will arrive, and no duplicated
          RERR messages will be generated.
        
      </t>
      <t>
        
          Routers with lower values for RteMsg_ENTRY_TIME may not
          consider received redundant multicast route messages as
          redundant, and may forward these messages unnecessarily.
        
      </t>
      <t>
        
          Routers with lower values for RREQ_WAIT_TIME may send more
          frequent RREQ messages and wrongly determine that a route does
          not exist, if the delay in receiving an RREP is greater than
          this interval.
        
      </t>
      <t>
        
          Routers with lower values for RREP_Ack_SENT_TIMEOUT may
          wrongly determine links to neighbors to be unidirectional if
          an RREP_Ack is delayed longer than this timeout.
        
      </t>
      <t>
        
          Routers with lower values for RREQ_HOLDDOWN_TIME will retry
          failed route discoveries sooner than routers with higher
          values. This may be an advantage if the network topology is
          frequently changing, or may unnecessarily cause more routing
          protocol traffic.
        
      </t>
    </list></t>
    <t>
      MAX_SEQNUM_LIFETIME MUST be configured to have the same values for
      all AODVv2 routers in the network.
    </t>
  </section>
  <section title="Protocol Constants" anchor="constants">
    
    <t>
      AODVv2 protocol constants typically do not require changes. The
      following table lists these constants, along with their values and
      a reference to the section describing their use.
    </t>
    <texttable anchor="const-tbl" align="center" title="AODVv2 Constants">
      
        
        
        
        
          
            <ttcol align="left">
              Name
            </ttcol>
            <ttcol align="left">
              Default
            </ttcol>
            <ttcol align="left">
              Description
            </ttcol>
          
        
        
          
            <c>
              DISCOVERY_ATTEMPTS_MAX
            </c>
            <c>
              3
            </c>
            <c>
              <xref target="route_discovery"/>
            </c>
          
          
            <c>
              RREP_RETRIES
            </c>
            <c>
              2
            </c>
            <c>
              <xref target="RREP_gen"/>
            </c>
          
          
            <c>
              MAX_METRIC[MetricType]
            </c>
            <c>
              [see below]
            </c>
            <c>
              <xref target="metrics"/>
            </c>
          
          
            <c>
              MAX_METRIC[HopCount]
            </c>
            <c>
              255
            </c>
            <c>
              <xref target="metrics"/> and
              <xref target="aodv_msgs"/>
            </c>
          
          
            <c>
              MAX_HOPCOUNT
            </c>
            <c>
              20
            </c>
            <c>
              Limit to number of hops an
            </c>
          
          
            <c>
            </c>
            <c>
            </c>
            <c>
              RREQ or RREP message can traverse
            </c>
          
          
            <c>
              INFINITY_TIME
            </c>
            <c>
              [see below]
            </c>
            <c>
              Maximum expressible clock
            </c>
          
          
            <c>
            </c>
            <c>
            </c>
            <c>
              time (<xref target="update_rte"/>)
            </c>
          
        
      
    </texttable>
    <t>
      
    </t>
    
    <t>
      MAX_HOPCOUNT cannot be larger than 255.
    </t>
    <t>
      MAX_METRIC[MetricType] MUST always be the maximum expressible
      metric value of type MetricType. Field lengths associated with
      metric values are found in
      <xref target="iana-metric-type"/>.
    </t>
    <t>
      These protocol constants MUST have the same values for all AODVv2
      routers in the ad hoc network. If the values were configured
      differently, the following consequences may be observed:
    </t>
    <t><list style="symbols">
      <t>
        
          DISCOVERY_ATTEMPTS_MAX: Routers with higher values are likely
          to be more successful at finding routes, at the cost of
          additional control traffic.
        
      </t>
      <t>
        
          RREP_RETRIES: Routers with lower values are more likely to
          blacklist neighbors when there is a temporary fluctuation in
          link quality.
        
      </t>
      <t>
        
          MAX_METRIC[MetricType]: No interoperability problems due to
          variations on different routers, but routers with lower values
          may exhibit overly restrictive behavior during route
          comparisons.
        
      </t>
      <t>
        
          MAX_HOPCOUNT: Routers with a value too small would not be able
          to discover routes to distant addresses.
        
      </t>
      <t>
        
          INFINITY_TIME: No interoperability problems due to variations
          on different routers, but if a lower value is used, route
          state management may exhibit overly restrictive behavior.
        
      </t>
    </list></t>
  </section>
  <section title="Local Settings" anchor="other">
    
    
    <t>
      The following table lists AODVv2 parameters which SHOULD be
      administratively configured for each router:
    </t>
    <texttable anchor="admincontrol" align="center" title="Configuration for Local Settings">
      
        
        
        
        
          
            <ttcol align="left">
              Name
            </ttcol>
            <ttcol align="left">
              Default Value
            </ttcol>
            <ttcol align="left">
              Description
            </ttcol>
          
        
        
          
            <c>
              Router Client Set
            </c>
            <c>
            </c>
            <c>
              <xref target="clients"/>
            </c>
          
          
            <c>
              BUFFER_SIZE_PACKETS
            </c>
            <c>
              2
            </c>
            <c>
              <xref target="route_discovery"/>
            </c>
          
          
            <c>
              BUFFER_SIZE_BYTES
            </c>
            <c>
              MAX_PACKET_SIZE [TBD]
            </c>
            <c>
              <xref target="route_discovery"/>
            </c>
          
          
            <c>
              CONTROL_TRAFFIC_LIMIT
            </c>
            <c>
              [Adjust for 10% capacity]
            </c>
            <c>
              <xref target="aodv_msgs"/>
            </c>
          
        
      
    </texttable>
    <t>
      
    </t>
  </section>
  <section title="Network-Wide Settings" anchor="network-wide-settings">
    
    <t>
      The following administrative controls MAY be used to change the
      operation of the network. The same settings SHOULD be used across
      the network. Inconsistent settings at different routers in the
      network will not result in protocol errors.
    </t>
    <texttable anchor="suggestedoptions" align="center" title="Configuration for Network-Wide Settings">
      
        
        
        
        
          
            <ttcol align="left">
              Name
            </ttcol>
            <ttcol align="left">
              Default
            </ttcol>
            <ttcol align="left">
              Description
            </ttcol>
          
        
        
          
            <c>
              ENABLE_IDLE_IN_RERR
            </c>
            <c>
              Disabled
            </c>
            <c>
              <xref target="RERR_gen"/>
            </c>
          
        
      
    </texttable>
    <t>
      
    </t>
  </section>
</section>
<section title="IANA Considerations" anchor="IANA">
  
  <t>
    This section specifies several [RFC5444] message types and address
    tlv-types required for AODVv2, as well as a new Code value for ICMP
    Destination Unreachable.
  </t>
  <section title="RFC 5444 Message Type Allocation" anchor="iana-msgtype">
    
    <t>
      This specification defines four Message Types, to be allocated
      from the 0-223 range of the "Message Types" namespace
      defined in <xref target="RFC5444"/>.
    </t>
    <texttable>
      
        
        
        
          
            <ttcol align="left">
              Name of Message
            </ttcol>
            <ttcol align="left">
              Type
            </ttcol>
          
        
        
          
            <c>
              Route Request (RREQ)
            </c>
            <c>
              10 (TBD)
            </c>
          
          
            <c>
              Route Reply (RREP)
            </c>
            <c>
              11 (TBD)
            </c>
          
          
            <c>
              Route Error (RERR)
            </c>
            <c>
              12 (TBD)
            </c>
          
          
            <c>
              Route Reply Acknowledgement (RREP_Ack)
            </c>
            <c>
              13 (TBD)
            </c>
          
        
      
    </texttable>
  </section>
  <section title="RFC 5444 Message TLV Types" anchor="iana-msgtlvspec">
    
    <t>
      This specification defines one Message TLV Type, to be allocated
      from the Message-Type-specific "Message TLV Types"
      namespace defined in <xref target="RFC5444"/>, as specified
      in <xref target="msgtlvtypes"/>.
    </t>
    <texttable anchor="msgtlvtypes" align="center" title="AODVv2 Message TLV Types">
      
        
        
        
        
        
          
            <ttcol align="left" width="41%">
              Name of TLV
            </ttcol>
            <ttcol align="left" width="13%">
              Type
            </ttcol>
            <ttcol align="left" width="22%">
              Length (octets)
            </ttcol>
            <ttcol align="left" width="22%">
              Reference
            </ttcol>
          
        
        
          
            <c>
              ACK_REQ
            </c>
            <c>
              128 (TBD)
            </c>
            <c>
              0
            </c>
            <c>
              <xref target="nexthopmonitoring"/>
            </c>
          
        
      
    </texttable>
    <t>
      
    </t>
  </section>
  <section title="RFC 5444 Address Block TLV Type Allocation" anchor="iana-addrtlvspec">
    
    <t>
      This specification defines three Address Block TLV Types, to be
      allocated from the Message-Type-specific "Address Block TLV
      Types" namespace defined in <xref target="RFC5444"/>,
      as specified in <xref target="addrtlvtypes"/>.
    </t>
    <texttable anchor="addrtlvtypes" align="center" title="AODVv2 Address Block TLV Types">
      
        
        
        
        
        
          
            <ttcol align="left" width="41%">
              Name of TLV
            </ttcol>
            <ttcol align="left" width="13%">
              Type
            </ttcol>
            <ttcol align="left" width="22%">
              Length (octets)
            </ttcol>
            <ttcol align="left" width="22%">
              Reference
            </ttcol>
          
        
        
          
            <c>
              PATH_METRIC
            </c>
            <c>
              129 (TBD)
            </c>
            <c>
              depends on MetricType
            </c>
            <c>
              <xref target="aodv_msgs"/>
            </c>
          
          
            <c>
              SEQ_NUM
            </c>
            <c>
              130 (TBD)
            </c>
            <c>
              2
            </c>
            <c>
              <xref target="aodv_msgs"/>
            </c>
          
          
            <c>
              ADDRESS_TYPE
            </c>
            <c>
              131 (TBD)
            </c>
            <c>
              1
            </c>
            <c>
              <xref target="represent"/>
            </c>
          
        
      
    </texttable>
    <t>
      
    </t>
  </section>
  <section title="MetricType Allocation" anchor="iana-metric-type">
    
    <t>
      The metric types used by AODVv2 are identified according to
      <xref target="metric-tbl"/>. All implementations MUST use
      these values.
    </t>
    <texttable anchor="metric-tbl" align="center" title="AODVv2 Metric Types">
      
        
        
        
        
          
            <ttcol align="left">
              Name of MetricType
            </ttcol>
            <ttcol align="left">
              Type
            </ttcol>
            <ttcol align="left">
              Metric Value Size
            </ttcol>
          
        
        
          
            <c>
              Unassigned
            </c>
            <c>
              0
            </c>
            <c>
              Undefined
            </c>
          
          
            <c>
              Hop Count
            </c>
            <c>
              1
            </c>
            <c>
              1 octet
            </c>
          
          
            <c>
              Unallocated
            </c>
            <c>
              2 - 254
            </c>
            <c>
              TBD
            </c>
          
          
            <c>
              Reserved
            </c>
            <c>
              255
            </c>
            <c>
              Undefined
            </c>
          
        
      
    </texttable>
    <t>
      
    </t>
  </section>
  <section title="ADDRESS_TYPE TLV Values" anchor="iana-address-type">
    
    <t>
      These values are used in the <xref target="RFC5444"/>
      Address Type TLV discussed in <xref target="represent"/>.
      All implementations MUST use these values.
    </t>
    <texttable anchor="addrtype-tbl" align="center" title="AODVv2 Address Types">
      
        
        
        
          
            <ttcol align="left">
              Address Type
            </ttcol>
            <ttcol align="left">
              Value
            </ttcol>
          
        
        
          
            <c>
              ORIGPREFIX
            </c>
            <c>
              0
            </c>
          
          
            <c>
              TARGPREFIX
            </c>
            <c>
              1
            </c>
          
          
            <c>
              UNREACHABLE
            </c>
            <c>
              2
            </c>
          
          
            <c>
              PKTSOURCE
            </c>
            <c>
              3
            </c>
          
          
            <c>
              UNSPECIFIED
            </c>
            <c>
              255
            </c>
          
        
      
    </texttable>
    <t>
      
    </t>
  </section>
  <section title="ICMPv6 Code Field for ICMP Destination Unreachable" anchor="iana-icmpv6_code">
    
    <t>
      A new Code Value is defined for ICMP Destination Unreachable
      messages (see <xref target="RREQ_rcv"/>).
    </t>
    <texttable anchor="icmpv6_code" align="center" title="AODVv2 ICMPv6 Code Field value">
      
        
        
        
          
            <ttcol align="left">
              Code Value
            </ttcol>
            <ttcol align="left">
              Value
            </ttcol>
          
        
        
          
            <c>
              Metric Type Mismatch
            </c>
            <c>
              8 (TBD)
            </c>
          
        
      
    </texttable>
    <t>
      
    </t>
  </section>
</section>
<section title="Security Considerations" anchor="Security">
  
  
  <t>
    This section describes various security considerations and potential
    avenues to secure AODVv2 routing. The main 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
    discovered from other AODVv2 routers.
  </t>
  <t>
    Networks using AODVv2 to maintain connectivity and establish routes
    on demand may be vulnerable to certain well-known types of threats,
    which will be detailed in this section. Some of the threats
    described can be mitigated or eliminated. Tools to do so will be
    described.
  </t>
  
  <t>
    With the exception of metric values, AODVv2 assures the integrity of
    all RteMsg data end-to-end though the use of ICVs (see
    <xref target="security-protection-integrity"/>. AODVv2
    implementations support ICV and TIMESTAMP TLVs, unless the
    implementation is intended for an environment in which security is
    unnecessary; 
    otherwise, AODVv2 deployments are configured to use these TLVs to
    secure messages.
  </t>
  <t>
    The on-demand nature of AODVv2 route discovery automatically reduces
    the vulnerability to route disruption. Since control traffic for
    updating route tables is diminished, there is less opportunity for
    attack and failure.
  </t>
  <section title="Availability" anchor="security-availability">
    
    <t>
      Threats to AODVv2 which reduce availability are considered below.
    </t>
    <section title="Denial of Service" anchor="security-availability-dos">
      
      <t>
        Flooding attacks using RREQ amount to a (BLIND) denial of
        service for route discovery: By issuing RREQ messages for
        targets that don't exist, an attacker can flood the network,
        blocking resources and drowning out legitimate traffic. By
        triggering the generation of CONTROL_TRAFFIC_LIMIT amount of
        messages (for example by sending RREQs for many non-existent
        destinations), an attacker can prevent legitimate messages from
        being generated. The effect of this attack is dampened by the
        fact that duplicate RREQ messages are dropped (preventing the
        network from DDoSing itself). Processing requirements for AODVv2
        messages are typically quite small, however AODVv2 routers
        receiving RREQs do allocate resources in the form of Neighbor
        Set, Local Route Set and Multicast Route Message Set entries.
        The attacker can maximize their impact on set growth by changing
        OrigPrefix or OrigPrefixLen for each RREQ. If a specific node is
        to be targeted, this attack may be carried out in a distributed
        fashion, either by compromising its direct neighbors or by
        specifying the target's address with TargPrefix and
        TargPrefixLen. Note that it might be more economical for the
        attacker to simply jam the medium; an attack which AODVv2 cannot
        defend itself against.
      </t>
      <t>
        Mitigation:
      </t>
      <t><list style="symbols">
        <t>
          
            If AODVv2 routers always verify that the sender of the RERR
            message is trusted, this threat is reduced. Processing
            requirements would typically be dominated by calculations to
            verify integrity. This has the effect of reducing (but by no
            means eliminating) AODVv2's vulnerability to denial of
            service attacks.
          
        </t>
        <t>
          
            Authentication of senders can prevent unauthenticated
            routers from launching a Denial of Service attack on another
            AODVv2 router. However, this does not protect the network if
            an attacker has access to an already authenticated router.
          
        </t>
      </list></t>
    </section>
    <section title="Malicious RERR messages" anchor="security-availability-rerr">
      
      <t>
        RERR messages are designed to cause removal of installed routes.
        A malicious node could send an RERR message with false
        information to attempt to get other routers to remove a route to
        one or more specific destinations, therefore disrupting traffic
        to the advertised destinations.
      </t>
      <t>
        Routes will be deleted if an RERR is received, withdrawing a
        route for which the sender is the receiver's next hop, if both
        of the following conditions are met:
      </t>
      <t><list style="symbols">
        <t>
          
            the RERR includes the MetricType of the installed route,
          
        </t>
        <t>
          
            the RERR includes either no sequence number for the route,
            or includes a greater sequence number than the sequence
            number stored with that route in the receiver's Local Route
            Set.
          
        </t>
      </list></t>
      <t>
        Routes will also be deleted if a received RERR contains a
        PktSource address corresponding to a Router Client.
      </t>
      <t>
        The information necessary to construct a malicious RERR could be
        discovered by eavesdropping, either by listening to AODVv2
        messages or by watching data packet flows.
      </t>
      <t>
        When the RERR is multicast, it can be received by many routers
        in the ad hoc network, and will be regenerated when processing
        results in an active route being removed. This threat could have
        serious impact on applications communicating by way of the
        sender of the RERR message.
      </t>
      <t><list style="symbols">
        <t>
          
            The set of routers which use the malicious router as a next
            hop may be targeted with a malicious RERR with no PktSource
            address included, if the RERR contains routes for which the
            malicious router is a next hop from the receiving router.
            
             However, since
            the sender of the RERR message is either malicious or
            broken, it is better that it is not used as a next hop for
            these routes anyway.
          
        </t>
        <t>
          
            A single router which does not use the malicious router as
            part of its route may be targeted with a malicious RERR with
            a PktSource address included.
          
        </t>
        <t>
          
            Replayed RERR messages could be used to disrupt active
            routes.
          
        </t>
      </list></t>
      <t>
        Mitigation:
      </t>
      <t><list style="symbols">
        <t>
          
            Protection against eavesdropping of AODVv2 messages would
            mitigate this attack to some extent, but eavesdropping of
            data packets can also be used to deduce the information
            about which routes could be targeted.
          
        </t>
        <t>
          
            Protection against a malicious router becoming part of a
            route will mitigate the attack where a set of routers are
            targeted. This will not protect against the attack if a
            PktSource address is included.
          
        </t>
        <t>
          
            By only regenerating RERR messages where active routes are
            removed, the spread of the malicious RERR is limited.
          
        </t>
        <t>
          
            Including sequence numbers in RERR messages offers
            protection against attacks using replays of these RERR
            messages.
          
        </t>
        <t>
          
            If AODVv2 routers always verify that the sender of the RERR
            message is trusted, this threat is reduced.
          
        </t>
      </list></t>
    </section>
    <section title="False Confirmation of Link Bidirectionality" anchor="security-availability-bidirectionality">
      
      <t>
        Links could be erroneously treated as bidirectional if malicious
        unsolicited or spoofed RREP messages were to be accepted. This
        would result in a route being installed which could not in fact
        be used to forward data to the destination, and may divert data
        packets away from the intended destination.
      </t>
      <t>
        There is a window of RREQ_WAIT_TIME after an RREQ is sent, in
        which any malicious router could send an RREP in response, in
        order for the link to the malicious router to be deemed as
        bidirectional.
      </t>
      <t>
        Mitigation:
      </t>
      <t><list style="symbols">
        <t>
          
            Ignoring unsolicited RREP and RREP_Ack messages partially
            mitigates against this threat.
          
        </t>
        <t>
          
            If AODVv2 routers always verify that the sender of the RREP
            message is trusted, this threat is reduced.
          
        </t>
      </list></t>
    </section>
    <section title="Message Deletion" anchor="security-availability-deletion">
      
      <t>
        A malicious router could decide not to forward an RREQ or RREP
        or RERR message. Not forwarding a RERR or RREP message would
        disrupt route discovery. Not regenerating a RERR message would
        result in the source of data packets continuing to maintain and
        use the route, and further RERR messages being generated by the
        sender of the non-regenerated RERR. A malicious router could
        intentionally disrupt traffic flows by not allowing the source
        of data traffic to re-discover a new route when one breaks.
      </t>
      <t>
        Failing to send an RREP_Ack would also disrupt route
        establishment, by not allowing the reverse route to be
        validated. Return traffic which needs that route will prompt a
        new route discovery, wasting resources and incurring a slight
        delay but not disrupting the ability for applications to
        communicate.
      </t>
      <t>
        Mitigation:
      </t>
      <t><list style="symbols">
        <t>
          
            None. Note that malicious router would have to wait for a
            route to break before it could perform this attack.
          
        </t>
      </list></t>
    </section>
  </section>
  <section title="Confidentiality" anchor="security-confidentiality">
    
    <t>
      Passive inspection (eavesdropping) of AODVv2 control messages
      could enable unauthorized devices to gain information about the
      network topology, since exchanging such information is the main
      purpose of AODVv2.
    </t>
    <t>
      Eavesdropping of data traffic could allow a malicious device to
      obtain information about how data traffic is being routed. With
      knowledge of source and destination addresses, malicious messages
      could be constructed to disrupt normal operation.
    </t>
  </section>
  <section title="Integrity of Routes" anchor="security-integrity">
    
    <t>
      Integrity of route information can be compromised in the following
      types of attack:
    </t>
    <section title="Message Insertion" anchor="security-integrity-insertion">
      
      <t>
        Valid route set entries can be replaced or modified by
        maliciously constructed AODVv2 messages, destroying existing
        routes and the network's integrity. Any router may pose as
        another router by sending RREQ, RREP, RREP_Ack and RERR messages
        in its name.
      </t>
      <t><list style="symbols">
        <t>
          
            Sending an RREQ message with false information can disrupt
            traffic to OrigPrefix, if the sequence number attached is
            not stale compared to any existing information about
            OrigPrefix. 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 with
            OrigPrefix.
          
        </t>
        <t>
          
            The actual threat to disrupt routes to OrigPrefix is reduced
            by the AODVv2 mechanism of marking RREQ-derived routes as
            "Unconfirmed" until the route to OrigAddr can be
            confirmed.
          
        </t>
        <t>
          
            Sending an RREP message with false information can disrupt
            traffic to TargPrefix. Since RREP is unicast, and ignored if
            a corresponding RREQ was not recently sent, this threat is
            minimized, and is restricted to receivers along the path
            from OrigAddr to TargAddr.
          
        </t>
        <t>
          
            Sending an RREP_Ack response message with false information
            can cause the route to an originator address to be
            erroneously accepted even though the route would contain a
            unidirectional link and thus not be suitable for most
            traffic. Since the RREP_Ack response is unicast, and ignored
            if an RREP_Ack was not sent recently to the sender of this
            RREP_Ack response, this threat is minimized and is strictly
            local to the RREP transmitter expecting the acknowledgement.
            Unsolicited RREP_Acks are ignored.
          
        </t>
        <t>
          
            Sending an RERR message with false information is discussed
            in <xref target="security-availability-rerr"/>.
          
        </t>
      </list></t>
      <t>
        Mitigation:
      </t>
      <t><list style="symbols">
        <t>
          
            If AODVv2 routers always verify that the sender of a message
            is trusted, this threat is reduced.
          
        </t>
      </list></t>
    </section>
    <section title="Message Modification - Man in the Middle" anchor="security-integrity-mitm">
      
      <t>
        Any AODVv2 router can forward messages with modified data.
      </t>
      <t>
        Mitigation:
      </t>
      <t><list style="symbols">
        <t>
          
            If AODVv2 routers verify the integrity of AODVv2 messages,
            then the threat of disruption is minimized. A man in the
            middle with no knowledge of the key used to calculate an
            integrity check value may modify a message but the message
            will be rejected when it fails an integrity check.
          
        </t>
      </list></t>
    </section>
    <section title="Replay Attacks" anchor="security-integrity-relay">
      
      <t>
        Replaying of RREQ or RREP messages would be of less use to an
        attacker, since they would be dropped immediately due to their
        stale sequence number. RERR messages may or may not include
        sequence numbers and are therefore susceptible to replay
        attacks. RREP_Ack messages do not include sequence numbers and
        are therefore susceptible to replay attacks.
      </t>
      <t>
        Mitigation:
      </t>
      <t><list style="symbols">
        <t>
          
            Use of timestamps or sequence numbers prevents replay
            attacks.
          
        </t>
      </list></t>
    </section>
  </section>
  <section title="Protection Mechanisms" anchor="security-protection">
    
    <section title="Confidentiality and Authentication" anchor="security-protection-confidentiality">
      
      <t>
        Encryption MAY be used for AODVv2 messages. If the routers share
        a packet-level security association, the message data can be
        encrypted prior to message transmission. The establishment of
        such security associations is outside the scope of this
        specification. Encryption will not only protect against
        unauthorized devices obtaining information about network
        topology (eavesdropping) but will ensure that only trusted
        routers participate in routing operations.
      </t>
    </section>
    <section title="Message Integrity using ICVs" anchor="security-protection-integrity">
      
      
      <t>
        Cryptographic Integrity Check Values (ICVs) can be used to
        ensure integrity of received messages, protecting against man in
        the middle attacks. Further, by using ICVs, only those routers
        with knowledge of a shared secret key are allowed to participate
        in routing information exchanges.
        <xref target="RFC7182"/> defines ICV TLVs for use with
        <xref target="RFC5444"/>.
      </t>
      <t>
        The data contained in AODVv2 routing protocol messages MUST be
        verified using Integrity Check Values, to avoid accepting
        tampered messages.
      </t>
    </section>
    <section title="Replay Protection using Timestamps" anchor="security-protection-replay">
      
      <t>
        <xref target="RFC7182"/> defines a TIMESTAMP TLV for use
        with <xref target="RFC5444"/> which can be used to
        prevent replay attacks when sequence numbers are not already
        included.
      </t>
      <t>
        The data contained in AODVv2 routing protocol messages can be
        protected with a TIMESTAMP value to ensure the protection
        against replaying of the message. Sequence numbers can be used
        in place of timestamps, since they are known to be strictly
        increasing.
      </t>
    </section>
  </section>
  <section title="Key Management" anchor="security-key_mgmt">
    
    <t>
      The method of distribution of shared secret keys is out of the
      scope of this protocol. Key management is not specified for the
      following reasons:
    </t>
    <t>
      Against <xref target="RFC4107"/>, an analysis as to whether
      automated or manual key management should be used shows a
      compelling case for automated management. In particular:
    </t>
    <t><list style="symbols">
      <t>
        
          a potentially large number of routers may have to be managed,
          belonging to several organisations, for example in vehicular
          applications.
        
      </t>
      <t>
        
          a stream cipher is likely to be used, such as an AES variant.
        
      </t>
      <t>
        
          long term session keys might be used by more than two parties,
          including multicast operations. AODVv2 makes extensive use of
          multicast.
        
      </t>
      <t>
        
          there may be frequent turnover of devices.
        
      </t>
    </list></t>
    <t>
      On reviewing the case for manual key management against the same
      document, it can be seen that manual management might be
      advantageous in environments with limited bandwidth or high round
      trip times. AODVv2 lends itself to sparse ad hoc networks where
      transmission conditions may indeed be limited, depending on the
      bearers selected for use.
    </t>
    <t>
      However, <xref target="RFC4107"/> assumes that the
      connectivity between endpoints is already available. In AODVv2, no
      route is available to a given destination until a router client
      requests that user traffic be transmitted. It is required to
      secure the signalling path of the routing protocol that will
      establish the path across which key exchange functions might
      subsequently be applied, which is clearly the reverse of the
      expected functionality. A different strategy is therefore
      required.
    </t>
    <t>
      There are two possible solutions. In each case, it is assumed that
      a defence in depth security posture is being adopted by the system
      integrator, such that each function in the network as a whole is
      appropriately secured or defended as necessary, and that there is
      not complete reliance on security mechanisms built in to AODVv2.
      Such additional mechanisms could include a suitable wireless
      device security technology, so that wireless devices are
      authenticated and secured by their peers prior to exchanging user
      data, which in this case would include AODVV2 signalling traffic
      as a payload, and mechanisms which verify the authenticity and/or
      integrity of application-layer user data transported once a route
      has been established.
    </t>
    <t><list style="numbers">
      <t>
        
          In the case that no AODVv2 routers have any detailed prior
          knowledge of any other AODVv2 router, but does have knowledge
          of the credentials of other organisations in which the router
          has been previously configured to trust, it is possible for an
          AODVv2 router to send an initialisation vector as part of an
          exchange, which could be verified against such credentials.
          Such an exchange could make use of Identity-Based Signatures
          (<xref target="I-D.ietf-manet-ibs"/>), based on
          Elliptic Curve-Based Certificateless Signatures for
          Identity-Based Encryption <xref target="RFC6507"/>,
          which eliminate the need for a handshake process to establish
          trust.
        
      </t>
      <t>
        
          If it is impossible to use Identity-Based Signatures, and the
          risk to the AODVv2 signalling traffic is considered to be low
          due to the use of security countermeasures elsewhere in the
          system, a simple pre-placed shared secret could be used
          between routers, which is used as-is or is used to generate
          some ephemeral secret based on another known variable, such as
          time of day if that is universally available at a level of
          accuracy sufficient to make such a system viable.
        
      </t>
    </list></t>
  </section>
</section>
<section title="Acknowledgments" anchor="acknowledgments">
  
  <t>
    AODVv2 is a descendant of the design of previous MANET on-demand
    protocols, especially AODV <xref target="RFC3561"/> and DSR
    <xref target="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, Justin Dean, Christopher Dearlove,
    Fatemeh Ghassemi, Sri Gundavelli, Ulrich Herberg, Henner Jakob,
    Ramtin Khosravi, Luke Klein-Berndt, Lars Kristensen, Tronje Krop,
    Koojana Kuladinithi, Kedar Namjoshi, Keyur Patel, Alexandru
    Petrescu, Stan Ratliff, Alvaro Retana, Henning Rogge, Fransisco Ros,
    Pedro Ruiz, Christoph Sommer, Romain Thouvenin, Pascal Thubert, Richard
    Trefler, Jiazi Yi, Seung Yi, Behnaz Yousefi, and Cong Yuan, for their
    reviews of AODVv2 and DYMO, as well as numerous specification suggestions.
  </t>
  
  
</section>

</middle>

<back>
<references title="Normative References">
	<xi:include
	 href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
	<xi:include
	 href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4443.xml"/>
	<xi:include
	 href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5444.xml"/>
	<xi:include
	 href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5498.xml"/>
	<xi:include
	 href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7182.xml"/>
</references>
<references title="Informative References">
	<xi:include
	 href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.0793.xml"/>
	<xi:include
	 href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2501.xml"/>
	<xi:include
	 href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3561.xml"/>
	<xi:include
	 href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4193.xml"/>
	<xi:include
	 href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4728.xml"/>
	<xi:include
	 href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6130.xml"/>
	<xi:include
	 href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4107.xml"/>
	<xi:include
	 href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6507.xml"/>
<!--	<xi:include
	 href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6621.xml"/> -->
	<xi:include
	 href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7251.xml"/>
	<xi:include
	 href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8175.xml"/>
	<xi:include
	 href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7991.xml"/>
	<xi:include
	 href="https://bib.ietf.org/public/rfc/bibxml-ids/reference.I-D.ietf-manet-ibs.xml"/>
	<xi:include
   href="https://bib.ietf.org/public/rfc/bibxml-ids/reference.I-D.ietf-roll-aodv-rpl.xml"/>

	<reference anchor="Perkins94">
	  <front>
	    <title>Highly Dynamic Destination-Sequenced Distance-Vector
			 Routing (DSDV) for Mobile Computers</title>
	    <author fullname="Charles E. Perkins"
				initials="C." surname="Perkins">
		<organization>
	                  IBM, TJ Watson Research Center
		</organization>
	    </author>
	    <author fullname="Pravin Bhagwat"
				initials="P." surname="Bhagwat">
		<organization>
	            Computer Science Department, University of Maryland
		</organization>
	    </author>
	    <date month="August" year="1994"/>
	  </front>
	  <seriesInfo name="Proceedings" value="of the ACM SIGCOMM '94
			Conference on Communications Architectures, Protocols
			and Applications, London, UK, pp. 234-244"/>
	</reference>

	<reference anchor="Koodli01">
	  <front>
	    <title>Fast handovers and context transfers in mobile networks
									</title>
	    <author fullname="Rajeev Koodli" initials="R." surname="Koodli">
	    </author>
	    <author fullname="Charles E. Perkins"
						initials="C." surname="Perkins">
	    </author>
	    <date month="October" year="2001"/>
	  </front>
	  <seriesInfo name="Proceedings"
			value="of the ACM SIGCOMM Computer Communication
				Review 2001, Volume 31 Issue 5, 37-47"/>
	</reference>

	<reference anchor="dot11">
	  <front>
          <title>802.11-2016 - IEEE Standard for Information technology--Telecommunications and information exchange between systems Local and metropolitan area networks--Specific requirements - Part 11: Wireless LAN Medium Access Control (MAC) and Physical Layer (PHY) Specification</title>

          <author surname="P802.11">
            <organization>"IEEE 802 Wireless"</organization>

            <address>
              <uri>http://standards.ieee.org/getieee802/download/802.11-2016.pdf
              (includes 802.11v amendment)</uri>
            </address>
          </author>

          <date month="March" year="2016"/>
	  </front>
	</reference>


	</references>
<!-- This document was prepared using Pandoc2rfc, https://github.com/miekg/pandoc2rfc -->

  
<section title="AODVv2 Draft Changes" anchor="AODVv2 Draft Changes">
    <section title="Changes from version 3 to version 4">
        <t>
        <list style="symbols">
            <t>
		Many textual changes resulting from use of new version of
		xml2rfc.  This particularly includes numbering and renumbering
		tables in <xref target="IANA"/>.
            </t>
            <t>
		Updated author information, and Acknowledgements
                (<xref target="acknowledgments"/>).
            </t>
            <t>
		Otherwise, no protocol modifications or
		substantive text updates.  Some bibliographic citations
		were updated automatically.
            </t>
            <t>
		Changed from v2-style RFC citations to using Xinclude as
                specified in <xref target="RFC7991"/>.
            </t>
        </list>
        </t>
    </section>
    <section title="Changes from version 2 to version 3">
  <t>
    This section lists the changes between AODVv2 revisions
    ...-02.txt and ...-03.txt.
  </t>
  <t><list style="symbols">
    <t>
      
        Changed name of Multicast Route Message table to be Multicast
        Message table (see <xref target="mcmsgtable"/>, and
        <xref target="suppress"/>).
      
    </t>
    <t>
      
        Reorganized the Overview to include the list of differences
        between AODVv2 and RFC 3561, as well as an expanded description
        of Distance Vector protocol so that "Counting to
        Infinity" can be explained in somewhat more detail.
      
    </t>
    <t>
      
        Improved consistency in terminology used (e.g., lost link versus
        broken link, metric type versus MetricType. Address List versus
        AddressList, IP.SourceAddress versus IP source address,
        participating mobile nodes versus participating mobile routers)
      
    </t>
    <t>
      
        Added Figures to depict the operation of RREQ and RREP during
        Route Discovery.
      
    </t>
    <t>
      
        Added text to <xref target="rte"/> explaining how the
        LocalRoute.LastUsed field can be used to eliminate the need for
        maintaining a timer interrupt service.
      
    </t>
    <t>
      
        Added terminology for Address Block
      
    </t>
    <t>
      
        Eliminated "Interface Set" term
      
    </t>
    <t>
      
        Removed "ENAR" from Terminology section since its use
        is local to <xref target="gateway"/>
      
    </t>
    <t>
      
        Eliminated instances of RFC 2119 mandate language that was
        inadvisedly used for various operations on internal data
        structures.
      
    </t>
    <t>
      
        Clarified that a re-initializing router can still participate in
        creating routes as an intermediate router.
      
    </t>
    <t>
      
        Improved language surrounding the use of external mechnanisms
        for establishing local connectivity. Added citations.
      
    </t>
    <t>
      
        Strengthened mandate to remove a Neighbor Set entry, in the case
        that an external mechanism reports a link as broken
      
    </t>
    <t>
      
        Eliminated ambiguous uses of the word "safe" by
        rewording to emphasize prevention of routing loops.
      
    </t>
    <t>
      
        Updated and added bibliographic entries.
      
    </t>
  </list></t>
</section>
<section title="Previous AODVv2 Draft Updates"
	anchor="previous-aodvv2-draft-updates">
  
  <t>
    This section lists the changes between AODVv2 revisions ...-00.txt
    and ...-02.txt.
  </t>
  <t><list style="symbols">
    <t>
      
        Changed notation for entries in Multicast Route Message table
        from RteMsg to McMsg {for Multicast Message} (see
        <xref target="conventions"/>,
        <xref target="mcmsgtable"/>, and
        <xref target="suppress"/>).
      
    </t>
    <t>
      
        Sharpened description of suppressing multicast messages to apply
        only to RREQs (see <xref target="suppress"/>).
      
    </t>
    <t>
      
        Supplied AES-CCM as the default choice for HASH_FUNCTION and
        CRYPTOGRAPHIC_FUNCTION (see <xref target="securing"/>).
      
    </t>
    <t>
      
        Changed the names of the Neighbor.State to be capitalized:
        CONFIRMED, HEARD, and BLACKLISTED (see
        <xref target="nbrlist"/>).
      
    </t>
    <t>
      
        Created a new Code field value for ICMP Destination Unreachable
        messages (see <xref target="iana-icmpv6_code"/>). This
        allows the target of a RREQ to inform RREQ_Gen that the
        requested Metric Type is not available (see
        <xref target="RREQ_rcv"/>). This will prevent continued
        flooding for a Route Discovery that can never be satisfied.
      
    </t>
    <t>
      
        Corrected various typos and made some stylistic improvements and
        clarifications.
      
    </t>
    <t>
      
        Add RerrMsg as a Notational Convenience
        <xref target="conventions"/>
      
    </t>
    <t>
      
        Wordsmithing, reduce repeated text
      
    </t>
    <t>
      
        Restore optional Precursor feature (see
        <xref target="precursor"/>)
      
    </t>
    <t>
      
        Correct misuse of RFC 2119 language
      
    </t>
    <t>
      
        Revise the method by which a multi-hop path is deemed to be
        Confirmed
      
    </t>
    <t>
      
        Remove technical specification details from definitions
      
    </t>
    <t>
      
        Move security operational mandates from Security Considerations
        into a new section <xref target="securing"/>
      
    </t>
    <t>
      
        Sharpen language related to assuring that routing must follow
        paths appropriate to the metric type for which the route was
        established (see <xref target="metrics"/>).
      
    </t>
    <t>
      
        Replace rambling paragraphs by itemized lists to improve
        readability
      
    </t>
    <t>
      
        Allow use of MAC-layer hints about bidirectionality (see
        <xref target="nexthopmonitoring"/>).
      
    </t>
    <t>
      
        Define concepts of compatibility and comparability for Multicast
        Route Message entries (see <xref target="suppress"/>).
        This is needed to enable proper comparisons in case multihomed
        nodes have route discoveries from multiple routers
      
    </t>
    <t>
      
        Sharpen language related to multihoming
      
    </t>
    <t>
      
        Suggest a proper default for CONTROL_TRAFFIC_LIMIT (see
        <xref target="other"/>).
      
    </t>
    <t>
      
        Sharpen Security Considerations Section according to suggestions
        from Bob Moskowitz
      
    </t>
  </list></t>
</section>
</section>

	</back>
</rfc>
