예제 #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
파일: dvtable.c 프로젝트: ITanCh/netlab-NJU
//这个函数动态创建距离矢量表.
//距离矢量表包含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;
}