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(); }
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; }
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; }