Beispiel #1
0
int main(int argc, char *argv[]) 
{
	printf("SIP layer is starting, pls wait...\n");

	topology_analysis();
	//初始化全局变量
	nct = nbrcosttable_create();
	dv = dvtable_create();
	dv_mutex = (pthread_mutex_t*)malloc(sizeof(pthread_mutex_t));
	pthread_mutex_init(dv_mutex,NULL);
	routingtable = routingtable_create();
	routingtable_mutex = (pthread_mutex_t*)malloc(sizeof(pthread_mutex_t));
	pthread_mutex_init(routingtable_mutex,NULL);
	son_conn = -1;
	stcp_conn = -1;

	nbrcosttable_print(nct);
	dvtable_print(dv);
	routingtable_print(routingtable);

	//注册用于终止进程的信号句柄
	signal(SIGINT, sip_stop);

	//连接到本地SON进程 
	son_conn = connectToSON();
	if(son_conn<0) {
		printf("can't connect to SON process\n");
		exit(1);		
	}

	//启动线程处理来自SON进程的进入报文 
	pthread_t pkt_handler_thread; 
	pthread_create(&pkt_handler_thread,NULL,pkthandler,(void*)0);

	//启动路由更新线程 
	pthread_t routeupdate_thread;
	pthread_create(&routeupdate_thread,NULL,routeupdate_daemon,(void*)0);	

	printf("SIP layer is started...\n");
	printf("waiting for routes to be established\n");
	sleep(SIP_WAITTIME);
	dvtable_print(dv);
	routingtable_print(routingtable);

	//等待来自STCP进程的连接
	printf("waiting for connection from STCP process\n");
	waitSTCP(); 

}
Beispiel #2
0
int main()
{
	dv_t* dv_table;
	routingtable_t* route_table;
	nbr_cost_entry_t* nbr_ct;

	nbr_ct = nbrcosttable_create();
	nbrcosttable_print(nbr_ct);

	printf("--------------- create dv table--------------------\n");
	dv_table = dvtable_create();
	printf("--------------- create dv table--------------------\n");
	dvtable_print(dv_table);

	printf("--------------- create route table--------------------\n");
	route_table = routingtable_create();
	printf("--------------- create route table--------------------\n");
	routingtable_print(route_table);

	nbrcosttable_destroy(nbr_ct);
	dvtable_destroy(dv_table);
	routingtable_destroy(route_table);

	return 0;
}
Beispiel #3
0
int route_dvt_update(nbr_cost_entry_t *nct, dv_t *dvt, routingtable_t * rtt,
                     pkt_routeupdate_t *data, int updater, pthread_mutex_t *dv_mutex) {
    int my_node_id = topology_getMyNodeID();
    int nbr_count = topology_getNbrNum();
    int entry_num = data -> entryNum;
    int i, modified = 0;

    pthread_mutex_lock(dv_mutex);
    dv_entry_t * my_dv_entry = NULL;
    for (i = 0; i < nbr_count + 1; ++i) {
        if (dvt[i].nodeID == my_node_id)
            my_dv_entry = dvt[i].dvEntry;
    }
    if (my_dv_entry == NULL) {
        printf("panic: cannot find my own dist-vec entry\n");
    } else {
        int curr_fmtu = dvtable_getcost(dvt, my_node_id, updater);
        for (i = 0; i < entry_num; ++i) {
            if ( curr_fmtu + data -> entry[i].cost <
                    dventry_getcost(my_dv_entry, data -> entry[i].nodeID)) {
                dventry_setcost(my_dv_entry, data -> entry[i].nodeID,
                                curr_fmtu + data -> entry[i].cost);
                routingtable_setnextnode(rtt, data -> entry[i].nodeID, updater);
                modified = 1;
            }
        }
    }


    dv_entry_t * updater_dv_entry = NULL;
    for (i = 0; i < nbr_count + 1; ++i) {
        if (dvt[i].nodeID == updater)
            updater_dv_entry = dvt[i].dvEntry;
    }
    if (updater_dv_entry == NULL) {
        printf("panic: cannot find updater's dist-vec entry\n");
    } else {
        for (i = 0; i < entry_num; ++i) {
            if (dventry_getcost(updater_dv_entry, data -> entry[i].nodeID) >
                    data -> entry[i].cost)
                dventry_setcost(updater_dv_entry, data -> entry[i].nodeID, data -> entry[i].cost);
        }
    }
    pthread_mutex_unlock(dv_mutex);
    if (modified) dvtable_print(dvt);
    return 1;
}