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

📄 updatemessage.cc

📁 RSA algorithm implementation is given
💻 CC
字号:
#include "common.h"#include "externDec.h"void	stlTimeHandler(void *data);void	updateMessage::printUpdate(){	cout << "updateMessage: printUpdate: num of entries " << entries_cnt << endl;	list<broadcast_entry>::iterator		iter;	iter = brentry_list.begin();	while(iter != brentry_list.end())	{		cout << "\t" << getDotIP(iter->getDestIP());		cout << "\t" << iter->getDestSeqNum();		cout << "\t" << iter->getRTMetric();		cout << endl;		iter++;	}}void	updateMessage::createMessage(char *buf){		u_int32_t	dst, seqNum, metric;	int			i;	type = buf[0];	reserved1 = buf[1];	reserved2 = buf[2];	entries_cnt = buf[3];#ifdef DEBUG	cout << "updateMessage: createMessage: entries cnt is " << (int)entries_cnt << endl;#endif	for(i=0;i<entries_cnt;i++)	{		memcpy(&dst,(buf+4+i*12),4);		memcpy(&seqNum,(buf+8+i*12),4);		memcpy(&metric,(buf+12+i*12),4);		addToBrdcstList(dst,seqNum,metric);	}	return;}	void	updateMessage::insertIntoList(u_int32_t dst, u_int32_t seq, u_int32_t metric){	broadcast_entry		brEntry;	brEntry.createEntry(dst,seq,metric);	brentry_list.push_back(brEntry);	return;}void	updateMessage::addToBrdcstList(u_int32_t dst, u_int32_t seq, u_int32_t metric){	broadcast_entry		brEntry;	brEntry.createEntry(dst,seq,metric);	brentry_list.push_back(brEntry);	return;}void	updateMessage::applyUpdates(u_int32_t	src){	u_int32_t	dst, new_metric, prevMetric, prevNextHop;	list<broadcast_entry>::iterator		iter;	bool		add_flag= false;	u_int64_t	currtime=getcurrtime();	iter = brentry_list.begin();	while(iter != brentry_list.end())	{		dst = iter->getDestIP();		if(dst != g_my_ip)		{			rtable_entry	*rtEntry;			rtEntry = rTableForward.findRoute(dst);			if(rtEntry != NULL)			{				prevMetric = rtEntry->getRTMetric();				prevNextHop = rtEntry->getNextHop();				if(iter->getRTMetric() == INFINITY)					new_metric = INFINITY;				else					new_metric = iter->getRTMetric()+1;#ifdef DEBUG				cout << "updateMessage: applyUpdates: an entry exist " << endl;#endif				if(iter->getDestSeqNum() > rtEntry->getDestSeqNum())				{#ifdef DEBUG					cout << "updateMessage: applyUpdates: entry received with higher seq num " << endl;#endif										/* set the change bit in the routing flag */					u_int32_t	temp_flag=1;					temp_flag = temp_flag << 31;					rtEntry->setRFlags(temp_flag);					if((rtEntry->getRTMetric() != INFINITY))					{#ifdef DEBUG						cout << "updateMessage: applyUpdates: an entry exist in kernel " << endl;#endif						/* check if it needs to be changed */						if((rtEntry->getNextHop() != src) || 							(rtEntry->getRTMetric() != new_metric))						{							del_kroute(*rtEntry);							add_flag = true;						}					}					else					{#ifdef DEBUG						cout << "updateMessage: applyUpdates: an entry does not\							exist in kernel " << endl;#endif						add_flag = true;					}					if(iter->getRTMetric() == INFINITY)						add_flag = false;					rtEntry->setNextHop(src);					rtEntry->setDestSeqNum(iter->getDestSeqNum());					rtEntry->setRTMetric(new_metric);					rtEntry->setLifeTime(currtime+ROUTE_TIMEOUT);					if(add_flag)						add_kroute(*rtEntry);					if(new_metric != INFINITY)					{#ifdef DEBUG						cout << "updateMessages: set the last recv time in settling time table " << endl;#endif						stlTable.setLastRecvTime(rtEntry->getDestIP());					}					if(new_metric == INFINITY || (new_metric < prevMetric) 						|| ((new_metric == prevMetric) && (src != prevNextHop)))					{#ifdef DEBUG						cout << "updateMessage: applyUpdates: do an immediate broadcast " << endl;#endif						/* sync the two routing tables */						rTableForward.syncRTables(rtEntry->getDestIP());						is_broadcast = true;					}					else					{#ifdef DEBUG						cout << "updateMessage: applyUpdates: do a delayed  broadcast " << endl;#endif						/* add a timer for delayed broadcast here */						/* there could be two cases:						 * new_metric > prevMetric or new_metric==prevMetric */						if(new_metric == prevMetric && src == prevNextHop)						{#ifdef DEBUG							cout << "just seq number change " << endl; #endif							rTableForward.syncRTables(rtEntry->getDestIP());						}						else						{							u_int64_t	stime =  stlTable.getSettleTime(rtEntry->getDestIP());							if(stime == 0)							{#ifdef DEBUG								cout << "updateMessage: no stl time data, broadcast immediately " << endl;#endif								rTableForward.syncRTables(rtEntry->getDestIP());								is_broadcast=true;							}							else							{								struct timerData	tData;								tData.type = DELAYED_UPDATE_TIMER;								tData.data = rtEntry->getDestIP();								timer_Q.set_timer(STL_TIME_FACTOR*stime, stlTimeHandler, (void *) &tData);							}						}					}				}				else if(iter->getDestSeqNum() < rtEntry->getDestSeqNum())				{#ifdef DEBUG					cout << "updateMessage: applyUpdates: entry received with smaller seq number " << endl; #endif					if(new_metric == INFINITY)						is_broadcast=true;				}				else				{#ifdef DEBUG					cout << "updateMessage: applyUpdates: entry	with a same seq number " << endl;#endif					if((iter->getRTMetric()+1) < rtEntry->getRTMetric())					{						/* set the change bit in the routing flag */						u_int32_t	temp_flag=1;						temp_flag = temp_flag << 31;						rtEntry->setRFlags(temp_flag);												//stlTable.setAvgStlTime(rtEntry->getDestIP());						stlTable.setNewStlTime(rtEntry->getDestIP());						stlTable.setLastRecvTime(rtEntry->getDestIP());						is_broadcast=true;						rTableForward.syncRTables(rtEntry->getDestIP());						if(rtEntry->getRTMetric() != INFINITY)							del_kroute(*rtEntry);						rtEntry->setNextHop(src);						rtEntry->setDestSeqNum(iter->getDestSeqNum());						rtEntry->setRTMetric(new_metric);						rtEntry->setLifeTime(currtime+ROUTE_TIMEOUT);						add_kroute(*rtEntry);					}				}			}			else {#ifdef DEBUG				cout << "updateMessage: applyUpdates: an entry does not exist " << endl;#endif				rtable_entry	rtEntry;				if(iter->getRTMetric() == INFINITY)					new_metric = INFINITY;				else 					new_metric = iter->getRTMetric()+1;				rtEntry.createEntry(iter->getDestIP(),src, iter->getDestSeqNum(),(new_metric),(getcurrtime()+ROUTE_TIMEOUT),0); 				/* set the change bit in the routing flag */				u_int32_t	temp_flag=1;				temp_flag = temp_flag << 31;				rtEntry.setRFlags(temp_flag);				rTableForward.insertRoute(rtEntry);				if(new_metric !=INFINITY)					add_kroute(rtEntry);				stlTable.setLastRecvTime(rtEntry.getDestIP());				rTableForward.syncRTables(rtEntry.getDestIP());				is_broadcast=true;			}		}		else		{#ifdef DEBUG			cout << "updateMessages: local node entry " << endl;#endif			if(duringReboot)			{				/*update local seq number */				if(localSeqNum < iter->getDestSeqNum())				{					localSeqNum=iter->getDestSeqNum();					rTableForward.setLocalSeqNum();					rTableBroadcast.setLocalSeqNum();				}							}		}		iter++;	}}void	stlTimeHandler(void *data){	dsdvOb.settling_time_handler(data);	/* do a broadcast in this handler function */}void	updateMessage::copyIntoBuf(char *buf){	u_int32_t	dst,seq,metric;	buf[0]=type;	buf[1]=0;	buf[2]=0;	buf[3]=entries_cnt;		list<broadcast_entry>::iterator		iter;	iter=brentry_list.begin();	int i=0;	while(iter != brentry_list.end())	{		dst=iter->getDestIP();		seq=iter->getDestSeqNum();		metric=iter->getRTMetric();		memcpy((buf+4+i*12),&dst,4);		memcpy((buf+8+i*12),&seq,4);		memcpy((buf+12+i*12),&metric,4);		i++;		iter++;	}	return;}

⌨️ 快捷键说明

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