联系方式

  • QQ:99515681
  • 邮箱:99515681@qq.com
  • 工作时间:8:00-23:00
  • 微信:codinghelp

您当前位置:首页 >> C/C++编程C/C++编程

日期:2021-10-02 10:56

Fall 2021

Programming Assignment 2

Weight: 1.2x

1 Introduction

In this assignment you will implement distance vector routing. You will implement a virtual network

on top of UDP. In this virtual network, Unix processes will be network nodes, and links will be

created using UDP.

The format to define our network is specified using a scenario file. An example scenario file

and associated network is shown in Figure 1. Since nodes in our virtual network are just Unix

processes, multiple nodes may reside on the same (physical) host. This is shown in Figure 1 —

virtual node 0 and 1 both reside on physical node fireball.

fireball frostbolt

icelance

(After Event Set #1)

(Scenario Configuration File)

Figure 1: Sample scenario configuration file and the two relevant states of the network after the

respective event set is executed. Shaded rectangles correspond to physical nodes and the solid

circles correspond to specific virtual nodes. All lines represent virtual links between nodes, which

are labeled by their link name and cost.

1

1.1 What is in a scenario file?

The scenario file defines the set of nodes and a set of event sets. An event set consists a set of

events that affect the links in the network1

. There are three types of events: establishment of a

link, tear-down of a link and updating the of cost of a link. All events in an event set are executed

sequentially without any delay. How event sets are ordered is configurable — for this assignment,

your task is to run the distance vector algorithm for a fixed amount of time before executing events

in the next event set. Thus, your code can be structured as follows:

boolean nextSET ← true ; Global variable

alarmHandler() { ; Called every timeout number of seconds

nextSET ← true;

}

. . .

do

if (nextSET is true)

es ← h next event set i

h dispatch all events in es i ; This will cause changes to the links in the network

nextSET ← false;

h execute Distance Vector protocol i

while h there are more event sets to process i

Obviously, you don’t have to follow this blueprint, this is just one possible way. You may also

wish to use an event queue to keep track of the next event to process (i.e., ‘run DV algorithm’ or

‘dispatch event set’) along with the time it should be processed, using the remaining time until the

event needs to be processed to set an appropriate timeout to poll or select.

2 Implementation

2.1 Scenario Configuration File

The format of the scenario file is as follows:

? The scenario file begins by listing all the virtual nodes in the network and may contain up to

256 virtual nodes. Virtual nodes are declared as follows:

node h node-id i hostname

The node id is an unsigned integer and corresponds to the virtual node identifier (must be

unique) and the hostname is the host on which the process corresponding to this virtual node

resides.

? After the virtual nodes are defined, the scenario file consists of a set of event sets. Event sets

themselves consist of events and are delimited by “(“ and “)”. Thus, the rest of the scenario

file looks like this:

( h set of events i ) . . . ( h set of events i )

1Unless otherwise noted, we mean the virtual network when we say network

2

? There are three types of events in an event set. An event set may contain an arbitrary number

of events of any given type in any given order. (Of course, the events must be consistent,

i.e. an event cannot refer to a node or a link that does not exist.) Specifics of events are as

follows:

– The establish event establishes a new link in the network. The syntax is as follows:

establish node h node-id i port h integer i node h node-id i port h integer i

cost h integer i name h string i

This command will establish a link between the two nodes (and associated port numbers)

whose node ids are specified. These nodes must already exist and the port numbers must

not have been used before to define a link. The link has a cost given as an unsigned

integer and a “name” specified as a string. All subsequent actions on this link will just

use this string to identify the link. Hence, link names must be globally unique.

– The following event is used to tear down an existing link: following following

tear-down h string i

Once again, the named link must already exist.

– Lastly, the cost of a link can be changed:

update h string i cost h integer i

The string should identify an existing link and the cost should be positive.

? A scenario file can also contain comments guarded by “;”.

2.2 Route Dissemination Packets

Routes are disseminated using an advertisement packet with the following structure:

0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| type | version | Num. Updates |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| dest_0 | min_cost_0 |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| dest_1 | min_cost_1 |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| .............. |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| dest_n | min_cost_n |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Type: Set to 0x7 for this assignment.

Version: Set to 0x1.

Num. Updates: Number of distance vector pairs in this advertisement. This must be more than zero

for all legal advertisements.

Dest: Assume the advertisement is from node a to node b and the Dest field is c. Node c is the final

destination to which node a is advertising the min. cost to node b through node a.

Cost: Using the terminology from above, the cost field correspond to the actual cost of the route to

destination c as advertised by node a (to node b).

3

2.3 Source Code

A substantial part of the source code will be given to you so you can concentrate on developing the distance

vector part. This code can be found in the ‘assignment2’ directory of the ‘materials’ repository, which you

either cloned for earlier projects or can be cloned by the following command:

git clone fall417git@poole.cs.umd.edu:materials

You are required to use either the select or poll system calls to multiplex reading from multiple

descriptors. Since your virtual process will have multiple links incident upon it, it can receive a message

from any link. If the node just does a read or recvfrom from any link, the process will be blocked till

something actually arrives on that link. The UNIX (system) calls select and poll allow you to wait on

multiple descriptors, and you should use this facility to implement your virtual node.

2.3.1 Parser

You will be given a flex and bison2 parser which will parse the configuration file and automatically create a

global node-to-hostname mapping and a two-dimensional local event structure that maps to the set of event

sets. The interface is in the form of the ruparse() function. You must call the parser init function before

calling ruparse as shown below.

char *sc_file;

extern int ruparse();

int main (int argc, char *argv[]) {

parse_arg(argc, argv);

parser_init(sc_file); // sc_file contains the name of the scenario file

ruparse();

........

}

The ruparse function creates a two-dimensional event list. Each column in the 2-D event list corresponds

to a event set in the scenario file. Note that once you call the parser using ruparse, you never have to

bother with the scenario file again and you never have to call ruparse again. All the information in the

scenario file has been read into the event list.

Each element of the event set is an struct es (struct event set). The definition of the event set is as

follows:

struct es{

struct es *next; // to create the 2-d list

struct es *prev;

e_type ev; // ev is one of establish, tear_down or update

int peer0, port0, peer1, port1;

int cost;

char *name;

};

Eventually, you will have to dispatch these events. We discuss dispatching events in Section 2.3.4. The

parser resides in *ru* files, and the event set is defined in the es.[c|h] files.

2

If you don’t know anything about parsing, don’t worry, you will not be required to do anything with flex or

bison for this assignment.

4

2.3.2 Nodes and Links

As the parser runs, it also creates a set of nodes to hostname mappings. This mapping can be accessed by

using the (char*) gethostbynode(int node) function defined in n2h* files. The node id must be defined

in order for gethostbynode to return anything meaningful.

In each dispatch of an event set (column), the local link set should be updated when necessary. Your

routing algorithm then use it to collect distance vector information, update its routing table. The local link

set has the following structure:

struct link {

struct link *next; // next entry

struct link *prev; // prev entry

node peer0, peer1; // link peers

int port0, port1;

int sockfd0; // if peer0 is itself, local port is bound

int sockfd1; // if peer1 is itself, local port is bound

cost c; // cost

char *name; // name of the link

};

The methods to access the link set are:

int create_ls(); // initialization

int add_link(node peer0, int port0, node peer1, int port1,

cost c, char *name);

int del_link(char *n);

struct link *ud_link(char *n, int cost);

struct link *find_link(char *n);

void print_link(struct link* i); // print info about a single link

void print_ls(); // prints entire link set

You must call create ls to initialize the link set at a node. The add link, del link, ud link functions

mutate the link set. The print link and print ls print information about a given link or the entire set at

the node.

Note well: When a link is added into the local link set, socket(s) corresponding to the link are not

automatically allocated. You must write the code to associate the sockets yourself. Note that you can obtain

a link structure using the find link function.

Link sets are defined in ls.*.

2.3.3 Routing Table

We provide a set of routines to manipulate routing tables. The methods to maintain routing tables are:

int create_rt();

int add_rte(node n, cost c, node nh);

int update_rte(node n, cost c, node nh);

int del_rte(node n);

struct rte *find_rte(node n);

5

void print_rte(struct rte* i);

void print_rt();

The function create rt must be called to create a routing table at a node. The functions add rte,

update rte, and del rte are used to add, update, and delete individual routing table entries. The logging

functions print rte and print rt print individual table entries and the entire table, respectively.

The function find rte is used to find an entry for a specific destination .

2.3.4 Dispatching events

After the event list is created, you have to dispatch functions for each event in the event sets. As we said

before, all the functions in a single event set will be executed sequentially. (Note that the event set at a

node will only contain events that pertain to this node — events at remote nodes that are in the scenario

file are not added to the event set at the local node). The event set code defines the walk el function that

traverses the event list and the dispatch event function that modifies the link set as appropriate.

3 Command-line options and logging

You executable should take in the following three command-line options:

rt -n <node_id> [-f <scenario_file>] [-u update-time] [-t time-between-event-sets] [-v]

The -n option is mandatory and specifies the node id; the optional -f parameter specifies a scenario

file (default config), and the optional -t parameter specifies how long to wait between executing event

sets (default 30 seconds). The -u option specifies how long to wait (in seconds) before sending out distance

vector updates; this should default to 3 seconds.

If the -v (verbose) option is not present, your code should print the following to stdout: 1) each event

in the event set that it acts upon using print event, 2) the routing table entry after it was changed in

response to processing a routing update using print rte, and 3) the full routing table after dispatching the

entire event set using print rt.

If the -v option is present, then the full routing table should additionally be printed after processing

every routing update (whether or not it changed any entries) using print rt.

4 Additional Requirements

1. Your code must be submitted as a series of commits that are pushed to the origin/master branch of

your Git repository. We consider your latest commit prior to the due date/time to represent your

submission.

2. The directory for your project must be called ‘assignment2’ and be located at the root of your Git

repository.

3. You must provide a Makefile that is included along with the code that you commit. We will run

‘make’ inside the ‘assignment2’ directory, which must produce a ‘rt’ also located in the ‘assignment2’

directory.

4. You must submit code that compiles in the provided VM, otherwise your assignment will not be

graded.

5. Your code must be -Wall clean on gcc/g++ in the provided VM, otherwise your assignment will not

be graded. Do not ask the TA for help on (or post to the forum) code that is not -Wall clean, unless

getting rid of the warning is the actual problem.

6. You are not allowed to work in teams or to copy code from any source.

6


版权所有:留学生编程辅导网 2020 All Rights Reserved 联系方式:QQ:99515681 微信:codinghelp 电子信箱:99515681@qq.com
免责声明:本站部分内容从网络整理而来,只供参考!如有版权问题可联系本站删除。 站长地图

python代写
微信客服:codinghelp