⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 routingtable.cc

📁 AODV
💻 CC
📖 第 1 页 / 共 2 页
字号:
	rtEntry = findRoute(dest);	if(rtEntry != NULL)	{			if((rtEntry->getDestSeqNum() >= seqNum) && 			(rtEntry->getRFlags()== ACTIVE_ROUTE))			return rtEntry;		else			return NULL;	}	else		return NULL;}/* update/add route table entry for neighbor during reboot */void		routingTable::rebootNeighborUpdate(u_int32_t neighbor, u_int32_t seq, u_int64_t life_time){	rtable_entry	*rtEntry, rtEntryNew;#ifdef DEBUG	cout << "routingTable: rebootNeighborUpdate: entered " << endl;#endif	rtEntry = findRoute(neighbor);	if(rtEntry != NULL)	{		rtEntry->setNextHop(neighbor);		rtEntry->setLifeTime(life_time);		rtEntry->setHopCnt(1);		rtEntry->setDestSeqNum(seq);		rtEntry->setRFlags(ACTIVE_ROUTE);	}	else	{#ifdef DEBUG		cout << "routingTable: neighborUpdate: create entry " << endl;#endif		rtEntryNew.createEntry(neighbor, seq, 1, neighbor, life_time, ACTIVE_ROUTE);		addRoute(rtEntryNew);	}	return;}/* update/add route table entry for neighbor*//* pass the neighbor ip and received seq number (if any) and the lifetime*/void		routingTable::neighborUpdate(u_int32_t neighbor, u_int32_t src, u_int32_t seq, u_int64_t life_time ){	rtable_entry	*rtEntry, rtEntryNew;#ifdef DEBUG	cout << "routingTable: neighborUpdate: entered " << endl;#endif	rtEntry = findRoute(neighbor);	if(rtEntry != NULL)	{		rtEntry->setNextHop(neighbor);		rtEntry->setLifeTime(life_time);		rtEntry->setHopCnt(1);		rtEntry->setDestSeqNum(seq);		if(rtEntry->getRFlags() != ACTIVE_ROUTE)		{			rtEntry->setRFlags(ACTIVE_ROUTE);			map<u_int32_t,rtable_entry>::iterator	iter;#ifdef DEBUG			cout << "insertRoute: entered" << endl;#endif			iter = findRouteIter(rtEntry->getDestIP());			add_kroute(iter);		}	}	else	{#ifdef DEBUG		cout << "routingTable: neighborUpdate: create entry " << endl;#endif		rtEntryNew.createEntry(neighbor, seq, 1, neighbor, life_time, ACTIVE_ROUTE);		insertRoute(rtEntryNew);	}	route_discovery_done(neighbor,ASL_ROUTE_FOUND);	/* also remove the rreq timer */	int ret = timer_Q.removeRREQTimer((neighbor));	if(ret == LR_TIMER)	{		local_repair.deleteFromList(neighbor);		/* no rerr with N flag need to be generated, as the received		 * hop cnt(1) can not be greater than the old hop cnt to neighbor */	}	/* also set/reset the active route timer if a hello message is received */	/*remove the old timer */	bool setTimer = false;	if(timer_Q.isActiveTimerInQueue(neighbor))	{		timer_Q.removeActiveRouteTimer(neighbor);		setTimer = true;	}	else	{		if(src == 0) /* hello Message */			setTimer = true;	}	/* set a new timer */	if(setTimer) 	{		struct	timerData	tData;		tData.type = ACTIVE_ROUTE_TIMER;		tData.data = neighbor;		timer_Q.set_timer(ALLOWED_HELLO_LOSS*HELLO_INTERVAL, neighborTimeoutHandler, (void *)&tData);	}	return;}void		neighborTimeoutHandler(void *data){	rtable.neighbor_timeout_handler(data);	return;}void		routingTable::neighbor_timeout_handler(void *val){	/* put dest in local repair list.. mark the route entry as broken...	 * set lifetime of the route entry to currtime+ACTIVE_ROUTE_TIMEOUT...	 * also mark any other dest using this route as broken */	struct	timerData	*tData;	u_int32_t	dst;	tData = (struct timerData *)val;	dst = tData->data;#ifdef DEBUG	cout << "routingTable:: neighbor_timeout_handler: entered" << endl;#endif	local_repair.addToList(dst);	map<u_int32_t,rtable_entry>::iterator	iter, iter_temp;	iter = rTableMap.find(dst);	/* check if this entry is not already expired by timeout..the two events	 * might happen one after another without any specific ordering */	if((iter != rTableMap.end()))	{		iter->second.setRFlags(BROKEN_ROUTE);		//iter->second.setLifeTime(getcurrtime()+(ACTIVE_ROUTE_TIMEOUT-ALLOWED_HELLO_LOSS*HELLO_INTERVAL));		iter->second.setLifeTime(getcurrtime()+(10*ACTIVE_ROUTE_TIMEOUT));		if(iter->second.getHopCnt() == INFINITY)		{			iter->second.setHopCnt(iter->second.getLastHopCnt());		}		else		{			iter->second.setLastHopCnt(iter->second.getHopCnt());			iter->second.setDestSeqNum(iter->second.getDestSeqNum()+1);			del_kroute(iter);		}	}	iter_temp = rTableMap.begin();	while(iter_temp != rTableMap.end())	{		if( iter != iter_temp)		{#ifdef DEBUG			cout << "routingTable: neighbor_timeout_handler: a diff entry found " << endl;#endif			if((iter->second.getDestIP() == iter_temp->second.getNextHop()) && (iter_temp->second.getRFlags() == ACTIVE_ROUTE))			{				local_repair.addToList(iter_temp->second.getDestIP());				iter_temp->second.setRFlags(BROKEN_ROUTE);				iter_temp->second.setLifeTime(getcurrtime()+ACTIVE_ROUTE_TIMEOUT);				iter_temp->second.setLastHopCnt(iter_temp->second.getHopCnt());				iter_temp->second.setDestSeqNum(iter_temp->second.getDestSeqNum()+1);				del_kroute(iter_temp);			}		}		iter_temp++;	}#ifdef DEBUG	cout << "routingTable: neighbor_timeout_handler: exiting " <<endl;#endif	return;}void		routingTable::deleteKernelRoute(u_int32_t dst){	map<u_int32_t,rtable_entry>::iterator	iter;	iter = rTableMap.find(dst);	if(iter != rTableMap.end())	{		del_kroute(iter);		return;	}	return;}/* update/delete stale entries from the route table */void		routingTable::refreshEntries(){	map<u_int32_t,rtable_entry>::iterator	iter, iter_temp, iter_temp2, iterNew;	int			time_idle, temp_time_idle;	u_int64_t	currtime = getcurrtime();#ifdef DEBUG	cout << "routingTable: refreshEntries: entered" << endl;#endif	iter = rTableMap.begin();	while(iter != rTableMap.end())	{		iter++;		iterNew=iter;		iter--;		#ifdef DEBUG		cout << "routingTable: refreshEntries: dest ip " << getDotIP(iter->second.getDestIP()) << endl;#endif		if(iter->second.getLifeTime() <= currtime)		{#ifdef DEBUG			cout << "routingTable: refreshEntries: entry is about to expire " << endl;#endif						if(iter->second.getHopCnt() == INFINITY)			{#ifdef DEBUG				cout << "routingTable: refreshEntries: INFINITY hopcnt " << endl;#endif				/* delete entry from the routing table*/				rTableMap.erase(iter);			}			else			{				/* query route_check module for the idle time */				/* first query the actual destination entry (with flag 1)..				 * and then if this node is one hop away then..				 * query all those nodes (with flag 0)for which this 				 * node acts as next hop */				time_idle = query_route_idle_time(iter->second.getDestIP(),1);				if(time_idle < 0)					time_idle = 2*ACTIVE_ROUTE_TIMEOUT;				if(iter->second.getHopCnt() == 1)				{#ifdef DEBUG					cout << "routingTable: refreshEntries: hop cnt is 1, time_idle " << time_idle << endl;#endif					iter_temp2 = rTableMap.begin();					while(iter_temp2 != rTableMap.end())					{						if( iter != iter_temp2)						{							if( iter->second.getDestIP() == iter_temp2->second.getNextHop())							{								temp_time_idle = query_route_idle_time(iter_temp2->second.getDestIP(),0);								if((temp_time_idle != -1) && (temp_time_idle < time_idle))									time_idle = temp_time_idle;							}						}						iter_temp2++;					}				}					#ifdef DEBUG				cout << "routingTable: refreshEntries: non INFINITY hopcnt, time_idle " << time_idle << endl;#endif				if(time_idle < ACTIVE_ROUTE_TIMEOUT)				{#ifdef DEBUG					cout << "routingTable: refreshEntries: update lifetime "  << endl;#endif					rtable_entry	*rtEntry;					/* also update the lifetime for next hop and the prev hop */					iter->second.setLifeTime((currtime-time_idle)+ACTIVE_ROUTE_TIMEOUT);					/* here we don't need to check is the route is an ACTIVE_ROUTE					 * or a BROKEN_ROUTE because route can not be a broken route if					 * the time_idle is smaller than ACTIVE_ROUTE_TIMEOUT */					rtEntry = findRoute(iter->second.getNextHop());					rtEntry->setLifeTime((currtime-time_idle)+ACTIVE_ROUTE_TIMEOUT);					/* we don't need to update prev hop lifetime..					 * whenever the prev hop entry expires..					 * query_route_idle_time() is called either to update					 * or delete the entry */				}				else				{					/* make the route entry invalid */					/* this would also involve broken routes */					u_int8_t	prevHopCnt;					RERR		rerrOb;#ifdef DEBUG					cout << "routingTable: refreshEntries: invalidate entry " <<  endl;					cout << "routingTable: refreshEntries: delete kernel route " <<  endl;					/* also delete the kernel rtable entry */										cout << "routingTable: refreshEntries: host ip is " << getDotIP(iter->second.getDestIP()) << endl; #endif					prevHopCnt = iter->second.getHopCnt();					if(iter->second.getRFlags() == ACTIVE_ROUTE)					{						del_kroute(iter);						iter->second.setDestSeqNum((iter->second.getDestSeqNum()+1));						iter->second.setLastHopCnt(iter->second.getHopCnt());					}#ifdef DEBUG					cout << "routingTable: refreshEntries: dest seq num is " << iter->second.getDestSeqNum() << endl;#endif					iter->second.setHopCnt(INFINITY);					iter->second.setLifeTime(currtime+DELETE_PERIOD);					iter->second.setRFlags(INVALID_ROUTE);					/* also remove the entry from the local repair list */					if((iter->second.getRFlags() == BROKEN_ROUTE))					{						local_repair.deleteFromList(iter->second.getDestIP());					}					if(prevHopCnt == 1)					{						/* this node was a neighbor before , update entries for						 * other destinations using this neighbor as next hop */#ifdef DEBUG						cout << "routingTable: refreshEntries: neighbor node " << endl;#endif						iter_temp = rTableMap.begin();						while(iter_temp != rTableMap.end())						{							if( iter != iter_temp)							{#ifdef DEBUG								cout << "routingTable: refreshEntries: a diff entry found " << endl;#endif								if((iter->second.getDestIP() == iter_temp->second.getNextHop()) && (iter_temp->second.getHopCnt() != INFINITY))								{									/* also delete the kernel rtable entry */									if(iter_temp->second.getRFlags() == ACTIVE_ROUTE)									{										del_kroute(iter_temp);										iter_temp->second.setLastHopCnt(iter_temp->second.getHopCnt());										iter_temp->second.setDestSeqNum((iter_temp->second.getDestSeqNum()+1));									}#ifdef DEBUG									cout << "routingTable: refreshEntries: modify entry for " <<getDotIP(iter_temp->second.getDestIP()) << endl;#endif									/* update this route table entry */									iter_temp->second.setHopCnt(INFINITY);									iter_temp->second.setLifeTime(currtime+DELETE_PERIOD);									iter_temp->second.setRFlags(INVALID_ROUTE);									/* also remove the entry from the local repair list */									if((iter_temp->second.getRFlags() == BROKEN_ROUTE))									{										local_repair.deleteFromList(iter_temp->second.getDestIP());									}								}							}							iter_temp++;						}					}				}			}		}		iter = iterNew;	}	return;}int		routingTable::del_kroute( map<u_int32_t,rtable_entry>::iterator iter ){	  struct rtentry  *new_krtentry;#ifdef DEBUG	  cout << "del_kroute: Entered" << endl;#endif	  if ((new_krtentry = gen_krtentry(iter)) == NULL)	  {		  cout << "del_kroute: error in gen_krtentry " << endl;	    /* del_kroute failed */	    return -1;	  }	  if(ioctl(ksock, SIOCDELRT, (char*) new_krtentry) == -1)	  {	    /* SIOCDELRT failed */#ifdef DEBUG		  cout << "routingTable: del_kroute: ioctl failed " << endl;        perror("Error in ioctl- deleting routes");#endif	    return -1;	  }	  return 0;	  free(new_krtentry);}int		routingTable::add_kroute( map<u_int32_t,rtable_entry>::iterator iter ){	/*	route_add(iter->second.getDestIP(), iter->second.getNextHop(), interface);	return 0;	*/	  struct rtentry  *new_krtentry;#ifdef DEBUG	  cout << "add_kroute: Entered" << endl;#endif	  if ((new_krtentry = gen_krtentry(iter)) == NULL)	  {	     cout << "Error in gen_krtentry" << endl;	    return -1;	  }	  if(ioctl(ksock, SIOCADDRT,(char*) new_krtentry) == -1)	  {#ifdef DEBUG		  cout << "routingTable: add_kroute: ioctl failed " << endl;        perror("Error in ioctl- adding routes");#endif	    return -1;	  }	  free(new_krtentry);	  return 0;}struct rtentry *routingTable::gen_krtentry( map<u_int32_t,rtable_entry>::iterator iter ){	  struct rtentry *new_rtentry;	  struct sockaddr_in dst;	  struct sockaddr_in gw;	  struct sockaddr_in genmask;	  unsigned int netmask=0xffffffff;#ifdef DEBUG	  cout << "gen_krtentry: Entered" << endl;#endif	  if((new_rtentry = (struct rtentry *)malloc(sizeof(struct rtentry))) == NULL)	  {		perror("Error in malloc");	   	return NULL; 	  }	  bzero((void *)new_rtentry,sizeof(struct rtentry));	  bzero((void *)&dst,sizeof(struct sockaddr_in));	  bzero((void *)&gw,sizeof(struct sockaddr_in));	  bzero((void *)&genmask,sizeof(struct sockaddr_in));	  dst.sin_family = AF_INET;	  gw.sin_family = AF_INET;	  genmask.sin_family = AF_INET;	  dst.sin_addr.s_addr = iter->second.getDestIP();	  struct in_addr 	addr_temp;	  addr_temp.s_addr = g_my_ip;#ifdef DEBUG	  cout << "gen_krtentry: Local Host is   " << inet_ntoa(addr_temp) << endl;	  addr_temp.s_addr = iter->second.getDestIP();	  cout << "gen_krtentry: DstIP is   " << inet_ntoa(addr_temp) << endl;	  addr_temp.s_addr = iter->second.getNextHop();	  cout << "gen_krtentry: Nxt Hop is   " << inet_ntoa(addr_temp) << endl;#endif	  if( iter->second.getHopCnt() == 1)	  {#ifdef DEBUG		cout << " routingTable: gen_krtentry: 1 hop cnt " << endl;#endif	  	gw.sin_addr.s_addr = g_my_ip;	  	//gw.sin_addr.s_addr = iter->second.getNextHop();	  }	  else	  {#ifdef DEBUG		cout << " routingTable: gen_krtentry: multi hop cnt " << endl;#endif	  	gw.sin_addr.s_addr = iter->second.getNextHop();	  }	  genmask.sin_addr.s_addr = netmask;	  //genmask.sin_addr.s_addr = inet_addr("255.255.255.255");	  new_rtentry->rt_flags = RTF_UP | RTF_HOST | RTF_GATEWAY;	  new_rtentry->rt_metric = (short)iter->second.getHopCnt();	  new_rtentry->rt_dev = interface;	  new_rtentry->rt_dst = *(struct sockaddr*) &dst;	  new_rtentry->rt_gateway = *(struct sockaddr*) &gw;	  new_rtentry->rt_genmask = *(struct sockaddr*) &genmask;	  return new_rtentry;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -