Пример #1
0
//这个函数动态创建距离矢量表.
//距离矢量表包含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;
}
Пример #2
0
//这个函数动态创建邻居代价表并使用邻居节点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;
}