Subject: [manet] Review of draft-ietf-manet-aodvv2-15

From: Ulrich Herberg <[email-masked]>
Date: Sat, 30 Apr 2016 10:35:44 -0700

Hi,

I have reviewed the latest version of AODVv2. Compared to previous
revisions of AODVv2/DYMO that I have reviewed in detail, the current
revision is an improvement. However, in my opinion there is still some
major work to be done before publication as RFC can be considered.
Below of this summary is a detailed review (each of my comments is
prefixed with UH>):

- Implementation: For an Experimental draft, the bar is certainly
lower in terms of requirements for implementations. However, I wonder
if the whole draft is tested on at least one implementation (even if
on a simulator) for correctness of message processing, generation, and
forwarding. In my experience creating of standards, I would have made
mistakes in these rules, hadn't I always verified the specification
with at least my own implementation.
For example, when I read section 7.1.2. RREQ Reception, it sounds
strange to me to update the neighbor set (in point 1) before checking
if the message is redundant (in point 6). I am not 100% sure if this
is really a mistake in the draft or if I am just misunderstanding
something, but knowing that the flow has been verified by at least one
implementation would give me more confidence.

- Security:
    - End-to-end integrity protection is not possible with the current
protocol design; it looks like the plan is to change this ([5]), but
it will likely mean a major redesign of the core protocol to go away
from message regeneration to actually forwarded messages.
    - Interoperability is not guaranteed by not specifying which
crypto/hash protocols should be used in the RFC7182 framework.
    - Key management is not addressed according to BCP107: There are
currently some early discussions on the MANET list about how to
provide keys to routers. [2]

- Metrics:
    - I prefer the approach that OLSRv2 is taking of a metric that
doesn't define the nature of the metric (as long as it's additive); I
agree with Henning's message in [3]
    - As outlined in my email [1], I don't agree with the assumption
in AODVv2 that most wireless links are symmetric. In my observations,
the opposite is the case. Vicky outlined some intended changes to
address this, but this will likely be a larger redesign of the
mechanism for calculating and using metrics.

- Same addresses on multiple interfaces: Question: has this (as
described in [4]) been addressed?

- Default router: no discovery of prefixes: If I understand correctly,
it's not possible to discover a prefix; but an AODVv2 router may
respond with an RREP that includes a prefix length. This would make it
inefficient to discover general "Internet" addresses (i.e., addresses
not inside the MANET); a router may have to trigger a new RREQ for
each new such requested address that is not present in the MANET
routing area.

- Experiment description: It seems to me that the text for the intent
of the experiment could have been the same 13 years ago, when AODV
(v1) was published. I had hoped that by now we would already have some
insights into the "behavior of the protocol in real-world
deployments", the "knowledge base of [...] reactive protocols [...]",
and "if sufficient demand exists [...] to prompt an effort to bring
the protocol to Standards Track".

- Ambiguities in RFC5444 format for messages: As described in my
detailed review, it's unclear to me whether or not some of the headers
should be added or not in the RFC5444 message. Also, some message
examples could be helpful in an appendix.

- No jitter: The WG has decided to specifiy jitter in RFC5148 and use
it in OLSRv2 because it is beneficial in flooding operations. But
AODVv2 doesn't specify the usage of jitter (there is only an orphaned
reference to RFC5148). What is the rationale for AODVv2 to not include
jitter?

- Missing constraints for parameters: OLSRv2 details constraints on
all the parameters (such as minimum and maximum values), in particular
for those that can be changed during runtime. I think it would be a
good idea to include the same for AODVv2.

- Unclear IANA section: The metrics table (table 6) is not included in
the IANA section, but in section 10. Also, there is no allocation
policy specified.

- Some TBDs and missing sections: There are some missing values (TBD)
in table 3, and table 4, but no request for IANA to assign these
values. Section 12.4.2 has as last sentence "Key management is not
specified for the following reasons:", but there is nothing following.

[1] https://www.ietf.org/mail-archive/web/manet/current/msg18873.html
[2] https://www.ietf.org/mail-archive/web/manet/current/msg18914.html
[3] https://www.ietf.org/mail-archive/web/manet/current/msg17390.html
[4] https://www.ietf.org/mail-archive/web/manet/current/msg18525.html
[5] https://www.ietf.org/mail-archive/web/manet/current/msg18948.html

See below for detailed comments:

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

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

Abstract

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

Status of This Memo

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

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

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

   This Internet-Draft will expire on October 22, 2016.

Copyright Notice

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

   This document is subject to BCP 78 and the IETF Trust's Legal
   Provisions Relating to IETF Documents
   (http://trustee.ietf.org/license-info) in effect on the date of

Perkins, et al.         Expires October 22, 2016                [Page 1]

Internet-Draft                   AODVv2                       April 2016

   publication of this document.  Please review these documents
   carefully, as they describe your rights and restrictions with respect
   to this document.  Code Components extracted from this document must
   include Simplified BSD License text as described in Section 4.e of
   the Trust Legal Provisions and are provided without warranty as
   described in the Simplified BSD License.

Table of Contents

   1.  Overview  . . . . . . . . . . . . . . . . . . . . . . . . . .   4
   2.  Terminology . . . . . . . . . . . . . . . . . . . . . . . . .   5
   3.  Applicability Statement . . . . . . . . . . . . . . . . . . .   9
   4.  Data Structures . . . . . . . . . . . . . . . . . . . . . . .  10
     4.1.  InterfaceSet  . . . . . . . . . . . . . . . . . . . . . .  10
     4.2.  Router Client Set . . . . . . . . . . . . . . . . . . . .  11
     4.3.  Neighbor Set  . . . . . . . . . . . . . . . . . . . . . .  12
     4.4.  Sequence Numbers  . . . . . . . . . . . . . . . . . . . .  12
     4.5.  Local Route Set . . . . . . . . . . . . . . . . . . . . .  13
     4.6.  Multicast Route Message Set . . . . . . . . . . . . . . .  15
     4.7.  Route Error (RERR) Set  . . . . . . . . . . . . . . . . .  17
   5.  Metrics . . . . . . . . . . . . . . . . . . . . . . . . . . .  17
   6.  AODVv2 Protocol Operations  . . . . . . . . . . . . . . . . .  19
     6.1.  Initialization  . . . . . . . . . . . . . . . . . . . . .  19
     6.2.  Next Hop Monitoring . . . . . . . . . . . . . . . . . . .  20
     6.3.  Neighbor Set Update . . . . . . . . . . . . . . . . . . .  21
     6.4.  Interaction with the Forwarding Plane . . . . . . . . . .  23
     6.5.  Message Transmission  . . . . . . . . . . . . . . . . . .  24
     6.6.  Route Discovery, Retries and Buffering  . . . . . . . . .  25
     6.7.  Processing Received Route Information . . . . . . . . . .  26
       6.7.1.  Evaluating Route Information  . . . . . . . . . . . .  27
       6.7.2.  Applying Route Updates  . . . . . . . . . . . . . . .  29
     6.8.  Suppressing Redundant Messages Using the Multicast Route
           Message Set . . . . . . . . . . . . . . . . . . . . . . .  31
     6.9.  Suppressing Redundant Route Error Messages using the
           Route Error Set . . . . . . . . . . . . . . . . . . . . .  33
     6.10. Local Route Set Maintenance . . . . . . . . . . . . . . .  34
       6.10.1.  LocalRoute State Changes . . . . . . . . . . . . . .  34
       6.10.2.  Reporting Invalid Routes . . . . . . . . . . . . . .  36
   7.  AODVv2 Protocol Messages  . . . . . . . . . . . . . . . . . .  36
     7.1.  Route Request (RREQ) Message  . . . . . . . . . . . . . .  37
       7.1.1.  RREQ Generation . . . . . . . . . . . . . . . . . . .  38
       7.1.2.  RREQ Reception  . . . . . . . . . . . . . . . . . . .  39
       7.1.3.  RREQ Regeneration . . . . . . . . . . . . . . . . . .  40
     7.2.  Route Reply (RREP) Message  . . . . . . . . . . . . . . .  41
       7.2.1.  RREP Generation . . . . . . . . . . . . . . . . . . .  42
       7.2.2.  RREP Reception  . . . . . . . . . . . . . . . . . . .  44
       7.2.3.  RREP Regeneration . . . . . . . . . . . . . . . . . .  45
     7.3.  Route Reply Acknowledgement (RREP_Ack) Message  . . . . .  46

Perkins, et al.         Expires October 22, 2016                [Page 2]

Internet-Draft                   AODVv2                       April 2016

       7.3.1.  RREP_Ack Generation . . . . . . . . . . . . . . . . .  46
       7.3.2.  RREP_Ack Reception  . . . . . . . . . . . . . . . . .  46
     7.4.  Route Error (RERR) Message  . . . . . . . . . . . . . . .  47
       7.4.1.  RERR Generation . . . . . . . . . . . . . . . . . . .  48
       7.4.2.  RERR Reception  . . . . . . . . . . . . . . . . . . .  49
       7.4.3.  RERR Regeneration . . . . . . . . . . . . . . . . . .  51
   8.  RFC 5444 Representation . . . . . . . . . . . . . . . . . . .  51
     8.1.  Route Request Message Representation  . . . . . . . . . .  53
       8.1.1.  Message Header  . . . . . . . . . . . . . . . . . . .  53
       8.1.2.  Message TLV Block . . . . . . . . . . . . . . . . . .  53
       8.1.3.  Address Block . . . . . . . . . . . . . . . . . . . .  53
       8.1.4.  Address Block TLV Block . . . . . . . . . . . . . . .  53
     8.2.  Route Reply Message Representation  . . . . . . . . . . .  54
       8.2.1.  Message Header  . . . . . . . . . . . . . . . . . . .  54
       8.2.2.  Message TLV Block . . . . . . . . . . . . . . . . . .  54
       8.2.3.  Address Block . . . . . . . . . . . . . . . . . . . .  55
       8.2.4.  Address Block TLV Block . . . . . . . . . . . . . . .  55
     8.3.  Route Reply Acknowledgement Message Representation  . . .  56
       8.3.1.  Message Header  . . . . . . . . . . . . . . . . . . .  56
       8.3.2.  Message TLV Block . . . . . . . . . . . . . . . . . .  56
       8.3.3.  Address Block . . . . . . . . . . . . . . . . . . . .  56
       8.3.4.  Address Block TLV Block . . . . . . . . . . . . . . .  57
     8.4.  Route Error Message Representation  . . . . . . . . . . .  57
       8.4.1.  Message Header  . . . . . . . . . . . . . . . . . . .  57
       8.4.2.  Message TLV Block . . . . . . . . . . . . . . . . . .  57
       8.4.3.  Address Block . . . . . . . . . . . . . . . . . . . .  57
       8.4.4.  Address Block TLV Block . . . . . . . . . . . . . . .  58
   9.  Simple External Network Attachment  . . . . . . . . . . . . .  58
   10. Configuration . . . . . . . . . . . . . . . . . . . . . . . .  59
     10.1.  Timers . . . . . . . . . . . . . . . . . . . . . . . . .  60
     10.2.  Protocol Constants . . . . . . . . . . . . . . . . . . .  62
     10.3.  Local Settings . . . . . . . . . . . . . . . . . . . . .  63
     10.4.  Network-Wide Settings  . . . . . . . . . . . . . . . . .  63
     10.5.  MetricType Allocation  . . . . . . . . . . . . . . . . .  63
   11. IANA Considerations . . . . . . . . . . . . . . . . . . . . .  64
     11.1.  RFC 5444 Message Types . . . . . . . . . . . . . . . . .  64
     11.2.  RFC 5444 Address Block TLV Types . . . . . . . . . . . .  64
     11.3.  ADDRESS_TYPE TLV Values  . . . . . . . . . . . . . . . .  65
   12. Security Considerations . . . . . . . . . . . . . . . . . . .  65
     12.1.  Availability . . . . . . . . . . . . . . . . . . . . . .  66
       12.1.1.  Denial of Service  . . . . . . . . . . . . . . . . .  66
       12.1.2.  Malicious RERR messages  . . . . . . . . . . . . . .  67
       12.1.3.  False Confirmation of Link Bidirectionality  . . . .  68
       12.1.4.  Message Deletion . . . . . . . . . . . . . . . . . .  68
     12.2.  Confidentiality  . . . . . . . . . . . . . . . . . . . .  69
     12.3.  Integrity  . . . . . . . . . . . . . . . . . . . . . . .  69
       12.3.1.  Message Insertion  . . . . . . . . . . . . . . . . .  69
       12.3.2.  Message Modification - Man in the Middle . . . . . .  70

Perkins, et al.         Expires October 22, 2016                [Page 3]

Internet-Draft                   AODVv2                       April 2016

       12.3.3.  Replay Attacks . . . . . . . . . . . . . . . . . . .  70
     12.4.  Protection Mechanisms  . . . . . . . . . . . . . . . . .  71
       12.4.1.  Confidentiality and Authentication . . . . . . . . .  71
       12.4.2.  Integrity and Trust using ICVs . . . . . . . . . . .  71
       12.4.3.  Replay Protection using Timestamps . . . . . . . . .  71
       12.4.4.  Application to AODVv2  . . . . . . . . . . . . . . .  71
   13. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . .  74
   14. References  . . . . . . . . . . . . . . . . . . . . . . . . .  74
     14.1.  Normative References . . . . . . . . . . . . . . . . . .  74
     14.2.  Informative References . . . . . . . . . . . . . . . . .  75
   Appendix A.  AODVv2 Draft Updates . . . . . . . . . . . . . . . .  77
   Authors' Addresses  . . . . . . . . . . . . . . . . . . . . . . .  77

1.  Overview

   The Ad hoc On-Demand Distance Vector Version 2 (AODVv2) protocol
   enables dynamic, self-starting, multihop routing between
   participating mobile nodes 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 topology in a timely manner.  The operation of AODVv2 is
   loop-free, and by avoiding the Bellman-Ford "counting to infinity"
   problem 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 lost link.

   One distinguishing feature of AODVv2 is its use of 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.

   Compared to AODV [RFC3561], AODVv2 has moved some features out of the
   scope of the document, notably intermediate route replies, expanding
   ring search, and precursor lists.  However, the document has been
   designed to allow their specification in a separate document.  Hello
   messages and local repair have been removed.  AODVv2 provides a
   mechanism for the use of multiple metric types.  Message formats have
   been updated and made compliant with [RFC5444].  AODVv2 control
   messages are defined as sets of data, which are mapped to message
   elements using the Generalized MANET Packet/Message Format defined in
   [RFC5444] and sent using the parameters in [RFC5498].  Verification

Perkins, et al.         Expires October 22, 2016                [Page 4]

Internet-Draft                   AODVv2                       April 2016

   of link bidirectionality has been substantially improved, and
   additional refinements made for route timeouts and state management.

   AODVv2 is an Experimental protocol.  The purpose of the experiment
   with AODVv2 is to gain information on the behavior of the protocol in
   real-world deployments, furthering the knowledge base of both
   reactive protocols in general, and with AODVv2 in particular.
   Another goal of the experiment is to determine if sufficient demand
   exists for the AODVv2 protocol to prompt an effort to bring the
   protocol to Standards Track.

UH> In how far is that a different experiment from the one defined by
AODV(v1) (RFC3561) in 2003? What were the conclusions of the
experiment from AODVv1?

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

   An AODVv2 router is configured to perform route discovery on behalf
   of a configured set of IP addresses known as Router Clients.

UH> As I mentioned it before on the manet list, why inventing a new
terminology (Router Client), when the IETF has already good
terminology (Router, hosts), as well as terms such as Local Attached
Network Set from OLSRv2?

   Route
   discovery is performed when an AODVv2 router needs to forward an IP
   packet from one of its Router Clients, but does not have a valid
   route to the packet's destination.  AODVv2 routers use Route Request
   (RREQ) and Route Reply (RREP) messages to carry route information
   between the originator of the route discovery and the router
   responsible for the target, establishing a route to both endpoints on
   all intermediate routers.  A metric value is included to represent
   the cost of the route contained within the message.  AODVv2 uses
   sequence numbers to identify stale routing information, and compares
   route metric values to determine if advertised routes could form
   loops.

   Route maintenance includes confirming bidirectionality of links to
   next hop AODVv2 routers, issuing Route Error (RERR) messages,
   reacting to received Route Error messages, and extending and
   enforcing route timeouts.

   The on-demand nature of AODVv2 requires signals to be exchanged
   between AODVv2 and the forwarding plane.  These signals indicate
   when: a packet is to be forwarded, in order to initiate route
   discovery; packet forwarding fails, in order to initiate route error
   reporting; a packet is successfully forwarded, for route maintenance.

   Security for authentication of AODVv2 routers and encryption of
   control messages is accomplished using the TIMESTAMP and ICV TLVs
   defined in [RFC7182].

2.  Terminology

   The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
   "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
   "OPTIONAL" in this document are to be interpreted as described in

Perkins, et al.         Expires October 22, 2016                [Page 5]

Internet-Draft                   AODVv2                       April 2016

   [RFC2119].  In addition, this document uses terminology from
   [RFC5444], and defines the following terms:

   AddressList
      A list of IP addresses as used in AODVv2 messages.
UH> What does that mean, "as used in AODVv2 messages"? Extensions can
add addresses and associate TLVs with them, and these added addresses
probably shouldn't be includeed in the AODVv2 processing. I assume
that you mean something along the line of "addresses that are
associated with a {certain} TLV"?

   AckReq
      Used in a Route Reply message to indicate the IP address of the
      router from which a Route Reply Acknowledgement is expected.

UH> "The IP address of the router"; a router can have multiple
interfaces, each of which can have multiple interfaces. It would be
better to clarify which IP address this is.

   AdvRte
      A route advertised in an incoming route message.

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

   CurrentTime
      The current time as maintained by the AODVv2 router.

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

   InterfaceSet
      The set of all network interfaces supporting AODVv2.

   Invalid route
      A route that cannot be used for forwarding but still contains
      useful sequence number information.

   LocalRoute
      An entry in the Local Route Set as defined in Section 4.5.

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

   MetricType
      The metric type for a metric value included in a message.

   MetricTypeList
      A list of metric types associated with the addresses in the
      AddressList of a Route Error message.

   Neighbor
      An AODVv2 router from which an RREQ or RREP message has been
      received.  Neighbors exchange routing information and verify

Perkins, et al.         Expires October 22, 2016                [Page 6]

Internet-Draft                   AODVv2                       April 2016

      bidirectionality of the link to a neighbor before installing a
      route via that neighbor into the Local Route Set.

   OrigAddr
      The source IP address of the IP packet triggering route discovery.

   OrigMetric
      The metric value associated with the route to OrigAddr (and any
      other addresses included in the given prefix length).

   OrigPrefixLen
      The prefix length, in bits, configured in the Router Client entry
      which includes OrigAddr.

   OrigSeqNum
      The sequence number of the AODVv2 router which originated the
      Route Request on behalf of OrigAddr.

   PktSource
      The source address of the IP packet which triggered a Route Error
      message.
UH> s/which/that/

   PrefixLengthList
      A list of routing prefix lengths associated with the addresses in
      the AddressList of a message.

   Reactive
      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".

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

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

   RerrMsg (RERR Message)
      A Route Error (RERR) message.

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

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

Internet-Draft                   AODVv2                       April 2016

   Router Client
      An address or 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 non-routing devices that are reachable without
      traversing another AODVv2 router.

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

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

   RREQ (Route Request)
      The AODVv2 message type used to discover a route to TargAddr and
      distribute information about a route to OrigAddr.

   RREQ_Gen (RREQ Generating Router)
      The AODVv2 router that generates the Route Request message, i.e.,
      the router configured with OrigAddr as a Router Client.

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

   SeqNum
      The sequence number maintained by an AODVv2 router to indicate
      freshness of route information.

   SeqNumList
      A list of sequence numbers associated with the addresses in the
      AddressList of a message.

   TargAddr
      The target address of a route request, i.e., the destination
      address of the IP packet triggering route discovery.

   TargMetric
      The metric value associated with the route to TargAddr (and any
      other addresses included in the given prefix length).

   TargPrefixLen
      The prefix length, in bits, configured in the Router Client entry
      which includes TargAddr.

   TargSeqNum
      The sequence number of the AODVv2 router which originated the
      Route Reply on behalf of TargAddr.

Perkins, et al.         Expires October 22, 2016                [Page 8]

Internet-Draft                   AODVv2                       April 2016

   Unreachable Address
      An address reported in a Route Error message, as described in
      Section 7.4.1.

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

   ValidityTime
      The length of time the route described by the message is offered.

   Valid route
      A route that can be used for forwarding, as described in
      Section 7.4.1.

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

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

                      Table 1: Notational Conventions

3.  Applicability Statement

   The AODVv2 routing protocol is a reactive routing protocol intended
   for use in mobile ad hoc wireless networks.  A reactive protocol only
   sends messages to discover a route when there is data to send on that
   route.  Therefore, a reactive routing protocol requires certain
   interactions with the forwarding plane (for example, to indicate when
   a packet is to be forwarded, in order to initiate route discovery).
   The set of signals exchanged between AODVv2 and the forwarding plane
   are discussed in Section 6.4.

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

   AODVv2 handles a wide variety of mobility and traffic patterns by
   determining routes on-demand.  In networks with a large number of
   routers, AODVv2 is best suited for relatively sparse traffic
   scenarios where each router forwards IP packets to a small percentage

Perkins, et al.         Expires October 22, 2016                [Page 9]

Internet-Draft                   AODVv2                       April 2016

   of other AODVv2 routers in the network.

UH> I would reword "sparse trafic". It's not really about the amount
of traffic: a router could send 10 TB of data to another destination.
As long as the percentage of destinations is small, AODVv2 could be
suitable.

   In this case fewer routes
   are needed, and therefore less control traffic is produced.  Data
   packets may be buffered until a route to their destination is
   available, as described in Section 6.6.

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

UH> Unless the encryption is explicitely specified, I would remove
this last sentence. And what are "security associations"?

   Since the 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 optimised for the requesting
   router, and the return path may not be the optimal route.

UH> s/optimised/optimized/

   AODVv2 is applicable to memory constrained devices, since only a
   little routing state is maintained in each AODVv2 router.

UH> s/since only a little/since only little/

UH> But that really depends on the number of destinations; if there
are many destinations, it could be a lot of state.

    AODVv2
   routes that are not needed for forwarding data do not need to be
   maintained.

   On routers unable to store persistent AODVv2 state,
   recovery can impose a performance penalty (e.g., in case of AODVv2
   router reboot), since if a router loses its sequence number, there is
   a delay before the router can resume full operations.  This is
   described in Section 6.1.

   AODVv2 supports routers with multiple interfaces 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.  Address
   assignment procedures are out of scope for AODVv2.

   AODVv2 supports Router Clients with multiple interfaces, as long as
   each interface is configured with its own unicast IP address.  Multi-
   homing of a Router Client IP address is not supported by AODVv2, and
   therefore an IP address SHOULD NOT be configured as a Router Client
   on more than one AODVv2 router at any one time.

UH> Is it appropriate to have RFC2119 language in the applicability statement?
UH> How can an IP address assure that it's not configured as a Router
Client on more than one AODVv2 router at any time?

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

UH> This may require some more explanations how this can work. A large
part of the document assumes layer 3 (see, for example, mentions of
MTU).

4.  Data Structures

4.1.  InterfaceSet

   The InterfaceSet is a conceptual data structure which contains
   information about all interfaces available to AODVv2.

UH> Can you define "available to AODVv2"? How can an interface on an
AODVv2 router not be available? Does it have to be configured to be
available? Or are there some conditions that automatically make an
interface not available to the routing protocol?

   Each element
   in the InterfaceSet MUST contain the following:

Perkins, et al.         Expires October 22, 2016               [Page 10]

Internet-Draft                   AODVv2                       April 2016

   Interface.Id
      An identifier that is unique in node-local scope and that allows
      the AODVv2 implementation to identify exactly one local network
      interface.

   If multiple interfaces of the AODVv2 router are configured for use by
   AODVv2, they MUST be configured in the InterfaceSet.

   Otherwise the InterfaceSet MAY be empty.

UH> Shouldn't at least one interface be configured as AODVv2
interface? How can this be empty?
UH> When adding or removing an interface during runtime, are there any
special actions that need to be performed (such as in OLSRv2)?

4.2.  Router Client Set

   An AODVv2 router provides route discovery services for its own local
   applications and for other non-routing devices that are reachable
   without traversing another AODVv2 router.

UH> By "other non-routing devices", do you mean "hosts"?

   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 configured Router Client
   addresses.

   Router Client Set entries MUST contain:

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

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

UH> I suggest rewording "provide connectivity"? My router at home
"provides connectivity" to Google, but it is several IP  hops away.

   RouterClient.Cost
      The cost associated with reaching this address or address range.

   A Router Client address MUST NOT be served by more than one AODVv2
   router at any one time.  To shift responsibility for a Router Client
   to a different AODVv2 router, correct AODVv2 routing behavior MUST be
   observed;

   The AODVv2 router adding the Router Client MUST wait for
   any existing routing information about this Router Client to be
   purged from the network, i.e., at least MAX_SEQNUM_LIFETIME since the
   last SeqNum update on the router which is removing this Router
   Client.

UH> s/which/that/
UH> It could be helpful to add a forward reference to the section that
describes how to purge existing routing information about this Router
Client. I searched for the word "purge" in the rest of the document,
but I couldn't find it.

Perkins, et al.         Expires October 22, 2016               [Page 11]

Internet-Draft                   AODVv2                       April 2016

4.3.  Neighbor Set

   A Neighbor Set MUST be maintained with 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 MUST be tested for
   bidirectionality and the result stored in this set.  A route will
   only be considered valid when the link is confirmed to be
   bidirectional.

   Neighbor Set entries MUST contain:

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

UH> Is this the source IP address from RFC5444 msg-orig-addr? Or is
this from the IP packet?

   Neighbor.State
      Indicates whether the link to the neighbor is bidirectional.
      There are three possible states: Confirmed, Unknown, and
      Blacklisted.

UH> If a router has several interfaces and several links to a neighbor
(e.g., one link via ethernet, one via Wifi), how is this reflected in
this set? Would I have two entries, one, say, confirmed, one unknown?

      Unknown 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 uni-
      directional.  Section 6.2 discusses how to monitor link
      bidirectionality.

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

   Neighbor.Interface
      The interface on which the link to the neighbor was established.

4.4.  Sequence Numbers

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

   Each AODVv2 router in the network MUST maintain its own sequence
   number.  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

Perkins, et al.         Expires October 22, 2016               [Page 12]

Internet-Draft                   AODVv2                       April 2016

   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).  The value zero (0) is reserved to indicate
   that the sequence number is unknown.

UH> Some explanation in which situations the sequence number is
unknown would be helpful.

   An AODVv2 router MUST only attach its own sequence number to
   information about a route to one of its configured Router Clients,
   all route messages regenerated by other routers retain the
   originator's sequence number.  Tod determine staleness, the

UH> s/Tod/To/

   previously stored sequence number associated with the originator, is

UH> remove the comma before "is"

   subtracted from the incoming sequence number.  The result of the
   subtraction is to be interpreted as a signed 16-bit integer, and if
   less than zero, the information in the new AODVv2 message is stale
   and MUST be discarded.

UH> Which previously stored sequence number? (that wasn't described before).
UH> What about wrap-around of the sequence number? Say, the previous
sequence number was 65,535. The new sequence number is 1. If I
subtract the previous number from the new number, it would be
negative, and thus considered as stale.

   This, along with the processes in Section 6.7.1, ensures loop
   freedom.

UH> How so? Some explanation would be helpful.

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

4.5.  Local Route Set

   All AODVv2 routers MUST maintain a Local Route Set, containing
   information about routes learned from AODVv2 route messages.  The
   Local Route Set is 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, implementations
   MAY choose to modify the Routing Information Base directly.

UH> Could be helpful to add some clarifications: In which cases would
that make sense to modify the RIB directly? What are the implications
of doing so?

   Routes learned from AODVv2 route messages are referred to in this
   document as LocalRoutes, and MUST contain the following information:

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

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

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

Perkins, et al.         Expires October 22, 2016               [Page 13]

Internet-Draft                   AODVv2                       April 2016

   LocalRoute.NextHop
      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.

UH> s/,i.e an/,i.e., an/

   LocalRoute.NextHopInterface
      The interface used to send IP packets toward LocalRoute.Address.

   LocalRoute.LastUsed
      If this route is installed in the Routing Information Base, the
      time it was last used to forward an IP packet.

UH> What is the value if the route hasn't been installed in the RIB?
(null?). Is this information always available on all operating
systems?

   LocalRoute.LastSeqNumUpdate
      The time LocalRoute.SeqNum was last updated.

   LocalRoute.ExpirationTime
      The time at which this LocalRoute MUST be marked as Invalid.

UH> s/this LocalRoute MUST marked as Invalid/LocalRoute.State for this
LocalRoute MUST be set to Invalid/

      An
      AODVv2 router MAY be offered a route for a limited time.  In this
      case, the route is referred to as a timed route.  If a route is
      not timed, LocalRoute.ExpirationTime is INFINITY_TIME.

UH> A forward reference to the section where this is specified would
be helpful.

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

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

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

   There are four possible states for a LocalRoute:

   Unconfirmed
      A route learned from a Route Request message, which has not yet
      been confirmed as bidirectional.  It MUST NOT be used for
      forwarding IP packets, and therefore it is not referred to as a
      valid route.  This state only applies to routes learned through
      RREQ messages.

UH> What are other ways of learning of a route?

   Idle
      A route which has been learned from a route message, and has also
UH> s/which/that/
      been confirmed, but has not been used in the last ACTIVE_INTERVAL.
      It is able to be used for forwarding IP packets, and therefore it
      is referred to as a valid route.

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

Internet-Draft                   AODVv2                       April 2016

   Active
      A route which has been learned from a route message, and has also
UH> s/which/that/
      been confirmed, and has been used in the last ACTIVE_INTERVAL.  It
      is able to be used for forwarding IP packets, and therefore it is
      referred to as a valid route.

   Invalid
      A route which has expired or been lost.  It MUST NOT be used for
UH> s/which/that/
      forwarding IP packets, and therefore it is not referred to as a
      valid route.  Invalid routes contain sequence number information
      which allows incoming information to be assessed for freshness.

   When the Local Route Set is stored separately from the Routing
   Information Base, routes are added to the Routing Information Base
UH>s/When/If/
UH>IMO, this should be more detailed: What does it mean if it is "not
stored separately"? What are the implications?

   when LocalRoute.State is valid (set to Active or Idle), and removed
   from the Routing Information Base when LocalRoute.State becomes
   Invalid.  Changes to LocalRoute state are detailed in Section 6.10.1.

   Multiple valid routes for the same address and prefix length but for
   different metric types may exist in the Local Route Set, but the
   decision of which of these routes to install in the Routing
   Information Base to use for forwarding is outside the scope of
   AODVv2.

UH> How does this work in case the Local Route Set is "not stored
separately" from the RIB?

4.6.  Multicast Route Message Set

   A route message (RteMsg) is either a Route Request or Route Reply
   message.  RREQ messages are multicast by default and regenerated

UH> I have outlined on the manet list why I think "regeneration" is a
bad idea (in particular in regards to end-to-end security):
https://www.ietf.org/mail-archive/web/manet/current/msg18431.html
https://www.ietf.org/mail-archive/web/manet/current/msg18081.html

   multiple times, and RREP messages will be multicast when the link to
   the next router is not known to be bidirectional.
UH> Is there any experience with AODVv2 of the implications (in terms
of overhead, packet loss, and delivery ratio) that justifies the use
of multicast RREP messages?

   Multiple similar
   route messages might be received by any one router during one route
   discovery attempt.  The AODVv2 router does not need to regenerate or
   respond to every one of these messages.

UH> Can this be clarified? "not [...] to every one of these messages"?
I would have thought more something like "The AODVv2 router MUST NOT
regenerate route messages with the same sequence number that it has
previously received" (probably would need some more word-smithing to
handle wrap-around)

   The Multicast Route Message Set is a conceptual set which contains
UH> s/which/, which/
   information about previously received multicast route messages, so
   that incoming route messages can be compared with previously received
   messages to determine if the incoming information is redundant or
   stale, and the router can avoid sending redundant control traffic.

   Multicast Route Message Set entries MUST contain the following
   information:

   RteMsg.MessageType
      Either RREQ or RREP.

Perkins, et al.         Expires October 22, 2016               [Page 15]

Internet-Draft                   AODVv2                       April 2016

   RteMsg.OrigAddr
      The source address of the IP packet triggering the route request.

   RteMsg.OrigPrefixLen
      The prefix length associated with RteMsg.OrigAddr, originally from
      the Router Client entry on RREQ_Gen which includes
UH> s/which/that/
      RteMsg.OrigAddr.
UH> maybe: s/Router Client entry/Router Client Set entry/
UH> I am not sure I understand where the prefix length is acquired.
Say this is the first RREQ received on this router; how does it know
the prefix length? Am I correct that this has to be manually
configured in the Router Client Set, but that this can be empty as
well? (since in the Router Client Set section the draft states: "If a
prefix length is included [...]".). In that case the above sentence
"Multicast Route Message Set entries MUST contain the following
information:" is misleading, since it implies that none of these
fields in the entry can be empty.

   RteMsg.TargAddr
      The destination address of the IP packet triggering the route
      request.

   RteMsg.TargPrefixLen
      The prefix length associated with RteMsg.TargAddr, originally from
      the Router Client entry on RREP_Gen which includes
UH>s/which/that/
      RteMsg.TargAddr.  If RteMsg is a RREQ, RteMsg.TargPrefixLen MUST
      equal address length.
UH> I assume this means that RREQs can only be issued for host
addresses (/32 or /128), not for prefixes. That would be  inefficient
for default gateway discovery, if a RREQ has to be issued for every
single address that is available through the gateway outside of the
MANET.

   RteMsg.OrigSeqNum
      The sequence number associated with the route to OrigAddr, if
      RteMsg is an RREQ.

   RteMsg.TargSeqNum
      The sequence number associated with the route to TargAddr, if
      RteMsg is an RREP.

   RteMsg.MetricType
      The metric type of the route requested.

   RteMsg.Metric
      The metric value received in the RteMsg.

   RteMsg.Timestamp
      The last time this Multicast Route Message Set entry was updated.

   RteMsg.RemoveTime
      The time at which this entry MUST be removed from the Multicast
      Route Message Set. This is set to CurrentTime +
      MAX_SEQNUM_LIFETIME, whenever the sequence number of this entry
      (RteMsg.OrigSeqNum for an RREQ, or RteMsg.TargSeqNum for an RREP)
      is updated.

   RteMsg.AckReqAddr
      The address from which a RREP_Ack is expected, if RteMsg is a RREP
      that contains an AckReq.
UH> Which address is that? Source IP address or OrigAddr?

   RteMsg.Interface
      The interface on which the message was received.

Perkins, et al.         Expires October 22, 2016               [Page 16]

Internet-Draft                   AODVv2                       April 2016

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

4.7.  Route Error (RERR) Set

   Each sent RERR message SHOULD be recorded in a conceptual set called
   the Route Error (RERR) Set.
UH> Why not MUST?  In which cases wouldn't you do this and what are
the implications?

   Each entry contains the following
   information:

   RerrMsg.Timeout
      The time after which the entry SHOULD be deleted.
UH> Why not MUST? What happens if it isn't deleted?

   RerrMsg.AddressList
      The AddressList of the RERR to be recorded.

   RerrMsg.PktSource:
      The PktSource of the RERR to be recorded, if any.

   See section Section 6.9 for instructions on how to update the set.

5.  Metrics

   Metrics measure a cost or quality associated with a route or a link,
   e.g., latency, delay, financial cost, energy, etc.  Metric values are
   reported in Route Request and Route Reply messages.

   In Route Request messages, the metric describes the cost of the route
   from OrigAddr (and any other addresses included in the prefix length
   of RREQ_Gen's Router Client entry for OrigAddr) to the router sending
   the Route Request.
UH> Isn't that the same router, OrigAddr and "the router sending the
Route Request"? Do you mean "to the router receiving the Route
Request"?

    For RREQ_Gen, this is the cost associated with
   the Router Client entry which includes OrigAddr.
UH> s/which/that/
UH> Doesn't every entry in that set include an OrigAddr?

    For routers which
UH> s/which/that/
   regenerate the RREQ, this is the cost from OrigAddr to the
   regenerating 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 regenerating the Route Request message, and used to
   install a route back toward OrigAddr.

   Similarly, in Route Reply messages, the metric reflects the cost of
   the route from TargAddr (and any other addresses included in the
   prefix length of RREP_Gen's Router Client entry for TargAddr) to the
   router sending the Route Reply.
UH> Similar to a previous comment, it's unclear what you mean by "the
router sending the Route Reply" (in particular because the draft
includes the concept of regeneration, so technically at every hop a
router is sending the RREP).

     For RREP_Gen, this is the cost
   associated with the Router Client entry which includes TargAddr.  For
   routers which regenerate the RREP, this is the cost from TargAddr to
   the regenerating 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

Perkins, et al.         Expires October 22, 2016               [Page 17]

Internet-Draft                   AODVv2                       April 2016

   included when regenerating the Route Reply message, and used to
   install a route back toward TargAddr.

   Assuming link metrics are symmetric, the cost of the routes installed
   in the Local Route Set at each router will be correct.
UH> I would go further and say that in wireless networks (which is
what this protocol is applicable for), links are almost never
symmetric.

     While this
   assumption is not always correct, calculating incoming/outgoing
   metric data is outside of scope of this document.
UH> Why? As you admit, this assumption is not always (I would say
"almost never") correct. Moving that out of scope of the document is
thus very surprising to me.

   The route
   discovered is optimised for the requesting router, and the return
   path may not be the optimal route.
UH> s/optimised/optimized/ (either consistently British or American English)

   AODVv2 enables the use of multiple metric types.  Each route
   discovery attempt indicates the metric type which is requested for
UH> s/which/that/
   the route.  Only one metric type MUST be used in each route discovery
   attempt.

   For each MetricType, AODVv2 requires:

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

   o  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 Section 10.5.
      If the cost of a route exceeds MAX_METRIC[MetricType], the route
      is ignored.
UH> Is a RREQ or RREP that already exceeds MAX_METRIC treated
differently? (e.g., not forwarded, or metric update done
differently?). How do you handle wrap around when MAX_METRIC is
incremented, i.e., to assure that MAX_METRIC + 1 isn't 0 or something
like that?

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

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

   o  A function to analyze routes for potential loops 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 Section 6.7.1,
      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.

Perkins, et al.         Expires October 22, 2016               [Page 18]

Internet-Draft                   AODVv2                       April 2016

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

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

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

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

6.  AODVv2 Protocol Operations

   The AODVv2 protocol's operations include managing sequence numbers,
   monitoring next hop AODVv2 routers on discovered routes and updating
   the Neighbor Set, performing route discovery and dealing with
   requests from other routers, processing incoming route information
   and updating the Local Route Set, updating the Multicast Route
   Message Set and suppressing redundant messages, and reporting broken
   routes.  These processes are discussed in detail in the following
   sections.

6.1.  Initialization

   During initialization where an AODVv2 router does not have
   information about its previous sequence number, or if its sequence
   number is lost at any point, the router resets its sequence number to
   one (1).  However, other AODVv2 routers may still hold sequence
   number information that this router previously issued.  Since
   sequence number information is removed if there has been no update to
   the sequence number in MAX_SEQNUM_LIFETIME, the initializing router
   MUST wait for MAX_SEQNUM_LIFETIME before it creates any messages
   containing its new sequence number.  It can then be sure that the
   information it sends will not be considered stale.

   During this wait period, the router is permitted to do the following:

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

   o  Regenerate a received RREQ or RREP

   o  Send an RREP_Ack

   o  Maintain valid routes in the Local Route Set

   o  Create, process and regenerate RERR messages

Perkins, et al.         Expires October 22, 2016               [Page 19]

Internet-Draft                   AODVv2                       April 2016

6.2.  Next Hop Monitoring

   To ensure AODVv2 routers Routers do not establish routes over uni-
UH> "routers Routers"?

   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.

   AODVv2 provides a mechanism for testing bidirectional connectivity
   during route discovery, and blacklisting routers where bidirectional
   connectivity is not available.  If a route discovery is retried by
   RREQ_Gen, the blacklisted routers can be excluded from the process,
   and a different route can be discovered.
UH> "Can" be excluded? (SHOULD/MUST?)

     Further, a route is not to
   be used for forwarding until the bidirectionality of the link to the
   next hop is confirmed.  AODVv2 routers do not need to monitor
   bidirectionality for links to neighboring routers which are not used
   as next hops on routes in the Local Route Set.
UH> Shouldn't there be some RFC2119 language in this paragraph?

   o  Bidirectional connectivity to upstream routers is tested by
      requesting acknowledgement of RREP messages by including an
      AckReq, which MUST be answered by sending an RREP_Ack.  Receipt of
      an RREP_Ack within RREP_Ack_SENT_TIMEOUT proves that bidirectional
      connectivity exists.  Otherwise, a link is determined to be
      unidirectional.  All AODVv2 routers MUST support this process,
      which is explained in Section 7.2 and Section 7.3.

   o  For the downstream router, receipt of an RREP message containing
      the route to TargAddr is confirmation of bidirectionality , since
      an RREP message is a reply to a RREQ message which previously
      crossed the link in the opposite direction.

   To assist with next hop monitoring, a Neighbor Set (Section 4.3) is
   maintained.  When an RREQ or RREP is received, search for an entry in
   the Neighbor Set where all of the following conditions are met:

   o  Neighbor.IPAddress == IP address from which the RREQ or RREP was
      received

   o  Neighbor.Interface == Interface on which the RREQ or RREP was
      received.

   If such an entry does not exist, a new entry is created as described
   in Section 6.3.  While the value of Neighbor.State is Unknown,
   acknowledgement of RREP messages sent to that neighbor MUST be
   requested.
UH> How? (a forward reference to a section would be helpful)

    If an acknowledgement is not received within the timeout
   period,
UH> Which timeout period?

   the neighbor MUST have Neighbor.State set to Blacklisted.  If
   an acknowledgement is received within the timeout period,
   Neighbor.State is set to Confirmed.  While the value of

Perkins, et al.         Expires October 22, 2016               [Page 20]

Internet-Draft                   AODVv2                       April 2016

   Neighbor.State is Confirmed, the request for an acknowledgement of
   any other RREP message is unnecessary.

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

   o  NHDP HELLO Messages [RFC6130]

   o  Route timeout

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

   o  TCP timeouts

   o  Promiscuous listening

   o  Other monitoring mechanisms or heuristics

   If such an external process signals that the link to a neighbor is
   bidirectional, the AODVv2 router MAY update the matching Neighbor Set
   entry by changing the value of Neighbor.State to Confirmed, e.g.
UH> How would a TCP timeout or Route timeout indicate that a neighbor
state should be changed to Confirmed? Shouldn't it be the opposite?

   receipt of a Neighborhood Discovery Protocol HELLO message with the
   receiving router listed as a neighbor.  If an external process
   signals that a link is not bidirectional, the the value of
   Neighbor.State MAY be changed to Blacklisted, e.g. notification of a
   TCP timeout.

6.3.  Neighbor Set Update

   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.

   A new Neighbor Set entry is created as follows:

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

   o  Neighbor.State := Unknown

   o  Neighbor.ResetTime := INFINITY_TIME

   o  Neighbor.Interface := Interface on which the RREQ or RREP was
      received.  MUST equal Interface.Id of one of the entries in the
      InterfaceSet (see Section 4.1).

Perkins, et al.         Expires October 22, 2016               [Page 21]

Internet-Draft                   AODVv2                       April 2016

   If the message is one of the following:

   o  an RREP which answers a RREQ sent within RREQ_WAIT_TIME over the
      same interface as Neighbor.Interface

   o  an RREP_Ack which answers a RREP sent within RREP_Ack_SENT_TIMEOUT
      over the same interface as Neighbor.Interface

   the link to the neighbor is bidirectional and the Neighbor Set entry
   is updated as follows:

   o  Neighbor.State := Confirmed

   o  Neighbor.ResetTime := INFINITY_TIME

   If the Multicast Route Message Set contains an entry where:

   o  RteMsg.MessageType == RREP

   o  RteMsg.AckReqAddr == Neighbor.IPAddress

   o  RteMsg.Interface == Neighbor.Interface

   o  RteMsg.Timestamp + RREP_Ack_SENT_TIMEOUT < CurrentTime

   the link is considered to be uni-directional and the Neighbor Set
   entry is updated as follows:

   o  Neighbor.State := Blacklisted

   o  Neighbor.ResetTime := CurrentTime + MAX_BLACKLIST_TIME

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

   o  Neighbor.State := Unknown

   If an external mechanism reports a link as broken, the Neighbor Set
   entry SHOULD be removed.

   Route requests from neighbors with Neighbor.State set to Blacklisted
   are ignored to avoid persistent IP packet loss or protocol failures.
   Neighbor.ResetTime 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.

Perkins, et al.         Expires October 22, 2016               [Page 22]

Internet-Draft                   AODVv2                       April 2016

6.4.  Interaction with the Forwarding Plane

   The signals descried in the following are conceptual signals, and can
s/descried/described/   (or better: specified)
   be implemented in various ways.  Conformant implementations of AODVv2
   are not mandated to implement the forwarding plane separately from
   the control plane or data plane; these signals and interactions are
   identified simply as assistance for implementers who may find them
   useful.

   AODVv2 requires signals from the forwarding plane:

   o  A packet cannot be forwarded because a route is unavailable:
      AODVv2 needs to know the source and destination IP addresses of
      the packet.  If the source of the packet is configured as a Router
      Client, the router should initiate route discovery to the
      destination.  If it is not a Router Client, the router should
      create a Route Error message.

   o  A packet is to be forwarded: AODVv2 needs to check the state of
      the route to ensure it is still valid.

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

   o  Packet forwarding failure occurs: AODVv2 needs to create a Route
      Error message.

   AODVv2 needs to send signals to the forwarding plane:

   o  A route discovery is in progress: buffering might be configured
      for packets requiring a route, while route discovery is attempted.

   o  A route discovery failed: any buffered packets requiring that
      route should be discarded, and the source of the packet should be
      notified that the destination is unreachable (using an ICMP
      Destination Unreachable message).  Route discovery fails if an
      RREQ cannot be generated because the control message generation
      limit has been reached, or if an RREP is not received within
      RREQ_WAIT_TIME (see Section 6.6).

   o  A route discovery is not permitted: any buffered packets requiring
      that route should be discarded.  A route discovery will not be
      attempted if the source address of the packet needing a route is
      not configured as a Router Client.

   o  A route discovery succeeded: install a corresponding route into
      the Routing Information Base and begin transmitting any buffered
      packets.

Perkins, et al.         Expires October 22, 2016               [Page 23]

Internet-Draft                   AODVv2                       April 2016

   o  A route has been made invalid: remove the corresponding route from
      the Routing Information Base.

   o  A route has been updated: update the corresponding route in the
      Routing Information Base.

6.5.  Message Transmission

   AODVv2 sends [RFC5444] formatted messages using the parameters for
   port number and IP protocol specified in [RFC5498].  Mapping of
   AODVv2 data to [RFC5444] messages is detailed in Section 8.  AODVv2
   multicast messages are sent to the link-local multicast address LL-
   MANET-Routers [RFC5498].  All AODVv2 routers MUST subscribe to LL-
   MANET-Routers on all AODVv2 interfaces [RFC5498] to receive AODVv2
   messages.  Note that multicast messages MAY be sent via unicast.  For
   example, this may occur for certain link-types (non-broadcast media),
   for manually configured router adjacencies, or in order to improve
   robustness.

   When multiple interfaces are available, an AODVv2 router transmitting
   a multicast message to LL-MANET-Routers MUST send the message on all
   interfaces that have been configured for AODVv2 operation, as given
   in the InterfaceSet (Section 4.1).

   To avoid congestion, each AODVv2 router's rate of message generation
   SHOULD be limited (CONTROL_TRAFFIC_LIMIT) and administratively
   configurable.  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:

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

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

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

   o  Fourth priority SHOULD be given to RREQ messages.

   o  Fifth priority SHOULD be given to RERR messages for newly
      invalidated routes.

Perkins, et al.         Expires October 22, 2016               [Page 24]

Internet-Draft                   AODVv2                       April 2016

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

   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
UH> I am curious: Is there scientific or experimental data available
that shows the positive effects of this mechanism?

6.6.  Route Discovery, Retries and Buffering

   AODVv2's RREQ and RREP messages are used for route discovery.  RREQ
   messages are multicast to solicit an RREP, whereas RREP are unicast
   where possible.  The constants used inSection 6.7.1 this section are
UH> s/inSection/in Section/
   defined in Section 10.

   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 generates
   (RREQ_Gen) and multicasts a Route Request message (RREQ), on all
   configured interfaces, containing OrigAddr and TargAddr.  The
   procedure for this is described in Section 7.1.1.  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.

   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.  Real-
   time traffic, voice, and scheduled delivery may suffer if packets are
   buffered and subjected to delays, but TCP connection establishment
   will benefit if packets are queued while route discovery is performed
   [Koodli01].  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 at each
   AODVv2 router.  Note that using different or no buffer methods does
   not affect interoperability.

   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 Route Message Table that corresponds to the
UH> s/Table/Set/

   generated RREP.  When CurrentTime exceeds RteMsg.Timestamp +
   RREQ_WAIT_TIME and no RREP has been received, RREQ_Gen will retry the
   route discovery.

   To reduce congestion in a network, repeated attempts at route
   discovery for a particular target address utilize a binary

Perkins, et al.         Expires October 22, 2016               [Page 25]

Internet-Draft                   AODVv2                       April 2016

   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 learned within the wait period, another RREQ is sent, up to a
   total of DISCOVERY_ATTEMPTS_MAX.  This is the same technique used in
   AODV [RFC3561].

   Through the use of bidirectional link monitoring and blacklists (see
   Section 6.2) uni-directional links on initial selected route will be
   ignored on subsequent route discovery attempts.

   Route discovery is considered to have failed after
   DISCOVERY_ATTEMPTS_MAX and the corresponding wait time for an RREP
   response to the final RREQ.  After the attempted route discovery has
   failed, RREQ_Gen waits 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) is delivered to the source of the packet, so that
   the application knows about the failure.

   If RREQ_Gen does receive a route message containing a route to
   TargAddr within the timeout, it processes the message according to
   Section 7.  When a valid 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.

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

6.7.  Processing Received Route Information

   All AODVv2 route messages contain a route.  A Route Request (RREQ)
   contains a route toward OrigAddr (and other addresses as indicated by
   OrigPrefixLen), and a Route Reply (RREP) contains a route toward
   TargAddr (and other addresses as indicated by TargPrefixLen).

UH> How does a RFC5444 message contain a route? It can contain one or
more addresses, and every address can be associated with one or more
TLVs. Some clarification would be helpful.

    All
   AODVv2 routers that receive a route message are able to store the
   route contained within it in their Local Route Set. Incoming
   information is first checked to verify that it is both safe to use
   and offers an improvement to existing information, as explained in
   Section 6.7.1.  If these checks pass, the Local Route Set MUST be
   updated according to Section 6.7.2.

   In the processes below, RteMsg is used to denote the route message,
   AdvRte is used to denote the route contained within it, and

Perkins, et al.         Expires October 22, 2016               [Page 26]

Internet-Draft                   AODVv2                       April 2016

   LocalRoute denotes an existing entry in the Local Route Set which
   matches AdvRte on address, prefix length, and metric type.

   AdvRte has the following properties:

   o  AdvRte.Address := network address given by combining
      RteMsg.OrigAddr and RteMsg.OrigPrefixLen (in RREQ) or
      RteMsg.TargAddr and RteMsg.TargPrefixLen (in RREP)

UH> How does this "combination" work? (in particular if the prefix
length is not included)

   o  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.OrigAddr (in RREQ) or RteMsg.TargAddr (in RREP)

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

   o  AdvRte.NextHop := RteMsg.IPSourceAddress (an address of the
      sending interface of the router from which the RteMsg was
      received)

   o  AdvRte.MetricType := RteMsg.MetricType

   o  AdvRte.Metric := RteMsg.Metric

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

   o  AdvRte.ValidityTime := RteMsg.ValidityTime, if included
UH> If not included, to what is the value set? null?

6.7.1.  Evaluating Route Information

   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:

   1.  Search for LocalRoutes in the Local Route Set matching AdvRte's
       address, prefix length and metric type

UH> By "matching", does it have to be exactly the same? What if the
route has the same address and metric type, but different prefix
length?

       *  If no matching LocalRoute exists, AdvRte MUST be used to
          update the Local Route Set and no further checks are required.
UH> "Update" how? (a forward reference to the appropriate section
could be helpful)

       *  If matching LocalRoutes are found, continue to Step 2.

Perkins, et al.         Expires October 22, 2016               [Page 27]

Internet-Draft                   AODVv2                       April 2016

   2.  Compare sequence numbers using the technique described in
       Section 4.4
UH> That section (4.4) doesn't handle comparison with wrap-around
(e.g., comparing sequence number 4 > 65,535)

       *  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.
UH> Definition of "more recent"? (e.g., "sequence number larger
than... using the comparison algorithm defined in section 4.4")

       *  If AdvRte is stale, AdvRte MUST NOT be used to update the
          Local Route Set. Ignore AdvRte for further processing.
UH> Definition of "stale"? ("sequence number lower than")

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

   3.  Check that AdvRte is safe against routing loops compared to all
       matching LocalRoutes (see Section 5)

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

       *  If LoopFree(AdvRte, LocalRoute) returns TRUE, continue to Step
          4.

   4.  Compare route costs

       *  If AdvRte is better than all matching LocalRoutes, it SHOULD
UH> Definition of "better"? ("cost(...) lower than ...")
          be used to update the Local Route Set because it offers
          improvement.  If it is not used to update the Local Route Set,
          the existing non-optimal LocalRoute will continue to be used,
          causing data traffic to use a non-optimal route.

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

       *  If AdvRte is worse
UH> Definition of "worse"? ("higher cost than...")
       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.

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

   If the advertised route is to be used to update the Local Route Set,
   the procedure in Section 6.7.2 MUST be followed.  If not, non-optimal
   routes will remain in the Local Route Set.

Perkins, et al.         Expires October 22, 2016               [Page 28]

Internet-Draft                   AODVv2                       April 2016

   For information on how to apply these changes to the Routing
   Information Base, see Section 4.5.

6.7.2.  Applying Route Updates

   After determining that AdvRte is to be used to update the Local Route
   Set (as described in Section 6.7.1), the following procedure applies.

   If AdvRte is learned from an RREQ message, the link to the next hop
   neighbor may not be confirmed as bidirectional (see Section 4.3).
   The route will offer improvement to the Local Route Set if the
   neighbor can be confirmed.  If there is no existing matching route,
   AdvRte allows a corresponding RREP to be sent.  If a matching entry
   already exists, AdvRte offers potential improvement.

   The route update is applied as follows:

   1.  If no existing entry in the Local Route Set matches AdvRte's
       address, prefix length and metric type, continue to Step 4 and
       create a new entry in the Local Route Set.

   2.  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.
UH> Can there be more than one unconfirmed route?

       *  If AdvRte.NextHop's Neighbor.State is Unknown, 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.

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

UH> What happens if Neighbor.State is Blacklisted? (can that happen?)

   3.  If only one matching LocalRoute exists in the Local Route Set:

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

       *  If AdvRte.NextHop's Neighbor.State is Unknown, AdvRte may
          offer improvement the existing LocalRoute, if the link to
          AdvRte.NextHop can be confirmed as bidirectional.

Perkins, et al.         Expires October 22, 2016               [Page 29]

Internet-Draft                   AODVv2                       April 2016

       *  If LocalRoute.State is Unconfirmed, AdvRte is an improvement
          to an existing Unconfirmed route.  Continue processing from
          Step 5 to update the existing LocalRoute.

       *  If LocalRoute.State is Invalid, AdvRte can replace the
          existing LocalRoute.  Continue processing from Step 5 to
          update the existing LocalRoute.

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

UH> Some rationale why a new entry is to be created what be helpful,
in particular because it's only a SHOULD.

   4.  Create an entry in the Local Route Set and initialize as follows:

       *  LocalRoute.Address := AdvRte.Address

       *  LocalRoute.PrefixLength := AdvRte.PrefixLength

       *  LocalRoute.MetricType := AdvRte.MetricType

   5.  Update the LocalRoute as follows:

       *  LocalRoute.SeqNum := AdvRte.SeqNum

       *  LocalRoute.NextHop := AdvRte.NextHop

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

       *  LocalRoute.Metric := AdvRte.Cost

       *  LocalRoute.LastUsed := CurrentTime

       *  LocalRoute.LastSeqNumUpdate := CurrentTime

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

   6.  If a new LocalRoute was created, or if the existing
       LocalRoute.State is Invalid or Unconfirmed, update LocalRoute as
       follows:

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

       *  LocalRoute.State := Idle (if the next hop's Neighbor.State is
          Confirmed)
UH> Can Neighbor.State be Blacklisted?

Perkins, et al.         Expires October 22, 2016               [Page 30]

Internet-Draft                   AODVv2                       April 2016

   7.  If an existing LocalRoute.State changed from Invalid or
       Unconfirmed to become Idle, any matching Unconfirmed LocalRoute
       with worse metric value SHOULD be expunged.

   8.  If an existing LocalRoute was updated with a better metric value,
       any matching Unconfirmed LocalRoute with worse metric value
       SHOULD be expunged.

   9.  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 SHOULD be cancelled.
UH> s/cancelled/canceled/
UH> Is there a list of all the timers? Which ones need to be canceled?
UH> Why SHOULD, not MUST? What happens if they are not canceled?

   If this update to the Local Route Set results in two LocalRoutes to
   the same address, the best LocalRoute will be Unconfirmed.
UH> Why is it that the best route is unconfirmed? Shouldn't it be the
worst route that is 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 Section 7.2.1).

6.8.  Suppressing Redundant Messages Using the Multicast Route Message
      Set

   When route messages are flooded in a MANET, an AODVv2 router may
   receive multiple similar messages.
UH> What do you mean by "similar"? Several instances of the same
message (as identified by the message sequence number)?

    Regenerating every one of these
   gives little additional benefit, and generates unnecessary signaling
   traffic and might generate unnecessary interference.

   Each AODVv2 router stores information about recently received route
   messages in the AODVv2 Multicast Route Message Set (Section 4.6).

   Entries in the Multicast Route Message Set 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.
UH> In the case of memory-constrained devices, is there a minimum
constraint to keep the entries, e.g., at least for x seconds? (or else
there is risk of flooding a message forever)?

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

   To determine if a received message is redundant:

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

       *  If there is no entry, the message is not redundant.

Perkins, et al.         Expires October 22, 2016               [Page 31]

Internet-Draft                   AODVv2                       April 2016

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

   2.  Compare sequence numbers using the technique described in
       Section 4.4
UH> That section does not describe the concepts of "older" and "newer"
sequence number (with respect to wrap-around), see comment in that
section.

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

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

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

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

   3.  Compare the metric values

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

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

   If the message is redundant, update the Timestamp and RemoveTime on
   the entry, since matching route messages are still traversing the
   network and this entry should be maintained.
UH> Updated how? Set it to the current timestamp?

    This message MUST NOT
   be regenerated or responded to.

   If the message is not redundant, create an entry or update the
   existing entry.

   To update a Multicast Route Message Set entry, set:

   o  RteMsg.MessageType := the message type of the received message

   o  RteMsg.OrigAddr := OrigAddr from the message

   o  RteMsg.OrigPrefixLen := the prefix length associated with OrigAddr
UH> Can this be unknown?

   o  RteMsg.TargAddr := TargAddr from the message

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

   o  RteMsg.OrigSeqNum := the sequence number associated with OrigAddr,
      if present in the received message
UH> Could be helpful to clarify in which cases the sequence number is
not present in the message (e.g., s/if present in the received
message/if RteMsg is an RREQ/

Perkins, et al.         Expires October 22, 2016               [Page 32]

Internet-Draft                   AODVv2                       April 2016

   o  RteMsg.TargSeqNum := the sequence number associated with TargAddr,
      if present in the received message
UH> Could be helpful to clarify in which cases the sequence number is
not present in the message (e.g., s/if present in the received
message/if RteMsg is an RREP/

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

   o  RteMsg.MetricType := the metric type associated with RteMsg.Metric

   o  RteMsg.Timestamp := CurrentTime

   o  RteMsg.RemoveTime := CurrentTime + MAX_SEQNUM_LIFETIME

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

6.9.  Suppressing Redundant Route Error Messages using the Route Error
      Set

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

   To determine if a received RERR is redundant:

   1.  Search for an entry in the Route Error Set where:

       *  RerrMsg.AddressList == RERR.AddressList

       *  RerrMsg.PktSource == RERR.PktSource

       If a matching entry is found, no further processing is required
       and the RERR SHOULD NOT be sent.

   2.  If no matching entry is found, a new entry with the following
       properties is created:

       *  RerrMsg.Timeout := CurrentTime + RERR_TIMEOUT

       *  RerrMsg.AddressList == RERR.AddressList

Perkins, et al.         Expires October 22, 2016               [Page 33]

Internet-Draft                   AODVv2                       April 2016

       *  RerrMsg.PktSource == RERR.PktSource

6.10.  Local Route Set Maintenance

   Route maintenance involves monitoring LocalRoutes in the Local Route
   Set, updating LocalRoute.State to handle route timeouts and reporting
   routes that become Invalid.

6.10.1.  LocalRoute State Changes

   During normal operation, AODVv2 does not require any explicit
   timeouts to manage the lifetime of a route.  At any time, any
   LocalRoute MAY be examined and updated according to the rules below.
UH> As implementer, that guidance is not easy to follow, "At any time,
any LocalRoute MAY be examined and updated".  Does it mean I should
implement a thread that repeatedly (e.g., every 10 secods) examines
and updates the routes? Or should I rather listen for certain events?
And why MAY and not SHOULD/MUST?

   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.

UH> What does "LocalRoute.State MUST be checked" mean? (checked how?)

   Route timeout behaviour is as follows:

   o  An Unconfirmed route MUST be expunged at MAX_SEQNUM_LIFETIME after
      LocalRoute.LastSeqNumUpdate.

   o  An Idle route MUST become Active when used to forward an IP
      packet.  If the route is not used to forward an IP packet within
      MAX_IDLETIME, LocalRoute.State MUST become Invalid.

   o  An Active route which is a timed route (i.e., with
      LocalRoute.ExpirationTime not equal to INFINITY_TIME) remains
      Active until LocalRoute.ExpirationTime, after which it MUST become
      Invalid.  If it it not a timed route, it MUST become Idle if the
      route is not used to forward an IP packet within ACTIVE_INTERVAL.

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

   o  In all cases, if the time since LocalRoute.LastSeqNumUpdate
      exceeds MAX_SEQNUM_LIFETIME, LocalRoute.SeqNum must be set to
      zero.  This is required to ensure that any AODVv2 routers
      following the initialization procedure can safely begin routing
      functions using a new sequence number.  A LocalRoute with
      LocalRoute.State set to Active or Idle can remain in the Local
      Route Set after removing the sequence number,
UH> By "removing the sequence number", do you mean set it to 0?

       for exmple 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.
UH> What do you mean by "later becomes Invalid"? Do we need another
monitor for later changes?

   LocalRoutes can become Invalid before a timeout occurs:

Perkins, et al.         Expires October 22, 2016               [Page 34]

Internet-Draft                   AODVv2                       April 2016

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

   o  LocalRoute.State MUST immediately be set to Invalid if a Route
      Error (RERR) message is received where:

      *  The sender is LocalRoute.NextHop or PktSource is a Router
         Client address

      *  There is an Address in AddressList which matches
         LocalRoute.Address, and:
UH> What if an extension adds an address to the RFC5444 address block
(associated with any TLV specified in that extension)? That address
should not be considered here. "AddressList" is not clearly defined,
IMO. Should this address be associated with a specific TLV in order to
be considered for this rule?

         +  The prefix length associated with this Address, if any,
            matches LocalRoute.PrefixLength

         +  The sequence number associated with this Address, if any, is
            newer or equal to LocalRoute.SeqNum (see Section 4.4)
UH> I am not sure how there can be addresses without sequence number.

         +  The metric type associated with this Address matches
            LocalRoute.MetricType

   LocalRoutes are also updated when Neighbor.State is updated:

   o  While the value of Neighbor.State is set to Unknown, any routes in
      the Local Route Set using that neighbor as a next hop MUST have
      LocalRoute.State set to Unconfirmed.

   o  When the value of Neighbor.State is set to Confirmed, the
      Unconfirmed routes in the Local Route Set using that neighbor as a
      next hop MUST have LocalRoute.State set to Idle.  Any other
      matching LocalRoutes with metric values worse than
      LocalRoute.Metric MUST be expunged from the Local Route Set.

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

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

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

   o  An Active route MUST NOT be expunged, as it is in use.  If
      deleted, IP traffic forwarded to this router will prompt

Perkins, et al.         Expires October 22, 2016               [Page 35]

Internet-Draft                   AODVv2                       April 2016

      generation of a Route Error message, and it will be necessary for
      a Route Request to be generated by the originator's router to re-
      establish the route.

   o  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 generated to re-establish
      the route.

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

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

UH> There are quite a few rules in this section. Have you created a
state diagram to make sure that these rules are not conflicting? Or
have you confirmed this in an interop test? I would have a hard time
as implementer to get this right.

6.10.2.  Reporting Invalid Routes

   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.

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

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

   The packet or message triggering the RERR MUST be discarded.

   Generation of an RERR message is described in Section 7.4.1.

7.  AODVv2 Protocol Messages

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

   Each AODVv2 message is defined as a set of data.  Rules for the
   generation, reception and regeneration of each message type are
   described in the following sections.  Section 8 discusses how the

Perkins, et al.         Expires October 22, 2016               [Page 36]

Internet-Draft                   AODVv2                       April 2016

   data is mapped to [RFC5444] Message TLVs, Address Blocks, and Address
   TLVs.

7.1.  Route Request (RREQ) Message

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

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

                      Figure 1: RREQ message contents

   AddressList
      Contains OrigAddr and TargAddr, the source and destination
      addresses of the IP packet for which a route is requested.
      OrigAddr and TargAddr MUST be routable unicast addresses.
UH> So it's not possible to discover a prefix, e.g., 0.0.0.0/0? This
should be pointed out in the applicability section IMO.

   PrefixLengthList
      Contains OrigPrefixLen, i.e., the length, in bits, of the prefix
      associated with the Router Client entry which includes OrigAddr.
      If omitted, the prefix length is equal to OrigAddr's address
      length in bits.

   OrigSeqNum
      The sequence number associated with OrigAddr.

   TargSeqNum
      A sequence number associated with an existing Invalid route to
      TargAddr.  This MAY be included if available.
UH> Why MAY and not SHOULD/MUST? In which cases would it not be available?

   MetricType
      The metric type associated with OrigMetric.

   OrigMetric

Perkins, et al.         Expires October 22, 2016               [Page 37]

Internet-Draft                   AODVv2                       April 2016

      The metric value associated with the LocalRoute to OrigAddr (and
      to any other addresses included in the given prefix length), as
      seen from the sender of the message.

   ValidityTime
      The length of time that the message sender is willing to offer a
      route toward OrigAddr (and any other addresses included in the
      given prefix length).  Omitted if no time limit is imposed.

7.1.1.  RREQ Generation

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

   Before creating an RREQ, the router SHOULD check the Multicast Route
   Message Set to see if an RREQ has recently been sent for the
   requested destination.  If so, and the wait time for a reply has not
   yet been reached, the router SHOULD continue to await a response
   without generating a new RREQ.  If the timeout has been reached, a
   new RREQ MAY be generated.  If buffering is configured, incoming IP
   packets awaiting this route SHOULD be buffered until the route
   discovery is completed.

   If the limit for the rate of AODVv2 control message generation has
   been reached, no message SHOULD be generated.
UH> In that case, will the route request ever be sent? Couldn't this
be an attack vector for a malicous router? (an application triggering
generation of many AODVv2 control messages, and once the limit has
been reached, other no control messages for other "legitimiate"
applicatinos would be generated)

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

   1.  Set AddressList := {OrigAddr, TargAddr}
UH> How is OrigAddr set in case of multiple interfaces / multiple addresses?

   2.  For the PrefixLengthList:

       *  If OrigAddr is part of an address range configured as a Router
          Client, set PrefixLengthList := {RouterClient.PrefixLength,
          null}. This allows receiving routers to learn a route to all
          the addresses included by the prefix length, not only to
          OrigAddr.

       *  Otherwise, omit PrefixLengthList.

   3.  For OrigSeqNum:

       *  Increment the router SeqNum as specified in Section 4.4.
UH> SeqNum is not mentioned in section 4.4.

       *  Set OrigSeqNum := SeqNum.

Perkins, et al.         Expires October 22, 2016               [Page 38]

Internet-Draft                   AODVv2                       April 2016

   4.  For TargSeqNum:

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

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

   5.  Include MetricType and set the type accordingly
UH> According to what?

   6.  Set OrigMetric := RouterClient.Cost for the Router Client entry
       which includes OrigAddr
UH> s/which/that/
UH> How is that defined, "which includes OrigAddr"?

   7.  Include ValidityTime if advertising that the route to OrigAddr
       (and any other addresses included in the given prefix length) via
       this router is offered for a limited time, and set ValidityTime
       accordingly
UH> Is ValidityTime a parameter that can be set on the router? How
would the implementer know what to set this to? Some guidance would be
helpful.

   This AODVv2 message is used to create a corresponding [RFC5444]
   message (see Section 8) which is handed to the 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.

7.1.2.  RREQ Reception

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

   1.  Check and update the Neighbor Set according to Section 6.3

       *  If the sender has Neighbor.State set to Blacklisted, ignore
          this RREQ for further processing.

   2.  Verify that the message contains the required data: OrigAddr,
       TargAddr, OrigSeqNum, and OrigMetric, and that OrigAddr and
       TargAddr are valid addresses (routable and unicast)

       *  If not, ignore this RREQ for further processing.

   3.  Check that the MetricType is supported and configured for use
UH> Where is that configured? (forward reference to section 10.5 would
be helpful)

       *  If not, ignore this RREQ for further processing.

Perkins, et al.         Expires October 22, 2016               [Page 39]

Internet-Draft                   AODVv2                       April 2016

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

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

   5.  Process the route to OrigAddr (and any other addresses included
       in the given prefix length) as specified in Section 6.7

   6.  Check if the information in the message is redundant by comparing
       to entries in the Multicast Route Message Set, following the
       procedure in Section 6.8

       *  If redundant, ignore this RREQ for further processing.

       *  If not redundant, continue processing.
UH> Shouldn't step number 6 instead be step number 1? Otherwise, it
could be possible to process the same message multiple times.

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

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

       *  If not, continue to RREQ regeneration.

7.1.3.  RREQ Regeneration

   By regenerating an RREQ, a router advertises that it will forward IP
   packets to the OrigAddr contained in the RREQ (and to other addresses
   included in the given prefix length) according to the information
   enclosed.  The router MAY choose not to regenerate 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.

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

   The procedure for RREQ regeneration is as follows:

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

   2.  Set OrigMetric := LocalRoute[OrigAddr].Metric

   3.  If the received RREQ contains a ValidityTime, or if the
       regenerating router wishes to limit the time that it offers a
       route to OrigAddr (and any other addresses included in the given
       prefix length), the regenerated RREQ MUST include ValidityTime
UH> That makes end-to-end integrity protection of the message very difficult.

Perkins, et al.         Expires October 22, 2016               [Page 40]

Internet-Draft                   AODVv2                       April 2016

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

   This AODVv2 message is used to create a corresponding [RFC5444]
   message (see Section 8) which is handed to the 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.  However, the regenerated RREQ can
   be unicast to the next hop address of the LocalRoute toward TargAddr,
   if known.

7.2.  Route Reply (RREP) Message

   When a Route Request message is received, requesting a route to a
   target address (TargAddr) which is configured as part of a Router
   Client entry, a Route Reply message is sent in response.  The RREP
   offers a route to TargAddr (and any other addresses included in the
   prefix length).

   RREP messages have the following contents:

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

                      Figure 2: RREP message contents

   AckReq
      The address of the intended next hop of the RREP.  This is
      included when the link to the next hop toward OrigAddr is not
      known to be bidirectional.  It indicates that an acknowledgement
      of the RREP is requested by the sender from the intended next hop
      (see Section 6.2).

   AddressList

Perkins, et al.         Expires October 22, 2016               [Page 41]

Internet-Draft                   AODVv2                       April 2016

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

   PrefixLengthList
      Contains TargPrefixLen, i.e., the length, in bits, of the prefix
      associated with the Router Client entry which includes TargAddr.
      If omitted, the prefix length is equal to TargAddr's address
      length, in bits.

   TargSeqNum
      The sequence number associated with TargAddr.

   MetricType
      The metric type associated with TargMetric.

   TargMetric
      The metric value associated with the LocalRoute to TargAddr (and
      any other addresses included in the given prefix length), as seen
      from the sender of the message.

   ValidityTime
      The length of time that the message sender is willing to offer a
      route toward TargAddr (and any other addresses included in the
      given prefix length).  Omitted if no time limit is imposed.

7.2.1.  RREP Generation

   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.TargAddr matches an address which is configured as a Router
   Client of the AODVv2 router.

   Before creating an RREP, the router SHOULD check if the corresponding
   RREQ is redundant, i.e., a Route Reply has already been generated in
   response to the RREQ, or if the limit for the rate of AODVv2 control
   message generation has been reached.  If so, the RREP SHOULD NOT be
   created.

   The RREP will follow the path of the route to OrigAddr.  If the best
   route to OrigAddr in the Local Route Set is Unconfirmed, the link to
   the next hop neighbor is not yet confirmed as bidirectional (as
   described in Section 6.2).  In this case the RREP MUST include AckReq
   set to the intended next hop address.  The AckReq indicates that an
   acknowledgement to the RREP is requested from the intended next hop
   router in the form of a Route Reply Acknowledgement (RREP_Ack).  If
   the best route to OrigAddr in the Local Route Set is valid, the link

Perkins, et al.         Expires October 22, 2016               [Page 42]

Internet-Draft                   AODVv2                       April 2016

   to the next hop neighbor is already confirmed as bidirectional, and
   the AckReq can be omitted.

   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 Section 6.6 for RREQ retries.  The acknowledgement MUST be
   considered to have failed after the wait time for an RREP_Ack
   response to the final RREP.
UH> What happens when it's considered failed?

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

   1.  If the link to the next hop router toward OrigAddr is not known
       to be bidirectional, include the AckReq with the address of the
       intended next hop router (see Section 8.2.3)

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

   3.  For the PrefixLengthList:

       *  If TargAddr is part of an address range configured as a Router
          Client, set PrefixLengthList := {null,
          RouterClient.PrefixLength}. This allows receiving routers to
          learn a route to all the addresses included by the prefix
          length, not only to TargAddr.

       *  Otherwise, omit PrefixLengthList.

   4.  For the TargSeqNum:

       *  Increment the router SeqNum as specified in Section 4.4.

       *  Set TargSeqNum := SeqNum.

   5.  Include MetricType and set the type to match the MetricType in
       the received RREQ message

   6.  Set TargMetric := RouterClient.Cost for the Router Client entry
       which includes TargAddr

   7.  Include ValidityTime if advertising that the route to TargAddr
       (and any other addresses included in the given prefix length) via
       this router is offered for a limited time, and set ValidityTime
       accordingly

Perkins, et al.         Expires October 22, 2016               [Page 43]

Internet-Draft                   AODVv2                       April 2016

   This AODVv2 message is used to create a corresponding [RFC5444]
   message (see Section 8) which is handed to the RFC5444 multiplexer
   for further processing.  If the Neighbor Set contains an entry for
   the neighbor stored as LocalRoute[OrigAddr].NextHop, with
   Neighbor.State set to Confirmed, the multiplexer is instructed to
   unicast the RREP to LocalRoute[OrigAddr].NextHop.  Otherwise, it
   multicasts the RREP to LL-MANET-Routers.  The RREP MUST be sent over
   the same interface on which the RREQ that triggered it was received.

7.2.2.  RREP Reception

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

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

        *  If not, ignore this RREP for further processing.

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

        *  If not, ignore this RREP for further processing.

   3.   If this RREP does not correspond to a RREQ generated or
        regenerated in the last RREQ_WAIT_TIME, ignore for further
        processing.
UH> Can you expand what you mean by "does not correspond"?

   4.   Update the Neighbor Set according to Section 6.3

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

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

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

        *  If there is an entry in the Router Client Set where
           RouterClient.IPAddress matches the address associated with
           the AckReq (see Section 8.2.3), the receiving router is the
           intended recipient.  Send an acknowledgement as specified in
           Section 7.3 and continue processing.

        *  Otherwise, ignore this RREP for further processing.

Perkins, et al.         Expires October 22, 2016               [Page 44]

Internet-Draft                   AODVv2                       April 2016

   7.   Process the route to TargAddr (and any other addresses included
        in the given prefix length) as specified in Section 6.7

   8.   Check if the message is redundant by comparing to entries in the
        Multicast Route Message Set (Section 6.8)
UH> Shouldn't step number 8 instead be step number 1? Otherwise, it
could be possible to process the same message multiple times.

        *  If redundant, ignore this RREP for further processing.

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

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

        *  If so, no further processing is necessary.

        *  If not, continue to Step 10.

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

        *  If so, continue to RREP regeneration.

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

7.2.3.  RREP Regeneration

   A received Route Reply message is regenerated toward OrigAddr.  By
   regenerating a RREP, a router advertises that it will forward IP
   packets to TargAddr.

   The RREP SHOULD NOT be regenerated if CONTROL_TRAFFIC_LIMIT has been
   reached.  Otherwise, the router MUST regenerate the RREP.

   The procedure for RREP regeneration is as follows:

   1.  If the link to the next hop router toward OrigAddr is not known
       to be bidirectional, include the AckReq with the address of the
       intended next hop router

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

   3.  Set TargMetric := LocalRoute[TargAddr].Metric

Perkins, et al.         Expires October 22, 2016               [Page 45]

Internet-Draft                   AODVv2                       April 2016

   4.  If the received RREP contains a ValidityTime, or if the
       regenerating router wishes to limit the time that it will offer a
       route to TargAddr (and any other addresses included in the given
       prefix length), the regenerated RREP MUST include ValidityTime

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

   This AODVv2 message is used to create a corresponding [RFC5444]
   message (see Section 8) which is handed to the RFC5444 multiplexer
   for further processing.  If the Neighbor Set contains an entry for
   the neighbor stored as LocalRoute[OrigAddr].NextHop, with
   Neighbor.State set to Confirmed, the multiplexer is instructed to
   unicast the RREP to LocalRoute[OrigAddr].NextHop.  Otherwise, it
   multicasts the RREP to LL-MANET-Routers.  The RREP MUST be sent over
   LocalRoute[OrigAddr].NextHopInterface.

7.3.  Route Reply Acknowledgement (RREP_Ack) Message

   The Route Reply Acknowledgement is a response to a Route Reply
   message.  When the RREP_Ack message is received by the sender of the
   RREP, it confirms that the link between the two routers is
   bidirectional (see Section 6.2).  The RREP_Ack has no further data.

7.3.1.  RREP_Ack Generation

   An RREP_Ack MUST be generated if a received Route Reply includes an
   AckReq with an address matching one of the receiving router's IP
   addresses.

   The RREP_Ack SHOULD NOT be generated if the limit for the
   rate of AODVv2 control message generation has been reached.

   There is no further data in an RREP_Ack.  The [RFC5444]
   representation is discussed in Section 8.  The RREP_Ack is unicast,
   by default, to the source IP address of the RREP message that
   requested it.  It MUST be sent over the same interface on which the
   RREP that triggered it was received.

7.3.2.  RREP_Ack Reception

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

   1.  Check if the RREP_Ack was expected:

       *  Check if the Multicast Route Message Set contains an entry
          where:

Perkins, et al.         Expires October 22, 2016               [Page 46]

Internet-Draft                   AODVv2                       April 2016

          +  RteMsg.MessageType == RREP

          +  RteMsg.AckReqAddr matches the source IP address of the
             RREP_Ack

          +  RteMsg.Timestamp > CurrentTime - RREP_Ack_SENT_TIMEOUT

          +  RteMsg.Interface matches the interface on which the
             RREP_Ack was received

       *  If it does, the router cancels any associated timeouts and
          processing continues to Step 2.
UH> Which timeouts can that be?

       *  Otherwise no actions are required and processing ends.

   2.  Update the Neighbor Set according to Section 6.3

7.4.  Route Error (RERR) Message

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

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

                      Figure 3: RERR message contents

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

   AddressList
      The addresses of the routes not available through RERR_Gen.

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

Perkins, et al.         Expires October 22, 2016               [Page 47]

Internet-Draft                   AODVv2                       April 2016

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

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

7.4.1.  RERR Generation

   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:

   o  When an IP packet that has been forwarded from another router, but
      cannot be forwarded further because 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.

   o  When an RREP message cannot be regenerated because the LocalRoute
      to OrigAddr has been lost or is Invalid, RREP_Gen needs to be
      informed that the route to OrigAddr does not exist.  The RERR
      generated MUST include PktSource set to the TargAddr of the RREP,
      and MUST contain only one unreachable address in the AddressList,
      the OrigAddr 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.

   o  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, PrefixLengthList, SeqNumList, and
      MetricTypeList will contain entries for each LocalRoute which has
      become Invalid.  An RERR message is only sent if an Active
      LocalRoute becomes Invalid, though an AODVv2 router can also
      include Idle LocalRoutes that become Invalid if the configuration
      parameter ENABLE_IDLE_IN_RERR is set (see Section 10.3).

Perkins, et al.         Expires October 22, 2016               [Page 48]

Internet-Draft                   AODVv2                       April 2016

   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 Section 6.9.

   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.
UH> What do you mean by "ICMP error packet"? Which code? Also, what is
the timing sequence? The ICMP destination unavailable could be
received before it is triggered to send the RERR.

   To generate the RERR, the router follows this procedure:

   1.  If necessary, include PktSource and set the value as given above

   2.  For each LocalRoute that needs to be reported:

       *  Insert LocalRoute.Address into the AddressList.

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

       *  Insert LocalRoute.SeqNum into SeqNumList, if known.

       *  Insert LocalRoute.MetricType into MetricTypeList.

   The AODVv2 message is used to create a corresponding [RFC5444]
   message (see Section 8).
UH> So does it mean there are two messages, one "AODVv2 message", one
"corresponding [RFC5444] message"?

   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.
UH> If the next hop on the route to PktSource is not available, would
this trigger a new RREQ?

7.4.2.  RERR Reception

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

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

       *  If not, ignore this RERR for further processing.

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

Perkins, et al.         Expires October 22, 2016               [Page 49]

Internet-Draft                   AODVv2                       April 2016

       *  The address is valid (routable and unicast)

       *  The MetricType is supported and configured for use

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

       *  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

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

       If any of the above are false the address does not match a
       LocalRoute and MUST NOT be processed or regenerated in a RERR.

       If all of the above are true, the LocalRoute which matches the
       address is no longer valid.  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:

       *  If the LocalRoute's prefix length is the same as the
          unreachable address' prefix length, set LocalRoute.State to
          Invalid.

       *  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.
UH> What's a "sub-route"? That is not a known terminology, nor is it
defined in the terminology section.

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

       *  Update the sequence number on the existing LocalRoute, if the
          reported sequence number is determined to be newer using the
          comparison technique described in Section 4.4.

   3.  If there are previously Active LocalRoutes that MUST be reported,
       as identified in step 2.:

       *  Regenerate the RERR as detailed in Section 7.4.3.

Perkins, et al.         Expires October 22, 2016               [Page 50]

Internet-Draft                   AODVv2                       April 2016

7.4.3.  RERR Regeneration

   The Route Error message SHOULD NOT be regenerated if
   CONTROL_TRAFFIC_LIMIT has been reached.

   The procedure for RERR regeneration is as follows:

   1.  If PktSource was included in the original RERR, and PktSource is
       not a Router Client, copy it into the regenerated RERR

   2.  For each LocalRoute that needs to be reported as identified in
       Section 7.4.1:

       *  Insert LocalRoute.Address into the AddressList.

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

       *  Insert LocalRoute.SeqNum into SeqNumList, if known.

       *  Insert LocalRoute.MetricType into MetricTypeList.
UH> Changing the message along its path makes end-to-end integrity
protection impossible.

   The AODVv2 message is used to create a corresponding [RFC5444]
   message (see Section 8).  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.
UH> Is there any prevention to flood multicast RERRs forever in the
network (similar to the process you described for RREQs/RREPs)? i.e.,
storing a set of sequence numbers of recently seen RERRs (BTW, do
RERRs contain a sequence number?)

8.  RFC 5444 Representation

   AODVv2 specifies that all control messages between routers MUST use
   the Generalized Mobile Ad Hoc Network Packet/Message Format
   [RFC5444], and therefore AODVv2's route messages comprise data which
   is mapped to message elements in [RFC5444].

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

   A brief summary of the [RFC5444] format:

   1.  A packet contains zero or more messages

Perkins, et al.         Expires October 22, 2016               [Page 51]

Internet-Draft                   AODVv2                       April 2016

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

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

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

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

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

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

   The addresses in an Address Block MAY appear in any order, and values
   in a TLV in the Address Block TLV Block must be associated with the
   correct address in the Address Block by the [RFC5444] implementation.
   To indicate which value is associated with each address, the AODVv2
   message representation uses lists where the order of the addresses in
   the AODVv2 AddressList matches the order of values in other data
   lists, e.g., the order of SeqNums in the SeqNumList in an RERR.
   [RFC5444] maps this information to Address Block TLVs associated with
   the relevant addresses in the Address Block.

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

   The following sections show how AODVv2 data is represented in
   [RFC5444] messages.  AODVv2 makes use of the VALIDITY_TIME Address
   Block TLV from [RFC5497], and defines (in Section 11) a number of new
   TLVs.  To calculate the time-value for the VALIDITY_TIME Address
   Block TLV, the value of C is defined in Section 10.2.

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

Perkins, et al.         Expires October 22, 2016               [Page 52]

Internet-Draft                   AODVv2                       April 2016

8.1.  Route Request Message Representation

8.1.1.  Message Header

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

UH> What does this mean? Can you add some text here? Are there any
other headers defined? (such as <msg-orig-addr>,
 <msg-hop-limit>, <msg-hop-count>, <msg-seq-num>)

8.1.2.  Message TLV Block

   AODVv2 does not define any Message TLVs for an RREQ message.

UH> What about OrigAddr / TargetAddr?

8.1.3.  Address Block

   An RREQ contains two addresses, OrigAddr and TargAddr, and each
UH> If an extension to this specification is used, it could contain
more than two addresses.
   address has an associated prefix length.  If the prefix length has
   not been included in the AODVv2 message, it is equal to the address
   length in bits.

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

UH> The notation "<address> + <prefix-length>" is not quite intuitive.
And what does the "Data" column in this table mean, and how does it
correlate to the "Address Block" column?

8.1.4.  Address Block TLV Block

   Address Block TLVs are always associated with one or more addresses
   in the Address Block.  The following sections show the TLVs that
   apply to each address.
UH> Not to each address: an extension to this protocol could add
addresses, and they wouldn't be associated with any of these TLVs.

8.1.4.1.  Address Block TLVs for OrigAddr

Perkins, et al.         Expires October 22, 2016               [Page 53]

Internet-Draft                   AODVv2                       April 2016

   +--------------+---------------+------------+-----------------------+
   | Data         | TLV Type      | Extension  | Value                 |
   |              |               | Type       |                       |
   +--------------+---------------+------------+-----------------------+
   | None         | ADDRESS_TYPE  | 0          | ADDRTYPE_ORIGADDR     |
UH> How is ADDRTYPE_ORIGADDR defined? I don't see any request for IANA
to allocate a number for it (only for ORIGADDR)

   | OrigSeqNum   | SEQ_NUM       | 0          | Sequence number of    |
   |              |               |            | RREQ_Gen, the router  |
   |              |               |            | which initiated route |
   |              |               |            | discovery.            |
UH> Why not use <msg-seq-num> of the RFC5444 message in combination
with <msg-orig-addr> instead of adding the originator address into an
address block and using a new TLV? This would safe bits

   | OrigMetric   | PATH_METRIC   | MetricType | Metric value for the  |
   | /MetricType  |               |            | route to OrigAddr,    |
   |              |               |            | using MetricType.     |
   | ValidityTime | VALIDITY_TIME | 0          | ValidityTime for      |
   |              |               |            | route to OrigAddr,    |
   |              |               |            | represented as        |
   |              |               |            | detailed in           |
   |              |               |            | [RFC5497].            |
   +--------------+---------------+------------+-----------------------+

UH> Do I need to associate all addresses with all of these TLVs? Or
only some of them? Which ones are mandatory to associate with the
address? What does the "Data" column mean, and why "None" for the
first row?

8.1.4.2.  Address Block TLVs for TargAddr

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

8.2.  Route Reply Message Representation

8.2.1.  Message Header

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

8.2.2.  Message TLV Block

   AODVv2 does not define any Message TLVs for an RREP message.

Perkins, et al.         Expires October 22, 2016               [Page 54]

Internet-Draft                   AODVv2                       April 2016

8.2.3.  Address Block

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

   It MAY also contain the address of the intended next hop, in order to
   request acknowledgement to confirm bidirectionality of the link, as
   described in Section 6.2.
UH> Which TLV type is associated with the next hop in that case?

    The prefix length associated with this
   address is equal to the address length in bits.

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

8.2.4.  Address Block TLV Block

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

8.2.4.1.  Address Block TLVs for OrigAddr

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

8.2.4.2.  Address Block TLVs for TargAddr

Perkins, et al.         Expires October 22, 2016               [Page 55]

Internet-Draft                   AODVv2                       April 2016

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

8.2.4.3.  Address Block TLVs for AckReq Intended Recipient Address

      +-------+---------------+-----------------+------------------+
      | Data  | TLV Type      | Extension Type  | Value            |
      +-------+---------------+-----------------+------------------+
      | None  | ADDRESS_TYPE  | 0               | ADDRTYPE_INTEND  |
UH> Where is ADDRTYPE_INTEND defined? I couldn't find it anywhere else
in the draft.
      +-------+---------------+-----------------+------------------+

8.3.  Route Reply Acknowledgement Message Representation

8.3.1.  Message Header

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

8.3.2.  Message TLV Block

   AODVv2 does not define any Message TLVs for an RREP_ack message.

8.3.3.  Address Block

   AODVv2 does not define an Address Block for an RREP_Ack message.
UH> Is it RREP_Ack or RREP_ack? (as in section 8.3.2).

Perkins, et al.         Expires October 22, 2016               [Page 56]

Internet-Draft                   AODVv2                       April 2016

8.3.4.  Address Block TLV Block

   AODVv2 does not define any Address Block TLVs for an RREP_Ack
   message.

8.4.  Route Error Message Representation

   Route Error Messages MAY be split into multiple [RFC5444] messages
   when the desired contents would exceed the MTU.

UH> Are there any special considerations how to split it into multiple RERRs?
UH> This is the only place in the document I can find something about
MTU. Are no other messages (and grouping of messages into packets)
affected by 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 [RFC5444] messages.

8.4.1.  Message Header

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

8.4.2.  Message TLV Block

   AODVv2 does not define any Message TLVs for an RERR message.

8.4.3.  Address Block

   The Address Block in an RERR MAY contain PktSource, the source
UH> "The Address Block" -- there can always be multiple address blocks
in a message

   address of the IP packet triggering RERR generation, as detailed in
   Section 7.4.  The prefix length associated with PktSource is equal to
   the address length in bits.

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

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

Perkins, et al.         Expires October 22, 2016               [Page 57]

Internet-Draft                   AODVv2                       April 2016

8.4.4.  Address Block TLV Block

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

8.4.4.1.  Address Block TLVs for PktSource

   +------------+---------------+----------------+---------------------+
   | Data       | TLV Type      | Extension Type | Value               |
   +------------+---------------+----------------+---------------------+
   | PktSource  | ADDRESS_TYPE  | 0              | ADDRTYPE_PKTSOURCE  |
UH> Where is ADDRTYPE_PKTSOURCE defined? (I don't find the term
anywhere else in the draft)
   +------------+---------------+----------------+---------------------+

8.4.4.2.  Address Block TLVs for Unreachable Addresses

   +----------------+--------------+------------+----------------------+
   | Data           | TLV Type     | Extension  | Value                |
   |                |              | Type       |                      |
   +----------------+--------------+------------+----------------------+
   | None           | ADDRESS_TYPE | 0          | ADDRTYPE_UNREACHABLE |
UH> Where is ADDRTYPE_UNREACHABLE defined?
   | SeqNumList     | SEQ_NUM      | 0          | Sequence number      |
   |                |              |            | associated with      |
   |                |              |            | invalid route to the |
   |                |              |            | unreachable address. |
   | MetricTypeList | PATH_METRIC  | MetricType | None. Extension Type |
   |                |              |            | set to MetricType of |
   |                |              |            | the route to the     |
   |                |              |            | unreachable address. |
   +----------------+--------------+------------+----------------------+

9.  Simple External Network Attachment

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

   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 Figure 4).  This AODVv2 network and
   networks attached to routers within it will be advertised to the
   external network using procedures which are out of scope for this
   specification.

Perkins, et al.         Expires October 22, 2016               [Page 58]

Internet-Draft                   AODVv2                       April 2016

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

           Figure 4: Simple External Network Attachment Example

   When an AODVv2 router within the AODVv2 MANET wants to discover a
   route toward an address on the external network, it uses the normal
   AODVv2 route discovery for that IP Destination Address.  The ENAR
   MUST respond to RREQ on behalf of all external network destinations,
   e.g., destinations not on the configured 191.0.2.0/24 network.  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 Section 7.  Note that AODvv2 does not support
   RREQs for prefixes that do not equal address length.

   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.

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

10.  Configuration

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

   o  Timers

   o  Protocol constants

Perkins, et al.         Expires October 22, 2016               [Page 59]

Internet-Draft                   AODVv2                       April 2016

   o  Administrative parameters and controls

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

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

10.1.  Timers

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

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

                     Table 2: Timing Parameter Values

   The above timing parameter values have worked well for small and
   medium well-connected networks with moderate topology changes.  The
   timing parameters SHOULD be administratively configurable.  Ideally,
   for networks with frequent topology changes the AODVv2 parameters
   SHOULD be adjusted using experimentally determined values or dynamic
   adaptation.
UH> Are there any constraints for these parameters (such as in
OLSRv2), like minimum values, maximum values, and constraints when
changing the values during run-time?

    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:

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

Perkins, et al.         Expires October 22, 2016               [Page 60]

Internet-Draft                   AODVv2                       April 2016

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

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

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

   o  Routers with lower values for RteMsg_ENTRY_TIME may not consider
      received redundant multicast route messages as redundant, and may
      regenerate these messages unnecessarily.

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

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

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

Perkins, et al.         Expires October 22, 2016               [Page 61]

Internet-Draft                   AODVv2                       April 2016

   MAX_SEQNUM_LIFETIME MUST be configured to have the same values for
   all AODVv2 routers in the network.

10.2.  Protocol Constants

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

   +------------------------+---------+--------------------------------+
   | Name                   | Default | Description                    |
   +------------------------+---------+--------------------------------+
   | DISCOVERY_ATTEMPTS_MAX | 3       | Section 6.6                    |
   | RREP_RETRIES           | 2       | Section 7.2.1                  |
   | MAX_METRIC[MetricType] | [TBD]   | Section 5                      |
   | MAX_METRIC[HopCount]   | 255     | Section 5 and Section 7        |
   | INFINITY_TIME          | [TBD]   | Maximum expressible clock time |
   |                        |         | (Section 6.7.2)                |
   | C                      | 1/1024  | Constant used in validity time |
   |                        |         | calculation [RFC5497]          |
   +------------------------+---------+--------------------------------+

UH> Does IANA associate the values for TBD? Is it instructed to do so?
This table is not in an IANA section.

                         Table 3: AODVv2 Constants

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

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

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

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

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

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

Perkins, et al.         Expires October 22, 2016               [Page 62]

Internet-Draft                   AODVv2                       April 2016

   o  C: Routers with lower values will invalidate timed routes before
      routers with higher values, which will cause Route Error messages
      to be generated and the route will effectively take on the shorter
      validity time.

10.3.  Local Settings

   The following table lists AODVv2 parameters which SHOULD be
   administratively configured for each router:
UH> What happens if they are not? (since it's not a MUST)

    +------------------------+------------------------+--------------+
    | Name                   | Default Value          | Description  |
    +------------------------+------------------------+--------------+
    | InterfaceSet           |                        | Section 4.1  |
    | BUFFER_SIZE_PACKETS    | 2                      | Section 6.6  |
    | BUFFER_SIZE_BYTES      | MAX_PACKET_SIZE [TBD]  | Section 6.6  |
    | CONTROL_TRAFFIC_LIMIT  | [TBD - 50 pkts/sec?]   | Section 7    |
    +------------------------+------------------------+--------------+
UH> Why is InterfaceSet listed here? But not the other Sets?
UH> What are the TBD values? Are they assigned by IANA?

                 Table 4: Configuration for Local Settings

10.4.  Network-Wide Settings

   The following administrative controls MAY be used to change the
   operation of the network.  The same settings SHOULD be used across
   the network.  Inconsistent settings at different routers in the
   network will not result in protocol errors, but poor performance may
   result.

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

             Table 5: Configuration for Network-Wide Settings

10.5.  MetricType Allocation

   The metric types used by AODVv2 are identified according to a new
   table to be created and maintained by IANA.  All implementations MUST
   use these values.

Perkins, et al.         Expires October 22, 2016               [Page 63]

Internet-Draft                   AODVv2                       April 2016

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

                       Table 6: AODVv2 Metric Types
UH> Shouldn't this table also be listed in section 11, IANA
Considerations? I assume that you would like to request a registry?
UH> Can a router be configured to support more than one MetricType at a time?

11.  IANA Considerations

   This section specifies several [RFC5444] message types and address
   tlv-types required for AODVv2.

11.1.  RFC 5444 Message Types

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

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

                       Table 7: AODVv2 Message Types

11.2.  RFC 5444 Address Block TLV Types

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

Perkins, et al.         Expires October 22, 2016               [Page 64]

Internet-Draft                   AODVv2                       April 2016

   +------------------------+----------+---------------+---------------+
   | Name of TLV            | Type     | Length        | Reference     |
   |                        |          | (octets)      |               |
   +------------------------+----------+---------------+---------------+
   | PATH_METRIC            | 11 (TBD) | depends on    | Section 7     |
   |                        |          | MetricType    |               |
   | SEQ_NUM                | 12 (TBD) | 2             | Section 7     |
   | ADDRESS_TYPE           | 13 (TBD) | 1             | Section 8     |
   +------------------------+----------+---------------+---------------+
UH> There was some discussion to move the TLV allocations to the
experimental range of RFC5444. Is that the plan for the next revision?

                  Table 8: AODVv2 Address Block TLV Types

11.3.  ADDRESS_TYPE TLV Values

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

                        +---------------+--------+
                        | Address Type  | Value  |
                        +---------------+--------+
                        | ORIGADDR      | 0      |
                        | TARGADDR      | 1      |
                        | UNREACHABLE   | 2      |
                        | PKTSOURCE     | 3      |
                        | INTEND        | 4      |
                        | UNSPECIFIED   | 255    |
                        +---------------+--------+
UH> What about IDLE routes in RERR when ENABLE_IDLE_IN_RERR is set?
Which value is used for them?

                       Table 9: AODVv2 Address Types

12.  Security Considerations

   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
   learned from other AODVv2 routers.

   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 the following.  Some of the threats
   described can be mitigated or eliminated.  Tools to do so will be
   described also.

   Since route messages are regenerated at each router, AODVv2 assumes a
   security model of transitive trust.  The sender of a message MUST be
   trusted in order for receiving one-hop neighbours to store the

Perkins, et al.         Expires October 22, 2016               [Page 65]

Internet-Draft                   AODVv2                       April 2016

   routing information it provides and regenerate the message to their
   own one-hop neighbours.
UH> See discussion on MANET list; providing end-to-end integrity would
be much better.

   Routes are installed based on information received from trusted
   neighbours.  Therefore a chain of trust back to the originator of a
   message is assumed by any router using the routing information
   received.

   Since messages are regenerated rather than forwarded, the message
   concepts known as RREQ, RREP and RERR do not travel as a single
   unchanged entity between source and destination, and therefore
   message integrity cannot be assured end-to-end between OrigAddr and
   TargAddr.

   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.
UH> How so?

12.1.  Availability

   Threats to AODVv2 which reduce availability are considered below.

12.1.1.  Denial of Service

   Flooding attacks using RREQ amount to a (BLIND)
UH> What's "BLIND"? (in upper case)

    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.  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 OrigAddr for each RREQ.  If a specific node is to be
   targeted, this attack may be carried out in a DISTRIBUTED fashion,
UH> Why capital DISTRIBUTED?
   either by compromising its direct neighbors or by specifying the
   target's address as TargAddr.  Note that it might be more economical
   for the attacker to simply jam the medium; an attack which AODVv2
   cannot defend itself against.
UH> I disagree. Jamming the medium is local; flooding affects the whole network.

   Mitigation:

   o  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

Perkins, et al.         Expires October 22, 2016               [Page 66]

Internet-Draft                   AODVv2                       April 2016

      means eliminating) AODVv2's vulnerability to denial of service
      attacks.

   o  Authentication of senders can prevent foreign nodes from DoSing a
UH> What's a foreign node?
UH> What's "DoSing"?
      AODVv2 router.  However, this does not protect the network if an
      attacker has access to an already authorized router.
UH> Definition of "aleady authorized router"?

12.1.2.  Malicious RERR messages
UH> What's a "Malicious" message?

   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.

   Routes will be deleted if an RERR is received, withdrawing a route
   for which the sender is the receiver's next hop, and when the RERR
   includes the MetricType of the installed route, and 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. Routes will also be deleted if a received
   RERR contains a PktSource address corresponding to a Router Client.

   The information necessary to construct a malicious RERR could be
   learned by eavesdropping, either by listening to AODVv2 messages or
   by watching data packet flows.

   Since the RERR is multicast,
 UH> Not always. There are also unicast RERRs.

    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.

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

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

   o  Replayed RERR messages could be used to disrupt active routes.

   Mitigation:

Perkins, et al.         Expires October 22, 2016               [Page 67]

Internet-Draft                   AODVv2                       April 2016

   o  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.
UH> Where is this specified?

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

   o  By only regenerating RERR messages where active routes are
      removed, the spread of the malicious RERR is limited.
UH> Can you explain why?

   o  Including sequence numbers in RERR messages offers protection
      against attacks using replays of these RERR messages.

   o  If AODVv2 routers always verify that the sender of the RERR
      message is trusted, this threat is reduced.
UH> But AODVv2 doesn't provide end-to-end trust.

12.1.3.  False Confirmation of Link Bidirectionality

   Links could be erroneously treated as bidirectional if malicious
   unsolicited or spoofed RREP messages were to be accepted.
UH> What are "malicious unsolicited or spoofed RREP messages"?

   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.

   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.

   Mitigation:

   o  Ignoring unsolicited RREP and RREP_Ack messages partially
      mitigates against this threat.
UH> In which section is the process of "ignoring unsolicitated RREP
and RREP_ACKs" defined?

   o  If AODVv2 routers always verify that the sender of the RERR
      message is trusted, this threat is reduced.
UH> There is no end-to-end trust in AODVv2.

12.1.4.  Message Deletion

   A malicious router could decide not to regenerate a RREQ or RREP or
   RERR message.  Not regenerating 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

Perkins, et al.         Expires October 22, 2016               [Page 68]

Internet-Draft                   AODVv2                       April 2016

   traffic flows by not allowing the source of data traffic to re-
   discover a new route when one breaks.

   Failing to send a 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.

   Mitigation:

   o  None. also note that malicious router would have to wait for a
      route to break before it could perform this attack.

12.2.  Confidentiality

   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.

   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.
UH> I don't understand the last sentence. What's a malicious message?
How could it be used to disrupt "normal" operation?
UH> Is there any mitigation in AODVv2 for this threat?

12.3.  Integrity

   Integrity of route information can be compromised in the following
   types of attack:

12.3.1.  Message Insertion

   Valid route set entries can be replaced or modified by maliciously
   constructed AODVv2 messages, destroying existing routes and the
   network's integrity.
UH> What do you mean by "destroying" a route, and by "destroying" the
network's integrity?

    Any router may pose as another router by
   sending RREQ, RREP, RREP_Ack and RERR messages in its name.
UH> What do you mean by "in its name"?

   o  Sending an RREQ message with false information can disrupt traffic
      to OrigAddr, if the sequence number attached is not stale compared
      to any existing information about OrigAddr.  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 OrigAddr.  The actual threat to disrupt routes
      to OrigAddr is reduced by the AODVv2 mechanism of marking RREQ-
      derived routes as "Unconfirmed" until the link to the next hop is
      confirmed.
UH> But still the flooding damage is done.

Perkins, et al.         Expires October 22, 2016               [Page 69]

Internet-Draft                   AODVv2                       April 2016

   o  Sending an RREP message with false information can disrupt traffic
      to TargAddr.  Since RREP is unicast,
UH> You also support multicast RREPs.

       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.

   o  Sending an RREP_Ack message with false information can cause the
      route advertised to a target address in an RREP to be erroneously
      accepted even though the route would contain a unidirectional link
      and thus not be suitable for most traffic.  Since RREP_Ack is
      unicast, and ignored if a RREP was not sent recently to the sender
      of the RREP_Ack, this threat is minimized and is strictly local to
      the RREP transmitter expecting the acknowledgement.  Unsolicited
      RREP_Acks are ignored.

   o  Sending an RERR message with false information is discussed in
      Section 12.1.2.

   Mitigation: * If AODVv2 routers always verify that the sender of a
   message is trusted, this threat is reduced.
UH> That is not possible in AODVv2, since end-to-end integrity isn't supported

12.3.2.  Message Modification - Man in the Middle

   Any AODVv2 router can regenerate messages with modified data.

   Mitigation:

   o  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 shared secret key used to calculate an
      integrity check value MAY modify a message but the message will be
      rejected when it fails an integrity check.
UH> Is shared secret the only option? What about asymmetric keys?
UH> MAY? or may?

12.3.3.  Replay Attacks

   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
UH> RFC2119 seems inappropriate here for "MAY or MAY NOT".

   numbers and are therefore susceptible to replay attacks.  RREP_Ack
   messages do not include sequence numbers and are therefore
   susceptible to replay attacks.

   Mitigation:

   o  Use of timestamps or sequence numbers prevents replay attacks.
UH> Do RREP_Ack messages contain sequence numbers then? I wasn't able
to tell from section 8.3.

Perkins, et al.         Expires October 22, 2016               [Page 70]

Internet-Draft                   AODVv2                       April 2016

12.4.  Protection Mechanisms

12.4.1.  Confidentiality and Authentication

   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.
UH> Since this is not specified in this document, I would not mention
encryption here (or say that it's out of scope of this document).

   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.

12.4.2.  Integrity and Trust using ICVs

   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.
UH> Shared secret is just one option. Deployments could also use
asymmetric keys. Can implementations of AODVv2 choose different
security mechanisms?

    [RFC7182] defines ICV TLVs for use with
   [RFC5444].

   The data contained in AODVv2 routing protocol messages MUST be
   verified using Integrity Check Values, to avoid the use of message
   data if the message has been tampered with.

   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:
UH> Looks like there is some text missing here
UH> See BCP107

12.4.3.  Replay Protection using Timestamps

   Replay attacks MUST be prevented by using timestamps or sequence
   numbers in messages.  [RFC7182] defines a TIMESTAMP TLV for use with
   [RFC5444].

   The data contained in AODVv2 routing protocol messages MUST be
   protected with a TIMESTAMP value to ensure the protection against
   replaying of the message.  Sequence numbers can be used as
   timestamps, since they are known to be strictly increasing.

12.4.4.  Application to AODVv2

   Implementations of AODVv2 MUST support ICV TLVs using type-extensions
   1 and 2, hash-function HASH_FUNCTION, and cryptographic function
   CRYPTOGRAPHIC_FUNCTION.  An ICV MUST be included with every message.
   The ICV value MAY be truncated as specified in [RFC7182].
UH> Which hash-function / which crypto function is used?

Perkins, et al.         Expires October 22, 2016               [Page 71]

Internet-Draft                   AODVv2                       April 2016

   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 <TIMESTAMP-value>
UH> What is the notation for <TIMESTAMP-value>? That syntax is not
explained in this draft nor RFC5444.

    field matches the AODVv2 sequence
   number defined in Section 4.4.  The TIMESTAMP TLV MUST be included in
   RREP_Ack and RERR messages.

   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.  In this case, the RFC5444 multiplexer MUST be
   instructed to include the Packet TLVs in packets containing AODVv2
   messages, or MUST be selected because it always performs these
   additions.  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.

   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.
UH> Unless they are added to the packet instead, as described in the
previous paragraph. When do you know whether to add to the message or
to the packet? Say, you first create a message, add ICV and timestamp;
then a second message is added to the package, does the multiplexer
now have to remove the ICV and timestamp from the first message again
and then add these TLVs to the package?

    The following steps list the
   generic procedure to be performed:
UH> "generic"? Are there exceptions to this list?

   1.  The considerations in Section 8 of [RFC7182] are followed,
       removing existing ICV TLVs and adjusting the size and flags
       fields.
UH> Section 8 in RFC7182 only applies to packets. What about messages?

   2.  The ICV is calculated over the fields specified below, depending
       on message type.  This value MAY be truncated (as specified in
       [RFC7182]).
UH> Where, below? I don't see a list of fields.

   3.  If the TIMESTAMP is to be included, add the TIMESTAMP TLV,
       updating size fields as necessary.
UH> How do I know whether it's to be included?

   4.  Add the ICV TLV, updating size fields as necessary.

   5.  The changes made in Step 1 are reversed to re-add any existing
       ICV TLVs and adjusting the size and flags fields.
UH> If this is for message generation, how comes there are already ICV
TLVs in there? (since messages are "regenerated" and not forwarded)

   The ICV MUST be verified at the receiver.  Verification of a received
   ICV value is performed by repeating Step 1 and Step 2.
UH> Specifying verification one sentence after generation may be
confusing. I would recommend to split verification and generation in
separate sections.

   If the ICV
   value calculated from the received message or packet does not match
   the value of <ICV-data> in the received message or packet, the
   validation fails and the AODVv2 message MUST be discarded.
UH> It would be clearer to split verification of messages and packets
into different sections.

   Verification of a received TIMESTAMP value is performed differently
   depending on message type.
UH> + "as specified in the following sub sections:"

Perkins, et al.         Expires October 22, 2016               [Page 72]

Internet-Draft                   AODVv2                       April 2016

12.4.4.1.  RREQ Generation and Reception

   Since OrigAddr is included in the RREQ, the ICV can be calculated and
   verified using all of the message contents.  This provides message
   integrity and endpoint authentication,
UH> not really endpoint, since you only use hop-by-hop

    because trusted routers MUST
   hold the shared key in order to calculate the ICV value.  The ICV TLV
   has type extension := 1.

   Since RREQ_Gen's sequence number is incremented for each new RREQ,
   replay protection is already afforded and no extra timestamp
   mechanism is required.

12.4.4.2.  RREP Generation and Reception

   Since TargAddr is included in the RREP, the ICV can be calculated and
   verified using all of the message contents.  This provides message
   integrity and endpoint authentication, because trusted routers MUST
   hold the shared key in order to calculate the ICV value.  The ICV TLV
   has type extension := 1.

   Since RREP_Gen's sequence number is incremented for each new RREP,
   replay protection is afforded and no extra timestamp mechanism is
   required.

12.4.4.3.  RREP_Ack Generation and Reception

   The RREP_Gen uses the source IP address of the RREP_Ack to identify
   the sender to look up whether the RREP_Ack is expected and update the
   Neighbor Set, and so 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.

   The message MUST also include a timestamp to protect against replay
   attacks, using TargSeqNum from the RREP as the value in the TIMESTAMP
   TLV.
UH> Bullet points and separation of generation and reception would be
clearer (e.g., spell out that TIMESTAMP TLV must be added *before*
adding the ICV TLV)

   Verification of a received TIMESTAMP value is performed by
   comparing the sequence number in the <TIMESTAMP-value> field with the
   sequence number in a recently sent RREP awaiting acknowledgement from
   the sender of the RREP_Ack.  If the sequence number is not equal, the
   AODVv2 message MUST be discarded.

12.4.4.4.  RERR Generation and Reception

   The receiver of the RERR MUST use the source IP address of the RERR
   to identify the sender to look up routes using that sender as next
   hop, and so the ICV MUST be calculated using the message contents and
   the IP source address.  The ICV TLV has type extension := 2 in order

Perkins, et al.         Expires October 22, 2016               [Page 73]

Internet-Draft                   AODVv2                       April 2016

   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.

   The message MUST also include a timestamp to protect against replay
   attacks, incrementing and using RERR_Gen's sequence number as the
   value in the TIMESTAMP TLV.  Verification of a received TIMESTAMP
   value is performed by comparing the sequence number in the
   <TIMESTAMP-value> field with the last seen sequence number from the
   sender of the RERR.  If the sequence number is not greater, the
   AODVv2 message MUST be discarded.

UH> Can I add multiple ICV/TIMESTAMP TLVs in a message?
UH> Is truncation of ICV TLVs allowed (see RFC7183)?

13.  Acknowledgments

   AODVv2 is a descendant of the design of previous MANET on-demand
   protocols, especially AODV [RFC3561] and DSR [RFC4728].  Changes to
   previous MANET on-demand protocols stem from research and
   implementation experiences.  Thanks to Elizabeth Belding and Ian
   Chakeres for their long time authorship of AODV.  Additional thanks
   to Derek Atkins, Emmanuel Baccelli, Abdussalam Baryun, Ramon Caceres,
   Thomas Clausen, Justin Dean, Christopher Dearlove, Fatemeh Ghassemi,
   Ulrich Herberg, Henner Jakob, Ramtin Khosravi, Luke Klein-Berndt,
   Lars Kristensen, Tronje Krop, Koojana Kuladinithi, Kedar Namjoshi,
   Keyur Patel, Alexandru Petrescu, Henning Rogge, Fransisco Ros, Pedro
   Ruiz, Christoph Sommer, Romain Thouvenin, Richard Trefler, Jiazi Yi,
   Seung Yi, Behnaz Yousefi, and Cong Yuan, for their reviews of AODVv2
   and DYMO, as well as numerous specification suggestions.

14.  References

14.1.  Normative References

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

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

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

Perkins, et al.         Expires October 22, 2016               [Page 74]

Internet-Draft                   AODVv2                       April 2016

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

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

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

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

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

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

14.2.  Informative References

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

   [Koodli01]
              Koodli, R. and C. Perkins, "Fast handovers and context
              transfers in mobile networks", Proceedings of the ACM
              SIGCOMM Computer Communication Review 2001, Volume 31
              Issue 5, 37-47, October 2001.

Perkins, et al.         Expires October 22, 2016               [Page 75]

Internet-Draft                   AODVv2                       April 2016

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

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

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

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

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

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

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

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

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

Perkins, et al.         Expires October 22, 2016               [Page 76]

Internet-Draft                   AODVv2                       April 2016

Appendix A.  AODVv2 Draft Updates

   This section lists the changes between AODVv2 revisions ...-14.txt
   and ...-15.txt.

   o  Shortened Terminology descriptions of Unreachable Address,
      Unreachable Route, Valid Route and add references to sections
      explaining the details.

   o  Clarified language regarding empty Message TLV Blocks and Address
      Blocks.

   o  Removed reference to RFC6551 from MetricType Allocation.

   o  Removed Message Aggregation Delay extension.

   o  Detailed what happens if the specified timers aren't the same
      across the network.

   o  RERRs SHOULD be MULTICAST instead of MUST (which enables precursor
      lists).

   o  RREP_Ack Reception: clarified wording regarding blacklist check.

   o  Removed "approaching the limit" verbiage.

   o  Added instructions on which messages to drop on congestion.

   o  Revised set vs. table wording

   o  Added note that AODVv2 was intended for use in mobile ad hoc
      wireless networks.

   o  Changed language to clarify that the RFC5444 multiplexer sends the
      messages, not AODVv2.

   o  Added instructions on how to use the Multicast Route Message Set
      to check whether an RREP_Ack or RREP was received in time.

   o  Removed optional features.

   o  Moved AODVv2 to the Experimental Track.

Authors' Addresses

Perkins, et al.         Expires October 22, 2016               [Page 77]

Internet-Draft                   AODVv2                       April 2016

   Charles E. Perkins
   Futurewei Inc.
   2330 Central Expressway
   Santa Clara, CA  95050
   USA

   Phone: +1-408-330-4586
   Email: [email-masked]

   Stan Ratliff
   Idirect
   13861 Sunrise Valley Drive, Suite 300
   Herndon, VA  20171
   USA

   Email: [email-masked]

   John Dowdell
   Airbus Defence and Space
   Celtic Springs
   Newport, Wales  NP10 8FZ
   United Kingdom

   Email: [email-masked]

   Lotte Steenbrink
   HAW Hamburg, Dept. Informatik
   Berliner Tor 7
   D-20099 Hamburg
   Germany

   Email: [email-masked]

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

   Email: [email-masked]

Perkins, et al.         Expires October 22, 2016               [Page 78]