draft-ietf-manet-dsr-00.txt | draft-ietf-manet-dsr-01.txt | |||
---|---|---|---|---|
IETF MANET Working Group Josh Broch | IETF MANET Working Group Josh Broch | |||
INTERNET-DRAFT David B. Johnson | INTERNET-DRAFT David B. Johnson | |||
David A. Maltz | David A. Maltz | |||
Carnegie Mellon University | Carnegie Mellon University | |||
13 March 1998 | 8 December 1998 | |||
The Dynamic Source Routing Protocol for Mobile Ad Hoc Networks | The Dynamic Source Routing Protocol for Mobile Ad Hoc Networks | |||
<draft-ietf-manet-dsr-00.txt> | <draft-ietf-manet-dsr-01.txt> | |||
Status of This Memo | Status of This Memo | |||
This document is a submission to the Mobile Ad-hoc Networks (manet) | This document is a submission to the Mobile Ad-hoc Networks (manet) | |||
Working Group of the Internet Engineering Task Force (IETF). | Working Group of the Internet Engineering Task Force (IETF). | |||
Comments should be submitted to the Working Group mailing list at | Comments should be submitted to the Working Group mailing list at | |||
"manet@itd.nrl.navy.mil". Distribution of this memo is unlimited. | "manet@itd.nrl.navy.mil". Distribution of this memo is unlimited. | |||
This document is an Internet-Draft. Internet-Drafts are working | This document is an Internet-Draft. Internet-Drafts are working | |||
documents of the Internet Engineering Task Force (IETF), its areas, | documents of the Internet Engineering Task Force (IETF), its areas, | |||
skipping to change at page 1, line 48 | skipping to change at page 1, line 48 | |||
Dynamic Source Routing (DSR) is a routing protocol designed | Dynamic Source Routing (DSR) is a routing protocol designed | |||
specifically for use in mobile ad hoc networks. The protocol allows | specifically for use in mobile ad hoc networks. The protocol allows | |||
nodes to dynamically discover a source route across multiple network | nodes to dynamically discover a source route across multiple network | |||
hops to any destination in the ad hoc network. When using source | hops to any destination in the ad hoc network. When using source | |||
routing, each packet to be routed carries in its header the complete, | routing, each packet to be routed carries in its header the complete, | |||
ordered list of nodes through which the packet must pass. A key | ordered list of nodes through which the packet must pass. A key | |||
advantage of source routing is that intermediate hops do not need | advantage of source routing is that intermediate hops do not need | |||
to maintain routing information in order to route the packets they | to maintain routing information in order to route the packets they | |||
receive, since the packets themselves already contain all of the | receive, since the packets themselves already contain all of the | |||
necessary routing information. This, coupled with the dynamic, | necessary routing information. This, coupled with the dynamic, | |||
on-demand nature of Route Discovery, completely eliminates the need | on-demand nature of DSR's Route Discovery, completely eliminates the | |||
for periodic router advertisements and link status packets, reducing | need for periodic router advertisements and link status packets, | |||
the overhead of DSR, especially during periods when the network | significantly reducing the overhead of DSR, especially during periods | |||
topology is stable and these packets serve only as keep-alives. | when the network topology is stable and these packets serve only as | |||
keep-alives. | ||||
Contents | Contents | |||
Status of This Memo i | Status of This Memo i | |||
Abstract i | Abstract i | |||
1. Introduction 1 | 1. Introduction 1 | |||
2. Assumptions 1 | 2. Assumptions 1 | |||
3. Terminology 2 | 3. Terminology 2 | |||
3.1. General Terms . . . . . . . . . . . . . . . . . . . . . . 2 | 3.1. General Terms . . . . . . . . . . . . . . . . . . . . . . 2 | |||
3.2. Specification Language . . . . . . . . . . . . . . . . . 4 | 3.2. Specification Language . . . . . . . . . . . . . . . . . 4 | |||
4. Protocol Overview 5 | 4. Protocol Overview 5 | |||
4.1. Route Discovery and Route Maintenance . . . . . . . . . . 5 | 4.1. Route Discovery and Route Maintenance . . . . . . . . . . 5 | |||
4.2. Packet Forwarding . . . . . . . . . . . . . . . . . . . . 6 | 4.2. Packet Forwarding . . . . . . . . . . . . . . . . . . . . 6 | |||
4.3. Conceptual Data Structures . . . . . . . . . . . . . . . 6 | 4.3. Multicast Routing . . . . . . . . . . . . . . . . . . . . 7 | |||
4.3.1. Route Cache . . . . . . . . . . . . . . . . . . . 6 | ||||
4.3.2. Node Information Cache . . . . . . . . . . . . . 8 | ||||
4.3.3. Send Buffer . . . . . . . . . . . . . . . . . . . 8 | ||||
4.3.4. Retransmission Buffer . . . . . . . . . . . . . . 8 | ||||
5. Packet Formats 10 | 5. Conceptual Data Structures 7 | |||
5.1. Destination Options Headers . . . . . . . . . . . . . . . 10 | 5.1. Route Cache . . . . . . . . . . . . . . . . . . . . . . . 7 | |||
5.1.1. DSR Route Request Option . . . . . . . . . . . . 11 | 5.2. Route Request Table . . . . . . . . . . . . . . . . . . . 9 | |||
5.1.2. DSR Route Reply Option . . . . . . . . . . . . . 13 | 5.3. Send Buffer . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
5.1.3. DSR Route Error Option . . . . . . . . . . . . . 14 | 5.4. Retransmission Buffer . . . . . . . . . . . . . . . . . . 9 | |||
5.1.4. DSR Acknowledgment Option . . . . . . . . . . . . 15 | ||||
5.2. DSR Routing Header . . . . . . . . . . . . . . . . . . . 17 | ||||
6. Detailed Operation 19 | 6. Packet Formats 11 | |||
6.1. Route Discovery . . . . . . . . . . . . . . . . . . . . . 19 | 6.1. Destination Options Headers . . . . . . . . . . . . . . . 11 | |||
6.1.1. Originating a Route Request . . . . . . . . . . . 19 | 6.1.1. DSR Route Request Option . . . . . . . . . . . . 12 | |||
6.1.2. Processing a Route Request Option . . . . . . . . 19 | 6.2. Hop-by-Hop Options Headers . . . . . . . . . . . . . . . 14 | |||
6.1.3. Originating a Route Reply . . . . . . . . . . . . 20 | 6.2.1. DSR Route Reply Option . . . . . . . . . . . . . 15 | |||
6.1.4. Processing a Route Reply Option . . . . . . . . . 21 | 6.2.2. DSR Route Error Option . . . . . . . . . . . . . 17 | |||
6.2. Route Maintenance . . . . . . . . . . . . . . . . . . . . 21 | 6.2.3. DSR Acknowledgment Option . . . . . . . . . . . . 18 | |||
6.2.1. Originating a Route Error . . . . . . . . . . . . 21 | 6.3. DSR Routing Header . . . . . . . . . . . . . . . . . . . 20 | |||
6.2.2. Processing a Route Error Option . . . . . . . . . 21 | ||||
6.2.3. Processing a DSR Acknowledgment Option . . . . . 22 | ||||
6.3. Processing a Routing Header . . . . . . . . . . . . . . . 22 | ||||
7. Optimizations 24 | 7. Detailed Operation 23 | |||
7.1. Leveraging the Route Cache . . . . . . . . . . . . . . . 24 | 7.1. Originating a Data Packet . . . . . . . . . . . . . . . . 23 | |||
7.1.1. Promiscuous Learning of Source Routes . . . . . . 24 | 7.2. Originating a Packet with a DSR Routing Header . . . . . 23 | |||
7.1.2. Answering Route Requests using the Route Cache . 25 | 7.3. Processing a Routing Header . . . . . . . . . . . . . . . 24 | |||
7.2. Route Discovery Using Expanding Ring Search . . . . . . . 25 | 7.4. Route Discovery . . . . . . . . . . . . . . . . . . . . . 25 | |||
7.3. Preventing Route Reply Storms . . . . . . . . . . . . . . 26 | 7.4.1. Originating a Route Request . . . . . . . . . . . 25 | |||
7.4. Piggybacking on Route Discoveries . . . . . . . . . . . . 27 | 7.4.2. Processing a Route Request Option . . . . . . . . 26 | |||
7.5. Discovering Shorter Routes . . . . . . . . . . . . . . . 27 | 7.4.3. Generating Route Replies using the Route Cache . 27 | |||
7.6. Rate Limiting the Route Discovery Process . . . . . . . . 28 | 7.4.4. Originating a Route Reply . . . . . . . . . . . . 28 | |||
7.7. Improved Handling of Route Errors . . . . . . . . . . . . 29 | 7.4.5. Processing a Route Reply Option . . . . . . . . . 29 | |||
7.5. Route Maintenance . . . . . . . . . . . . . . . . . . . . 30 | ||||
7.5.1. Using Network-Layer Acknowledgments . . . . . . . 30 | ||||
7.5.2. Using Link Layer Acknowledgments . . . . . . . . 32 | ||||
7.5.3. Originating a Route Error . . . . . . . . . . . . 32 | ||||
7.5.4. Processing a Route Error Option . . . . . . . . . 33 | ||||
7.5.5. Salvaging a Packet . . . . . . . . . . . . . . . 33 | ||||
8. Constants 30 | 8. Optimizations 35 | |||
8.1. Leveraging the Route Cache . . . . . . . . . . . . . . . 35 | ||||
8.1.1. Promiscuous Learning of Source Routes . . . . . . 35 | ||||
8.2. Preventing Route Reply Storms . . . . . . . . . . . . . . 36 | ||||
8.3. Piggybacking on Route Discoveries . . . . . . . . . . . . 37 | ||||
8.4. Discovering Shorter Routes . . . . . . . . . . . . . . . 37 | ||||
8.5. Rate Limiting the Route Discovery Process . . . . . . . . 38 | ||||
8.6. Improved Handling of Route Errors . . . . . . . . . . . . 39 | ||||
9. IANA Considerations 31 | 9. Constants 40 | |||
10. Security Considerations 32 | 10. IANA Considerations 41 | |||
Location of DSR Functions in the ISO Model 33 | 11. Security Considerations 42 | |||
Implementation Status 34 | Location of DSR Functions in the ISO Model 43 | |||
Acknowledgments 35 | Implementation Status 44 | |||
Areas for Refinement 36 | Acknowledgments 45 | |||
References 37 | References 46 | |||
Chair's Address 39 | Chair's Address 48 | |||
Authors' Addresses 40 | Authors' Addresses 49 | |||
1. Introduction | 1. Introduction | |||
This document describes Dynamic Source Routing (DSR) [6, 7], a | This document describes Dynamic Source Routing (DSR) [6, 7], a | |||
protocol developed by the Monarch Project [8, 14] at Carnegie Mellon | protocol developed by the Monarch Project [8, 14] at Carnegie Mellon | |||
University for routing packets in a mobile ad hoc network [3]. | University for routing packets in a mobile ad hoc network [3]. | |||
Source routing is a routing technique in which the sender of a packet | Source routing is a routing technique in which the sender of a packet | |||
determines the complete sequence of nodes through which to forward | determines the complete sequence of nodes through which to forward | |||
the packet; the sender explicitly lists this route in the packet's | the packet; the sender explicitly lists this route in the packet's | |||
header, identifying each forwarding "hop" by the address of the next | header, identifying each forwarding "hop" by the address of the next | |||
node to which to transmit the packet on its way to the destination | node to which to transmit the packet on its way to the destination | |||
host. | node. | |||
DSR offers a number of potential advantages over other routing | DSR offers a number of potential advantages over other routing | |||
protocols for mobile ad hoc networks. First, DSR uses no periodic | protocols for mobile ad hoc networks. First, DSR uses no periodic | |||
routing messages (e.g., no router advertisements and no link-level | routing messages of any kind (e.g., no router advertisements and no | |||
neighbor status messages), thereby reducing network bandwidth | link-level neighbor status messages), thereby significantly reducing | |||
overhead, conserving battery power, and avoiding the propagation of | network bandwidth overhead, conserving battery power, reducing the | |||
probability of packet collision, and avoiding the propagation of | ||||
potentially large routing updates throughout the ad hoc network. Our | potentially large routing updates throughout the ad hoc network. Our | |||
Dynamic Source Routing protocol is able to adapt quickly to changes | Dynamic Source Routing protocol is able to adapt quickly to changes | |||
such as host movement, yet requires no routing protocol overhead | such as node movement, yet requires no routing protocol overhead | |||
during periods in which no such changes occur. | during periods in which no such changes occur. | |||
In addition, DSR has been designed to compute correct routes in | In addition, DSR has been designed to compute correct routes in | |||
the presence of asymmetric (uni-directional) links. In wireless | the presence of asymmetric (uni-directional) links. In wireless | |||
networks, links may at times operate asymmetrically due to sources | networks, links may at times operate asymmetrically due to sources | |||
of interference, differing radio or antenna capabilities, or the | of interference, differing radio or antenna capabilities, or the | |||
intentional use of asymmetric communication technology such as | intentional use of asymmetric communication technology such as | |||
satellites. Due to the existence of asymmetric links, traditional | satellites. Due to the existence of asymmetric links, traditional | |||
link-state or distance vector protocols may compute routes that | link-state or distance vector protocols may compute routes that do | |||
do not work. DSR, however, will find a correct route even in the | not work. DSR, however, will always find a correct route even in the | |||
presence of asymmetric links. | presence of asymmetric links. | |||
2. Assumptions | 2. Assumptions | |||
We assume that all hosts wishing to communicate with other hosts | We assume that all nodes wishing to communicate with other nodes | |||
within the ad hoc network are willing to participate fully in the | within the ad hoc network are willing to participate fully in the | |||
protocols of the network. In particular, each host participating in | protocols of the network. In particular, each node participating in | |||
the network should also be willing to forward packets for other hosts | the network should also be willing to forward packets for other nodes | |||
in the network. | in the network. | |||
We refer to the minimum number of hops necessary for a packet to | We refer to the minimum number of hops necessary for a packet to | |||
reach from any host located at one extreme edge of the network to | reach from any node located at one extreme edge of the network to | |||
another host located at the opposite extreme, as the diameter of the | another node located at the opposite extreme, as the diameter of the | |||
network. We assume that the diameter of an ad hoc network will be | network. We assume that the diameter of an ad hoc network will be | |||
small (e.g., perhaps 5 or 10 hops), but may often be greater than 1. | small (e.g., perhaps 5 or 10 hops), but may often be greater than 1. | |||
Packets may be lost or corrupted in transmission on the wireless | Packets may be lost or corrupted in transmission on the wireless | |||
network. A host receiving a corrupted packet can detect the error | network. A node receiving a corrupted packet can detect the error | |||
and discard the packet. | and discard the packet. | |||
We assume that hosts can enable a promiscuous receive mode on | We assume that nodes can enable promiscuous receive mode on their | |||
their wireless network interface hardware, causing the hardware to | wireless network interface hardware, causing the hardware to | |||
deliver every received packet to the network driver software without | deliver every received packet to the network driver software without | |||
filtering based on link-layer destination address. Although we do | filtering based on link-layer destination address. Although we do | |||
not require this facility, it is for example common in current LAN | not require this facility, it is for example common in current LAN | |||
hardware for broadcast media including wireless, and some of our | hardware for broadcast media including wireless, and some of our | |||
optimizations take advantage of it if available. Use of promiscuous | optimizations take advantage of its availability. Use of promiscuous | |||
mode does increase the software overhead on the CPU, but we believe | mode does increase the software overhead on the CPU, but we believe | |||
that wireless network speeds are more the inherent limiting factor to | that wireless network speeds are more the inherent limiting factor | |||
performance in current and future systems. We believe that portions | to performance in current and future systems. We also believe | |||
of the protocol are also suitable for implementation directly within | that portions of the protocol are also suitable for implementation | |||
a programmable network interface unit to avoid this overhead on the | directly within a programmable network interface unit to avoid this | |||
CPU. | overhead on the CPU. | |||
3. Terminology | 3. Terminology | |||
3.1. General Terms | 3.1. General Terms | |||
node | ||||
A device that implements IP. | ||||
router | ||||
A node that forwards IP packets not explicitly addressed to | ||||
itself. | ||||
host | ||||
Any node that is not a router. | ||||
link | link | |||
A communication facility or medium over which nodes can | A communication facility or medium over which nodes can | |||
communicate at the link layer, such as an Ethernet (simple or | communicate at the link layer, such as an Ethernet (simple or | |||
bridged). A link is the layer immediately below IP. | bridged). A link is the layer immediately below IP. | |||
interface | interface | |||
A node's attachment to a link. | A node's attachment to a link. | |||
prefix | prefix | |||
A bit string that consists of some number of initial bits of an | A bit string that consists of some number of initial bits of an | |||
address. | address. | |||
interface index | interface index | |||
An 8-bit quantity which uniquely identifies an interface among | An 7-bit quantity which uniquely identifies an interface among | |||
a given node's interfaces. | a given node's interfaces. Each node can assign interface | |||
indices to its interfaces using any scheme it wishes. | ||||
The index IF_INDEX_MA is reserved for use by Mobile IP [9] | ||||
mobility agents (home or foreign agents) to indicate that they | ||||
believe they can reach a destination via a connected internet | ||||
infrastructure. The index IF_INDEX_ROUTER is reserved for | ||||
use by routers not acting as Mobile IP mobility agents to | ||||
indicate that they believe they can reach the destination via a | ||||
connected internet infrastructure. | ||||
The distinction between the index for mobility agents and | ||||
the index for routers, allows mobility agents to advertise | ||||
their existence ``for free''. A node that processes a routing | ||||
header listing the interface index IF_INDEX_MA, can then send | ||||
a unicast Agent Solicitation to the corresponding address in | ||||
the routing header to obtain complete information about the | ||||
mobility services being provided. | ||||
link-layer address | link-layer address | |||
A link-layer identifier for an interface, such as IEEE 802 | A link-layer identifier for an interface, such as IEEE 802 | |||
addresses on Ethernet links. | addresses on Ethernet links. | |||
packet | packet | |||
An IP header plus payload. | An IP header plus payload. | |||
piggybacking | ||||
Including two or more conceptually different types of data in | ||||
the same packet so that all data elements move through the | ||||
network together. | ||||
home address | home address | |||
An IP address that is assigned for an extended period of time | An IP address that is assigned for an extended period of time | |||
to a mobile node. It remains unchanged regardless of where | to a mobile node. It remains unchanged regardless of where | |||
the node is attached to the Internet [9]. If a node has more | the node is attached to the Internet [9]. If a node has more | |||
than one home address, it SHOULD select and use a single home | than one home address, it SHOULD select and use a single home | |||
address when participating in the ad hoc network. | address when participating in the ad hoc network. | |||
source route | source route | |||
A source route from node A to node B is an ordered list of home | A source route from a node S to some node D is an ordered list | |||
addresses, starting with the home address of node A and ending | of home addresses and interface indexes that contains all the | |||
with the home address of the node B. Between A and B, the | information that would be needed to forward a packet through | |||
source route includes an ordered list of all the intermediate | the ad hoc network. For each node that will transmit the | |||
hops between A and B, as well as the interface index of the | packet, the source route provides the index of the interface | |||
interface through which the packet should be transmitted to | over which the packet should be transmitted, and the address of | |||
reach the next hop. Note that the packet formats defined in | the node which is intended to receive the packet. | |||
Section 5.1 encode the Target Address (node B) separately, | ||||
instead of encoding it as the last hop on the source route. | DSR Routing Headers as described in Section 6.3 use a more | |||
compact encoding of the source route and do not explicitly list | ||||
address S in the Routing Header`, since it is carried as the IP | ||||
Source Address of the packet. | ||||
A source route is described as ``broken'' when the specific | ||||
path it describes through the network is not actually viable. | ||||
Route Discovery | Route Discovery | |||
The method in DSR by which a node A dynamically obtains a | The method in DSR by which a node S dynamically obtains a | |||
source route to node B that will carry packets through the | source route to some node D that will be used by S to route | |||
network from A to B. Performing a route discovery involves | packets through the network to D. Performing a Route Discovery | |||
sending one or more Route Request packets. | involves sending one or more Route Request packets. | |||
Route Maintenance | Route Maintenance | |||
The process in DSR of monitoring the status of a source route | The process in DSR of monitoring the status of a source route | |||
while in use, so that any link-failures along the source route | while in use, so that any link-failures along the source route | |||
can be detected and the broken source route removed from use. | can be detected and the broken link removed from use. | |||
3.2. Specification Language | 3.2. Specification Language | |||
The keywords "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The keywords "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | |||
document are to be interpreted as described in RFC 2119 [2]. | document are to be interpreted as described in RFC 2119 [2]. | |||
4. Protocol Overview | 4. Protocol Overview | |||
4.1. Route Discovery and Route Maintenance | 4.1. Route Discovery and Route Maintenance | |||
A source routing protocol must solve two challenges, which DSR terms | A source routing protocol must solve two challenges, which DSR terms | |||
Route Discovery and Route Maintenance. Route Discovery is the | Route Discovery and Route Maintenance. Route Discovery is the | |||
mechanism whereby a node S wishing to send a packet to a destination | mechanism whereby a node S wishing to send a packet to a destination | |||
D obtains a source route to D. | D obtains a source route to D. | |||
Route Maintenance is the mechanism whereby S is able to detect, while | Route Maintenance is the mechanism whereby S is able to detect, while | |||
using a source route to D, if the network topology has changed such | using a source route to D, if the network topology has changed such | |||
that it can no longer use its route to D because a hop along the | that it can no longer use its route to D because a link along the | |||
route no longer works. When Route Maintenance indicates a source | route no longer works. When Route Maintenance indicates a source | |||
route is broken, S can attempt to use any other route it happens to | route is broken, S can attempt to use any other route it happens to | |||
know to D, or can invoke Route Discovery again to find a new route. | know to D, or can invoke Route Discovery again to find a new route. | |||
To perform Route Discovery, the source node S broadcasts a Route | To perform Route Discovery, the source node S link-layer broadcasts | |||
Request packet with a recorded source route listing only itself. | a Route Request packet. Here, node S is termed the initiator of the | |||
Each node that hears the Route Request forwards the Request if | Route Discovery, and the node to which S is attempting to discover a | |||
appropriate, adding its own address to the recorded source route in | source route, say D, is termed the target of the Discovery. | |||
this copy of the Request and rebroadcasts the packet. The forwarding | ||||
of Requests is constructed so that copies of the Request propagate | Each node that hears the Route Request packet forwards a copy of the | |||
hop-by-hop outward from the node initiating the Route Discovery, | Request, if appropriate, by adding its own address to a source route | |||
until either the target of the Request is found or until another node | being recorded in the Request packet and then rebroadcasting the | |||
is found that can supply a route to the target. | Route Request. | |||
The forwarding of Route Requests is constructed so that copies of the | ||||
Request propagate hop-by-hop outward from the node initiating the | ||||
Route Discovery, until either the target of the Request is found or | ||||
until another node is found that can supply a route to the target. | ||||
The basic mechanism of forwarding Route Requests forwards the Request | The basic mechanism of forwarding Route Requests forwards the Request | |||
if the node (1) is not the target of the Request and (2) is not | if the node (1) is not the target of the Request, (2) is not already | |||
already listed in the recorded source route in this copy of the | listed in the recorded source route in this copy of the Request, and | |||
Request. In addition, however, each node maintains an LRU cache of | (3) has not recently seen another Route Request packet belonging to | |||
recently received Route Requests and does not propagate any copies | this same Route Discovery. A node can determine if it has recently | |||
of a Request after the first, avoiding the overhead of forwarding | seen such a Route Request, since each Route Request packet contains | |||
additional copies that reach this node along different paths. Also, | a unique identifier for this Route Discovery, generated by the | |||
the Time-to-Live field in the IP header of the packet carrying the | initiator of the Discovery. Each node maintains an LRU cache of the | |||
Route Request MAY be used to limit the scope over which the Request | unique identifier from each recently received Route Request. By not | |||
will propagate, using the normal behavior of Time-to-Live defined by | propagating any copies of a Request after the first, the overhead of | |||
IP [12, 1]. Additional optimizations on the handling and forwarding | forwarding additional copies that reach this node along different | |||
of Route Requests are also used to further reduce the Route Discovery | paths is avoided. | |||
overhead. When the target of the Request (e.g., node D) receives the | ||||
Route Request, it copies the recorded source route into a Route Reply | In addition, the Time-to-Live field in the IP header of the packet | |||
packet which it then sends this Reply back to the initiator of the | carrying the Route Request MAY be used to limit the scope over which | |||
Route Request (e.g., node S). | the Request will propagate, using the normal behavior of Time-to-Live | |||
defined by IP [12, 1]. Additional optimizations on the handling and | ||||
forwarding of Route Requests are also used to further reduce the | ||||
Route Discovery overhead. | ||||
When the target of the Request (e.g., node D) receives the Route | ||||
Request, the recorded source route in the Request identifies the | ||||
sequence of hops over which this copy of the Request reached D. | ||||
Node D copies this recorded source route into a Route Reply packet | ||||
and sends this Route Reply back to the initiator of the Route Request | ||||
(e.g., node S). | ||||
All source routes learned by a node are kept in a Route Cache, which | All source routes learned by a node are kept in a Route Cache, which | |||
is used to further reduce the cost of Route Discovery. When a node | is used to further reduce the cost of Route Discovery. When a node | |||
wishes to send a packet, it examines its own Route Cache and performs | wishes to send a packet, it examines its own Route Cache and performs | |||
Route Discovery only if no suitable source route is found in its | Route Discovery only if no suitable source route is found in its | |||
Cache. | Cache. | |||
Further, when a node B receives a Route Request from S for another | Further, when some intermediate node B receives a Route Request from | |||
node D, B searches its own Route Cache for a route to D. If B finds | S for some target node D, B not equal D, B searches its own Route | |||
such a route, it does not propagate the Route Request, but instead | Cache for a route to D. If B finds such a route, it might not have | |||
returns a Route Reply to node S based on the concatenation of the | to propagate the Route Request, but instead return a Route Reply to | |||
recorded source route from S to B in the Route Request and the cached | node S based on the concatenation of the recorded source route from | |||
route from B to D. The details of replying from a Route Cache in this | S to B in the Route Request and the cached route from B to D. The | |||
way are discussed in Section 7.1. | details of replying from a Route Cache in this way are discussed in | |||
Section 8.1. | ||||
As a node overhears routes being used by others, either by | As a node overhears routes being used by others, either on data | |||
promiscuously snooping on them or when forwarding packets, the node | packets or on control packets used by Route Discovery or Route | |||
MAY insert those routes into its Route Cache, leveraging the Route | Maintenance, the node MAY insert those routes into its Route Cache, | |||
Discovery operations of the other nodes. | leveraging the Route Discovery operations of the other nodes in | |||
the network. Such route information MAY be learned either by | ||||
promiscuously snooping on packets or when forwarding packets. | ||||
4.2. Packet Forwarding | 4.2. Packet Forwarding | |||
To represent a source route within a packet's header, DSR uses a | To represent a source route within a packet's header, DSR uses a | |||
Routing Header that conforms to the Routing Header format specified | Routing Header similar to the Routing Header format specified for | |||
for IPv6, adapted to the needs of DSR and to the use of the DSR in | IPv6, adapted to the needs of DSR and to the use of DSR in IPv4 (or | |||
IPv4 (or in IPv6 in the future). The DSR Routing Header uses a | in IPv6 in the future). The DSR Routing Header uses a unique Routing | |||
unique Routing Type field value to distinguish it from the existing | Type field value to distinguish it from the existing Type 0 Routing | |||
Type 0 Routing Header defined within IPv6 [4]. | Header defined within IPv6 [4]. | |||
To forward a packet, a receiving node N simply processes the Routing | To forward a packet, a receiving node N simply processes the Routing | |||
Header as specified in the IPv6 [4] and transmits the packet to | Header as specified in Section 7.3 and transmits the packet to | |||
the next hop. If a forwarding error occurs along the link to | the next hop. If a forwarding error occurs along the link to the | |||
the next hop in the route, this node N sends a Route Error back | next hop in the route, this node N sends a Route Error back to the | |||
to the originator S of the packet informing S that this link is | originator S of this packet informing S that this link is "broken". | |||
"broken". If node N's Route Cache contains a different route to the | If node N's Route Cache contains a different route to the destination | |||
destination, then the packet is retransmitted using the new source | of the original packet, then the packet is salvaged using the new | |||
route. Each node overhearing or forwarding a Route Error packet also | source route (Section 7.5.5). Otherwise, the packet is dropped. | |||
Each node overhearing or forwarding a Route Error packet also | ||||
removes from its Route Cache the link indicated to be broken, thereby | removes from its Route Cache the link indicated to be broken, thereby | |||
cleaning the stale cache data from the network. | cleaning the stale cache data from the network. | |||
4.3. Conceptual Data Structures | 4.3. Multicast Routing | |||
All information a node needs for participation in an ad hoc | At this time DSR does not support true multicasting. However, it | |||
network using the Dynamic Source Routing Protocol can be organized | does support the controlled flooding of a data packet to all nodes in | |||
conceptually into four data structures: a Route Cache, a Node | the network that are within some number of hops of the originator. | |||
Information Cache, a Send Buffer, and a Retransmission Buffer. These | While this mechanism does not support pruning of the broadcast | |||
tree to conserve network resources, it can be used to distribute | ||||
information to nodes in the network. | ||||
When an application on a DSR node sends a packet to a multicast | ||||
address, DSR piggybacks the data from the packet inside a Route | ||||
Request packet targeted at the multicast address. The normal Route | ||||
Request distribution scheme described in Sections 4.1 and 7.4.2 | ||||
will result in this packet being efficiently distributed to all | ||||
nodes in the network within the specified TTL of the originator. | ||||
The receiving nodes can then do destination address filtering on | ||||
the packet, discarding it if they do not wish to receive multicast | ||||
packets destined to this multicast address. | ||||
5. Conceptual Data Structures | ||||
In order to participate in the Dynamic Source Routing Protocol, a | ||||
node needs four conceptual data structures: a Route Cache, a Route | ||||
Request Table, a Send Buffer, and a Retransmission Buffer. These | ||||
data structures MAY be implemented in any manner consistent with the | data structures MAY be implemented in any manner consistent with the | |||
external behavior described in this document. | external behavior described in this document. | |||
4.3.1. Route Cache | 5.1. Route Cache | |||
All routing information needed by a node participating in an ad hoc | All routing information needed by a node participating in an ad hoc | |||
network is stored in a Route Cache. Each node in the network | network using DSR is stored in a Route Cache. Each node in the | |||
maintains its own Route Cache. The node adds information to the | network maintains its own Route Cache. The node adds information | |||
cache as it learns of new links between nodes in the ad hoc network, | to the Cache as it learns of new links between nodes in the ad hoc | |||
for example through packets carrying either a Route Reply or a | network, for example through packets carrying either a Route Reply or | |||
Routing Header. Likewise, the node removes information from the | a Routing Header. Likewise, the node removes information from the | |||
cache as it learns existing links in the ad hoc network have broken, | cache as it learns existing links in the ad hoc network have broken, | |||
for example through packets carrying a Route Error or through the | for example through packets carrying a Route Error or through the | |||
link-layer retransmission mechanism reporting a failure in forwarding | link-layer retransmission mechanism reporting a failure in forwarding | |||
a packet to its next-hop destination. The Route Cache is indexed | a packet to its next-hop destination. The Route Cache is indexed | |||
logically by destination node, and supports the following operations: | logically by destination node address, and supports the following | |||
operations: | ||||
void Insert(Route RT) | void Insert(Route RT) | |||
Information extracted from source route RT is inserted into the | Inserts information extracted from source route RT into the | |||
Route Cache. | Route Cache. | |||
Route Get(Node DEST) | Route Get(Node DEST) | |||
A source route from this node to DEST (if it exists) is | Returns a source route from this node to DEST (if one is | |||
returned. | known). | |||
void Delete(Node FROM, Node TO) | void Delete(Node FROM, Interface INDEX, Node TO) | |||
Any routes in the cache that assume the existence of a | Removes from the route cache any routes which assume that a | |||
unidirectional link from node FROM to node TO are removed from | packet transmitted by node FROM over its interface with the | |||
the cache. | given INDEX will be received by node TO. | |||
Each implementation MAY choose the cache replacement and cache search | Each implementation MAY choose the cache replacement and cache search | |||
strategies most appropriate for its particular network environment. | strategies for its Route Cache that are most appropriate for its | |||
For example, some environments may choose to return the shortest | particular network environment. For example, some environments may | |||
route to a node (the shortest sequence of hops), while others may | choose to return the shortest route to a node (the shortest sequence | |||
select an alternate metric for the Get() operation. | of hops), while others may select an alternate metric for the Get() | |||
operation. | ||||
The Route Cache SHOULD support storing more than one source route for | The Route Cache SHOULD support storing more than one source route for | |||
each destination. | each destination. | |||
If node S is using a source route to destination D that includes | If there are multiple cached routes to a destination, the Route Get() | |||
intermediate node I, S SHOULD shorten the route to destination D when | operation SHOULD prefer routes that do not traverse a hop with an | |||
it learns of a shorter route to node I. A node S using a source route | interface index of IF_INDEX_MA or IF_INDEX_ROUTER. This will prefer | |||
to destination D through node I, MAY shorten the source route if it | routes that lead directly to the target node over routes that attempt | |||
learns of a shorter path from node I to node D. | to reach the target via any internet infrastructure connected to the | |||
ad hoc network. | ||||
If a node S is using a source route to some destination D that | ||||
includes intermediate node N, S SHOULD shorten the route to | ||||
destination D when it learns of a shorter route to node N than the | ||||
one that is listed as the prefix of its current route to D. | ||||
A node S using a source route to destination D through intermediate | ||||
node N, MAY shorten the source route if it learns of a shorter path | ||||
from node N to node D. | ||||
The Route Cache replacement policy SHOULD allow routes to be | The Route Cache replacement policy SHOULD allow routes to be | |||
categorized based upon "preference", where routes with a higher | categorized based upon "preference", where routes with a higher | |||
preferences are less likely to be removed from the cache. For | preferences are less likely to be removed from the cache. For | |||
example, a node could prefer routes for which it initiated a Route | example, a node could prefer routes for which it initiated a Route | |||
Discovery over routes that it learned as the result of promiscuous | Discovery over routes that it learned as the result of promiscuous | |||
snooping. In particular, a node SHOULD prefer routes that it is | snooping on other packets. In particular, a node SHOULD prefer | |||
presently using over those that it is not. | routes that it is presently using over those that it is not. | |||
The Route Cache SHOULD time-stamp each route as it is inserted into | ||||
the cache. If the route is not used within ROUTE_CACHE_TIMEOUT | ||||
seconds, it SHOULD be removed from the cache. | ||||
4.3.2. Node Information Cache | 5.2. Route Request Table | |||
The Node Information Cache is a collection of records indexed by home | The Route Request Table is a collection of records about Route | |||
address. A record maintained on node N1 for node N2 contains the | Request packets that were recently originated or forwarded by this | |||
following: | node. The table is indexed by the home address of the target of the | |||
route discovery. A record maintained on node S for node D contains | ||||
the following: | ||||
- The time that N1 last began a Route Discovery for N2. | - The time that S last originated a Route Discovery for D. | |||
- The interval of time that N1 must wait before the next attempt at | - The remaining amount of time that S must wait before the next | |||
a Route Discovery for N2. | attempt at a Route Discovery for D. | |||
- The Time-to-live (TTL) field in the IP header of last Route | - The Time-to-live (TTL) field in the IP header of last Route | |||
Request transmitted by N1 for N2. | Request originated by S for D. | |||
- A FIFO cache of the last ID_FIFO_SIZE Identification values | - A FIFO cache of the last ID_FIFO_SIZE Identification values from | |||
observed in Route Request packets initiated by N2. | Route Request packets targeted at node D that were forwarded by | |||
this node. | ||||
Nodes SHOULD use an LRU policy to manage the entries of the Node | Nodes SHOULD use an LRU policy to manage the entries of in their | |||
Information Cache. | Route Request Table. | |||
4.3.3. Send Buffer | ID_FIFO_SIZE MUST NOT be set to an unlimited value, since, in the | |||
worst case, when a node crashes and reboots the first ID_FIFO_SIZE | ||||
Route Request packets it sends might appear to be duplicates to the | ||||
other nodes in the network. | ||||
The Send Buffer is a queue of packets that cannot be transmitted | 5.3. Send Buffer | |||
because the transmitting node does not yet have a source route | ||||
to the packets' destinations. Each packet in the Send Buffer is | ||||
stamped with the time that it is placed into the Buffer, and SHOULD | ||||
be removed from the Send Buffer and discarded SEND_BUFFER_TIMEOUT | ||||
seconds after initially being placed in the Buffer. If necessary, a | ||||
FIFO strategy SHOULD be used to evict packets before they timeout to | ||||
prevent the buffer from overflowing. | ||||
Subject to the rate limiting defined in Section 6.1, a Route | The Send Buffer of some node is a queue of packets that cannot be | |||
Discovery SHOULD be initiated as often as possible for any packets | transmitted by that node because it does not yet have a source | |||
residing in the Send Buffer. | route to each respective packet's destination. Each packet in the | |||
Send Buffer is stamped with the time that it is placed into the | ||||
Buffer, and SHOULD be removed from the Send Buffer and discarded | ||||
SEND_BUFFER_TIMEOUT seconds after initially being placed in the | ||||
Buffer. If necessary, a FIFO strategy SHOULD be used to evict | ||||
packets before they timeout to prevent the buffer from overflowing. | ||||
4.3.4. Retransmission Buffer | Subject to the rate limiting defined in Section 7.4, a Route | |||
Discovery SHOULD be initiated as often as possible for the | ||||
destination address of any packets residing in the Send Buffer. | ||||
The Retransmission Buffer is a queue of packets that are awaiting the | 5.4. Retransmission Buffer | |||
receipt of an explicit acknowledgment from the next hop in the source | ||||
route (Section 5.2). | The Retransmission Buffer of a node is a queue of packets sent by | |||
this node that are awaiting the receipt of an acknowledgment from the | ||||
next hop in the source route (Section 6.3). | ||||
For each packet in the Retransmission Buffer, a node maintains (1) a | For each packet in the Retransmission Buffer, a node maintains (1) a | |||
count of the number of retransmissions and (2) the time of the last | count of the number of retransmissions and (2) the time of the last | |||
retransmission. | retransmission. | |||
Packets are removed from the buffer when an acknowledgment | Packets are removed from the buffer when an acknowledgment | |||
is received, or when the number of retransmissions exceeds | is received, or when the number of retransmissions exceeds | |||
MAX_EXPLICIT_REXMIT. In the later case, the removal of the packet | DSR_MAXRXTSHIFT. In the later case, the removal of the packet from | |||
from the Retransmission Buffer should result in a Route Error being | the Retransmission Buffer SHOULD result in a Route Error being | |||
returned to the initial source of the packet (Section 6.2). | returned to the initial source of the packet (Section 7.5). | |||
5. Packet Formats | ||||
5.1. Destination Options Headers | 6. Packet Formats | |||
Dynamic Source Routing makes use of four options carrying control | Dynamic Source Routing makes use of four options carrying control | |||
information that can be piggybacked in any existing IP packet. | information that can be piggybacked in any existing IP packet. | |||
The mechanism used for these options is based on the design of | ||||
the Destination Option mechanism in IPv6 [4]. This notion of | The mechanism used for these options is based on the design of the | |||
a Destination Option must be build in to a IPv4 protocol stack. | Hop-by-Hop and Destination Options mechanisms in IPv6 [4]. The | |||
Specifically, the Protocol field in the IP header should be used to | ability to generate and process such options must be added to an IPv4 | |||
indicate that a Destination Options header exists between the IP | protocol stack. Specifically, the Protocol field in the IP header | |||
header and the remaining portion of a packet's payload (such as a | is used to indicate that a Hop-by-Hop Options or Destination Options | |||
transport layer header). The Next Header field in the Destination | extension header exists between the IP header and the remaining | |||
Options header will then indicate the type of header that follows it | portion of a packet's payload (such as a transport layer header). | |||
in a packet. | The Next Header field in each extension header will then indicate the | |||
type of header that follows it in a packet. | ||||
6.1. Destination Options Headers | ||||
The Destination Options header is used to carry optional information | The Destination Options header is used to carry optional information | |||
that need be examined only by a packet's destination node(s). The | that need be examined only by a packet's destination node(s). The | |||
Destination Options header is identified by a Next Header value of 60 | Destination Options header is identified by a Next Header (or | |||
in the immediately preceding header, and has the following format: | Protocol) value of 60 in the immediately preceding header, and has | |||
the following format: | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Next Header | Hdr Ext Len | | | | Next Header | Hdr Ext Len | | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | |||
| | | | | | |||
. . | . . | |||
. Options . | . Options . | |||
. . | . . | |||
| | | | | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
The following destination options are used by the Dynamic Source | Next Header | |||
Routing protocol: | ||||
- DSR Route Request option (Section 5.1.1) | 8-bit selector. Identifies the type of header immediately | |||
following the Destination Options header. Uses the same values | ||||
as the IPv4 Protocol field [15]. | ||||
- DSR Route Reply option (Section 5.1.2) | Hdr Ext Len | |||
- DSR Route Error option (Section 5.1.3) | 8-bit unsigned integer. Length of the Destination Options | |||
header in 4-octet units, not including the first 8 octets. | ||||
- DSR Acknowledgement option (Section 5.1.4) | Options | |||
All of these destination options MAY appear multiple times within a | Variable-length field, of length such that the complete | |||
Destination Options header is an integer multiple of 4 octets | ||||
long. Contains one or more TLV-encoded options. | ||||
The following destination option is used by the Dynamic Source | ||||
Routing protocol: | ||||
- DSR Route Request option (Section 6.1.1) | ||||
This destination option MUST NOT appear multiple times within a | ||||
single Destination Options header. | single Destination Options header. | |||
5.1.1. DSR Route Request Option | 6.1.1. DSR Route Request Option | |||
The DSR Route Request destination option is encoded in | The DSR Route Request destination option is encoded in | |||
type-length-value (TLV) format as follows: | type-length-value (TLV) format as follows: | |||
0 1 2 3 | 0 1 2 3 | |||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Option Type | Option Length | Identification | | | Option Type | Option Length | Identification | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Target Address | | | Target Address | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Index[1] | Index[2] | Index[3] | Index[4] | | |C| IN Index[1] |C| IN Index[2] |C| IN Index[3] |C| IN Index[4] | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
|C|OUT Index[1] |C|OUT Index[2] |C|OUT Index[3] |C|OUT Index[4] | | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Address[1] | | | Address[1] | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Address[2] | | | Address[2] | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Address[3] | | | Address[3] | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Address[4] | | | Address[4] | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Index[5] | Index[6] | Index[7] | Index[8] | | |C| IN Index[5] |C| IN Index[6] |C| IN Index[7] |C| IN Index[8]| | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
|C|OUT Index[5] |C|OUT Index[6] |C| OUT Index[7] |C|OUT Index[8]| | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| Address[5] | | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| ... | | | ... | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
IP fields: | IP fields: | |||
Source Address | Source Address | |||
MUST be the home address of the node transmitting this packet. | MUST be the home address of the node originating this packet. | |||
Intermediate nodes that repropagate the request do not change | ||||
this field. | ||||
Destination Address | Destination Address | |||
MUST be the limited broadcast address (255.255.255.255). | MUST be the limited broadcast address (255.255.255.255). | |||
Hop Limit (TTL) | Hop Limit (TTL) | |||
Can be varied from 1 to 255, for example to implement | Can be varied from 1 to 255, for example to implement | |||
expanding-ring searches. | expanding-ring searches. | |||
Route Request fields: | Route Request fields: | |||
Option Type | Option Type | |||
???. A node that does not understand this option MUST discard | ???. A node that does not understand this option MUST discard | |||
the packet (the top two bits must be 01). | the packet and the Option Data may change en-route (the top | |||
three bits are 011). | ||||
Option Length | Option Length | |||
8-bit unsigned integer. Length of the option, in octets, | 8-bit unsigned integer. Length of the option, in octets, | |||
excluding the Option Type and Option Length fields. | excluding the Option Type and Option Length fields. | |||
Identification | Identification | |||
A unique value generated by the initiator (original sender) | A unique value generated by the initiator (original sender) | |||
of the Route Request. This value allows a recipient to | of the Route Request. This value allows a recipient to | |||
determine whether or not it has recently seen this a copy of | determine whether or not it has recently seen this a copy of | |||
this Request; if it has, the packet is simply discarded. When | this Request; if it has, the packet is simply discarded. When | |||
propagating a Route Request, this field MUST be copied from the | propagating a Route Request, this field MUST be copied from the | |||
received copy of the Request being forwarded. | received copy of the Request being forwarded. | |||
Target Address | Target Address | |||
The home address of the node that is the target of the Route | The home address of the node that is the target of the Route | |||
Request. | Request. | |||
Index[1..n] | Change Interface (C) bit[1..n] | |||
Index[i] is the interface index of the ith hop recorded in in | A flag associated with each interface index that indicates | |||
the Route Request option (in Address[i]). | whether or not the corresponding node repropagated the Request | |||
over a different physical interface type than over which it | ||||
received the Request. | ||||
IN Index[1..n] | ||||
IN Index[i] is the index of the interface over which the node | ||||
indicated by Address[i] received the Route Request option. | ||||
These are used to record a reverse route from the target of | ||||
the request to the originator, over which a Route Reply MAY be | ||||
sent. | ||||
OUT Index[1..n] | ||||
OUT Index[i] is the interface index that the node indicated by | ||||
Address[i-1] used when rebroadcasting the Route Request option. | ||||
Address[1..n] | Address[1..n] | |||
Address[i] is the home address of the ith hop recorded in the | Address[i] is the home address of the ith hop recorded in the | |||
Route Request option. | Route Request option. | |||
5.1.2. DSR Route Reply Option | 6.2. Hop-by-Hop Options Headers | |||
The DSR Route Reply destination option is encoded in | The Hop-by-Hop Options header is used to carry optional information | |||
type-length-value (TLV) format as follows: | that must be examined by every node along a packet's delivery path. | |||
The Hop-by-Hop Options header is identified by a Next Header (or | ||||
Protocol) value of ??? in the IP header, and has the following | ||||
format: | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| Next Header | Hdr Ext Len | | | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | ||||
| | | ||||
. . | ||||
. Options . | ||||
. . | ||||
| | | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
Next Header | ||||
8-bit selector. Identifies the type of header immediately | ||||
following the Hop-by-Hop Options header. Uses the same values | ||||
as the IPv4 Protocol field [15]. | ||||
Hdr Ext Len | ||||
8-bit unsigned integer. Length of the Hop-by-Hop Options | ||||
header in 4-octet units, not including the first 8 octets. | ||||
Options | ||||
Variable-length field, of length such that the complete | ||||
Hop-by-Hop Options header is an integer multiple of 4 octets | ||||
long. Contains one or more TLV-encoded options. | ||||
The following hop-by-hop options are used by the Dynamic Source | ||||
Routing protocol: | ||||
- DSR Route Reply option (Section 6.2.1) | ||||
- DSR Route Error option (Section 6.2.2) | ||||
- DSR Acknowledgment option (Section 6.2.3) | ||||
All of these destination options MAY appear one or more times within | ||||
a single Hop-by-Hop Options header. | ||||
6.2.1. DSR Route Reply Option | ||||
The DSR Route Reply hop-by-hop option is encoded in type-length-value | ||||
(TLV) format as follows: | ||||
0 1 2 3 | 0 1 2 3 | |||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Option Type | Option Length |R|F| Reserved | | | Option Type | Option Length | Reserved | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Target Address | | | Target Address | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Index[1] | Index[2] | Index[3] | Index[4] | | |C|OUT Index[1] |C|OUT Index[2] |C|OUT Index[3] |C|OUT Index[4] | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Address[1] | | | Address[1] | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Address[2] | | | Address[2] | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Address[3] | | | Address[3] | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Address[4] | | | Address[4] | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Index[5] | Index[6] | Index[7] | Index[8] | | |C|OUT Index[5] |C|OUT Index[6] |C|OUT Index[7] |C|OUT Index[8] | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| Address[5] | | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| ... | | | ... | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
Option Type | Option Type | |||
???. A node that does not understand this option should ignore | ???. A node that does not understand this option should ignore | |||
this option and continue processing the packet (the top two | this option and continue processing the packet, and the Option | |||
bits should be 00). | Data does not change en-route (the top three bits are 000). | |||
Option Length | Option Length | |||
8-bit unsigned integer. Length of the option, in octets, | 8-bit unsigned integer. Length of the option, in octets, | |||
excluding the Option Type and Option Length fields. | excluding the Option Type and Option Length fields. | |||
Router (R) | ||||
If the Router (R) bit is set, the last address recorded in this | ||||
header is the home address of a router that believes it can | ||||
reach the Target Address specified in the Route Request packet. | ||||
Foreign Agent (F) | ||||
If the Foreign Agent (F) bit is set, the last address recorded | ||||
in this header is the home address of an IETF Mobile IP [9] | ||||
Foreign Agent. The Router (R) bit and the Foreign Agent (F) | ||||
bit are mutually exclusive as (F) implies (R). | ||||
Reserved | Reserved | |||
Sent as 0; ignored on reception. | Sent as 0; ignored on reception. | |||
Target Address | Target Address | |||
The home address of the node that is the ultimate destination | The home address of the node to which the Route Reply must be | |||
of the source route contained in the Route Reply. | delivered. | |||
Index[1..n] | Change Interface (C) bit[1..n] | |||
Index[i] is the interface index of the ith hop listed in the | If the C bit associated with a node N is set, it implies N will | |||
Route Reply option (in Address[i]). | be forwarding the packet out a different interface than the one | |||
over which it was received (i.e., the node sending the packet | ||||
to N should not expect a passive acknowledgment). | ||||
OUT Index[1..n] | ||||
OUT Index[i] is the interface index of the ith hop listed in | ||||
the Route Reply option. It denotes the interface that should | ||||
be used by Address[i-1] to reach Address[i] when using the | ||||
specified source route. | ||||
Address[1..n] | Address[1..n] | |||
Address[i] is the home address of the ith hop listed in the | Address[i] is the home address of the ith hop listed in the | |||
Route Reply option. | Route Reply option. | |||
5.1.3. DSR Route Error Option | 6.2.2. DSR Route Error Option | |||
The DSR Route Error destination option is encoded in | The DSR Route Error hop-by-hop option is encoded in type-length-value | |||
type-length-value (TLV) format as follows: | (TLV) format as follows: | |||
0 1 2 3 | 0 1 2 3 | |||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Option Type | Option Length | Index | | | Option Type | Option Length | Index | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Originator Address | | | Error Source Address | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| From Hop Address | | | Error Destination Address | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Next Hop Address | | | Unreachable Node Address | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
Option Type | Option Type | |||
???. A node that does not understand this option should ignore | ???. A node that does not understand this option should ignore | |||
the option and continue processing the packet (the top two bits | the option and continue processing the packet, and the Option | |||
must be 00). | Data does not change en-route (the top three bits are 000). | |||
Option Length | Option Length | |||
8-bit unsigned integer. Length of the option, in octets, | 8-bit unsigned integer. Length of the option, in octets, | |||
excluding the Option Type and Option Length fields. | excluding the Option Type and Option Length fields. | |||
Index | Index | |||
The interface index of the network interface over which the | The interface index of the network interface over which the | |||
link from the From Hop Address node to the Next Hop Node is | node designated by Error Source Address tried to forward a | |||
being reported as broken by this Route Error option. This | packet to the node designated by Unreachable Node Address. | |||
Index refers to an interface on the From Hop Address node. | ||||
Originating Address | Error Source Address | |||
The home address of the node which originated the packet that | The home address of the node originating the Route Error (e.g., | |||
could not be forwarded. | the node that attempted to forward a packet and discovered the | |||
link failure). | ||||
From Hop Address | Error Destination Address | |||
The home address of the node that attempted to forward a packet | The home address of the node to which the Route Error must be | |||
and discovered the link failure. | delivered (e.g, the node that generated the routing information | |||
claiming that the hop Error Source Address to Unreachable Node | ||||
Address was a valid hop). | ||||
Next Hop Address | Unreachable Node Address | |||
The home address of the node that was found to be unreachable | The home address of the node that was found to be unreachable | |||
(the next hop neighbor to which the node at Originating Address | (the next hop neighbor to which the node at ``Error Source | |||
was attempting to transmit the packet). | Address'' was attempting to transmit the packet). | |||
5.1.4. DSR Acknowledgment Option | 6.2.3. DSR Acknowledgment Option | |||
The DSR Acknowledgment destination option is encoded in | The DSR Acknowledgment hop-by-hop option is encoded in | |||
type-length-value (TLV) format as follows: | type-length-value (TLV) format as follows: | |||
0 1 2 3 | 0 1 2 3 | |||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| Option Type | Option Length | | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Option Type | Option Length | Identification | | | Identification | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Address[1] | | | ACK Source Address | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| ACK Destination Address | | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| Data Source Address | | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
Option Type | Option Type | |||
???. A node that does not understand this option should ignore | ???. A node that does not understand this option should ignore | |||
the option and continue processing the packet (the top two bits | the option and continue processing the packet, and the Option | |||
must be 00). | Data does not change en-route (the top three bits are 000). | |||
Option Length | Option Length | |||
8-bit unsigned integer. Length of the option, in octets, | 8-bit unsigned integer. Length of the option, in octets, | |||
excluding the Option Type and Option Length fields. | excluding the Option Type and Option Length fields. | |||
Identification | Identification | |||
A unique value assigned by the originator of the packet. | A 32-bit value that when taken in conjunction with Data Source | |||
This value is used to match explicit acknowledgments to the | Address, uniquely identifies the packet being acknowledged. | |||
corresponding packet. | ||||
Address[1] | The Identification value is computed as ((ip_id << 16) | ip_off) | |||
where ip_id is the value of the 16-bit Identification field in | ||||
the IP header of the packet being acknowledged, and ip_off is | ||||
the value of the 13-bit Fragment Offset field in the IP header | ||||
of the packet being acknowledged. | ||||
The home address of the original source of the IP packet. | When constructing the Identification, ip_id and ip_off MUST be | |||
in host byte-order. The entire Identification value MUST then | ||||
be converted to network byte-order before being placed in the | ||||
Acknowledgment option. | ||||
5.2. DSR Routing Header | ACK Source Address | |||
The home address of the node originating the Acknowledgment. | ||||
ACK Destination Address | ||||
The home address of the node to which the Acknowledgment must | ||||
be delivered. | ||||
Data Source Address | ||||
The IP Source Address of the packet being acknowledged. | ||||
6.3. DSR Routing Header | ||||
As specified for IPv6 [4], a Routing header is used by a source to | As specified for IPv6 [4], a Routing header is used by a source to | |||
list one or more intermediate nodes to be "visited" on the way to | list one or more intermediate nodes to be ``visited'' on the way to | |||
a packet's destination. This function is similar to IPv4's Loose | a packet's destination. This function is similar to IPv4's Loose | |||
Source and Record Route option, but the Routing header does not | Source and Record Route option, but the Routing header does not | |||
record the route taken as the packet is forwarded. The specific | record the route taken as the packet is forwarded. The specific | |||
processing steps required to implement the Routing header must be | processing steps required to implement the Routing header must be | |||
added to an IPv4 protocol stack. The Routing header is identified by | added to an IPv4 protocol stack. The Routing header is identified by | |||
a Next Header value of 43 in the immediately preceding header, and | a Next Header value of 43 in the immediately preceding header, and | |||
has the following format: | has the following format: | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Next Header | Hdr Ext Len | Routing Type | Segments Left | | | Next Header | Hdr Ext Len | Routing Type | Segments Left | | |||
skipping to change at page 17, line 33 | skipping to change at page 20, line 33 | |||
. . | . . | |||
| | | | | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
The type specific data for a Routing Header carrying a DSR Source | The type specific data for a Routing Header carrying a DSR Source | |||
Route is: | Route is: | |||
0 1 2 3 | 0 1 2 3 | |||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
|R| Reserved | Identification | | |R|S| Reserved | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Index[1] | Index[2] | Index[3] | Index[4] | | |C|OUT Index[1] |C|OUT Index[2] |C|OUT Index[3] |C|OUT Index[4] | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Address[1] | | | Address[1] | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Address[2] | | | Address[2] | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Address[3] | | | Address[3] | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Address[4] | | | Address[4] | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Index[5] | Index[6] | Index[7] | Index[8] | | |C|OUT Index[5] |C|OUT Index[6] |C|OUT Index[7] |C|OUT Index[8] | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| Address[5] | | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| ... | | | ... | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
Routing Header Fields: | Routing Header Fields: | |||
Next Header | Next Header | |||
8-bit selector. Identifies the type of header immediately | 8-bit selector. Identifies the type of header immediately | |||
following the Routing Request header. | following the Routing header. | |||
Hdr Ext Len | Hdr Ext Len | |||
8-bit unsigned integer. Length of the Routing header in | 8-bit unsigned integer. Length of the Routing header in | |||
8-octet units, not including the first 8 octets. | 4-octet units, not including the first 8 octets. | |||
Routing Type | Routing Type | |||
??? | ??? | |||
Segments Left | Segments Left | |||
Number of route segments remaining, i.e., number of explicitly | Number of route segments remaining, i.e., number of explicitly | |||
listed intermediate nodes still to be visited before reaching | listed intermediate nodes still to be visited before reaching | |||
the final destination. | the final destination. | |||
Type Specific Fields: | Type Specific Fields: | |||
Acknowledgment Request (R) | Acknowledgment Request (R) | |||
The Acknowledgment Request (R) bit is set to request an | The Acknowledgment Request (R) bit is set to request an | |||
explicit acknowledgment from the next hop. | explicit acknowledgment from the next hop. After processing | |||
the Routing Header, The IP Destination Address lists the | ||||
address of the next hop. | ||||
Salvaged Packet (S) | ||||
The Salvaged Packet (S) bit indicates that this packet has been | ||||
salvaged by an intermediate node, and thus that this Routing | ||||
Header was generated by Address[1] and not the IP Source | ||||
Address (Section 7.5.5). | ||||
Reserved | Reserved | |||
Sent as 0; ignored on reception. | Sent as 0; ignored on reception. | |||
Identification | Change Interface (C) bit[1..n] | |||
A unique value assigned by the originator of the packet. This | If the C bit associated with a node N is set, it implies N will | |||
value is used to match acknowledgments (passive or explicit) to | be forwarding the packet out a different interface than the one | |||
the appropriate packet. | over which it was received (i.e., the node sending the packet | |||
to N should not expect a passive acknowledgment and MAY wish to | ||||
set the R bit). | ||||
Index[1..n] | OUT Index[1..n] | |||
Index[i] is the interface index of the ith hop in the Routing | Index[i] is the interface index that the node indicated | |||
header. | by Address[i-1] must use when transmitting the packet to | |||
Address[i]. Index[1] indicates which interface the node | ||||
indicated by the IP Source Address uses to transmit the packet. | ||||
Address[1..n] | Address[1..n] | |||
Address[i] is the home address of the ith hop in the Routing | Address[i] is the home address of the ith hop in the Routing | |||
header. | header. | |||
6. Detailed Operation | Note that Address[1] is the first intermediate hop along the route. | |||
The address of the originating node is the IP Source Address. The | ||||
only exception to this rule is for packets that are salvaged, as | ||||
described in Section 7.5.5. A packet that has been salvaged has an | ||||
alternate route placed on it by an intermediate node in the network, | ||||
and in this case, the address of the originating node (the salvaging | ||||
node) is Address[1]. Salvaged packets are indicated by setting the S | ||||
bit in the DSR Routing header. | ||||
6.1. Route Discovery | 7. Detailed Operation | |||
Route Discovery is the demand-driven process by which nodes actively | 7.1. Originating a Data Packet | |||
When node A originates a packet, the following steps MUST be taken | ||||
before transmitting the packet: | ||||
1. If the destination address is a multicast address, piggyback the | ||||
data packet on a Route Request targeting the multicast address. | ||||
The following fields MUST be initialized as specified: | ||||
IP.Source_Address = Home address of node A | ||||
IP.Destination_Address = 255.255.255.255 | ||||
Request.Target_Address = Multicast destination address | ||||
DONE. | ||||
2. Otherwise, call Route_Cache.Get() to determine if there is a | ||||
cached source route to the destination. | ||||
3. If the cached route indicates that the destination is directly | ||||
reachable over one hop, no Routing Header should be added to the | ||||
packet. Initialize the following fields: | ||||
IP.Source_Address = Home address of node A | ||||
IP.Destination_Address = Home address of the Destination | ||||
DONE. | ||||
4. Otherwise, if the cached route indicates that multiple hops are | ||||
required to reach the destination, insert a Routing Header into | ||||
the packet as described in Section 7.2. DONE. | ||||
5. Otherwise, if no cached route to the destination is found, insert | ||||
the packet into the Send Buffer and initiate Route Discovery as | ||||
described in Section 7.4. | ||||
7.2. Originating a Packet with a DSR Routing Header | ||||
When a node originates a packet with a Routing Header, the address | ||||
of the first hop in the source route MUST be listed as the IP | ||||
Destination Address as well as Address[1] in the Routing Header. | ||||
The final destination of the packet is listed as the last hop | ||||
in the Routing Header (Address[n]). At each intermediate hop i, | ||||
Address[i] is copied into the IP Destination Address and the packet | ||||
is retransmitted. | ||||
For example, suppose node A originates a packet destined for node D | ||||
that should pass through intermediate hops B and C. The packet MUST | ||||
be initialized as follows: | ||||
IP.Source_Address = Home address of node A | ||||
IP.Destination_Address = Home address of node B | ||||
RT.Segments_Left = 2 | ||||
RT.Out_Index[1] = Interface index used by A to reach B | ||||
RT.Out_Index[2] = Interface index used by B to reach C | ||||
RT.Out_Index[3] = Interface index used by C to reach D | ||||
RT.Address[1] = Home address of node B | ||||
RT.Address[2] = Home address of node C | ||||
RT.Address[3] = Home address of node D | ||||
7.3. Processing a Routing Header | ||||
Excluding the exceptions listed here, a DSR Routing Header is | ||||
processed using the same rules as outlined for Type 0 Routing Headers | ||||
in IPv6 [4]. The Routing Header is only processed by the node whose | ||||
address appears as the IP destination of the packet. The following | ||||
additional rules apply to processing the type specific data of a DSR | ||||
Source Route: | ||||
Let | ||||
SegLft = the value of Segments Left when the packet was received | ||||
NumAddrs = the total number of addresses in the Routing Header | ||||
1. The address of the next hop, Address[NumAddrs - SegLft + 1], | ||||
is copied into the IP.Destination_Address of the packet. The | ||||
existing IP.Destination_Address is NOT copied back into the | ||||
Address list of the Routing Header. | ||||
2. The interface used to transmit the packet to its next hop from | ||||
this node MUST be the interface denoted by Index[NumAddrs - | ||||
SegLft + 1]. | ||||
3. If the Acknowledgment Request (R) bit is set, the node MUST | ||||
transmit a packet containing the DSR Acknowledgment option to | ||||
the previous hop, Address[NumAddrs - SegLft - 1], performing | ||||
Route Discovery if necessary. (Address[0] is taken as the | ||||
IP.Source_Address) | ||||
4. Perform Route Maintenance by verifying that the packet was | ||||
received by the next hop as described in Section 7.5. | ||||
7.4. Route Discovery | ||||
Route Discovery is the on-demand process by which nodes actively | ||||
obtain source routes to destinations to which they are actively | obtain source routes to destinations to which they are actively | |||
attempting to send packets. The destination node for which a Route | attempting to send packets. The destination node for which a | |||
Discovery is initiated to discover a route is known as the "target" | Route Discovery is initiated is known as the "target" of the Route | |||
of the Route Discovery. A Route Discovery for a destination SHOULD | Discovery. A Route Discovery for a destination SHOULD NOT be | |||
NOT be initiated unless the initiating node has an unexpired packet | initiated unless the initiating node has a packet in the Send Buffer | |||
to be delivered to that destination. | requiring delivery to that destination. A Route Discovery for a | |||
given target node MUST NOT be initiated unless permitted by the | ||||
rate-limiting information contained in the Route Request Table. | ||||
After each Route Discovery attempt, the interval between successive | ||||
Route Discoveries for this target must be doubled, up to a maximum of | ||||
MAX_REQUEST_PERIOD. | ||||
A Route Discovery for a given target node MUST NOT be initiated | Route Discoveries for a multicast address SHOULD NOT be rate limited, | |||
unless the difference between the current time and the time that a | and SHOULD always be permitted. | |||
Route Discovery was last initiated for destination D is greater than | ||||
the backoff interval currently listed in the Node Information Cache | ||||
for node D. After each Route Discovery attempt, the interval between | ||||
successive Route Discoverys must be doubled, up to a maximum of | ||||
MAX_RTDISCOV_INTERVAL. | ||||
The basic Route Discovery algorithm is to originate a single | 7.4.1. Originating a Route Request | |||
Route Request packet as described below that targets the desired | ||||
destination and has a maximum hop limit set to MAX_ROUTE_LEN. | ||||
6.1.1. Originating a Route Request | The basic Route Discovery algorithm for a unicast destination is as | |||
follows: | ||||
A node originates a Route Request for a particular host when it has | 1. Originate a Route Request packet with the IP header Time-to-Live | |||
no route to that host. The Option Length field in the Route Request | field initialized to 1. This type of Route Request is called a | |||
option MUST be set to 6, the Identification field MUST be set to a | non-propagating Route Request and allows the originator of the | |||
unique number, and the Target Address field MUST contain the Home | Request to inexpensively query the route caches of each of its | |||
Address of the node for which a route is being requested. | neighbors for a route to the destination. | |||
6.1.2. Processing a Route Request Option | 2. If a Route Reply is received in response to the non-propagating | |||
Request, use the returned source route to transmit all packets | ||||
for the destination that are in the Send Buffer. DONE. | ||||
Let P1 be the received packet containing a Route Request option. | 3. Otherwise, if no Route Reply is received within | |||
Let P2 be a packet containing a corresponding Route Reply. A Route | RING0_REQUEST_TIMEOUT seconds, transmit a Route Request | |||
Request option is processed as follows: | with the IP header Time-to-Live field initialized to | |||
MAX_ROUTE_LEN. This type of Route Request is called a propagating | ||||
Route Request. Update the information in the Route Request | ||||
Table, to double the amount of time before any subsequent Route | ||||
Discovery attempt to this target. | ||||
1. Determine the originator of the Route Request. | 4. If no Route Reply is received within the time interval indicated | |||
by the Route Request Table, GOTO step 1. | ||||
If no addresses are presently listed in P1.REQUEST.Address[], | The Route Request option SHOULD be initialized as follows: | |||
then P1.Source_Address identifies the originator of the Route | ||||
Request. Otherwise, P1.REQUEST.Address[1] identifies the | ||||
originator of the Route Request. | ||||
2. If the combination (Originator Address, P1.REQUEST.Identification) | IP.Source_Address = This node's home address | |||
is in the node's cache of recently seen (Address, Identification) | IP.Destination_Address = 255.255.255.255 | |||
pairs, then discard the packet. DONE. | Request.Target = Home address of intended destination | |||
Request.OUT_Index[1] = Index of interface used to transmit the Request | ||||
3. If the home address of this node is already listed in | The behavior of a node processing a packet containing both a Routing | |||
P1.REQUEST.Address[], then discard the packet. DONE. | Header and a Route Request Destination option is unspecified. | |||
Packets SHOULD NOT contain both a Routing Header and a Route Request | ||||
Destination option. [This is not exactly true: A Route Request | ||||
option appearing in the second Destination Options header that IPv6 | ||||
allows after the Routing Header would probably do-what-you-mean, | ||||
though we have not triple-checked it yet. Namely, it would allow the | ||||
originator of a route discovery to unicast the request to some other | ||||
node, where it would be released and begin the flood fill. We call | ||||
this a Route Request Blossom since the unicast portion of the path | ||||
looks like a stem on the blossoming flood-fill of the request.] | ||||
4. If P1.REQUEST.Target_Address matches the home address of | Packets containing a Route Request Destination option SHOULD NOT be | |||
this node, then this packet contains a complete source route | retransmitted, SHOULD NOT request an explicit DSR Acknowledgment by | |||
setting the R bit, SHOULD NOT expect a passive acknowledgment, and | ||||
SHOULD NOT be placed in the Retransmission Buffer. The repeated | ||||
transmission of packets containing a Route Request Destination option | ||||
is controlled solely by the logic described in this section. | ||||
7.4.2. Processing a Route Request Option | ||||
When a node A receives a packet containing a Route Request option, | ||||
the Route Request option is processed as follows: | ||||
1. If Request.Target_Address matches the home address of this node, | ||||
then the Route Request option contains a complete source route | ||||
describing the path from the initiator of the Route Request to | describing the path from the initiator of the Route Request to | |||
this node. | this node. | |||
(a) Send a Route Reply as described in Section 6.1.3. | (a) Send a Route Reply as described in Section 7.4.4. | |||
(b) If P1.REQUEST.Next_Header indicates No Next Header, DONE. | (b) Continue processing the packet in accordance with the Next | |||
Header value contained in the Destination Option extension | ||||
header. DONE. | ||||
(c) Otherwise, swap P1.REQUEST.Target_Address and | 2. Otherwise, if the combination (IP.Source_Address, | |||
P1.Source_Address and pass the packet up the protocol | Request.Identification) is found in the Route Request | |||
stack. DONE. | Table, then discard the packet, since this is a copy of a | |||
recently seen Route Request. DONE. | ||||
5. Set P1.REQUEST.Address[n+1] = home address of this node. | 3. Otherwise, if Request.Target_Address is a multicast address then: | |||
Re-broadcast the Route Request packet jittered by T milliseconds, | ||||
where T is a uniformly distributed, random number between 0 and | (a) If node A is a member of the multicast group indicated by | |||
Request.Target_Address, then create a copy of the packet, | ||||
setting IP.Destination_Address = REQUEST.Target_Address, and | ||||
continue processing the copy of the packet in accordance with | ||||
the Next Header field of the Destination option. | ||||
(b) If IP.TTL is non-zero, decrement IP.TTL, and retransmit the | ||||
packet. DONE. | ||||
(c) Otherwise, discard the packet. DONE. | ||||
4. Otherwise, if the home address of node A is already listed in | ||||
the Route Request (IP.Source_Address or Request.Address[]), then | ||||
discard the packet. DONE. | ||||
5. Let | ||||
m = number of addresses currently in the Route Request option | ||||
n = m + 1 | ||||
6. Otherwise, append the home address of node A to the Route Request | ||||
option (Request.Address[n]). | ||||
7. Set Request.IN_Index[n] = index of interface packet was received | ||||
on. | ||||
8. If a source route to Request.Target_Address is found in our Route | ||||
Cache and the rules of Section 7.4.3 permit it, return a Cached | ||||
Route Reply as described in Section 7.4.3. DONE. | ||||
9. Otherwise, for each interface on which the node is configured to | ||||
participate in a DSR ad hoc network: | ||||
(a) Make a copy of the packet containing the Route Request. | ||||
(b) Set Request.OUT_Index[n+1] = index of the interface. | ||||
(c) If the outgoing interface is different from the incoming | ||||
interface, then set the C bit on both Request.OUT_Index[n+1] | ||||
and Request.IN_Index[n] | ||||
(d) Link-layer re-broadcast the packet containing the Route | ||||
Request on the interface jittered by T milliseconds, where | ||||
T is a uniformly distributed, random number between 0 and | ||||
BROADCAST_JITTER. DONE. | BROADCAST_JITTER. DONE. | |||
6.1.3. Originating a Route Reply | 7.4.3. Generating Route Replies using the Route Cache | |||
Let P1 be the received packet containing a Route Request option. Let | A node SHOULD use its Route Cache to avoid propagating a Route | |||
P2 be a packet containing a corresponding Route Reply. A Route Reply | Request packet received from another node. In particular, suppose a | |||
is transmitted in response to a Route Request as follows: | node receives a Route Request packet for which it is not the target | |||
and which it does not discard based on the logic of Section 7.4.2. | ||||
If the node has a Route Cache entry for the target of the Request, | ||||
it SHOULD append this cached route to the accumulated route record | ||||
in the packet and return this route in a Route Reply packet to | ||||
the initiator without propagating (re-broadcasting) the Route | ||||
Request. Thus, for example, if node F in the example network shown | ||||
in Figure 7.4.3 needs to send a packet to node D, it will initiate | ||||
a Route Discovery and broadcast a Route Request packet. If this | ||||
broadcast is received by node A, node A can simply return a Route | ||||
Reply packet to F containing the complete route to D consisting of | ||||
the sequence of hops: A, B, C, and D. | ||||
1. If P1.REQUEST.Address[] does not contain any hops, then this node | Before transmitting a Route Reply packet that was generated using | |||
is only a single hop from the originator of the Route Request. | information from its Route Cache, a node MUST verify that: | |||
Build a Route Replay packet as follows: | ||||
P2.Destination_Address = P1.Source_Address | 1. The resulting route contains no loops. | |||
P2.Source_Address = P1.REQUEST.Target_Address | ||||
GOTO 3. | 2. The node issuing the Route Reply is listed in the route that it | |||
specifies in its Reply. This increases the probability that the | ||||
route is valid, since the node in question should have received | ||||
a Route Error if this route stopped working. Additionally, this | ||||
requirement means that a Route Error traversing the route will | ||||
pass through the node that issued the Reply based on stale cache | ||||
data, which is critical for ensuring stale data is removed from | ||||
caches in a timely manner. Without this requirement, the next | ||||
Route Discovery initiated by the original requester might also be | ||||
contaminated by a Route Reply from this node containing the same | ||||
stale route. | ||||
7.4.4. Originating a Route Reply | ||||
Let REQPacket denote a packet received by node A that | ||||
contains a Route Request option which lists node A as the | ||||
REQPacket.Request.Target_Address. Let REPPacket be a packet | ||||
transmitted by node A that contains a corresponding Route Reply. The | ||||
Route Reply option transmitted in response to a Route Request MUST be | ||||
initialized as follows: | ||||
B->C->D | ||||
+---+ +---+ +---+ +---+ | ||||
| A |---->| B |---->| C |---->| D | | ||||
+---+ +---+ +---+ +---+ | ||||
+---+ | ||||
| F | +---+ | ||||
+---+ | E | | ||||
+---+ | ||||
Figure 1: An example network where A knows a | ||||
route to D via B and C. | ||||
1. If REQPacket.Request.Address[] does not contain any hops, then | ||||
node A is only a single hop from the originator of the Route | ||||
Request. Build a Route Reply packet as follows: | ||||
REPPacket.IP.Source_Address = REQPacket.Request.Target_Address | ||||
REPPacket.Reply.Target = REQPacket.IP.Source_Address | ||||
REPPacket.Reply.OUT_Index[1] = REQPacket.Request.OUT_index[1] | ||||
REPPacket.Reply.OUT_C_bit[1] = REQPacket.Request.OUT_C_bit[1] | ||||
REPPacket.Reply.Address[1] = The home address of node A | ||||
GOTO step 3. | ||||
2. Otherwise, build a Route Reply packet as follows: | 2. Otherwise, build a Route Reply packet as follows: | |||
P2.Destination_Address = P1.REQUEST.Address[1] | REPPacket.IP.Source_Address = The home address of node A | |||
P2.Source_Address = P1.REQUEST.Target_Address | REPPacket.Reply.Target = REQPacket.IP.Source_Address | |||
P2.REPLY.Address[1..n] = P1.REQUEST.Address[1..n] | REPPacket.Reply.OUT_Index[1..n]= REQPacket.Request.OUT_index[1..n] | |||
REPPacket.Reply.OUT_C_bit[1..n]= REQPacket.Request.OUT_C_bit[1..n] | ||||
REPPacket.Reply.Address[1..n] = REQPacket.Request.Address[1..n] | ||||
3. Transmit the Route Reply jittered by T milliseconds, where | 3. Send the Route Reply jittered by T milliseconds, where T | |||
T is a uniformly distributed, random number between 0 and | is a uniformly distributed random number between 0 and | |||
BROADCAST_JITTER. DONE. | BROADCAST_JITTER. DONE. | |||
If sending a Route Reply packet to the originator of the Route | If sending a Route Reply packet to the originator of the Route | |||
Request requires performing a Route Discovery, the Route Reply | Request requires performing a Route Discovery, the Route Reply | |||
destination option MUST be piggybacked on the packet that contains | hop-by-hop option MUST be piggybacked on the packet that contains the | |||
the Route Request. This prevents a loop wherein the target of the | Route Request. This prevents a loop wherein the target of the new | |||
Route Request (which was itself the originator of the original Route | Route Request (which was itself the originator of the original Route | |||
Request) must do another Route Request in order to return its Route | Request) must do another Route Request in order to return its Route | |||
Reply. | Reply. | |||
If sending the Route Reply to the originator of the Route Request | If sending the Route Reply to the originator of the Route Request | |||
does not require performing Route Discovery, nodes SHOULD send a | does not require performing Route Discovery, a node SHOULD send a | |||
unicast Route Reply in response to every Route Request targeted at | unicast Route Reply in response to every Route Request targeted at | |||
them. | it. | |||
6.1.4. Processing a Route Reply Option | 7.4.5. Processing a Route Reply Option | |||
Upon receipt of a Route Reply, a node should extract the source route | Upon receipt of a Route Reply, a node should extract the source route | |||
(Address[1..n] + Target Address) and insert this route into its Route | (Target_Address, OUT_Index[1]:Address[1], .. OUT_Index[n]:Address[n] | |||
Cache. Any packets in the Send Buffer that are addressed to Target | ) and insert this route into its Route Cache. All the packets in the | |||
Address SHOULD be processed. | Send Buffer SHOULD be checked to see whether the information in the | |||
Reply allows them to be sent immediately. | ||||
6.2. Route Maintenance | 7.5. Route Maintenance | |||
6.2.1. Originating a Route Error | Route Maintenance requires that whenever a node transmits a data | |||
packet, a Route Reply, or a Route Error, it must verify that the next | ||||
hop (indicated by the Destination IP Address) correctly receives the | ||||
packet. | ||||
If while forwarding a packet with a Routing Header, the next hop | If the sender cannot verify that the next hop received the packet, it | |||
specified in the source route is found to be unreachable, a Route | MUST decide that its link to the next hop is broken and MUST send a | |||
Error packet (Section 5.1.3) MUST be returned to the originator | Route Error to the node responsible for generating the Routing Header | |||
(Address[1]) of the packet. | that contains the broken link (Section 7.5.3). | |||
The forwarding node SHOULD consider the next hop to be unreachable if | The following ways may be used to verify that the next hop correctly | |||
any of the following conditions occurs: | received a packet: | |||
- The failure to receive a passive acknowledgment when such passive | - The receipt of a passive acknowledgment (Section 7.5.1). | |||
acknowledgments had been received previously. | ||||
- The failure to receive an explicitly requested acknowledgment | - The receipt of an explicitly requested acknowledgment | |||
after MAX_EXPLICIT_REXMIT retransmissions. | (Section 7.5.1). | |||
- In link layers providing retransmissions and acknowledgments | - By the presence of positive feedback from the link layer | |||
(e.g., 802.11), a signal from the link layer that it is unable to | indicating that the packet was acknowledged by the next hop | |||
deliver the packet. | (Section 7.5.2). | |||
6.2.2. Processing a Route Error Option | - By the absence of explicit failure notification from the link | |||
layer that provides reliable hop-by-hop delivery such as MACAW or | ||||
802.11 (Section 7.5.2). | ||||
Upon receipt of a Route Error via any mechanism, a node SHOULD remove | Nodes MUST NOT perform Route Maintenance for packets containing a | |||
any route from its Route Cache that uses the hop (From Hop Address, | Route Request option or packets containing only an Acknowledgment | |||
Next Hop Address). | option. Sending Acknowledgments for packets containing only | |||
an Acknowledgment option would create an infinite loop whereby | ||||
acknowledgments would be sent for acknowledgments. Acknowledgments | ||||
should be always sent for packets containing a Routing Header with | ||||
the R bit set (e.g., packets which contain only an Acknowledgment | ||||
and a Routing Header for which the last forwarding hop requires an | ||||
explicit acknowledgment of receipt by the final destination). | ||||
When the Route Error is returned to the Originator Address, the | 7.5.1. Using Network-Layer Acknowledgments | |||
originator must verify that the source route in the Route Error | ||||
packet (From Hop Address...Originator Address) includes the same | ||||
hops as the working prefix of the original packet's source route | ||||
(Originator Address...From Hop Address). If any hop listed in the | ||||
working prefix is not included in the Route Error's source route, | ||||
then the originator must transmit the Route Error back along the | ||||
working prefix (Originator Address...From Hop Address) so that each | ||||
node along the working prefix will remove the invalid route from its | ||||
Route Cache. | ||||
If the node processing a Route Error option discovers its home | For link layers that do not provide explicit failure notification, | |||
address equals the Router Error's Originator Address and the packet | the following steps SHOULD be used by a node A to perform Route | |||
contains an additional nested Route Error, the node MUST perform the | Maintenance. | |||
following steps: | ||||
1. Remove the Route Error being processed from the packet. | When receiving a packet: | |||
2. Copy the Originator Address from the next nested Route Error to | - If the packet contains a Routing Header with the R bit set, send | |||
the IP destination field of the packet. | an explicit acknowledgment as described in Section 7.3. | |||
3. Attach a source route and send the packet to the IP destination, | - If the packet does not contain a Routing Header, the node MUST | |||
performing Route Discovery if needed. | transmit a packet containing the DSR Acknowledgment option | |||
to the previous hop as indicated by the IP.Source_Address. | ||||
Since the receiving node is the final destination, there | ||||
will be no opportunity for the originator to obtain a | ||||
passive acknowledgment, and the receiving node must infer the | ||||
originator's request for an explicit acknowledgment. | ||||
6.2.3. Processing a DSR Acknowledgment Option | When sending a packet: | |||
Upon receipt of a DSR Acknowledgment, a node should remove any packet | 1. Before sending a packet, insert a copy of the packet into the | |||
in its Retransmission Buffer matching the (Address, Identification) | Retransmission Buffer and update the information maintained about | |||
pair found in the Acknowledgment option. If no match is found, the | this packet in the Retransmission Buffer. | |||
Acknowledgment should be silently discarded. | ||||
[I'm supposed to say something intelligent here, but I can't remember | 2. If after processing the Routing Header, RH.Segments_Left is equal | |||
what... -josh] | to 0, then node A MUST set the Acknowledgment Request (R) bit in | |||
the Routing Header before transmitting the packet over its final | ||||
hop. | ||||
6.3. Processing a Routing Header | 3. If after processing the Routing Header and copying | |||
RH.Address[n] to IP.Destination_Address, node A determines that | ||||
RH.OUT_C_bit[n+1] is set, then node A MUST set the Acknowledgment | ||||
Request (R) bit in the Routing Header before transmitting the | ||||
packet (since the C bit was set during Route Discovery by the | ||||
node now listed as the IP.Destination_Address to indicate that | ||||
it will propagate the packet out a different interface, and that | ||||
node A will not receive a passive acknowledgment). | ||||
A DSR Routing Header should be processed in accordance with the steps | 4. Set the retransmission timer for the packet in the Retransmission | |||
outlined for Routing Headers in [4]. The Routing Header is only | Buffer. | |||
processed by the node whose address appears as the IP destination | ||||
of the packet. A few additional rules apply to processing the type | ||||
specific data of a DSR Source Route: | ||||
1. The interface used to transmit the packet MUST be the interface | 5. Transmit the packet. | |||
denoted by Index[n] where Address[n] is the home address of this | ||||
6. If a passive or explicit acknowledgment is received before the | ||||
retransmission timer expires, then remove the packet from the | ||||
Retransmission Buffer and disable the retransmission timer. | ||||
DONE. | ||||
7. Otherwise, when the Retransmission Timer expires, remove the | ||||
packet from the Retransmission Buffer. | ||||
8. If DSR_MAXRXTSHIFT transmissions have been done, then attempt | ||||
to salvage the packet (Section 7.5.5). Also, generate a Route | ||||
Error. DONE. | ||||
9. GOTO step 1. | ||||
7.5.2. Using Link Layer Acknowledgments | ||||
If explicit failure notifications are provided by the link layer, | ||||
then all packets are assumed to be correctly received by the next hop | ||||
and a Route Error is sent only when a explicit failure notification | ||||
is made from the link layer. | ||||
Nodes receiving a packet without a Routing Header do not need to send | ||||
an explicit Acknowledgment to the packet's originator, since the | ||||
link layer will notify the originator if the packet was not received | ||||
properly. | ||||
7.5.3. Originating a Route Error | ||||
If the next hop of a packet is found to be unreachable as described | ||||
in Section 7.5, a Route Error packet (Section 6.2.2) MUST be returned | ||||
to the node whose cache generated the information used to route the | ||||
packet. | ||||
When a node A generates a Route Error for packet P, it MUST | ||||
initialize the fields in the Route Error as follows: | ||||
Error.Source_Address = Home address of node A | ||||
Error.Unreachable_Address = Home address of the unreachable node | ||||
- If the packet contains a DSR Routing Header and the S bit is NOT | ||||
set, the packet has been forwarded without the need for salvaging | ||||
up to this point. | ||||
Error.Destination_Address = P.IP.Source_Address | ||||
- Otherwise, if the packet contains a DSR Routing Header and the S | ||||
bit IS set, the packet has been salvaged by an intermediate node, | ||||
and thus this Routing Header was placed there by the salvaging | ||||
node. | node. | |||
2. If the Acknowledgment Request (R) bit is set, the node MUST | Error.Destination_Address = P.RoutingHeader.Address[1] | |||
create and transmit a packet containing the DSR Acknowledgment | ||||
option to the IP Source of the packet, performing Route Discovery | ||||
if necessary. | ||||
3. If the node chooses to set the Acknowledgment Request (R) bit in | - Otherwise, if the packet does not contain a DSR Routing Header, | |||
the packet when it forwards it, it must first make a copy of the | the packet must have been originated by this node A. | |||
packet and insert this copy into its Retransmission Buffer. | ||||
4. If a node finds the next hop in the Routing Header to be | Error.Destination_Address = Home address of node A | |||
unreachable, it MUST send a Route Error packet to the originator | ||||
of the packet, denoted by ROUTING.Address[1]. | ||||
7. Optimizations | Send the packet containing the Route Error to Error.Destination_Address, | |||
performing Route Discovery if necessary. | ||||
As an optimization, Route Errors that are discovered by the | ||||
packet's originator (such that Error.Source_Address is equal to | ||||
Error.Destination_Address) SHOULD be processed internally. Such | ||||
processing should invoke all the steps that would be taken if a Route | ||||
Error option was created, transmitted, received, and processed, | ||||
but an actual packet containing a Route Error option SHOULD NOT be | ||||
transmitted. | ||||
7.5.4. Processing a Route Error Option | ||||
Upon receipt of a Route Error via any mechanism, a node | ||||
SHOULD remove any route from its Route Cache that uses the hop | ||||
(Error.Source_Address, Error.Index to Error.Unreachable_Address). | ||||
This includes all Route Errors overheard, and those processed | ||||
internally as described in Section 7.5.3. | ||||
When the node identified by Error.Destination_Address receives | ||||
the Route Error, it SHOULD verify that the source route | ||||
responsible for delivering the Route Error includes the same | ||||
hops as the working prefix of the original packet's source route | ||||
(Error.Destination_Address to Error.Source_Address). If any | ||||
hop listed in the working prefix is not included in the Route | ||||
Error's source route, then the originator SHOULD forward the Route | ||||
Error back along the working prefix (Error.Destination_Address to | ||||
Error.Source_Address) so that each node along the working prefix will | ||||
remove the invalid route from its Route Cache. | ||||
If the node processing a Route Error option discovers its home | ||||
address is Error.Destination_Address and the packet contains | ||||
additional Route Error option(s) later on the inside of the Hop | ||||
by Hop options header, we call the additional Route Errors nested | ||||
Route Errors. The node MUST deliver the first nested Route Error | ||||
to Nested_Error.Destination_Address, performing Route Discovery if | ||||
needed. It does this by removing the Route Error option listing | ||||
itself as the Error.Destination_Address, finding the first nested | ||||
Route Error option, and originating the remaining packet to | ||||
Nested_Error.Destination_Address. This mechanism allows for the | ||||
proper handling of Route Errors that are discovered while delivering | ||||
a Route Error. | ||||
7.5.5. Salvaging a Packet | ||||
When node A attempts to salvage a packet originated at node S and | ||||
destined for node D, it MUST perform the following steps: | ||||
1. Generate and send a Route Error to A as explained in | ||||
Section 7.5.3. | ||||
2. Call Route_Cache.Get() to determine if it has a cached source | ||||
route to the packet's ultimate destination D (which is the last | ||||
Address listed in the Routing Header). | ||||
3. If node A does not have a cached route for node D, it MUST | ||||
discard the packet. DONE. | ||||
4. Otherwise, let Salvage_Address[1] through Salvage_Address[m] be | ||||
the sequence of hops returned from the Route Cache. Initialize | ||||
the following fields in the packet's header: | ||||
RT.Segments_Left = m - 2; | ||||
RT.S = 1 | ||||
RT.Address[1] = Home address of Node A | ||||
RT.Address[2] = Salvage.Address[1] | ||||
... | ||||
RT.Address[n] = Salvage.Address[m] | ||||
The IP Source Address of the packet MUST remain unchanged. When the | ||||
Routing Header in the outgoing packet is processed, RT.Address[2], | ||||
will be copied to the IP Destination Address field. | ||||
8. Optimizations | ||||
A number of optimizations can be added to the basic operation of | A number of optimizations can be added to the basic operation of | |||
Route Discovery and route maintenance as described in Section 4.1 | Route Discovery and Route Maintenance as described in Sections 7.4 | |||
that can reduce the number of overhead packets and improve the | and 7.5 that can reduce the number of overhead packets and improve | |||
average efficiency of the routes used on data packets. This section | the average efficiency of the routes used on data packets. This | |||
discusses some of those optimizations. | section discusses some of those optimizations. | |||
7.1. Leveraging the Route Cache | 8.1. Leveraging the Route Cache | |||
The data in a node's Route Cache may be stored in any format, but | The data in a node's Route Cache may be stored in any format, but | |||
the active routes in its cache form a tree of routes, rooted at | the active routes in its cache form a tree of routes, rooted at | |||
this node, to other nodes in the ad hoc network. For example, the | this node, to other nodes in the ad hoc network. For example, the | |||
illustration below shows an ad hoc network of six mobile nodes, in | illustration below shows an ad hoc network of six mobile nodes, in | |||
which mobile node A has earlier completed a Route Discovery for | which mobile node A has earlier completed a Route Discovery for | |||
mobile node D and has cached a route to D through B and C: | mobile node D and has cached a route to D through B and C: | |||
B->C->D | B->C->D | |||
+---+ +---+ +---+ +---+ | +---+ +---+ +---+ +---+ | |||
skipping to change at page 24, line 40 | skipping to change at page 35, line 40 | |||
+---+ | +---+ | |||
Since nodes B and C are on the route to D, node A also learns the | Since nodes B and C are on the route to D, node A also learns the | |||
route to both of these nodes from its Route Discovery for D. If A | route to both of these nodes from its Route Discovery for D. If A | |||
later performs a Route Discovery and learns the route to E through B | later performs a Route Discovery and learns the route to E through B | |||
and C, it can represent this in its Route Cache with the addition of | and C, it can represent this in its Route Cache with the addition of | |||
the single new hop from C to E. If A then learns it can reach C in a | the single new hop from C to E. If A then learns it can reach C in a | |||
single hop (without needing to go through B), A SHOULD use this new | single hop (without needing to go through B), A SHOULD use this new | |||
route to C to also shorten the routes to D and E in its Route Cache. | route to C to also shorten the routes to D and E in its Route Cache. | |||
7.1.1. Promiscuous Learning of Source Routes | 8.1.1. Promiscuous Learning of Source Routes | |||
A node can add entries to its Route Cache any time it learns a | ||||
new route. In particular, when a node forwards a data packet as | ||||
an intermediate hop on the route in that packet, the forwarding | ||||
node is able to observe the entire route in the packet. Thus, for | ||||
example, when node B forwards packets from A to D, B SHOULD add the | ||||
route information from that packet to its own Route Cache. If a | ||||
node forwards a Route Reply packet, it SHOULD also add the route | ||||
information from the route record being returned in the Route Reply, | ||||
to its own Route Cache. | ||||
Finally, since all wireless network transmissions are inherently | ||||
broadcast, a node MAY configure its network interface into | ||||
promiscuous receive mode, and add to its Route Cache the route | ||||
information from any packet it can overhear. | ||||
7.1.2. Answering Route Requests using the Route Cache | ||||
A node SHOULD use its Route Cache to avoid propagating a Route | ||||
Request packet received from another node. In particular, suppose a | ||||
node receives a Route Request packet for which it is not the target | ||||
and which it does not discard on based on the logic of section 6.1.1. | ||||
If the node has a Route Cache entry for the target of the request, | ||||
it may append this cached route to the accumulated route record | ||||
in the packet, and may return this route in a Route Reply packet | ||||
to the initiator without propagating (re-broadcasting) the Route | ||||
Request. Thus, for example, if node F in the example network shown | ||||
in Section 7.1 needs to send a packet to node D, it will initiate | ||||
a Route Discovery and broadcast a Route Request packet. If this | ||||
broadcast is received by A, A can simply return a Route Reply packet | ||||
to F containing the complete route to D consisting of the sequence of | ||||
hops A, B, C, and D. | ||||
Before transmitting a Route Reply packet that was generated using | ||||
information from its Route Cache, a node MUST verify that: | ||||
1. The resulting route does not contain any loops. | ||||
2. The node issuing the Route Reply is listed in the route that it | ||||
is replying with. This increases the probability that the route | ||||
is valid, since the node in question should have received a Route | ||||
Error if this route stopped working. | ||||
7.2. Route Discovery Using Expanding Ring Search | ||||
The propagating nature of a basic Route Request packet means that | ||||
potentially every node in the ad hoc network will be disturbed | ||||
whenever one is originated. To reduce this network-wide cost, all | ||||
nodes SHOULD limit the maximum propagation of their Route Requests in | ||||
some way, and MAY use the following algorithm. | ||||
1. Whenever the backoff algorithm permits the initiation of a Route | ||||
Discovery, initially send a Route Request with a hop limit of one | ||||
(we refer to this as a non-propagating Route Request). | ||||
2. If no Route Reply is received from the non-propagating Route | A node can add entries to its Route Cache any time it learns a new | |||
Request after RING0_TIMEOUT seconds, send a new Route Request | route. In particular, when a node forwards a data packet as an | |||
with the hop limit set to MAX_ROUTE_LEN. | intermediate hop on the route in that packet, the forwarding node is | |||
able to observe the entire route in the packet. Thus, for example, | ||||
when any intermediate node B forwards packets from A to D, B SHOULD | ||||
add the source route information from that packet's Routing Header | ||||
to its own Route Cache. If a node forwards a Route Reply packet, it | ||||
SHOULD also add the source route information from the route record | ||||
being returned in the Route Reply, to its own Route Cache. | ||||
A single attempt at Route Discovery for destination node D may | In addition, since all wireless network transmissions at the physical | |||
therefore involve sending two Route Request packets. Nodes MUST | layer are inherently broadcast, it may be possible for a node to | |||
not backoff between the sending a Route Request with a hop limit of | configure its network interface into promiscuous receive mode, such | |||
one and the subsequent sending of Route Request with a hop limit of | that the node is able to receive all packets without link layer | |||
MAX_ROUTE_LEN. This procedure uses the hop limit on the Route Request | address filtering. In this case, the node MAY add to its Route Cache | |||
packet to inexpensively check if the target is currently within | the route information from any packet it can overhear. | |||
wireless transmitter range of the initiator, or if another node | ||||
within range has a Route Cache entry for this target (effectively | ||||
using the caches of this node's neighbors as an extension of its own | ||||
cache). Since the initial request is limited to one network hop, the | ||||
timeout period before sending the propagating request can be quite | ||||
small. | ||||
7.3. Preventing Route Reply Storms | 8.2. Preventing Route Reply Storms | |||
The ability for nodes to reply to a Route Request not targeted at | The ability for nodes to reply to a Route Request not targeted at | |||
them using their Route Caches can result in a Route Reply storm. If | them by using their Route Caches can result in a Route Reply storm. | |||
a node broadcasts a Route Request for a node that its neighbors have | If a node broadcasts a Route Request for a node that its neighbors | |||
in their Route Caches, each neighbor may attempt to send a Route | have in their Route Caches, each neighbor may attempt to send a | |||
Reply thereby wasting bandwidth and increasing the rate of collisions | Route Reply, thereby wasting bandwidth and increasing the rate | |||
in the area. For example, in the network shown in Section 7.1, if | of collisions in the area. For example, in the network shown in | |||
both A and B receive F's Route Request, they will both attempt to | Section 8.1, if both node A and node B receive F's Route Request, | |||
reply from their Route Caches. Both will send their replies at | they will both attempt to reply from their Route Caches. Both will | |||
about the same time since they receive the broadcast at about the | send their Replies at about the same time since they receive the | |||
same time. Particularly when more than the two mobile nodes in this | broadcast at about the same time. Particularly when more than the | |||
example are involved, these simultaneous replies from the mobile | two mobile nodes in this example are involved, these simultaneous | |||
nodes receiving the broadcast may create packet collisions among | replies from the mobile nodes receiving the broadcast may create | |||
some or all of these replies and may cause local congestion in the | packet collisions among some or all of these replies and may cause | |||
wireless network. In addition, it will often be the case that the | local congestion in the wireless network. In addition, it will | |||
different replies will indicate routes of different lengths. For | often be the case that the different replies will indicate routes | |||
example, A's reply will indicate a route to D that is one hop longer | of different lengths. For example, A's Route Reply will indicate a | |||
than that in B's reply. | route to D that is one hop longer than that in B's reply. | |||
For interfaces which can promiscuously listen to the channel, mobile | For interfaces which can promiscuously listen to the channel, mobile | |||
nodes SHOULD use the following algorithm to reduce the number of | nodes SHOULD use the following algorithm to reduce the number of | |||
simultaneous replies by slightly delaying their Route Reply: | simultaneous replies by slightly delaying their Route Reply: | |||
1. Pick a delay period | 1. Pick a delay period | |||
d = H * (h - 1 + r) | d = H * (h - 1 + r) | |||
where h is the length in number of network hops for the route to | where h is the length in number of network hops for the route | |||
be returned in this node's reply, r is a random number between 0 | to be returned in this node's Route Reply, r is a random number | |||
and 1, and H is a small constant delay to be introduced per hop. | between 0 and 1, and H is a small constant delay to be introduced | |||
per hop. | ||||
2. Delay transmitting the Route Reply from this node for a period | 2. Delay transmitting the Route Reply from this node for a period | |||
of d. | of d. | |||
3. Within the delay period, promiscuously receive all packets at | 3. Within the delay period, promiscuously receive all packets at | |||
this node. If a packet is received by this node during the delay | this node. If a packet is received by this node during the delay | |||
period that is addressed to the target of this Route Discovery | period that is addressed to the target of this Route Discovery | |||
(the target is the final destination address for the packet, | (the target is the final destination address for the packet, | |||
through any sequence of intermediate hops), and if the length of | through any sequence of intermediate hops), and if the length of | |||
the route on this packet is less than h, then cancel the delay | the route on this packet is less than h, then cancel the delay | |||
and do not transmit the Route Reply from this node; this node | timer and do not transmit the Route Reply from this node; this | |||
may infer that the initiator of this Route Discovery has already | node may infer that the initiator of this Route Discovery has | |||
received a Route Reply, giving an equal or better route. | already received a Route Reply, giving an equally good or better | |||
route. | ||||
7.4. Piggybacking on Route Discoveries | 8.3. Piggybacking on Route Discoveries | |||
As described in Section 4.1, when one node needs to send a packet | As described in Section 4.1, when one node needs to send a packet | |||
to another, if the sender does not have a Route Cached to the | to another, if the sender does not have a route cached to the | |||
destination node, it must initiate a Route Discovery, either | destination node, it must initiate a Route Discovery, buffering the | |||
buffering the original packet until the Route Reply is returned, or | original packet until the Route Reply is returned. The delay for | |||
discarding it and relying on a higher-layer protocol to retransmit | Route Discovery and the total number of packets transmitted can be | |||
it if needed. The delay for Route Discovery and the total number | reduced by allowing data to be piggybacked on Route Request packets. | |||
of packets transmitted can be reduced by allowing data to be | Since some Route Requests may be propagated widely within the ad hoc | |||
piggybacked on Route Request packets. Since some Route Requests may | network, though, the amount of data piggybacked must be limited. We | |||
be propagated widely within the ad hoc network, though, the amount | currently use piggybacking when sending a Route Reply or a Route | |||
of data piggybacked must be limited. We currently use piggybacking | Error packet, since both are naturally small in size. Small data | |||
when sending a Route Reply or a Route Error packet, since both are | packets such as the initial SYN packet opening a TCP connection [13] | |||
naturally small in size, and small data packets such as the initial | could easily be piggybacked. | |||
SYN packet opening a TCP connection [13] could easily be piggybacked. | ||||
One problem, however, arises when piggybacking on Route Request | One problem, however, arises when piggybacking on Route Request | |||
packets. If a Route Request is received by a node that replies | packets. If a Route Request is received by a node that replies | |||
to the request based on its Route Cache without propagating the | to the request based on its Route Cache without propagating the | |||
request (Section 7.1), the piggybacked data will be lost if the node | Request (Section 8.1), the piggybacked data will be lost if the node | |||
simply discards the Route Request. In this case, before discarding | simply discards the Route Request. In this case, before discarding | |||
the packet, the node must construct a new packet containing the | the packet, the node must construct a new packet containing the | |||
piggybacked data from the Route Request packet. The source route | piggybacked data from the Route Request packet. The source route | |||
in this packet MUST be constructed to appear as if the new packet | in this packet MUST be constructed to appear as if the new packet | |||
had been sent by the initiator of the Route Discovery and had been | had been sent by the initiator of the Route Discovery and had been | |||
forwarded normally to this node. Hence, the first portion of the | forwarded normally to this node. Hence, the first portion of the | |||
route is taken from the accumulated route record in the Route Request | route is taken from the accumulated route record in the Route Request | |||
packet and the remainder of the route is taken from this node's Route | packet and the remainder of the route is taken from this node's Route | |||
Cache. The sender address in the packet should also be set to the | Cache. The sender address in the packet MUST also be set to the | |||
initiator of the Route Discovery. Since the replying node will be | initiator of the Route Discovery. Since the replying node will be | |||
unable to correctly recompute an Authentication header for the split | unable to correctly recompute an Authentication header for the split | |||
off piggybacked data, data covered by an Authentication header SHOULD | off piggybacked data, data covered by an Authentication header SHOULD | |||
NOT be piggybacked on Route Request packets. | NOT be piggybacked on Route Request packets. | |||
7.5. Discovering Shorter Routes | 8.4. Discovering Shorter Routes | |||
Once a route between a packet source and a destination has been | Once a route between a packet source and a destination has been | |||
discovered, the basic DSR protocol MAY continue to use that route for | discovered, the basic DSR protocol MAY continue to use that route | |||
all traffic from the source to the destination, even if the nodes | for all traffic from the source to the destination as long as | |||
move such that a shorter route becomes possible. In many cases, the | it continues to work, even if the nodes move such that a shorter | |||
basic route maintenance procedure will discover the shorter route, | route becomes possible. In many cases, the basic Route Maintenance | |||
since if a node moves enough to create a shorter route, it will | procedure will discover the shorter route, since if a node moves | |||
likely also move out of transmission range of at least one hop on the | enough to create a shorter route, it will likely also move out of | |||
existing route. | transmission range of at least one hop on the existing route. | |||
When operating in promiscuous receive mode, a node SHOULD use the | Furthermore, when a data packet is received as the result of | |||
following algorithm to process a received packet. Whenever possible, | operating in promiscuous receive mode, the node checks if the Routing | |||
this algorithm shortens routes that already exist in the Route Cache. | Header packet contains its address in the unprocessed portion of the | |||
source route (Address[NumAddrs - SegLft] to Address[NumAddrs]). If | ||||
so, the node knows that packet could bypass the unprocessed hops | ||||
preceding it in the source route. The node then sends what is called | ||||
a gratuitous Route Reply message to the packet's source, giving it | ||||
the shorter route without these hops. | ||||
The following algorithm describes how a node A should process packets | ||||
with an IP.Destination_Address not addressed to A or the IP broadcast | ||||
address or a multicast address that are received as a result of A | ||||
being in promiscuous receive mode: | ||||
1. If the packet is not a data packet containing a Routing Header, | 1. If the packet is not a data packet containing a Routing Header, | |||
drop the packet. DONE. | drop the packet. DONE. | |||
2. If the IP destination is the home address of this node, then | 2. If the home address of this node does not appear in the portion | |||
follow the normal steps to process the packet. DONE. | ||||
3. If the home address of this node does not appear in the portion | ||||
of the source route that has not yet been processed (indicated by | of the source route that has not yet been processed (indicated by | |||
Segments Left), then drop the packet. DONE. | Segments Left), then drop the packet. DONE. | |||
4. The node S indicated by the Source Address field in the IP header | 3. Otherwise, the node B that just transmitted the packet (indicated | |||
can communicated directly with this node N. Create a Route Reply. | by Address[NumAddrs - SegLft - 1]) can communicate directly with | |||
The Route Reply MUST list the entire source routing contained in | this node A. Create a Route Reply. The Route Reply MUST list | |||
the received packet with the exception of the intermediate nodes | the entire source route contained in the received packet with the | |||
between node S and node N. | exception of the intermediate nodes between node B and node A. | |||
7.6. Rate Limiting the Route Discovery Process | 4. Send this gratuitous Route Reply to the node listed as the | |||
IP.Source_Address of the received packet. If Route Discovery | ||||
is required it MAY be initiated, or the gratuitous Route Reply | ||||
packet MAY be dropped. | ||||
8.5. Rate Limiting the Route Discovery Process | ||||
One common error condition that must be handled in an ad hoc network | One common error condition that must be handled in an ad hoc network | |||
is the case in which the network effectively becomes partitioned. | is the case in which the network effectively becomes partitioned. | |||
That is, two nodes that wish to communicate are not within | That is, two nodes that wish to communicate are not within | |||
transmission range of each other, and there are not enough other | transmission range of each other, and there are not enough other | |||
mobile nodes between them to form a sequence of hops through which | mobile nodes between them to form a sequence of hops through which | |||
they can forward packets. If a new Route Discovery was initiated | they can forward packets. If a new Route Discovery was initiated | |||
for each packet sent by a node in this situation, a large number of | for each packet sent by a node in this situation, a large number of | |||
unproductive Route Request packets would be propagated throughout the | unproductive Route Request packets would be propagated throughout the | |||
subset of the ad hoc network reachable from this node. In order to | subset of the ad hoc network reachable from this node. In order to | |||
reduce the overhead from such route discoveries, we use exponential | reduce the overhead from such Route Discoveries, we use exponential | |||
backoff to limit the rate at which new route discoveries may be | back-off to limit the rate at which new Route Discoveries may be | |||
initiated from any node for the same target. If the node attempts to | initiated from any node for the same target. If the node attempts to | |||
send additional data packets to this same node more frequently than | send additional data packets to this same node more frequently than | |||
this limit, the subsequent packets SHOULD be buffered in the Send | this limit, the subsequent packets SHOULD be buffered in the Send | |||
Buffer until a Route Reply is received, but it MUST NOT initiate a | Buffer until a Route Reply is received, but it MUST NOT initiate a | |||
new Route Discovery until the minimum allowable interval between new | new Route Discovery until the minimum allowable interval between new | |||
route discoveries for this target has been reached. This limitation | Route Discoveries for this target has been reached. This limitation | |||
on the maximum rate of route discoveries for the same target is | on the maximum rate of Route Discoveries for the same target is | |||
similar to the mechanism required by Internet nodes to limit the rate | similar to the mechanism required by Internet nodes to limit the rate | |||
at which ARP requests are sent to any single IP address [1]. | at which ARP requests are sent to any single IP address [1]. | |||
7.7. Improved Handling of Route Errors | 8.6. Improved Handling of Route Errors | |||
All nodes SHOULD process all of the Route Error messages they | All nodes SHOULD process all of the Route Error messages they | |||
receive, regardless of whether the node is the destination of | receive, regardless of whether the node is the destination of | |||
the Route Error, is forwarding the Route Error, or promiscuously | the Route Error, is forwarding the Route Error, or promiscuously | |||
overhears the Route Error. | overhears the Route Error. | |||
Since a Route Error packet names both ends of the hop that is no | Since a Route Error packet names both ends of the hop that is no | |||
longer valid, any of the nodes receiving the error packet may update | longer valid, any of the nodes receiving the error packet may update | |||
their Route Caches to reflect the fact that the two nodes indicated | their Route Caches to reflect the fact that the two nodes indicated | |||
in the packet can no longer directly communicate. A node receiving | in the packet can no longer directly communicate. A node receiving | |||
a Route Error packet simply searches its Route Cache for any routes | a Route Error packet simply searches its Route Cache for any routes | |||
using this hop. For each such route found, the route is truncated at | using this hop. For each such route found, the route is effectively | |||
this hop. All nodes on the route before this hop are still reachable | truncated at this hop. All nodes on the route before this hop are | |||
on this route, but subsequent nodes are not. | still reachable on this route, but subsequent nodes are not. | |||
An experimental optimization to improve the handling of errors is | An experimental optimization to improve the handling of errors is | |||
to support the caching of "negative" information in a node's Route | to support the caching of "negative" information in a node's Route | |||
Cache. The goal of negative information is to record that a given | Cache. The goal of negative information is to record that a given | |||
route was tried and found not to work, so that if the same route | route was tried and found not to work, so that if the same route | |||
is discovered again shortly after the failure, the Route Cache can | is discovered again shortly after the failure, the Route Cache can | |||
ignore or downgrade the metric of the failed route. | ignore or downgrade the metric of the failed route. | |||
We have not currently included this caching of negative information | We have not currently included this caching of negative information | |||
in our simulations, since it appears to be unnecessary if nodes also | in our simulations, since it appears to be unnecessary if nodes also | |||
promiscuously receive Route Error packets. | promiscuously receive Route Error packets. | |||
8. Constants | 9. Constants | |||
BROADCAST_JITTER 10 milliseconds | BROADCAST_JITTER 10 milliseconds | |||
ID_FIFO_SIZE 8 identifiers | MAX_ROUTE_LEN 15 nodes | |||
INVALID_INTERFACE_INDEX 0xFF | Interface Indexes | |||
IF_INDEX_INVALID 0x7F | ||||
IF_INDEX_MA 0x7E | ||||
IF_INDEX_ROUTER 0x7D | ||||
MAX_EXPLICIT_REXMIT 3 attempts | Route Cache | |||
ROUTE_CACHE_TIMEOUT 300 seconds | ||||
MAX_RTDISCOV_INTERVAL 120 seconds | Send Buffer | |||
SEND_BUFFER_TIMEOUT 30 seconds | ||||
MAX_ROUTE_LEN 15 nodes | Request Table | |||
MAX_REQUEST_ENTRIES 32 nodes | ||||
MAX_REQUEST_IDS 8 identifiers | ||||
MAX_REQUEST_REXMT 16 retransmissions | ||||
MAX_REQUEST_PERIOD 10 seconds | ||||
REQUEST_PERIOD 500 milliseconds | ||||
RING0_REQUEST_TIMEOUT 30 milliseconds | ||||
RING0_TIMEOUT 30 milliseconds | Retransmission Buffer | |||
DSR_RXMT_BUFFER_SIZE 50 packets | ||||
ROUTE_CACHE_TIMEOUT 300 seconds | Retransmission Timer | |||
DSR_MAXRXTSHIFT 2 | ||||
SEND_BUFFER_TIMEOUT 30 seconds | 10. IANA Considerations | |||
9. IANA Considerations | This document proposes the use of the Destination Options header and | |||
the Hop-by-Hop Options header, originally defined for IPv6, in IPv4. | ||||
The Next Header values indicating these two extension headers thus | ||||
must be reserved within the IPv4 Protocol number space. | ||||
This document defines four new types of IPv6 destination option, each | Furthermore, this document defines four new types of destination | |||
of which must be assigned an Option Type value: | options, each of which must be assigned an Option Type value: | |||
- The DSR Route Request option, described in Section 5.1.1 | - The DSR Route Request option, described in Section 6.1.1 | |||
- The DSR Route Reply option, described in Section 5.1.2 | - The DSR Route Reply option, described in Section 6.2.1 | |||
- The DSR Route Error option, described in Section 5.1.3 | - The DSR Route Error option, described in Section 6.2.2 | |||
- The DSR Acknowledgment option, described in Section 5.1.4 | - The DSR Acknowledgment option, described in Section 6.2.3 | |||
DSR also requires a routing header Routing Type be allocated for the | DSR also requires a routing header Routing Type be allocated for the | |||
DSR Source Route defined in section 5.2. | DSR Source Route defined in Section 6.3. | |||
In IPv4, we require two new protocol numbers be issued to identify | In IPv4, we require two new protocol numbers be issued to identify | |||
the next header as either an IPv6-style destination option, or an | the next header as either an IPv6-style destination option, or an | |||
IPv6-style routing header. Other protocols can make use of these | IPv6-style routing header. Other protocols can make use of these | |||
protocol numbers as nodes that support them will processes any | protocol numbers as nodes that support them will processes any | |||
included destination options or routing headers according to the | included destination options or routing headers according to the | |||
normal IPv6 semantics. | normal IPv6 semantics. | |||
10. Security Considerations | 11. Security Considerations | |||
This document does not specifically address security concerns. This | This document does not specifically address security concerns. This | |||
document does assume that all nodes participating in the DSR protocol | document does assume that all nodes participating in the DSR protocol | |||
do so in good faith and with out malicious intent to corrupt the | do so in good faith and with out malicious intent to corrupt the | |||
routing ability of the network. In mission-oriented environments | routing ability of the network. In mission-oriented environments | |||
where all the nodes participating in the DSR protocol share a | where all the nodes participating in the DSR protocol share a | |||
common goal that motivates their participation in the protocol, the | common goal that motivates their participation in the protocol, the | |||
communications between the nodes can be encrypted at the physical | communications between the nodes can be encrypted at the physical | |||
channel or link layer to prevent attack by outsiders. | channel or link layer to prevent attack by outsiders. | |||
Location of DSR Functions in the ISO Model | Location of DSR Functions in the ISO Reference Model | |||
When designing DSR, we had to determine at what level within the | When designing DSR, we had to determine at what level within the | |||
protocol hierarchy to implement source routing. We considered two | protocol hierarchy to implement source routing. We considered two | |||
different options: routing at the link layer (ISO layer 2) and | different options: routing at the link layer (ISO layer 2) and | |||
routing at the network layer (ISO layer 3). Originally, we opted to | routing at the network layer (ISO layer 3). Originally, we opted to | |||
route at the link layer for the following reasons: | route at the link layer for the following reasons: | |||
- Pragmatically, running the DSR protocol at the link layer | - Pragmatically, running the DSR protocol at the link layer | |||
maximizes the number of mobile nodes that can participate in | maximizes the number of mobile nodes that can participate in | |||
ad hoc networks. For example, the protocol can route equally | ad hoc networks. For example, the protocol can route equally | |||
well between IP [12], IPv6 [4], and IPX [5] nodes. | well between IPv4 [12], IPv6 [4], and IPX [5] nodes. | |||
- Historically, DSR grew from our contemplation of a multihop ARP | - Historically, DSR grew from our contemplation of a multi-hop ARP | |||
protocol [6, 7] and source routing bridges [10]. ARP [11] is a | protocol [6, 7] and source routing bridges [10]. ARP [11] is a | |||
layer 2protocol. | layer 2protocol. | |||
- Technically, we designed DSR to be simple enough that that it | - Technically, we designed DSR to be simple enough that that it | |||
could be implemented directly in network interface cards, well | could be implemented directly in network interface cards, well | |||
below the layer 3 software within a mobile node. We see great | below the layer 3 software within a mobile node. We see great | |||
potential for DSR running between clouds of mobile nodes around | potential for DSR running between clouds of mobile nodes around | |||
fixed base stations. DSR would act to transparently fill in the | fixed base stations. DSR would act to transparently fill in the | |||
coverage gaps between base stations. Mobile nodes that would | coverage gaps between base stations. Mobile nodes that would | |||
otherwise be unable to communicate with the base station due to | otherwise be unable to communicate with the base station due to | |||
factors such as distance, fading, or local interference sources | factors such as distance, fading, or local interference sources | |||
could then reach the base station through their peers. | could then reach the base station through their peers. | |||
Ultimately, however, we decided to design DSR as a layer 3 protocol | Ultimately, however, we decided to specify DSR as a layer 3 protocol | |||
since this is the only layer at which we could realistically support | since this is the only layer at which we could realistically support | |||
nodes with multiple interfaces of different types. | nodes with multiple interfaces of different types. | |||
Implementation Status | Implementation Status | |||
We have implemented Dynamic Source Routing (DSR) under the | We have implemented Dynamic Source Routing (DSR) under the | |||
FreeBSD 2.2.2 operating system running on Intel x86 platforms. | FreeBSD 2.2.7 operating system running on Intel x86 platforms. | |||
FreeBSD is based on a variety of free software, including 4.4 BSD | FreeBSD is based on a variety of free software, including 4.4 BSD | |||
Lite from the University of California, Berkeley. | Lite from the University of California, Berkeley. | |||
Acknowledgments | Acknowledgments | |||
The protocol described in this draft has been designed within | The protocol described in this draft has been designed within | |||
the CMU Monarch Project, a research project at Carnegie Mellon | the CMU Monarch Project, a research project at Carnegie Mellon | |||
University which is developing adaptive networking protocols and | University which is developing adaptive networking protocols and | |||
protocol interfaces to allow truly seamless wireless and mobile host | protocol interfaces to allow truly seamless wireless and mobile node | |||
networking [8, 14]. The current members of the CMU Monarch Project | networking [8, 14]. The current members of the CMU Monarch Project | |||
include: | include: | |||
- Josh Broch | - Josh Broch | |||
- Yih-Chun Hu | - Yih-Chun Hu | |||
- Jorjeta Jetcheva | - Jorjeta Jetcheva | |||
- David B. Johnson | - David B. Johnson | |||
- David A. Maltz | - Qifa Ke | |||
Areas for Refinement | ||||
We are currently working to refine the DSR protocol in the following | ||||
ways: | ||||
- Improve the algorithms and data structures used by the Route | ||||
Cache. We currently represent the Route Cache as a directed | ||||
acyclic tree of paths branching out from a root that represents | ||||
the node owning the Route Cache. However, each source | ||||
route learned by the Route Cache effectively describes the | ||||
interconnectedness of all the hops listed on the route, and | ||||
can be treated as a type of partial information Link State | ||||
Packet as one would find in a Link State routing algorithm. | ||||
By generalizing the Route Cache to a graph of all known links | ||||
between all known nodes, it may be possible to better leverage | ||||
the information a node overhears. | ||||
- Support for better route selection. In order to select the | ||||
best source route to send a packet with, nodes need be able to | ||||
evaluate the costs/benefits of each of their cached routes to the | ||||
destination. If those routes involve forwarding through nodes | ||||
with more than one interface, some routes may be better suited to | ||||
the traffic type because the bandwidth/range/latency/error-rate | ||||
characteristics of of the interfaces used on those routes best | ||||
match the needs of the traffic type. The Route Request and Route | ||||
Reply option format must be extended to enable node to report | ||||
the properties of the interfaces on the route, as well as the | ||||
interface index used in basic DSR forwarding. | ||||
- Improved Route Discovery algorithms. We are investigating ways | - David A. Maltz | |||
to cancel a propagating Route Request if the target of the | ||||
request has already been found in another part of the network. | ||||
Similarly, we are studying various ring-search algorithms in case | ||||
a more sophisticated algorithm might perform better than the | ||||
2-step algorithm we currently use. | ||||
References | References | |||
[1] R. Braden, editor. Requirements for Internet Hosts -- | [1] R. Braden, editor. Requirements for Internet Hosts -- | |||
Communication Layers. RFC 1122, October 1989. | Communication Layers. RFC 1122, October 1989. | |||
[2] Scott Bradner. Key words for use in RFCs to Indicate | [2] Scott Bradner. Key words for use in RFCs to Indicate | |||
Requirement Levels. RFC 2119, March 1997. | Requirement Levels. RFC 2119, March 1997. | |||
[3] Scott Corson and Joseph Macker. Mobile Ad Hoc Networking | [3] Scott Corson and Joseph Macker. Mobile Ad Hoc Networking | |||
skipping to change at page 39, line 5 | skipping to change at page 47, line 8 | |||
for Transmission on Ethernet Hardware. RFC 826, November 1982. | for Transmission on Ethernet Hardware. RFC 826, November 1982. | |||
[12] J. Postel, editor. Internet Protocol. RFC 791, September 1981. | [12] J. Postel, editor. Internet Protocol. RFC 791, September 1981. | |||
[13] J. Postel, editor. Transmission Control Protocol. RFC 793, | [13] J. Postel, editor. Transmission Control Protocol. RFC 793, | |||
September 1981. | September 1981. | |||
[14] The CMU Monarch Project. http://www.monarch.cs.cmu.edu/. | [14] The CMU Monarch Project. http://www.monarch.cs.cmu.edu/. | |||
Computer Science Department, Carnegie Mellon University. | Computer Science Department, Carnegie Mellon University. | |||
[15] J. Reynolds and J. Postel. Assigned Numbers. RFC 1700, October | ||||
1994. | ||||
Chair's Address | Chair's Address | |||
The Working Group can be contacted via its current chairs: | The Working Group can be contacted via its current chairs: | |||
M. Scott Corson | M. Scott Corson | |||
Institute for Systems Research | Institute for Systems Research | |||
University of Maryland | University of Maryland | |||
College Park, MD 20742 | College Park, MD 20742 | |||
USA | USA | |||
skipping to change at page 40, line 11 | skipping to change at page 49, line 11 | |||
Phone: +1 202 767-2001 | Phone: +1 202 767-2001 | |||
Email: macker@itd.nrl.navy.mil | Email: macker@itd.nrl.navy.mil | |||
Authors' Addresses | Authors' Addresses | |||
Questions about this document can also be directed to the authors: | Questions about this document can also be directed to the authors: | |||
Josh Broch | Josh Broch | |||
Carnegie Mellon University | Carnegie Mellon University | |||
Electrical and Computer Engineering Department | Electrical and Computer Engineering | |||
5000 Forbes Avenue | 5000 Forbes Avenue | |||
Pittsburgh, PA 15213-3891 | Pittsburgh, PA 15213-3890 | |||
USA | USA | |||
Phone: +1 412 268-3056 | Phone: +1 412 268-3056 | |||
Email: broch@andrew.cmu.edu | Fax: +1 412 268-7196 | |||
Email: broch@cs.cmu.edu | ||||
David B. Johnson | David B. Johnson | |||
Carnegie Mellon University | Carnegie Mellon University | |||
Computer Science Department | Computer Science Department | |||
5000 Forbes Avenue | 5000 Forbes Avenue | |||
Pittsburgh, PA 15213-3891 | Pittsburgh, PA 15213-3891 | |||
USA | USA | |||
Phone: +1 412 268-7399 | Phone: +1 412 268-7399 | |||
Fax: +1 412 268-5576 | Fax: +1 412 268-5576 | |||
End of changes. | ||||
This html diff was produced by rfcdiff 1.23, available from http://www.levkowetz.com/ietf/tools/rfcdiff/ |