(updated 2-feb) Fred Goldstein k1io goldstein@carafe.tay2.dec.com Version 2.2 2-feb-1992 The Radio Shortest Path First (RSPF) Routing Protocol For Internet Protocol over Amateur Packet Radio ** DRAFT ARCHITECTURE -- FOR COMMENT ** CONTENTS I. Introduction and Version Notes II. Acquisition of router-router adjacencies III. Acquisition of end node adjacencies IV. Link state propagation V. The Shortest Path First Spanning Tree Appendix A: Router Parameters Appendix B: Schematic Representation of RSPF Tables [note: Significant changes to Version 2.1 are flagged in this text with "**".] I. Introduction The packet radio environment is a very difficult one for TCP/IP to run on. As typically implemented in the Amateur Service, it provides very low bandwidths within severely constrained implementations. The most common radio technology has been 1200 baud single-frequency operation, although higher speeds and some full-duplex operation are also found. Virtually all amateur packet radio TCP/IP activity (the AMPRnet) makes use of personal computers, most with severely constrained memory address space. In this environment, automatic routing of IP packets has not been the norm. Routing protocols designed for other environments are rarely satisfactory. Manual route tables are common. Most amateur packet radio operation to date does not even make use of IP; instead, it converges applications directly upon a source-routed frame relaying protocol called AX.25. Improved routing support will be an important factor in the success of IP. Many IP and other wireline networks have implemented link state routing based upon Dijkstra's "SPF" (shortest path first) spanning tree algorithm. A wireline implementation of SPF for IP is being standardized as the Open SPF Interior Gateway Protocol (OSPF), and an SPF procedure has been accepted by ISO as the standard "IS-IS" routing protocol for OSI connectionless networks [ISO10589]. A similar (and derivative) procedure can be applied to AMPRnet (Net 44) and perhaps to similarly-constrained packet radio networks. It is called Radio Shortest Path First (RSPF); this document describes the RSPF protocol, version 2.2. RSPF occupies the role traditionally referred to in TCP/IP networks as an "Interior Gateway Protocol" (IGP), where "Gateway" means "router". It makes use of the services of the Internet Protocol. It is not inconceivable that a router could use both RSPF and another IGP, or communicate with another network using the Exterior Gateway Protocol (EGP). However these scenarios are not described in this document. RSPF is intended to be implemented on nodes which serve as routers; its implementation on end nodes is optional, and not required for the end nodes to take advantage of routing services. Any IP station may be an end node giving no further consideration to routing. I.1. Elements of RSPF The RSPF protocol is designed for use by Internet-layer routing nodes (IP Gateways) in a packet radio network using the Internet Protocol. It is comprised of four major functions: 1) Acquisition of router-router adjacencies 2) Acquisition of end node adjacencies 3) Link state propagation 4) Spanning tree route decision making. Its net result is the automatic maintenance of a least-cost routing table for use by IP Routing. RSPF is optimized for the geographically heirarchical addressing used in AMPRnet, but does not depend upon it. RSPF is simpler than OSPF and IS-IS, as it is principally designed for personal computer implementation within the Amateur Radio Service. It also adds procedures to take advantage of packet radio's "semi-broadcast" nature. I.2. Addressing convention When an RSPF router communicates with an end node, it will typically deal with a 32 bit IP address. Routers themselves, however, also support node group addressing (fewer than 32 bits need match). This follows the convention in the KA9Q NOS IP routing program, which permits a crude form of heirarchical addressing as well as allowing portable operations to override the defaults. RSPF looks for the match (node or node group) with the greatest number of matching bits. Only if the number of bits matched is equal, then the lower cost path will be used. Thus a match to a full node address will override a "cheaper" path that matches its "subnet" (node group) of 24 bits, which overrides a 16-bit node group, etc., noting that AMPRnet node groups need not follow rigid IP subnetting rules, and that AMPRnet is a single Class A net. In every case, a greater number of bits matched is considered a superior path to a destination than one that matches fewer bits, regardless of the value of the routing metric ("cost"). **An extension of this is the handling of manual routes, which are routes defined by a manual entry into a table. Manual routes provide a useful starting point during the RSPF convergence, and are required when RSPF implementation in a given area is limited. As an order of precedence, whether a route is manual or RSPF-generated should only be used to break ties equal in both subnet size and cost; RSPF-generated routes then take precedence. I.3 Subnetworks The generic term used herein for the layer directly beneath IP, creating the adjacency between two IP nodes, is subnetwork. A routing protocol gains efficiency by recognizing the nature of all subnetworks that it supports. RSPF is intended to work across a specific set of subnetworks that occur in packet radio. (Note that this use of "subnetwork" is consistent with OSI terminology; the function of the IP "subnet mask" in other IP routing protocols is herein referred to as "node group".) I.3.1. Classification by topology All subnworks may be classified according to topology. An initial division is made between broadcast-topology subnetworks and general-topology subnetworks. I.3.1.1 Broadcast topology. A broadcast-topology subnetwork is one in which a node may send a single packet which is propagated to all other nodes, which receive it with high probability. Ethernet and FDDI are examples of broadcast-topology subnetworks. I.3.1.2. General topology. A general-topology subnetwork is any that does not offer a reasonably reliable broadcast service. Within this classification, an extreme case is a point-to-point subnetwork, with only two nodes. Examples of point-to-point subnetwork protocols are PPP, SLIP and LAP-B. Packet-switched networks are typically general-topology, with wireline networks conforming to CCITT Recommendation X.25 being one example. Another general-topology subnetwork found in packet radio is the type implemented by "TheNet" (from NordLink) and its clones. Its network layer offers a datagram service to an addressed point, not a useful broadcast service, and again with no guarantee of delivery. I.3.1.3. Topologies found in packet radio. Within the amateur packet radio world, an example of a broadcast-topology subnetwork might be a packet "LAN" implemented using a full-duplex RF repeater. However, these are relatively rare; the typical single-frequency radio "LAN" using CSMA or Aloha operation, typified by AX.25 subnetworks, fails the test of broadcast topology. It loses too many packets for routing to be able to trust unacknowledged delivery. This is often due to the "hidden transmitter syndrome" (HTS), the details of which are beyond the scope of this document. However, some steps may be taken in order to make use of the near-broadcast nature of these "LANs". These are "semi- broadcast" subnetworks. I.3.2. Adjacencies and Subnetwork Access Points The purpose of any subnetwork is to create adjacencies between IP nodes. Each IP node is identified at the IP layer by its IP address. Each node in turn identifies each of its adjacencies as a Subnetwork Access Point (SNAcP). A SNAcP is identified within the router by the 2-tuple {Subnetwork address, Hardware port}. In the case of a point-to-point subnetwork, the subnetwork address component is null. In the case of some other subnetworks, it may be almost arbitrarily complex. For example, an AX.25 "address" may consist of a string of addresses by which the AX.25 subnetwork performs source-routed frame relaying. Thus the actual routing information includes 3-tuples consisting of the IP destination address or node group as the key, followed by the two elements of the SNAcP. The output of RSPF is this routing table. I.3.3. Connection-oriented vs. connectionless subnetworks IP is a connectionless (datagram) network protocol, and supports both connection-oriented (virtual circuit) and connectionless (datagram) lower layers (subnets). In a network with a high packet loss rate, the local retransmission provided by a connection-oriented datalink may substantially improve overall throughput. However, in a high-speed dedicated backbone, particularly one implemented using full-duplex radio or wireline links, connectionless links may provide better overall performance. The choice of which to use is a local matter; RSPF will work with both. **Connection-oriented subnetworks are assumed here to operate in assured mode, as is provided with LAP-B. No connection-oriented non-assured subnets, such as wireline Frame Relay, are contemplated for packet radio RSPF use at this time. The reliability of the routing information, however, may be somewhat greater with connection-oriented datalink procedures. This occurs both because the link will have more reliable propagation of network state information, and because these will give more rapid indication of a physical link failure. In a true broadcast-topology subnetwork, connectionless operation should suffice. Much of RSPF's uniqueness comes from permitting connectionless operation over unreliable media, a combination that appears to be in much demand within the AMPRnet community. I.4. Relationship to other protocols All packets specific to RSPF shall be exchanged inside IP packets using a protocol identifier which, pending formal assignment of one, shall be 73. Such IP packets shall be sent with a time to live (TTL) value of 1. If broadcast procedures are used over AX.25, connectionless AX.25 UI frames shall be sent, with a broadcast address "QST-0" in the AX.25 address and **an IP address ending in [.255], indicating multicast. This permits different ports on a router to have different broadcast addresses. (A router can also "read the mail" on passing radio packets not addressed to it; such procedures are for further study.) Equivalent procedures may be developed for other subnetworks. Note that in this document, "subnetwork" and "data link" are synonymous, and refer to the layer over which IP packets are exchanged. I.5. Change history I.5.1. Changes for Version 2.1. (October, 1989) RSPF draft 2.0 was released in June, 1988, as the first nearly- implementable version. It was first implemented in September, 1989 by Anders Klemets. Version 2.1 reflects changes whose need was discovered during this implementation. These changes are both editorial and, in a few cases, substantive. The format of the Routing Update packet was slightly modified. In order to prevent fragments of two or more different routing update messages from being erroneously merged, an Envelope ID was added to each such packet, with the same Envelope ID on all fragments of a multi-packet message. The term for such a message is now "envelope"; it contains one or more "bulletins", each of which originated from a single router. There are no longer separate packet types for Full Routing Update and Partial Routing Update. Instead, they are distinguished by the value of the subsequence number, which is always 0 for Full Routing Updates and is never 0 for Partial Routing Updates. A given envelope may contain both types of bulletin. Cost is now set on the basis of receiver instead of transmitter. This permits the automatic link quality adjustment to operate on the basis of locally-received traffic. It is explicitly stated that upon creation of a new router-router adjacency, the routers exchage full routing information. This allows routers to initialize themselves with a reasonably complete map of the network. 1.5.2. Changes for Version 2.2 (January, 1992) Version 2.1 was actually implemented and deployed in several locations, providing a useful input to this version. The changes in Version 2.2 are intended to be compatible, at the message level, with Version 2.1; however, the internal organization is different. This should preserve interoperability in the face of several changes. Some descriptive changes were made in this document in order to make it less dependent upon any one implementation or network. The major change is the generalization of the subnetwork and the SNAcP; this allows arbitrary subnetworks to be converged under RSPF. Behavior of "private" and "manual" routes is also now explicitly described. The behavior of RSPF in acquiring new adjacencies is also clarified with a new state machine. A connectionless adjacency is never put into general use until it is successfully tested. This fixes an ambiguity in Version 2.1 which led to the immediate creation of a "suspect" route upon receipt of a Router-Router Hello message, even if it failed successive pings. Sequence number behavior for bulletins is also clarified, with a new initialization procedure. The number space is now linear and finite. II. Acquisition of router-router adjacencies For RSPF to operate correctly, all routers must remain reasonably current as to the state of the network at large. This is handled by the propagation of "bulletin" messages among routers. End nodes need not concern themselves with this; they will normally communicate through one selected router at any given time, for all (non-adjacent) destinations (not seen by ARP or other lower-layer procedures). End nodes can also, of course, connect to each other directly, bypassing RSPF. Each router maintains an adjacencies table. Each router's adjacency table lists the following information for all other nodes, both routers and end nodes, from which it directly receives packets over a subnetwork: Adjacent node IP address (i.e., 44.56.4.44) Adjacent node subnetwork (eg.,AX.25) address (eg., K1IO-0) Subnet (hardware) used (i.e., AX0) Subnet cost (i.e., 4) Number of packets heard since last RRH update (i.e., 50) Packet sequence number in last RRH update (i.e., 2593) Time of last RRH update (i.e., 2130). **Link state (tentative, good, suspect, lost) **Type of service (connection-oriented, connectionless) Table II.1. Adjacencies table. II.1. Router-router hello For the backbone to create its topology automatically, there must be a way for routers to discover each other with minimal overhead. For this purpose, a router-router hello (RRH) message is provided. Periodically, based upon the value of timer "rrhtimer", the router sends out the RRH message to the subnet multicast address and IP multicast address. RSPF makes no assumption of reciprocity (that links are bidirectional); receipt of an RRH packet provides the receiver with information about a potential one-way (received) adjacency. It is noted, however, that while the route testing procedure does not require reciprocity of subnetworks for "ping" testing, some implementations will require a successful two-way ARP exchange before the ICMP Echo packet can be sent. This often results in some requirement for reciprocity in practice, even though it is not a characteristic of RSPF. II.2. Connection-oriented procedure If a router uses connection-oriented subnet procedures on a given interface, then when a router receives an RRH packet on such an interface, it checks to see if it already has a link to that packet's originator in its own **adjacencies table. If not, and the interface is of a broadcast nature (reliable or unreliable), it waits a random period of time (example for AX.25: within the range of 0 to 10 times the link's value of T1, DWAIT or SLOTTIME, and in any case much longer than the timers used within a CSMA or Aloha subnet such as AX.25) and then attempts to establish a connection in the usual manner. For example, in an AX.25 subnet, the router initiates the connection with SABM; the distant router responds with the usual UA (link established) or DM (link rejected). Failure to initiate a connection (i.e., receive a UA) terminates this procedure; no adjacency is added. If a two-way connection has been established, then both routers add the link to their adjacency tables. While the existence of this route is set reciprocally, the cost of each side of the route is set separately for each side of the connection. Cost is propagated in the routing update (link state) packet. Thus the adjacency between two routers is not actually used for real traffic until the first routing update packet exchange has taken place. (This may be useful in dealing with the situation where a UA is lost during link initiation; procedures for coping with this known LAP-B problem are for further study.) Loss of an adjacency may then be noted by the loss of the subnet connection. When this occurs, the router removes the adjacency from its adjacency table and follows the "bad news" procedures outlined below for link state propagation. (If this cannot be determined by the implementation, then "ping" procedures as in 1.3.2 below may be useful.) II.3. Connectionless procedure If a router uses connectionless datalink procedures to its own adjacencies (most suitable to low-loss links such as broadcast-topology or reliable general-topology subnetworks), then when a router receives an RRH packet, it checks to see if this adjacency is already in its adjacency table. II.3.1. Acquisition of connectionless adjacencies **In practice, reliable broadcast topology is unusual in the packet radio arena. Thus, the acquisition of a new adjacency begins by setting the link status to "**tentative". A tentative-state adjacency is tested by attempting to exchange a packet (ICMP echo) with it, up to a settable "maxping" number of times. If successful, the link state is raised to "good". If unsuccessful, the adjacency is returned to null, ignored, and not added to any tables. **If the destination is already reachable via a different route, then this prior route should not be discarded; it should be returned to use if the newly-tested adjacency fails, or if the new adjacency has a higher cost. (This may be implemented with a "don't route" function in IP, bypassing the existing IP route table, passing normally-hidden subnet information to and from RSPF.) **An alternative to ICMP echo for AX.25 and other broadcast and semi-broadcast subnets is to directly use ARP to test the adjacency. In practice, ICMP will require ARP anyway. This option raises questions of layering, but may solve other problems, such as the existence of a prior IP route when the available IP layer does not support "don't route". II.3.2. Loss of connectionless adjacencies Loss of an adjacency may be noted by timeout; if no RRH message is received, and no frames have been received from the adjacent router for a period of time "suspect timer" (initial suggestion: slightly over twice the maximum interval "rrhtimer" between RRH messages), then the adjacency state becomes "suspect". The router should attempt (a settable number of times "maxping") to exchange a packet (ICMP echo) with the suspect adjacency; if unsuccessful (after the usual number of retries), the adjacency is marked "lost". It may also be marked lost if other attempts to send data through that router fail, such that the implementation determines that there is a high probability that the link is lost. (However, no obvious means of doing this is noted. Thus the "ping" is more likely to be required.) II.3.3. Link states For purposes of route table generation and link state propagation, a link whose state is "tentative" or "lost" is "bad"; bad routes are not used in creating the routing table. Tentative routes are not propagated; newly bad ("lost") routes are propagated by the link state ("bad news") propagation procedure, and then dropped. Links whose state is "good" or "suspect" are used for route table generation and are propagated. Note that if a link is connection-oriented, there may be no need for either a suspect or tentative state; these links are either "good", "lost", or "null". **Table II-1. State transition table for adjacencies. (Null) ----------> Tentative -----------> Good <----\ traffic or RRH heard | ping succeeds \ \-----/ RRH heard \ \ \--------->Null \---| no RRH/tfc heard ping fails \ v \<-Lost<---Suspect ping fails II.4. Manual procedure for general-topology subnetworks A general-topology subnetwork may have adjacencies which cannot be detected by means of a broadcast-oriented (RRH) procedure. These links cannot be automatically added, and alternative procedures are required. These links may be connection-oriented or connectionless; the link state transition procedure is determined accordingly. The most general way to handle this is to insert these adjacencies manually. The state of these adjacencies is determined the same way as with links that are created by hearing RRH messages. Note that when an adjacency is manually-initiated across a general-topology subnet, the initiating side of the link takes action, while the responding side should accept the incoming connection request, and both sides see the link. Thus only one side of the adjacency actually needs to have a manual entry. If a connection already exists to another node across a subnetwork, then there is no need to initiate a second connection simply because a manual entry exists. **In some cases (such as source-routed frame relay "digipeating" over AX.25), a manual route can be entered to a destination whose first hop, at least, crosses a broadcast-style subnetwork. This type of adjacency may require manual intervention in the ARP function as well. II.4.1. Semi-automatic discovery In addition to manually-created links across a subnetwork, there exist cases in which the RSPF router is also a subnet router, and is thus privy to routing exchange information generated by that subnetwork. (An example is a node which implements both RSPF and "TheNet".) If the subnetwork provides sufficient information such that support of RSPF by another node can be inferred (i.e., by a distinctive subnetwork address), then RSPF may sequentially initiate appropriate procedures to determine whether or not a useful adjacency exists. Translation of routing metrics into an RSPF link metric is handled on a case-by-case basis. Specific convergence procedures for any such subnetwork require further study. Table II-2. Coding of the RRH PDU. 1 2 |0 |8 |6 |4 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | RSPF Version #| Type (RRH) | Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Full IP Address of sending router | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | last packet sent seq. # | flags | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | plaintext |... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Parameters-- An RSPF Router-Router Hello packet is sent within IP with a protocol ID of . Each RRH packet contains the following fields: RSPF Version Number: Version number of this protocol "22". ** This packet format is identical with version 21; RSPF22 should accept "21" as valid. Future versions "30" and above may be incompatible. (Accept anything 2x on receive.) Type: Value of 3 for RRH. Checksum: IP-style checksum Address: Full IP address of sending router Last packet sent sequence number: An integer (mod 65536) incremented by 1 for every frame sent by the subnet across this interface. This value allows receiving entities using connectionless procedures to use the automatic link quality measurement technique described in II.5. Flags: The low-order bit is 1 if connectionless datalink is preferred on this interface; 0 if connection-oriented is preferred. (Set by system management based upon anticipated link quality.) Other bits are reserved (sent 0; ignored on receive). Note that some implementations do not support this; "preferred" does not mean "mandatory". Plaintext: An optional text message (length may be up to maximum size remaining in datalink PDU). This might serve, for example, to "broadcast" the router's existence to persons who might be "reading the mail" (monitoring a radio channel promiscuously). **It may be noted that a very short RRH message can be received intact across a subnetwork that otherwise might not be capable of supporting maximum-size packets with reasonable reliability. This should be taken into account when setting the value of Plaintext. An explicit minimum is not, however, stated. II.5. Automatic link quality measurement (This procedure was not tested in the implementation of RSPF 2.1, and is therefore considered highly experimental!) A connectionless link or subnetwork may have very reliable, or very sporadic, performance. Since there is no procedure for ensuring the reliability of packets sent over a connectionless link, a high rate of packet loss may occur without being detected by the routers. If this loss is high enough, another route may become a better choice; a high enough packet loss rate may be enough to mark a link as "down". The automatic link quality measurement procedure allows links which are not yet "down", but whose performance is substandard, to be noted. Every router shall maintain, for each link, a count of all packets sent over each link. Every time an RRH message is sent, it includes the current value of this counter (modulo 65536). Every router also maintains, in its adjacency table, a count of the total number of packets received from said adjacency since the last RRH message, and the value of that counter as received in the last RRH message. Upon receipt of an RRH message, the recipient router compares the value of the received packet counter with the last received value in the adjacency table. The difference (taking into account wrap-around at the modulus) is compared with the number of packets received since the last RRH message. (This works even if an RRH message is lost.) This packet loss ratio is then maintained as a guideline to determine link quality. If link quality falls below a settable threshhold, the link state is changed to suspect. Timestamp can also be used to compute packet arrival rate. Connection-oriented data links presumably deliver 100% of attempted packets. A high-quality connectionless link, such as Ethernet/LLC1, will come close to this. However, single-frequency packet radio links are prone to packet loss for several reasons, including hidden transmitters, lack of collision detection, and rf interference. The packet loss ratio is useful in setting link cost, and may also be used to determine whether a link should use connectionless or connection-oriented procedures. If a router reports, in its link update packets, that a given link has a cost of _n_, then its adjacencies (and only its adjacencies) may apply the packet loss ratio to adjust the cost which they maintain in their link state tables. These adjusted costs, rather than the received costs, may then be propagated to other routers. Such procedures should be applied sparingly, as each change must be propagated and could, if used too frequently **or inconsistently across a network, result in network-wide instability. A suggested (experimental) algorithm is as follows: A percentage threshhold x is set, as is a cost-adjustment factor y. If fewer than x% of packets are received during a measurement interval, the cost of that adjacency is multipled by y. For example, if x is 80 and y is 1.5, then an adjacency with a nominal assigned cost of 4 will be up-costed to 6 if only 70% of packets are received, but will be restored to 4 if 80% or more are received during the next measurement interval. The measurement interval is the time between RRH messages, which typically should precede routing update messages. III. Acquisition of end node adjacencies Four possible means of automatically determining adjacencies to end nodes are the inclusion of RSPF in end nodes, the use of connected-mode subnet links, the use of ARP, and the use of a "wiretap" algorithm (see RFC981). Unless a connection mode Data Link layer or subnetwork (with keepalive timers) is used, adjacent nodes may need to send each other messages at regular intervals (ping) to ensure that the link is still usable. A procedure is outlined below for routers and end nodes to acquire knowledge of each other. **Adjacencies may also be set manually. RSPF maintains a manual routes table which may list both individual nodes and node groups that this router will route to absent any other information. (This is required for creating node group support of end nodes.) Manual adjacencies are determined from the manual routes table. An entry in the manual route table not flagged as private should be propagated as a known adjacency. Private entries are not propagated. **In the event that a private route provides connectivity to a general-topology subnetwork which notifies the router of a potential adjacency, this indirect adjacency may be propagated. (This latter detail is unproven and may warrant a flag to disable, on a system or per-manual-route basis.) III.1. RSPF optional in end nodes RSPF need not be activated in end nodes; this permits them to use a simple version of the TCP/IP software. A node that has RSPF support in its software but operates as an end node can also use the router-router connection procedures and simply broadcast its adjacency to the router in a one-entry bulletin with a **low horizon. Such a node may also be simultaneously homed on two or more other routers, unlike true end nodes whose traffic either bypasses RSPF (using ARP) or arrives by way of its associated router. There is no "redirect" function provided in RSPF. Since radio does not generally provide a true "broadcast" topology subnetwork, a router cannot presume that if both end nodes can hear it, that both end nodes can hear each other. If an RSPF-equipped end node hears the destination directly, it may test adjacency to that node, via ARP. If that succeeds, then it should choose on its own to route packets there directly, since that one-hop link on an interface will cost less than a two-hop link across the same interface. III.2 End node subnet connection If an end node knows the IP address of the router which will connect it to the network at large, it may establish a connected-mode AX.25 or other subnet connection to the router; the presence of this connection indicates that the node is reachable from that router, which then adds it to its links table and subsequent bulletins. This may, of course, require an ARP exchange in order to acquire the subnet address (eg., the AX.25 address). III.3. Connectionless using Address Resolution Protocol Alternately, the end node can simply use ARP and use connectionless link procedures. In this case the router should assume that the end node is available until either a rather lengthy timer expires, or the router is unable to make an ARP contact after the ARP timer expires. (A loss of reachability should not be inferred from the ARP timeout.) Routers may periodically broadcast their availability (suggested interval: every 15 minutes) with a broadcast frame sent to the broadcast address. In AX.25, this is a UI frame sent to "QST-0". A human-readable ("unproto") message may go here, allowing individual operators to recognize routers and connect as appropriate. (No specific PDU coding is provided, as the end nodes do not use RSPF, and thus this is not really an RSPF packet. However, the RRH frame may double for this function, since its plaintext will generally be readable.) III.3.1. Promiscuous ARP A router may also choose to use "Promiscuous ARP" to provide service to an end node which is attempting to connect with an IP address reachable by the router. In such a case the router should wait an extra interval after receiving the ARP request because the desired destination may actually be directly reachable; ARP procedures may need to be modified to provide this. III.4. Wiretap Another potential approach is for routers to simply listen to AX.25 traffic on the link and determine who is adjacent to whom. This is the gist of the "wiretap" algorithm in RFC981, which also finds non-adjacent nodes by taking advantage of the source routing found in AX.25 frames. Integration of wiretap into RSPF is for further study. (It is not part of RSPF 2.2.) IV. Link state propagation Link state information is propagated between routers within bulletin envelopes, which are sequences of packets containing partial or full copies of the sending node's link state table. Both point-to-point and broadcast procedures are provided. IV.1. Optional multicast/broadcast Packet radio is inherently a broadcast medium. Packet radio networks, however, do not necessarily offer a reliable broadcast service, even if they happen to use a broadcast physical medium. It is still possible to exploit the broadcast nature of the medium. RSPF link state propagation procedures allow but do not require such multicasting. If the link uses connectionless procedures for user data packet exchange, then broadcast procedures should be used for link state packet exchange. The converse may not necessarily be true: The threshhold of loss that militates against connectionless transmission of user data may be more stringent than that which call for non-broadcast transmission of link state packets. Note that RSPF specifically permits its broadcast procedures to be used over subnetworks that do not have the reliability of true broadcast-topology subnetworks. This reduces the channel utilization on radio links. IV.2. Routing update bulletins Routing updates are passed along from router to router via routing update bulletins, which are broadcast within routing update envelopes. Bulletin propagation is designed to make it highly likely that every node within a given "horizon" eventually receives every routing update message sent out by a given node. IV.2.1. Sequence numbers Every router originates information about changes in its own adjacencies, as well as periodic retranmissions of its entire list of adjacencies. These bulletins are then propagated among other routers. The router whose adjacency information is being broadcast is called the _reporting router_; this may be some hops away from the routers which forward it to their own adjacencies. Each reporting router's bulletins (adjacency updates) contain sequence numbers (and in some cases, a subsequence number). These sequence and subsequence numbers are generated by the reporting router and propagated; they are not changed when a bulletin is relayed. They are incrememted by 1 every time a new one is generated. IV.2.1.1. Restored sequence numbers **If RPSF is restarted, after having been run previously run (i.e., in the event of a system restart) before all knowledge of that router has timed out of the network, then sequence numbers beginning with 1 could cause the network to fail to converge, as these bulletins will always appear obsolete. A procedure is needed for routers to "catch up" with its previous sequence number if it is still in the network. **When a router first goes into service, its sequence number is initialized at 1 (or another low nonzero number). The router sends RRH before it sends its first bulletin. This enables it to first receive an update from its own adjacencies. Even if it sends a bulletin before receiving one from its adjacencies, sending a bulletin with a sequence number of 1 will prompt the adjacency to update it. Whenever a router receives a bulletin, it examines the contents to see if its own router number is included as a reporting router. If so, then it resets its own sequence number to 1 greater than the sequence number received. This enables the router to resume its sequence number generation at a higher number than where it left off. A value of 0 is never used for reporting. However, a router shall respond to receipt of a bulletin with a sequence number of 0 with an update containing the current sequence number. (The 0 is thus reserved for use as a "poll".) IV.2.1.2. Sequence number exhaust **Modular (circular) numbers are not used in RPSF Version 2.2. Thus a router may eventually exhaust its 16-bit number space, if it is in continuous operation long enough (nearly two years, given 15-minute updates). Should this occur, the router may reinitialize itself by halting all bulletin origination for a period long enough for the entire network to "forget" about that router's existence. Pending further study, a period of two hours is recommended for RSPF in a typical packet radio environment. IV.2.2 Subsequence numbers Bulletins may also carry change information incremental to previous bulletins. These carry the same sequence number as the full routing update bulletin to which they are reporting incremental changes; each such partial routing update bulletin has a subsequence number. The subsequence number is zero for a full routing update bulletin. IV.2.3. Horizon Every bulletin also has a horizon value, set by the reporting router, associated with each of its constituent links. (A given reporting router may have more than one constituent link, if it is a multi-port router.) Every time a bulletin is propagated, each horizon value is decremented by 1. When it hits zero, the bulletin is not propagated further. Note that for horizon purposes, a bulletin's individual constituent links may have separate horizons; when a link's horizon hits zero, other links' adjacency information from the same reporting router may continue to be propogated. It should also be noted that if a given link has adjacencies with different horizons, these must be treated as separate links, since horizon is reported as a characteristic of a link. Such a circumstance may occur, for example, when a router serves a node group. Adjacencies within the node group are typically propagated with short horizons, since they are only of local interest (i.e., to other nodes in or near that node group). Similarly, the node group itself is propagated with a long horizon, across a backbone. However, adjacencies outside the node group may be propagated with long horizons, as they would not otherwise be reached across a backbone dependent upon node groups for long-haul routing. IV.2.4 Routers table Every router maintains within memory a routers table containing one tuple for every other router on the network, excepting those which are unseen because of a horizon. (An extreme case of this exception is an end node running RSPF with a horizon of 1, whose existence is only known to its own adjacencies.) This tuple contains the following elements: IP Address (router number) Last received bulletin sequence number Last received bulletin subsequence number Timestamp for when the data was received. Horizon remaining in bulletin when received This table is used to coordinate the receipt and transmission of bulletins, using either broadcast or non-broadcast procedures. **If a router chooses to use multiple IP addresses (as is commonplace on the Internet where different interfaces may use different addresses), only one IP address is used by each router for propagating link state information. This is used as the router number. IV.3. Flooding without congestion A procedure is used to "flood" the network with link state information. This is designed to minimize the total amount of information transmitted, while maintaining an up-to-date data base on each router. IV.3.1. Upon initialization of adjacencies Bulletins are forwarded in a routing update envelope which may contain one or more reporting routers' bulletins (adjacency lists), which are flooded to the network. A bulletin envelope may actually concatenate multiple reporting routers' bulletins; this is in fact the typical case, when routing update packets are exchanged on schedule, and when a given router acquires a new adjacency. However, partial routing updates (good news and bad news) may be sent at any time. The first time an adjacency is acquired, the two routers perform a full routing update with each other, exchanging their complete link lists. Once this is complete, the routers perform the SPF algorithm and compute new routing tables. IV.3.2. Preventing loops and retransmissions A bulletin from reporting router X (which lists all of X's adjacencies) is sent, initially by X, to every adjacent (to X) router A. This router A passes it along to all of its own adjacencies B, etc. This flooding is controlled such that no reporting router's adjacency update is sent more than once between the same pair of routers. After router A sends its bulletin envelope to B, the recipient router B then looks at the sequence number of each reporting router X's adjacency bulletin within that envelope, and for each reporting router's bulletin, compares the sequence number of the just-received adjacency bulletin with the highest sequence number previously originated from X. If the just-received bulletin is newer (higher number), then it [**for further study: sends a positive acknowledgement to A, and] joins in the flooding to its own adjacencies. The horizon is, of course, decremented. If the bulletin from X has the same number as was stored in B, B checks the horizon left in the received bulletin against the horizon left when it previously received the bulletin. In the event that the latest bulletin received had a shorter (lower number) horizon left than the earlier one, it simply ignores [and acknowledges] the (redundant) message. But if the reporting router X's horizon left is greater for the new copy of the bulletin, router B propagates it as if it were a new bulletin. This way, if the bulletin happened to first arrive via a roundabout path, it won't accidentally fail to reach the intended end of its range. (Summary: Newer or longer-horizon bulletins are both passed along. Same age or older (by sequence number) or same or lower horizon will not be propagated.) If any router B receives from router A a bulletin (from any reporting router X) that contains a lower sequence number than one that had previously arrived at B from said X, then it can be presumed that A has "obsolete" information. B replies by sending a bulletin to A with the latest link state information for that node X. As a corollary, a router may poll for information about a given reporting router by sending a routing update bulletin for that reporting router with a sequence number **of 0. Said bulletin may contain zero links' information. IV.4. Point-to-point bulletin envelope exchange A router may acquire routing information from adjacent routers via point-to-point procedures which treat every adjacency as a separate logical data link. (Such a procedure also works, of course, over point-to-point links such as wirelines.) This tends to have the highest reliability, since connection-oriented data link control procedures can be used to ensure the accuracy and completeness of the data passed over the link. It has the disadvantage of requiring separate transmission of the same data to different adjacent nodes on the same radio channel. Bulletin envelopes are thus exchanged (when connection-oriented is selected) periodically (based upon timers) and when new information is received (over a new adjacency, and when good and bad news arrive). Delivery of these bulletins is considered to be generally reliable. IV.5. Broadcast bulletin propagation When a router is adjacent to several other routers via the same broadcast (i.e., packet radio) channel, retransmission of routing bulletins to each adjacency makes additional use of bandwidth, which may be a scarce resource. A broadcast procedure may be used to pass the bulletin along that link. Note that broadcast propagation of bulletins may be combined with non-broadcast propagation, on a link by link basis. Although packet radio is a broadcast medium, it is not a perfect one: The reliability of multicast packets is not as high as for wireline LANs. This leads to the need for a unique broadcast "flooding" technique. Note that in a true broadcast-topology subnetwork, these procedures add little channel overhead, so these procedures are applicable there as well. IV.5.1. AX.25 subnetworks **At this time, only the AX.25 subnetwork is widely used in AMPRnet while providing a multicast/broadcast service. Similar procedures may be adapted for use elsewhere. A routing update bulletin is broadcast to the Layer 2 multicast AX.25 address using the IP multicast address. Individual recipient routers may or may not receive the entire bulletin, since there is no acknowledgement provided. In the previously described case of a non-broadcast message sent via a connection-oriented datalink, the entire routing update bulletin can be assumed to have been received intact. Thus, if a given reporting router has originated a new complete list of its adjacencies (new sequence numbers, subsequence numbers are 0), then any adjacency not included is presumed to have ceased to exist. Such a presumption is not always possible when a bulletin was received via unacknowledged broadcast, as the message might have been received in part. This should not make the partially received bulletin unusable. A bulletin envelope is transmitted in one or more packets, each of which constitutes a numbered fragment of the whole bulletin envelope. Within the transmitted bulletin envelope, each individual reporting router's bulletin begins with a node-header which contains the number of links being reported on. Within each bulletin, each link is identified by a link header, each of which specifies the number of adjacencies being reported on (for that link). Since each IP packet that makes up a bulletin contains a fragment number, it is also possible to determine whether or not a fragment was lost. Each packet also contains an envelope-ID, which prevents accidental mis-assembly of different bulletins that may arrive close in time. In connection-oriented non-broadcast procedures, a routing update bulletin (not a partial one with a subsequence numbers >0) provides a complete list of adjacencies known to the sending node, except where the horizon is exceeded. Absence of a previouly-known adjacency then implies that the adjacency has been lost. However, that assumption does not apply to fragmented bulletins received in part, which can occur with broadcast procedures: If a fragment was lost before reaching the end of a given reporting router's bulletin within the bulletin envelope, then the absence of a previously-known adjacency in the received bulletin does not mean that the adjacency was lost. RSPF procedures dictate that routing update bulletins with a subsequence number of zero are presumed to be complete lists of adjacencies from their originators; higher subsequence numbers represent incremental changes only. In the broadcast procedures, a routing update bulletin with a subsequence number of zero, if received only in part, is treated as a partial routing update bulletin. If it received in full, it is treated as a full routing update bulletin. Thus, the recipient compares the sequence number with the previously received sequence number from that reporting router. If it is higher than the previously received one, then its adjacencies are used. If it was received in full, and had a subsequence number of 0, then its previous adjacencies are replaced (removed if not contained in the latest full routing update bulletin). If it was not received in full, or if its subsequence number was not zero, then its previous adjacencies are left intact unless explicitly changed by the received bulletin. If a bulletin is received in full, then the routers table is updated with the latest sequence and/or subsequence number, horizon, and timestamp. If it is received in part, then these entries are not updated. After the bulletin has been completely transmitted, a recipient node which has received a partial update from a reporting node may poll for that node's latest information, by **originating a bulletin naming the reporting router in question, specifying sequence number 0, with zero links for that reporting router. (This is the same polling procedure used for non-broadcast links.) Note that if a fragment is lost, a reporting router whose node-header is in the lost fragment will of course remain unchanged in the recipient's data base. Furthermore, any data received in subsequent fragments, prior to a node-header, will also be meaningless. The last adjacency of the last link in a reporting router's bulletin will have the Last flag set to 1, signaling that following the address, a node header follows. Note also that the first node-header within an envelope is pointed to by the sync byte in the envelope header. The last flag and sync byte should match or an error should be noted. **IV.5.2. Reconstructing bulletins from multiple fragments If the resent bulletin is the same one as previously received in part, and it too is received in part, then if all of the previously received fragments were stored, the receiving router may attempt to reconstruct the entire bulletin from the two (or more) fragmented transmissions. Once an entire bulletin has been reconstructed, the receiving router may treat this as a complete update. (This procedure is optional.) **IV.5.3. Non-broadcast unreliable subnets If an adjacency is established across a general-topology subnet that does not offer reliable packet delivery (eg., TheNet packet level), then broadcast procedures should be used to exchange routing information across the subnet between the two adjacencies. If the entire bulletin is received intact, then it should be used; if it is received in part, the received portions may be used, and the recipient may poll for a retransmission as in IV.5.1 and IV.5.2 above. IV.6. Routing update bulletin packets A routing update bulletin envelope (Table IV.1) may contain several different reporting routers' updated link state information, concatenated into one message, with a different sequence number for each source (reporting router). One of the sources, of course, may be the local router. Each router's link state information is further broken down by link, which allows its backbone routing information to be propogated separately from its local end node adjacency information. IV.6.1. Node group reduction of adjacency list If an end node establishes a connection with a router whose node group default addresses (based on the significant bit count) already include that end station, no bulletin need mention that adjacency, as packets to that end station will already be routed correctly. Node groups are defined manually. IV.6.2. Incremental changes (good news and bad news) Bulletins that only report changes in state come in two flavors. Good news bulletins inform other routers that an adjacency has been noted. bad news bulletins inform them that an adjacency has been lost. Theoretically, a router could send out a new full routing update bulletin every time it gained or lost an adjacency. However, the use of shorter good news and bad news packets, which do not contain a full routing update, allow the network to remain relatively current with less transmitted traffic. Good news and bad news packets are propogated like other packets, but are not originated by the same rules. While full routing bulletins are originated based upon a timer (rspftimer), good news packets are transmitted immediately upon receipt and initiated immediately after an adjacency is initialized. This enables new links to be useful quickly. Bad news, however, should not travel as fast: A node should cache any bad news message for a time (**recommendation for this timer: rspftimer/16) while waiting for the link to come back up. This helps keep the network stable; if the node receives a packet destined for the lost destination, it may send an ICMP "host unreachable" message to the originator of the packet, unless it can reroute the packet itself (as may happen with the loss of a backbone link when others still exist). Because good news and bad news messages represent changes to the last full link state bulletin propogated, but do not purport to completely represent a node's link states, they carry bulletin subsequence numbers. These use the last bulletin sequence number originated by the reporting router, but the sub-sequence value increments from 1. (A full link state packet has a sub-sequence value of 0, and resets the subsequence counter.) IV.6.3. Routes to nearby destinations Sometimes more than one router will serve the same area (determined by the significant bits' matching), and they will need to know which one has the better path to a given station. These adjacency messages may only require a short horizon, as will good news and bad news packets which refer to end nodes going on and off the air. Higher horizons are needed for backbone routers. **This distinction allows routers to define their service area and role within a network by appropriate horizon adjustment. A router that only uses short horizons may be useful for providing connectivity within a constrained geographic area, typically encompassing one or a small number of node groups, in which not all end users have full connectivity to a single router. Such a router will set its horizon_link, reporting on other routers, to a low value. A router that serves as a backbone node, propagating node groups across a wider horizon, will have a high horizon_group, reporting node groups, value. (**Horizon_link and horizon_group values are usually set the same. Horizon_portable is usually set to the same value as horizon_group and horizon_link; horizon_local is set to a low value, so that even a backbone router will not propagate intra-node group information across the backbone.) Table IV.1. Routing update (link state packet) bulletin envelope: 1 2 |0 |8 |6 |4 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ---- | RSPF Version #| Type | fragment # | fragment total| packet +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -hdr | Checksum | sync byte | # nodes below | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Envelope-ID | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ---- | Reporting node #1 full IP Router-Address | node +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -hdr | Node 1 bulletin sequence # | sub-sequence #| # links | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ---- | horizon left | ERP factor | link cost | #adjacencies | link +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ _-hdr_ |significant bits| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Adjacent node(s) 1,1,1 IP address | adj. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ --- |significant bits| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Adjacent node(s) 1,1,2 IP address | adj. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ --- ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |significant bits| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Adjacent node(s) 1,1,n IP address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ --- | horizon left | ERP factor | link cost | #adjacencies | link +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ --- |significant bits| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Adjacent node(s) 1,2,1 IP address | adj. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ --- ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |significant bits| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Adjacent node(s) 1,2,n IP address | adj. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ --- | Reporting node #2 full IP Address | node +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Node 2 bulletin sequence # | sub-sequence #| # links | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ --- | horizon left | ERP factor | link cost | #adjacencies | link +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ --- |significant bits| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ adj. | Adjacent node(s) 2,1,1 IP address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ --- |significant bits| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Adjacent node(s) 2,1,2 IP address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | horizon left | ERP factor | link cost | #adjacencies | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |significant bits| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Adjacent node(s) 2,2,1 IP address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |significant bits| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Adjacent node(s) 2,2,n IP address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Reporting node #n full IP address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Node n bulletin sequence # | sub-sequence #| # links | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ etc. Parameters-- An RSPF bulletin packet is sent within IP with a type of . Each routing update envelope contains an envelope packet header that contains: RSPF Version Number: Version number of the protocol (22). Type: (Value 1 for Routing Update Bulletin Envelope) Fragment Number: States which fragment, in a segmented message, this is, beginning at 1. Non-fragmented messages use 1. Fragment total: Total number of fragments in message; 1 if not fragmented. Checksum: IP-style checksum. Sync byte: Which octet in this packet (counting from this byte as byte 0) is the beginning of the first node-header. If 0, this fragment has no node-header. Non-fragmented messages use a value of 4 (because 3 bytes follow in packet header). Number of nodes reporting: The number of reporting routers in the messages that follows (this packet or a sequence of packets forming the envelope). The node-header (for each reporting router) contains 8 octets: Reporting router #n full IP router address: The IP address of the router whose adjacencies are being reported below. (Note that if a router uses separate IP addresses on its links, it should still adopt a single one as its router address.) Bulletin sequence number: When a bulletin is passed along, this number is NOT changed; every new bulletin from a given Reporting router has a value 1 higher than the previous bulletin from that reporting router. Sub-sequence number: Good news and bad news packets representing incremental changes from the last full report increment this value by 1; it is 0 for full bulletins. # links: The number of different cost-horizon values (typically, but not necessarily, representing different types of link in a mulitiport gateway) being reported below; the following four octets are the header for each link. [For each reporting router, adjacencies are reported separately by link cost. This is the received cost value for that data link, after any adjustment that may be based upon packet loss ratio. Adjacencies are also reported separately by horizon, even if the cost is the same. It does not matter at this point if there are multiple RF or other links if their cost and horizon are the same. Likewise, separate received costs or horizons on one link will be treated separately and such adjacencies will be grouped under separate link headers:] Horizon left: This number is decremented every time a routing update bulletin is passed along; when it reaches 0, it is not passed further. Link cost: A "figure of merit" for each link, rising with slower/poorer links. This is the number whose total is minimized by SPF. The range is 1-127. As a starting point, a 56000 bps fdx backbone link might have a value of 2, a 4800bps hdx link a value of 5, a 1200bps hdx link a value of 10 and a 300 bps hf "wormhole" a value of 20. An Ethernet or high-speed (1 Mbps+) link might then have a value of 1. A value of 255 denotes the loss of a link; this is found in Bad News packets. These values should be coordinated network-wide; adjusting them will change the way packets are routed by RSPF. Number of adjacencies: The number of adjacencies to be listed for that reporting node. ERP Factor: Used for "approximating" a route; contains the number of significant bits for which a given node can be presumed to be a valid router, even if it doesn't report in detail. A low factor = wider coverage area; thus ERP of 16 means that if NO other match is found for a given address, this router will try to handle it if it matches 16 bits. Basically a handle for future enhancements; its use will not be required in this release of RSPF. For each adjacency of the given link cost, the following is provided: Significant bits: The number of bits used for node group routing purposes. Usually 32 but may be lower if a given link purports to serve all end nodes in an area defined using the most-matched-bits node group convention. Higher numbers of bits matched take a higher priority than least cost. This uses the low-order 5 bits of the octet. Last-flag: If this is the last adjacency in the list for this reporting router, this value is 1; otherwise it is 0. (This occupies the high-order bit of the significant bits octet.) Full IP address: The full IP address for this node. Note that the n,n,n vector within the bulletin has three fields in the above representation: Reporting router within bulletin envelope, link cost/horizon within reporting router's bulletin, and reporting adjacency with that link cost/horizon. IV.7. Fragmentation In a moderate to large network, a full routing update can easily exceed the maximum size of an AX.25 frame or IP packet. The RSPF Routing Update message, however, may be sent in fragments. The IP fragmentation function is not used for this; bulletins are not assumed to be terminated by a packet boundary. Each fragment is, however, numbered in the packet header, along with an indication of the number of the total number of fragments in that envelope. In order to permit parsing of the incoming fragments by routers who are using unacknowledged broadcast information (with the high likelihood of lost fragments), every bulletin's packet header contains a sync byte indicator. This indicates which byte, where the next byte in the header is byte 1, is the beginning of a node header. If a previous fragment was lost, the receiver should ignore the number of bytes indicated in the sync byte before resuming parsing of the packet. (If the fragment does not exceed 255 bytes, this will always be sufficient. It is recognized that long packets may not be able to use this mechanism reliably, and a value of "0" should be used to indicate that no sync is possible within this fragment.) Each routing update bulletin envelope takes the form of a three- dimensional list, with the dimensions being reporting router, link and adjacency. A given bulletin envelope may report on link state from one or more remote nodes, as well as from the sending node. Each node may have one or more links; each link may have one or more adjacencies. Packets may not be fragmented within adjacencies, but may be fragmented after an adjacency's address and before the next adjacency's significant bits field. (This presents a 5-octet field that should not be fragmented.) The next fragment, in a new packet, simply begins where the last one left off; the receiver knows how much more to expect based upon the node and link count in the respective node-header and link-header. A router may not start sending a new Routing Update message of any kind to any given IP address until all fragments of a previous message to that address have been transmitted. This applies both to point to point (non-multicast address) and multicast procedures. IV.8. Bulletin Timers The timers used for bulletin updates must be a compromise between maintaing the network's current state and the traffic required to do so. An initial suggestion: Good news messages should be initiated within a few seconds and bad news should wait at least **rspftimer/16, with relatively short horizons on the bulletins (i.e., the routers within the region). Full routing updates with normal horizons should be sent out every rspftimer interval (typically 30 minutes). If the network is small, more frequent updates may be possible; too frequent updates risk choking the network with update traffic. V. The Shortest Path First spanning tree algorithm As a routing node comes onto the network, it acquires over time a complete list of adjacencies between other nodes on the network except as limited by the "horizon". Each adjacency (point to point link) within the entire known network has a "cost" associated with it. It should be noted that adjacencies, for the purposes of this algorithm, are "logical" and not necessarily physical; if a subnetwork link occurs below IP (as in AX.25 digipieating or TheNet), the two ends of the link are still adjacent. (Adjacency at the IP internet layer is based upon subnetworks, which may contain their own links.) Cost is set for the receive side of each link. If the receiver and transmitter do not agree on cost, the network shall apply different routes for packets going in opposite directions between the same two end nodes. (This is not a problem. In a radio environment, one should NOT assume reciprocity across a link.) V.1. Tables V.1.1. Link State Table Each router builds a _link state table_ (or links table) that lists, for every known link in the network (from every reporting router), the two ends and the cost of that end of the link. The ends are listed by an IP router address and, for the destination IP router address, a number of significant bits. This is what is updated by the bulletins and by good news/bad news messages. Adjacent links also are merged in from the adjacencies table. Source IP address Dest. IP addr/bits Cost 44.56.4.44 44.56.4.128/32 5 44.56.4.44 44.56.4.12/25 10 V.1.2. Paths table The goal of the SPF algorithm within RSPF is to build a _paths table_ which lists, for every reachable node (or node group approximation of fewer than 32 bits) on the network, that node address (or node group address and number of significant bits), the adjacent node used to get there (i.e., where you blast the packets to next), and the total cost of the path. This is done by building a spanning tree with the router doing the computation (the home router) as the root of the tree. The paths table thus lists the best way across the tree from the home router to all known destinations. V.1.2.1. Route table **It should be noted that the only implementation of RSPF to date is within the KA9Q NOS package. This includes a route table which roughly corresponds to the paths table, trusting ARP to provide subnetwork information. However, RSPF routing makes nominal use of a logical route table which includes both the paths table entries and the subnetwork address required to reach the first adjacency. The structure of this table's implementation need not be defined here. It may, for example, be a logical union of the paths table relation (providing IP addresses) with ARP and related subnetwork table relations, using IP address as the common key. (Thus there is no RSPF route table per se. This corresponds to the logical route table in RSPF 2.1.) Or RSPF may supersede these tables with a separate route table including required hardware and subnetwork address information. Entries in the route table include: Destination IP Address Destination IP Address number of bits (0-32) Selected adjacency hardware interface Selected adjacency subnetwork address string Adjacency IP address Cost V.1.3. Trial table Every router contains, for the purposes of building the tree, a _trial table_ that has three entries: Destination address/bits, adjacent node, and cost of this path. The paths table additionally has one more entry, the _parent_ node, which is the last hop before the destination. Thus in a path A -> B -> C -> D -> E, home router A views E as the destination, D as the parent, and B as the adjacency. Note that in the path from A to B, A is the parent node. V.2. Building the paths table Begin building the paths table by using the home router as the first node on the paths table. The cost to reach yourself is always 0, so make the first entry on the paths table as follows: Source=self, destination=self, parent=self, and cost=0. From here on in, parent is always (by definition of the SPF spanning tree) the node most recently added to the paths table. Destination Adjacent Parent Cost 44.56.0.128 44.56.0.128 44.56.4.44 5 44.56.0.131 44.56.0.128 44.56.0.128 10 44.56.0.200 44.56.0.128 44.56.0.131 15 Paths Table showing relationship between destination, parent and adjacent nodes, where the home node is 44.56.4.44 and 44.56.0.200 is three hops away; all hops here have a cost of 5. V.2.1. Scanning the links The home router now scans its links table looking for all nodes (routers and end nodes) that are adjacent to the current parent node, except for links to nodes which are already on the paths table. (It is generally fastest to build the paths table by scanning the links table in order of increasing link cost.) Each of these new nodes is added to the trial table, except for the parent node (which is already on the paths table, so it can't possibly have a shorter path). The value of cost placed on the trial table is the cost of the link from the parent to the destination plus the cost from home to the parent node (which value is already on the paths table). A node may only appear once in the trial table at any given time. If an adjacency is found to a node that is already on the trial table, a new entry replaces the existing entry if and only if the new total cost is lower. If the cost is higher, it is ignored. (If the costs are equal, then a "tiebreaker" is determined by treating the lower-numbered IP address as the lower cost. This will simply make the spanning tree more deterministic in case of tie.) Thus the trial table always contains the lowest cost path to each destination found so far. Once all of the links from the parent node have had their chance to go onto the trial table, scan the entire trial table for the _one_ entry with the lowest total cost. This not need be a link from that parent node! In case of tie, pick the lower IP address (again just to be deterministic). Move this node to the paths table; guaranteed, there'll be no cheaper path to that node! The adjacency used for that node in the paths table is the adjacency to its parent node. Note that the parent _must_ already be on the paths table since that's the source of the parent; you're working your way outward. This new addition to the paths table becomes the new parent node. Repeat the procedure above (from the beginning of V.2.1) until there are no nodes left on the trial table. This means you've completed the spanning tree and have found the least-cost path to every other node. One of the router parameters is maximum_cost. If the cost to a given parent node exceeds this value, the procedure stops, since all subsequent entries in the route table will have a higher cost. This value has some semblane to the time-to-live parameter of the IP packet: It makes little sense to compute a routing table to nodes that cannot be reached within time-to-live. (Ideally, ttl will be implemented using a timer rather than a node counter, but this is difficult to do with some of the packet radio data link controller implementations; vis., TNCs.) A router should recalculate its routes periodically based upon the current links table. How frequently depends upon the CPU load involved. Initial estimates are that it should be recalculated after receipt of every routing update bulletin: Partial calculations do not save enough CPU time to make them worthwhile. V.3. Filling in the routing table **The route table in NOS (the KA9Q et al implementations of IP) contains, for each entry, the destination address, number of bits, interface, gateway and metric. RSPF 2.2 conceptually replaces this with a manual route table (essentially what exists in NOS without RSPF) and a route table which RSPF generates itself; when RSPF is activated, this latter table is used for packet routing. **The route table is filled in from the paths table after each time the SPF algorithm has finished. It takes entries from both the paths table and the manual route table. Order of precedence is important here. Manual routes have lower precedence than routes taken from the paths table, given an equal cost, but a lower cost manual route will override a higher-cost paths table entry. Since the routing table will be periodically recalculated from scratch, implementation **requires two separate route tables, one "in progress" and one "in service". When the route calculation is complete, the "in progress" table becomes "in service" and the old one is cleared for reuse. This allows packet forwarding to continue while the completed paths table is being converted into the route table. **Calculation of the paths table and route table can require substantial CPU resources, and should not take precedence over packet forwarding. V.4. Manual routes A manual route table may also be maintained. This takes second precedence to RSPF-generated entries in generating the route table. Manual routes are useful defaults before RSPF generates routing entries, for destinations not reported on by RSPF, for creating node group adjacencies, and for interworking with other routing protocols. **Note that manual routes in RSPF 2.2 are (at least logically) not simply entries in the initial routing table, but are permanent (until changed manually) entries in a separate manual route table which is merged into the RSPF-generated route table as the last stage of each calculation of the route table. (As an implementation option, the manual route table could conceivably be interleaved with the route table, with a "manual" flag on these entries, but the manual entries behave differently.) **Note that all manual routes are considered as adjacencies. This is obviously wrong at times, but cannot be determined automatically. Thus the private flag is provided. Entries in the manual route table include: Destination IP Address Destination IP Address number of bits (0-32) Selected adjacency hardware interface Selected adjacency subnetwork address string Adjacency IP address Cost Flag: Private/non-private V.4.1. Private routes Any manual route may be flagged as private. These routes are used in calculating the route table, but are never propagated to other nodes. Default routes should always be defined as private, as they do not denote known adjacencies, only values that this node will use absent better information. **V.5. Secondary storage of routing information This section is for study. It may be unnecessary because adjacencies will provide a full report to a router upon initialization of an adjacency. Real implementations of RSPF, especially under single-tasking operating systems (such as MS/PC/DR-DOS), will not always run continuously without interruption. Nor will all end systems. When RPSF starts running, it has an empty links table, and depends upon manual routes until receiving links information from its adjacencies. On a packet radio network, given the low bandwidths, this convergence may take excessively long. An implementation may work around this by storing, in non-volatile media (eg., hard disk) the information needed to quickly resume operation. This file (whose internal format is a local matter) should contain a timestamp and the last sequence number and subsequence number originated by this node, followed by the contents of the links table. This file should be stored after a new bulletin (with sequence or subsequence number) is transmitted. Only one copy of this file need be stored. Other tables may be optionally stored, for diagnostic purposes, but only the links table is required. When RSPF begins to run, it looks for this file. If present, it checks the timestamp. If the timestamp is recent (suggested maximum age: no older than twice the rspftimer), then the file should be read into the paths table. Acknowledgments The author would like the thank the participants in the Internet tcp-group for their assistance in preparing this, and to the various radio amateurs who have tested RSPF 2.1 on the air, for their assistance. Special thanks to Anders Klemets SM0RGV for drafting the first implementation of RSPF2.1, and to Mike Bilow N1BEE for creating a stable implementation as well as for his assitance in editing this revision. Appendix A. Router parameters Every router must set a number of parameters in order to properly operate. While RSPF builds its routing matrix automatically, overall network efficiency and stability may require some fine-tuning based upon experience. These include parameters set for each data link or subnetwork layer entity (i.e., each radio channel) and for the router in general. Commands given below are not necessarily the statements used in real implementations. Link/subnet settings: Set Link cost: This is the cost parameter based upon the link speed and type. Since the overall cost of the end-to-end path is minimized by the RSPF spanning tree, link cost should be set to arrive at the best overall network performance. The legal range is 1-127. This is sent in routing update bulletins. Node settings: Add/Delete Node group: [IPaddr]/bits {cost}. This allows a node to announce its ability to serve a group of nodes, identified using the standard NOS convention of address/significant bits. Thus a node group setting of [44.56.4.1]/25 will match all nodes from [44.56.4.1] to [44.56.4.127]. Cost is optional; if set, this cost to will be propogated to reach such nodes; otherwise, the link's default is used. This is fed into the manual route table. **A given router may support multiple node groups; this facilitatates operation near the boundary of address-subnet regions. Such a router may use a lower node group cost for its own node group than for adjacent (or nearby) ones, so that it is not a favored route to other groups. High costs for other node groups are still useful because they define whether an adjacency is governed by horizon local or horizon portable. (Use of a Private flag for this function, instead of propagating a higher cost, is for further study.) Set horizon link: This sets the horizon value for the node's routing bulletins apropos 32-bit addresses of other adjacent routers. This should be high enough to propogate across the backbone, if a backbone router. Set horizon group: This sets the horizon value for the node's routing bulletins apropos node group addresses (fewer than 32 bits matched) nominally served (providing end user adjacencies) by this router. Usually matches the horizon link value. Set horizon local: This sets the horizon vaue for the node's routing bulletins apropos full link addresses (32 bits) to non-routers within the router's node group area. This is set to a low value so that only other routers serving the same or overlapping node group(s) will receive these messages. Set horizon portable: This sets the horizon value for the node's routing bulletins apropos full link addresses (32 bits) to non-router adjacencies not within a supported node group. This allows portable end nodes to have their location in the network propogated farther than the local horizon; this is usually set the same as horizon group. Set RRH timer: This sets the time, in seconds, between router-router hello (RRH) broadcasts. Initial suggestion: 900. Set RSPF timer: This sets the time, in seconds, between newly originated link state bulletins. Initial suggestion: 900. Set suspect timer: This sets the time, in seconds, after which a connectionless adjacency is "suspect" if no packets are received from it. The route is then tested (e.g., pinged). Initial suggestion: 2000. Set suspect count (maxping): This sets the number of times an ICMP echo (ping) should be sent after a node is suspect, before it is removed from the adjacency list. Initial suggestion: 3. APPENDIX B. Schematic representation of RSPF tables. ---------------------------------------------------\ / ADJAC. LINKS PATHS | (SNAcP) SUBNETS-->+----+ +------+ [SPF] +-----+ | |II. |------>|V.1.1 | --->|V.1.2| | RRH IN--->| | | | TRIAL / | | | +----+ | |-->+-----+ / +-----+ | BULLETINS<--------->+------+ |V.1.3|-/least | | | ^ | | cost V | +------+ non- | +-----+ +-------+ | |IV.2.4| private | |V.1.2.1| / | | +-------+--/ | |<- +------+ | V.4 |-------------------------->| | ROUTERS | | all manual routes +-------+ +-------+ ROUTE MANUAL ROUTE Figure B. Information flow showing relationship between tables. Numbers in tables refer to sections above which introduce each table.