/*****************************************************************
* DVsim.c Distance Vector Routing Simulation Package
*
* Event driven simulation of distributed, asynchronous,
* distance vector routing. This file contains the network
* simulation code which emulates layer 2 and below:
*
* - simulates packet tranmissions between two
* physically connected nodes
*
* - assumes with no packet loss or corruption
*
* - calls initializations routines rtinit0, etc., before
* beginning simulation
*
*
* Original code from Kurose and Ross, Computer Networking
*
* Modified by S. Dykes Apr. 2000
* 1. Changed RNG to use drand48() with seed = getpid()
* 2. Replaced 999 with INF
* 3. created common include file DVsim.h
* 4. extended to 6 node network
*
*---------------------------------------------------------------*/
#define DVSIM_H
#include "DVsim.h"
#define FROM_LAYER2 2
#define LINK_CHANGE 10
/*----------------------------------------
* Event list and possible events
*---------------------------------------*/
struct event
{
double evtime; /* event time */
int evtype; /* event type code */
int eventity; /* entity where event occurs */
struct rtpkt *rtpktptr; /* ptr to packet (if any) assoc w/ this event */
struct event *prev;
struct event *next;
};
struct event *evlist = NULL;
/*--------------------------------
* Simulation clock
*-------------------------------*/
double clocktime = 0.000;
double get_clock() { return clocktime; }
/*--------------------------------
* Function prototypes
*-------------------------------*/
void init();
void insertevent (struct event *);
void printevlist();
void tolayer2 (struct rtpkt );
void PrintResult();
/*-------------------------------
* MAIN
*-------------------------------*/
main()
{
int i;
struct event *eventptr;
/*----------------------------------------
* Loop until we run out of events
*---------------------------------------*/
init();
// while (1)
// {
//----------------------------------------
// Get next event from top of list
// Done if event list is empty
//---------------------------------------
if (! (eventptr = evlist) ) return;
evlist = evlist->next;
if (evlist) evlist->prev=NULL;
//----------------------------------------
// Trace info
//---------------------------------------
if (TRACE>1) {
printf("\nMAIN: rcv event, t=%.3f, at %d",
eventptr->evtime, eventptr->eventity);
if (eventptr->evtype == FROM_LAYER2 ) {
printf(" src:%2d,", eventptr->rtpktptr->sourceid);
printf(" dest:%2d,", eventptr->rtpktptr->destid);
printf(" contents: ");
for (i=0; i<NODES; i++) printf ("%3d ",eventptr->rtpktptr->mincost[i]);
printf("\n");
}
}
//----------------------------------------
// Update clock to next event time
//---------------------------------------
clocktime = eventptr->evtime;
//----------------------------------------
// Call event handler
//---------------------------------------
if (eventptr->evtype == FROM_LAYER2 ) {
if (eventptr->eventity == 0) rtupdate0(eventptr->rtpktptr);
else if (eventptr->eventity == 1) rtupdate1(eventptr->rtpktptr);
else if (eventptr->eventity == 2) rtupdate2(eventptr->rtpktptr);
else if (eventptr->eventity == 3) rtupdate3(eventptr->rtpktptr);
else if (eventptr->eventity == 4) rtupdate4(eventptr->rtpktptr);
// else if (eventptr->eventity == 5) rtupdate5(eventptr->rtpktptr);
else { printf("Panic: unknown event entity\n"); exit(0); }
}
else if (eventptr->evtype == LINK_CHANGE ) {
if (clocktime < 10001.0) { linkhandler0(1,20); linkhandler1(0,20); }
else { linkhandler0(1,1); linkhandler1(0,1); }
}
else {
printf("Panic: unknown event type\n");
exit(0);
}
//--------------------------------------------------------
// Free memory for packet (if any) and event struct
//-------------------------------------------------------
if (eventptr->evtype == FROM_LAYER2 ) free(eventptr->rtpktptr);
free(eventptr);
// }
// */
/*-------------------------------
* SIMULATION TERMINATED
*-------------------------------*/
PrintResult();
printf("\nSimulator terminated at t=%f, no packets in medium\n", clocktime);
}
void Update()
{
int i;
struct event *eventptr;
/*----------------------------------------
* Loop until we run out of events
*---------------------------------------*/
while (1)
{
/*----------------------------------------
* Get next event from top of list
* Done if event list is empty
*---------------------------------------*/
if (! (eventptr = evlist) ) break;
evlist = evlist->next;
if (evlist) evlist->prev=NULL;
/*----------------------------------------
* Trace info
*---------------------------------------*/
if (TRACE>1) {
printf("\nMAIN: rcv event, t=%.3f, at %d",
eventptr->evtime, eventptr->eventity);
if (eventptr->evtype == FROM_LAYER2 ) {
printf(" src:%2d,", eventptr->rtpktptr->sourceid);
printf(" dest:%2d,", eventptr->rtpktptr->destid);
printf(" contents: ");
for (i=0; i<NODES; i++) printf ("%3d ",eventptr->rtpktptr->mincost[i]);
printf("\n");
}
}
/*----------------------------------------
* Update clock to next event time
*---------------------------------------*/
clocktime = eventptr->evtime;
/*----------------------------------------
* Call event handler
*---------------------------------------*/
if (eventptr->evtype == FROM_LAYER2 ) {
if (eventptr->eventity == 0) rtupdate0(eventptr->rtpktptr);
else if (eventptr->eventity == 1) rtupdate1(eventptr->rtpktptr);
else if (eventptr->eventity == 2) rtupdate2(eventptr->rtpktptr);
else if (eventptr->eventity == 3) rtupdate3(eventptr->rtpktptr);
else if (eventptr->eventity == 4) rtupdate4(eventptr->rtpktptr);
// else if (eventptr->eventity == 5) rtupdate5(eventptr->rtpktptr);
else { printf("Panic: unknown event entity\n"); exit(0); }
}
else if (eventptr->evtype == LINK_CHANGE ) {
if (clocktime < 10001.0) { linkhandler0(1,20); linkhandler1(0,20); }
else { linkhandler0(1,1); linkhandler1(0,1); }
}
else {
printf("Panic: unknown event type\n");
exit(0);
}
/*--------------------------------------------------------
* Free memory for packet (if any) and event struct
*-------------------------------------------------------*/
if (eventptr->evtype == FROM_LAYER2 ) free(eventptr->rtpktptr);
free(eventptr);
}
}
/*-------------------------------
* init
*-------------------------------*/
void init()
{
int i;
double sum, avg;
struct event *evptr;
int j,k;
for(j=0;j<5;j++)
for(k=0;k<5;k++)
min_cost[j][k]=linkcost[j][k];
/*---------------------
* Input TRACE
*--------------------*/
printf ("Enter value for TRACE (no trace =0, user= 1 or 2, developer= 3): ");
scanf ("%d", &TRACE);
/*---------------------
* Test RNG
*--------------------*/
srand ((long) getpid());
// for (i=0, sum=0.; i<1000; i++) sum+= drand48();
for (i=0, sum=0.; i<1000; i++) sum+= rand();
avg = sum/30000000.0;
if (avg < 0.25 || avg > 0.75) {
printf("RNG PROBLEM\n");
printf("Average of 1000 random numbers is %g (expected 0.5).\n"
Distr_Nodes.rar_Distr_Nodes_distance vector_距离向量_距离向量算法_选路
版权申诉
154 浏览量
2022-09-21
04:27:36
上传
评论
收藏 19KB RAR 举报
周楷雯
- 粉丝: 78
- 资源: 1万+
最新资源
- 原生微信小程序源码 - -仿豆瓣图书
- 原生微信小程序源码 - -滴滴公交-查公交
- 人工智能实验四 感知器算法的设计实现
- java小项目多线程多线程 复制文件 冒泡排序 群聊
- 四数之和(java代码).docx
- 701837906919458TapScanner v3.0.10 (Pro).apk
- 青岛大学人工智能实验二 利用α-β搜索的博弈树算法编写一字棋游戏
- ### 1、项目介绍 本项目Scrapy进行数据爬取,并使用Django框架+PyEcharts实现可视化大屏 效果如下:
- # 微信小程序-健康菜谱 基于微信小程序的一个查找检索菜谱的应用 ### 效果 !动态图(./res/gif/demo
- zabbix-get命令包资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0