Link State Routing Fundamentals

This is a new version of the assignment. This revision was posted at 8:30AM Wednesday, February 25.

Due Wednesday, March 4, 1998. Note that you will have other stuff to do in the meantime (mainly reading), so don't dawdle.

In this cnet assignment, you will implement a part of the 1980 ARPANET link state packet mechanism, but you will do no actual routing of data packets. Thus, you should not enable any of the application layers of your nodes. You should assume a reliable data link layer by using CNET_write_physical_reliable for all transmissions.

Your program's goal will be to make sure each node builds a complete picture of the network in the form of link state packets for each other node. This will, of course, involve flooding LSP's from each node. But before a node can flood its own LSP, it must build the LSP in the first place. This requires that each node come to know the identity of its neighbors. Thus, the first phase of your development should focus on the problem of...

Neighbor Discovery

We will use simplifications of the neighbor discovery and flooding processes used by the ARPANET. We will not, for example, be measuring link costs, nor will we be providing flooding acknowledgements. Still, enough of the ARPANET's approach remains so that (1) each node should end up with a correct map of the whole network, (2) the maps will adapt to topology changes, and (3) the trouble of October 27, 1980 will be reproducible.

When a node is booted, it knows how many links it has. This may be detectable by the hardware, or it may be part of the software configuration. In any case, your cnet nodes have the information (in nodeinfo.nlinks). What a node does not know, however, is the identity of the node on the other end of each link. "Neighbor discovery" refers to the process of finding out who's on the other end of each link.

Here is the neighbor discovery protocol you should implement:

Flooding

Here are the rules for the ARPANET flooding of link state packets.

Some notes

How are you going to test your code? You should start by not allowing nodes to crash. You'll want to know whether the nodes can (1) correctly identify their neighbors within a short time of network startup, and (2) correctly describe the entire network within, say, 120 seconds of network startup. You can certainly You can see the adaptivity of this protocol by letting nodes crash and come back up. To let a node crash, you set its "nodemtbf" ("node mean time between failures") and "nodemttr" ("node mean time to repair") attributes in the topology file. If you have node 0 printing out its LSP list (that is, its map of the network) more frequently than you expect nodes to crash, you can watch node 0's map adapt to the new topology. Note that you do not need to let every node crash.

Perhaps this is obvious, but I want to mention it anyway. You'll want to have a many-node topology file to test your program. Write your own, or use mine

Extra credit: Simulating October 27, 1980

When node 0 boots, have it do its usual business, but set a timer for, say 200 seconds (long enough to let all the nodes' maps to stabilize). When the timer goes off, have node 0 send out three LSP's with sequence numbers 8, 40, and 44 to each of its neighbors. This should overload the network, as it did in 1980. How will you be able to tell that the network is overloaded? In what other ways can you track the problems these nasty sequence numbers cause?

Have fun. Keep in touch.



Jeff Ondich, Department of Mathematics and Computer Science, Carleton College, Northfield, MN 55057, (507) 646-4364, jondich@carleton.edu