📄 routingtable.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 + -