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

📄 routingtable.cc

📁 RSA algorithm implementation is given
💻 CC
字号:
#include "common.h"#include "externDec.h"/* This function does routing table initialization */int routingTable::init_KRT (){	  rtable_entry	rtEntry;	  rtEntry.createEntry(g_my_ip,g_my_ip,localSeqNum,0,(getcurrtime()+ROUTE_TIMEOUT),0); #ifdef DEBUG	  cout << "Inside initRT" << endl;#endif	  /* Insert entry for the local node in both the routing tables */	  rTableMap.insert(pair<u_int32_t,rtable_entry>(rtEntry.getDestIP(),rtEntry));	  /* add this entry to the kernel routing table */	  add_kroute(rtEntry);	  return 0;}/* This function does routing table initialization */int routingTable::init_RT (){	  rtable_entry	rtEntry;	  rtEntry.createEntry(g_my_ip,g_my_ip,localSeqNum,0,(getcurrtime()+ROUTE_TIMEOUT),0); #ifdef DEBUG	  cout << "Inside initRT" << endl;#endif	  /* Insert entry for the local node in both the routing tables */	  rTableMap.insert(pair<u_int32_t,rtable_entry>(rtEntry.getDestIP(),rtEntry));	  return 0;}void	routingTable::incrementLocalSeqNum(){	map<u_int32_t,rtable_entry>::iterator	iter;	iter = rTableMap.find(g_my_ip);	if(iter != rTableMap.end())	{		iter->second.setDestSeqNum(genSeqNum());	}}u_int32_t	routingTable::genSeqNum(){	localSeqNum+=2;	return localSeqNum;}void	routingTable::setLocalSeqNum(){	map<u_int32_t,rtable_entry>::iterator	iter;	iter = rTableMap.find(g_my_ip);	if(iter != rTableMap.end())	{		iter->second.setDestSeqNum(localSeqNum);	}}rtable_entry *	routingTable::findRoute(u_int32_t dst){	map<u_int32_t,rtable_entry>::iterator	iter;	iter = rTableMap.find(dst);	if(iter != rTableMap.end())		return &(iter->second);	else		return NULL;}void	routingTable::insertRoute(rtable_entry rtEntry){	  rTableMap.insert(pair<u_int32_t,rtable_entry>(rtEntry.getDestIP(),rtEntry));	  //add_kroute(rtEntry);}u_int8_t	routingTable::getSize(){	return rTableMap.size();}void	routingTable::generateUpdateMessage(updateMessage *umsg, bool full_dump){	/* if it is a full dump, reset the chang bit to 0 in the routing flag */	u_int32_t	temp_flag=0;	u_int8_t	count=0;	umsg->setType(DSDV_PERIODIC_UPDATE);	map<u_int32_t,rtable_entry>::iterator	iter, iter_temp;#ifdef DEBUG	cout << "routingTable: generateUpdateMessage: entered" << endl;#endif	/* first put the local node entry */	iter_temp = rTableMap.find(g_my_ip);	if(iter_temp != rTableMap.end())	{		umsg->insertIntoList(iter_temp->second.getDestIP(), iter_temp->second.getDestSeqNum(), iter_temp->second.getRTMetric());		count++;			}	iter=rTableMap.begin();	while(iter!=rTableMap.end())	{#ifdef DEBUG		cout << "routingTable: generateUpdateMessage: inside while" << endl;#endif		if(iter->second.getDestIP() != g_my_ip)		{#ifdef DEBUG			cout << "routingTable: generateUpdateMessage: not the local entry" << endl;			cout << "routingTable: generateUpdateMessage: dest ip is" << getDotIP(iter->second.getDestIP()) << endl;#endif			if(full_dump)			{				umsg->insertIntoList(iter->second.getDestIP(), iter->second.getDestSeqNum(), iter->second.getRTMetric());				count++;				iter->second.setRFlags(0);			}			else			{				/* check if the change flag is set to 1 */				temp_flag = iter->second.getRFlags();				temp_flag = temp_flag >> 31;				if(temp_flag == 1)				{#ifdef DEBUG					cout << "generateUpdateMessage: change flag is set " << endl;#endif					umsg->insertIntoList(iter->second.getDestIP(), iter->second.getDestSeqNum(), iter->second.getRTMetric());					count++;				}			}		}		iter++;	}	umsg->setEntriesCnt(count);	return;}u_int8_t	routingTable::getChangedEntriesCnt(){	u_int32_t	temp_flag=0;	u_int8_t	temp_cnt=0;	map<u_int32_t,rtable_entry>::iterator	iter;	iter=rTableMap.begin();	while(iter!=rTableMap.end())	{		temp_flag = iter->second.getRFlags();		temp_flag = temp_flag >> 31;		if(temp_flag == 1)		{			temp_cnt++;		}		iter++;	}	return temp_cnt;}void	routingTable::syncRTables(u_int32_t dst){	map<u_int32_t,rtable_entry>::iterator	iterFw;	iterFw = rTableMap.find(dst);	if(iterFw != rTableMap.end())	{		rtable_entry	*rtEntry;		rtEntry = rTableBroadcast.findRoute(dst);		if(rtEntry != NULL)		{			rtEntry->updateEntry(iterFw->second);		}		else		{			rTableBroadcast.addEntry(iterFw->second);		}	}	return;}void	routingTable::addEntry(rtable_entry rtEntry){	rTableMap.insert(pair<u_int32_t,rtable_entry>(rtEntry.getDestIP(),rtEntry));	return;}void	routingTable::deleteEntry(u_int32_t dst){	map<u_int32_t,rtable_entry>::iterator	iter;	iter = rTableMap.find(dst);	if(iter != rTableMap.end())	{#ifdef DEBUG		cout << "routingTable:: deleteEntry: delete entry " << getDotIP(dst) << endl;#endif		rTableMap.erase(iter);	}	return;}bool	routingTable::refreshEntries(){	bool	doBroadcast=false;	u_int64_t	currtime=getcurrtime();	u_int32_t	prevMetric;	map<u_int32_t,rtable_entry>::iterator	iter, temp_iter, iter_new;	iter=rTableMap.begin();	while(iter!=rTableMap.end())	{		iter++;		temp_iter=iter;		iter--;		if(iter->second.getDestIP() != g_my_ip)		{			if(iter->second.getLifeTime() <= currtime)			{#ifdef DEBUG				cout << "routingTable: expire the entry " << endl;#endif				if(iter->second.getRTMetric() == INFINITY)				{					rTableBroadcast.deleteEntry(iter->second.getDestIP());					rTableMap.erase(iter);				}				else				{					/* delete entry from the kernel */					del_kroute(iter->second);					stlTable.deleteEntry(iter->second.getDestIP());					doBroadcast=true;					prevMetric = iter->second.getRTMetric();					/* set metric to infinity and increment the sequence number */					iter->second.setRTMetric(INFINITY);					iter->second.setDestSeqNum(iter->second.getDestSeqNum()+1);					/* set the change bit in the routing flag */					u_int32_t	temp_flag=1;					temp_flag = temp_flag << 31;					iter->second.setRFlags(temp_flag);					syncRTables(iter->second.getDestIP());					if(prevMetric == 1)					{#ifdef DEBUG						cout << "routingTable: refreshEntries: one hop heighbor " << endl;#endif						iter_new = rTableMap.begin();						while(iter_new != rTableMap.end())						{							if((iter_new->second.getRTMetric()!= INFINITY) &&							(iter_new->second.getNextHop() == iter->second.getDestIP()))							{								del_kroute(iter_new->second);																/* set metric to infinity and increment 								 * the sequence number */								iter_new->second.setRTMetric(INFINITY);								iter_new->second.setDestSeqNum(iter_new->second.getDestSeqNum()+1);								/* set the change bit in the routing flag */								u_int32_t	temp_flag=1;								temp_flag = temp_flag << 31;								iter_new->second.setRFlags(temp_flag);								syncRTables(iter_new->second.getDestIP());							}							iter_new++;						}					}				}			}		}		else		{#ifdef DEBUG			cout << "routingTable: local entry expires, reset lifetime " << endl;#endif			iter->second.setLifeTime(ROUTE_TIMEOUT);		}		iter=temp_iter;	}	return doBroadcast;}

⌨️ 快捷键说明

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