//这个函数动态创建距离矢量表. //距离矢量表包含n+1个条目, 其中n是这个节点的邻居数,剩下1个是这个节点本身. //距离矢量表中的每个条目是一个dv_t结构,它包含一个源节点ID和一个有N个dv_entry_t结构的数组, 其中N是重叠网络中节点总数. //每个dv_entry_t包含一个目的节点地址和从该源节点到该目的节点的链路代价. //距离矢量表也在这个函数中初始化.从这个节点到其邻居的链路代价使用提取自topology.dat文件中的直接链路代价初始化. //其他链路代价被初始化为INFINITE_COST. //该函数返回动态创建的距离矢量表. dv_t* dvtable_create() { int nbr_count = topology_getNbrNum(); int * nbr_array = topology_getNbrArray(); int node_count = topology_getNodeNum(); int * node_array = topology_getNodeArray(); dv_t * dvtable = (dv_t *)malloc( sizeof(dv_t) * (nbr_count + 1) ); memset(dvtable, 0, sizeof(dv_t) * (nbr_count+1) ); int i, j; // the first dv_t has nodeID of itself. dvtable[0].nodeID = topology_getMyNodeID(); dvtable[0].dvEntry = (dv_entry_t *)malloc(sizeof(dv_entry_t)*(node_count)); memset(dvtable[0].dvEntry, 0, sizeof(dv_entry_t)*(node_count)); for (j = 0; j < node_count; ++j) { dvtable[0].dvEntry[j].nodeID = node_array[j]; dvtable[0].dvEntry[j].cost = topology_getCost(dvtable[0].nodeID, node_array[j]); if (dvtable[0].nodeID == dvtable[0].dvEntry[j].nodeID) dvtable[0].dvEntry[j].cost = 0; } for (i = 1; i < nbr_count+1; ++i) { dvtable[i].nodeID = nbr_array[i-1]; dvtable[i].dvEntry = (dv_entry_t *)malloc( sizeof(dv_entry_t)*node_count); memset(dvtable[i].dvEntry, 0, sizeof(dv_entry_t)*node_count); for (j = 0; j < node_count; ++j) { dvtable[i].dvEntry[j].nodeID = node_array[j]; dvtable[i].dvEntry[j].cost = INFINITE_COST; } } return dvtable; }
//这个函数动态创建距离矢量表. //距离矢量表包含n+1个条目, 其中n是这个节点的邻居数,剩下1个是这个节点本身. //距离矢量表中的每个条目是一个dv_t结构,它包含一个源节点ID和一个有N个dv_entry_t结构的数组, 其中N是重叠网络中节点总数. //每个dv_entry_t包含一个目的节点地址和从该源节点到该目的节点的链路代价. //距离矢量表也在这个函数中初始化.从这个节点到其邻居的链路代价使用提取自topology.dat文件中的直接链路代价初始化. //其他链路代价被初始化为INFINITE_COST. //该函数返回动态创建的距离矢量表. dv_t* dvtable_create() { getTopoData(); nbn=topology_getNbrNum(); int *nbList=topology_getNbrArray(); int *costList=topology_getNbrCost(); alln=topology_getNodeNum(); int *allList=topology_getNodeArray(); dv_t *dvList=malloc((nbn+1)*sizeof(dv_t)); if(dvList==NULL)exit(-1); int i=0; //init nerghbor for(;i<nbn;i++) { dvList[i].nodeID=nbList[i]; dvList[i].dvEntry=malloc(alln*sizeof(dv_entry_t)); int j=0; for(;j<alln;j++) { dvList[i].dvEntry[j].nodeID=allList[j]; dvList[i].dvEntry[j].cost=INFINITE_COST; } } //init this node dvList[nbn].nodeID=topology_getMyNodeID(); dvList[nbn].dvEntry=malloc(alln*sizeof(dv_entry_t)); for(i=0;i<alln;i++) { dvList[nbn].dvEntry[i].nodeID=allList[i]; if(allList[i]==dvList[nbn].nodeID) { dvList[nbn].dvEntry[i].cost=0; continue; } int j=0; for(;j<nbn;j++) { if(allList[i]==nbList[j]) { dvList[nbn].dvEntry[i].cost=costList[j]; break; } } if(j==nbn) dvList[nbn].dvEntry[i].cost=INFINITE_COST; } return dvList; }