//这个函数动态创建距离矢量表. //距离矢量表包含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; }
//这个函数动态创建邻居代价表并使用邻居节点ID和直接链路代价初始化该表. //邻居的节点ID和直接链路代价提取自文件topology.dat. nbr_cost_entry_t* nbrcosttable_create() { int nbrnum = topology_getNbrNum(); nbr_cost_entry_t *nbr_table = (nbr_cost_entry_t*)malloc(sizeof(nbr_cost_entry_t)); int* nbrlist = topology_getNbrArray(); int mynode = topology_getMyNodeID(); int i = 0; for(i = 0; i<nbrnum; i++) { nbr_table[i].nodeID = nbrlist[i]; nbr_table[i].cost = topology_getCost(mynode, nbrlist[i]); nbr_table[i].flag = 0; pthread_mutex_init(&nbr_table[i].flag_mutex, NULL); } return nbr_table; }