In this lab, you will be writing a
"distributed" set of procedures that implement a distributed
asynchronous distance vector routing for the network shown in Figure
1.
Figure 1:
Network topology and link costs for DV routing lab
The routines you will write
For the basic part of the assignment, you
are to write the following routines which will "execute''
asynchronously within the emulated environment that we have written
for this assignment.
For node 0, you will write the routines:
rtupdate0()
is the "heart" of the distance vector algorithm. The values it
receives in a routing packet from some other node i
contain i's current shortest path costs to all other network
nodes. rtupdate0()
uses these received values to update its own distance table (as
specified by the distance vector algorithm). If its own minimum cost
to another node changes as a result of the
update, node 0 informs its directly connected neighbors of this change
in minimum cost by sending them a routing packet. Recall that in the
distance vector algorithm, only directly connected nodes will exchange
routing packets. Thus nodes 1 and 2 will communicate with each other,
but nodes 1 and 3 will not communicate with each other.
As we saw in class, the distance table
inside each node is the principal data structure used by the distance
vector algorithm. You will find it convenient to declare the distance
table as a 4-by-4 array of int's,
where entry [i,j]
in the distance table in
node 0 is node 0's currently computed cost to node j via direct
neighbor i. If 0 is not directly
connected to i, you can
ignore this entry.
Figure 2 provides a conceptual view of
the relationship of the procedures inside node 0.
Similar routines are defined for nodes
1, 2 and 3. Thus, you will write 8 procedures in all: rtinit0(),
rtinit1(), rtinit2(), rtinit3(), rtupdate0(), rtupdate1(),
rtupdate2(), rtupdate3()
Figure 2: Relationship between procedures inside node 0
The procedures described above are the
ones that you will write. We have written the following routines that
can be called by your routines:
tolayer2(struct rtpkt
pkt2send)
where rtpkt
is the following structure, which is already declared for you in prog.h.
The procedure tolayer2() is defined in the file prog.c
struct rtpkt {
int sourceid; /* id of node sending this pkt, 0, 1, 2, or 3 */
int destid; /* id of router to which pkt being sent
(must be an immediate neighbor) */
int mincost[4]; /* min cost to node 0 ... 3 */
};
Note
that tolayer2()
is
passed a structure, not a pointer to a structure.
printdt0()
will
pretty print the distance table for node 0. It is passed a pointer to
a structure of type distance_table.
printdt0()
and the structure declaration for the node 0 distance table are
declared in the file node0.c. Similar pretty-print routines are defined for you
in the files node1.c, node2.c node3.c.
Your
procedures rtinit0(), rtinit1(), rtinit2(), rtinit3()
and rtupdate0(),
rtupdate1(), rtupdate2(), rtupdate3()
send routing packets (whose format is described above) into the
medium. The medium will deliver packets in-order, and without loss to
the specified destination. Only directly-connected nodes can
communicate. The delay between is sender and receiver is variable (and
unknown).
When
you compile your procedures and my procedures together and run the
resulting program, you will be asked to specify only one value
regarding the simulated network environment:
A
tracing value of 2 may be helpful to you in debugging your code. You
should keep in mind that real implementers do not have
underlying networks that provide such nice information about what is
going to happen to their packets!
You are NOT allowed to declare
any global variables that are visible outside of a given C file (e.g.,
any global variables you define in node0.c.
may only be accessed inside node0.c).
This
is to force you to abide by the coding conventions that you would have
to adopt is you were really running the procedures in four distinct
nodes. To compile your routines: cc
prog.c node0.c node1.c node2.c node3.c
Prototype
versions of these files are here: node0.c, node1.c,
node2.c, node3.c. You can
download the emulator files provided to
you here: prog.c and
prog. h. You are NOT
supposed to make any changes to the emulator files.
This
assignment can be completed on any machine supporting C. It makes no
use of UNIX features.
You
need to hand in a code listing (with comments) and sample output.
For
your sample output, your procedures should print out a message
whenever your rtinit0(),
rtinit1(), rtinit2(), rtinit3()
or rtupdate0(),
rtupdate1(), rtupdate2(), rtupdate3()
procedures are called. For rtupdate0(),
rtupdate1(),
rtupdate2(), rtupdate3()
you should print the identity of the sender of the routing packet that
is being passed to your routine, whether or not
the distance table is updated, the contents of the distance table (you
can use my pretty-print routines), and a description of any messages
sent to neighboring nodes as a result of any distance table updates.
The
sample output should be an output listing with a TRACE value of 2.
Highlight the final distance table produced in each node. Your program
will run until there are no more routing packets in-transit in the
network, at which point our emulator will terminate.
You
are to write two procedures, rtlinkhandler0(int
linkid, int
newcost)
and rtlinkhandler1(int
linkid, int
newcost),
which will be called if (and when) the cost of the link between 0 and
1 changes. These routines should be defined in the files node0.c
and node1.c,
respectively. The routines will be passed the name (id) of the
neighboring node on the other side of the link whose cost has changed,
and the new cost of the link. Note that when a link cost changes,
these routines will have to update the distance table and may (or may
not) have to send updated routing packets
to neighboring nodes.
In
order to complete the
advanced part of the assignment, you will need to change the value of
the constant LINKCHANGES (line 3 in prog.c)
to 1. FYI, the cost of the link will change from 1 to 20 at time 10000
and then change back to 1 at time 20000. Your routines will be invoked
at these times.