Lnx File specification
Lnx files are specified by a series of directives, one per line. Comments are denoted with #. Lines beginning with # are ignored. On any other line, any text after a # is also ignored. The next few sections define the syntax for each directive.
interface
Format:
interface <name> <virtual IP address>/<prefix> <UDP address>:<UDP port>
This directive may appear multiple times, one for each interface.
| Parameter | Example | Description |
|---|---|---|
name | if0 | Name for this interface |
virtual IP address | 10.0.0.1 | Virtual IP address assigned to this interface |
prefix | 24 | Integer 0-32 that defines the size of the network, together with the address. For example, 10.0.0.1/24 means that this interface has address 10.0.0.1 on the network 10.0.0.0/24 (ie, netmask 255.255.255.0). |
UDP address | 127.0.0.1 | Bind address for the UDP socket used to send/receive packets on this interface. Note: Must be an IPv4 address–the current version doesn’t support using hostnames (ie, localhost) here |
UDP port | 5000 | Port for the UDP socket for this interface |
neighbor
The neighbor defines how to reach other nodes on the same network. Thus, every node always knows the IP addresses and link-layer info for how to reach its neighbors (since we have no such thing as ARP).
Format:
neighbor <virtual IP> <UDP address>:<UDP port> via <interface>
This directive may appear multiple times, one for each neighbor. On networks with hosts (eg rX-hosts), an interface may have more than one neighbor.
| Parameter | Example | Description |
|---|---|---|
virtual IP | 10.0.0.1 | IP of a neighboring node |
UDP address:port | 127.0.0.1:5000 | UDP Address and port for where to send a packet to reach this node. This is the virtual link-layer equivalent of a mac address. |
interface | if0 | Interface where this neighbor can be reached. This should be the interface used when sending packets to this neighbor. Note: Interface must have previously been declared with an interface directive. |
Example
Here’s one of the interface/neighbor directives for r2:
interface if1 10.2.0.1/24 127.0.0.1:5004 # to network r2-hosts
neighbor 10.2.0.2 at 127.0.0.1:5005 via if1 # h2
neighbor 10.2.0.3 at 127.0.0.1:5006 via if1 # h3
This says that r2 knows about two nodes reachable on if1: one at 10.2.0.2 (h2) and another at 10.2.0.3 (h3).
routing
Format:
routing <rip|static>
This defines the routing mode. There are two modes, rip and static.
If no routing directive is specified, the default is static. This directive should only appear once per lnx file.
| Mode | Description |
|---|---|
rip | Advertise known routes and learn new routes via RIP. Used for routers. |
static | (Default) Don’t use RIP and operate only on local and manually-specified routes. This is normally used for hosts. It can also be used on routers for testing purposes, like to make sure things work even without RIP. |
rip advertise-to
Format:
rip advertise-to <virtual IP>
If this node is using RIP, this is used to specify IP addresses of other routers that should receive RIP messages (ie. RIP requests, periodic updates, triggered updates).
<virtual IP> MUST be a neighboring node. In other words, it must be a neighbor IP address defined with a neighbor directive.
This directive may appear multiple times to specify multiple neighboring routers that use RIP.
Example
rip advertise-to 10.0.0.1
rip advertise-to 10.0.0.2
This states that the node should send RIP updates to neighboring routers at 10.0.0.1 and 10.0.0.2.
rip periodic-update-rate
Format:
rip periodic-update-rate <milliseconds>
This directive specifies the rate (in milliseconds) at which periodic updates should be sent. If unspecified, the default is 5000 milliseconds (5 seconds).
<milliseconds> can be any positive integer. A value of zero MAY disable periodic updates.
rip route-timeout-threshold
Format:
rip route-timeout-threshold <milliseconds>
This directive specifies number of milliseconds after which a route can be expired if an update is not received from the router that sent it. If unspecified, the default is 12000 milliseconds (12 seconds).
<sec> can be any positive integer. A value of zero MAY disable route expiration.
Note: This value only specifies a lower bound on when routes can be deleted. In other words, it is NOT necessary to delete a route after exactly
<route-timeout-thredhold>milliseconds have elapsed.For grading purposes, we will assume that routes
MUSTbe deleted after2*<route-timeout-threshold>milliseconds have elapsed. When testing, we will choose expiration times to ensure your program can reach a quiescent state after a timeout has occurred.
route
Format:
route <prefix> via <virtual IP>
This directive is used to manually add a route to a node’s route table, called a static route.
Example 1 (Default route)
route 0.0.0.0/0 via 10.0.0.1
This states that packets matching the prefix 0.0.0.0/0 (ie. all traffic) should be routed to 10.0.0.1. This is a default route, which sends all traffic that doesn’t match other routes to a specific destination.
Example 2
route 10.5.0.0/24 via 10.1.0.1
This routes traffic in 10.5.0.0/24 to 10.1.0.1.
tcp rto-min
Format:
tcp rto-min <milliseconds>
This directive specifies minimum RTO value for TCP (in milliseconds). This value should be used at the minimum value when computing RTO updates.
<milliseconds> can be any positive integer.
tcp rto-max
Format:
tcp rto-max <milliseconds>
This directive specifies maximum RTO value for TCP (in milliseconds). This value should be used as the maximum value when computing RTO updates.
<milliseconds> can be any positive integer.