blob: 399584f767fc7839c7efd2e782be00e541435628 [file] [log] [blame]
#include<list>
#include "nlsr_fe.hpp"
#include "nlsr_fib.hpp"
#include "nlsr_nhl.hpp"
#include "nlsr.hpp"
using namespace std;
static bool
fibEntryNameCompare(FibEntry& fe, string name)
{
return fe.getName() == name ;
}
void
Fib::removeFromFib(string name)
{
std::list<FibEntry >::iterator it = std::find_if( fibTable.begin(),
fibTable.end(), bind(&fibEntryNameCompare, _1, name));
if( it != fibTable.end() )
{
for(std::list<NextHop>::iterator nhit=(*it).getNhl().getNextHopList().begin();
nhit != (*it).getNhl().getNextHopList().begin(); nhit++)
{
//remove entry from NDN-FIB
}
fibTable.erase(it);
}
}
void
Fib::updateFib(string name, Nhl& nextHopList, int maxFacesPerPrefix)
{
int startFace=0;
int endFace=getNumberOfFacesForName(nextHopList,maxFacesPerPrefix);
std::list<FibEntry >::iterator it = std::find_if( fibTable.begin(),
fibTable.end(), bind(&fibEntryNameCompare, _1, name));
if( it != fibTable.end() )
{
nextHopList.sortNhl();
if ( !(*it).isEqualNextHops(nextHopList) )
{
std::list<NextHop>::iterator nhit=nextHopList.getNextHopList().begin();
(*it).getNhl().addNextHop((*nhit));
removeFibEntryHop((*it).getNhl(),(*nhit).getConnectingFace());
startFace++;
nhit++;
for( int i=startFace;i< endFace;nhit++,i++)
{
(*it).getNhl().addNextHop((*nhit));
}
(*it).setTimeToRefresh(fibEntryRefreshTime);
}
(*it).getNhl().sortNhl();
//update NDN-FIB
}
else
{
nextHopList.sortNhl();
FibEntry newEntry(name);
std::list<NextHop>::iterator nhit=nextHopList.getNextHopList().begin();
for(int i=startFace; i< endFace ; i++)
{
newEntry.getNhl().addNextHop((*nhit));
++nhit;
}
newEntry.getNhl().sortNhl();
newEntry.setTimeToRefresh(fibEntryRefreshTime);
fibTable.push_back(newEntry);
//Update NDN-FIB
}
}
void
Fib::refreshFib(nlsr& pnlsr)
{
for ( std::list<FibEntry >::iterator it = fibTable.begin() ;
it != fibTable.end() ; ++it)
{
(*it).setTimeToRefresh((*it).getTimeToRefresh()-60);
if( (*it).getTimeToRefresh() < 0 )
{
cout<<"Refreshing FIB entry : "<<endl;
cout<<(*it)<<endl;
(*it).setTimeToRefresh(fibEntryRefreshTime);
//update NDN-FIB
}
}
printFib();
scheduleFibRefreshing(pnlsr,60);
}
void
Fib::scheduleFibRefreshing(nlsr& pnlsr, int refreshTime)
{
pnlsr.getScheduler().scheduleEvent(ndn::time::seconds(refreshTime),
ndn::bind(&Fib::refreshFib,this,boost::ref(pnlsr)));
}
void Fib::cleanFib()
{
for( std::list<FibEntry >::iterator it=fibTable.begin(); it != fibTable.end();
++it)
{
for(std::list<NextHop>::iterator nhit=(*it).getNhl().getNextHopList().begin();
nhit != (*it).getNhl().getNextHopList().begin(); nhit++)
{
//remove entry from NDN-FIB
}
}
if ( fibTable.size() > 0 )
{
fibTable.clear();
}
}
void
Fib::removeFibEntryHop(Nhl& nl, int doNotRemoveHopFaceId)
{
for( std::list<NextHop >::iterator it=nl.getNextHopList().begin();
it != nl.getNextHopList().end(); ++it)
{
if ( (*it).getConnectingFace() != doNotRemoveHopFaceId )
{
nl.getNextHopList().erase(it);
}
}
}
int
Fib::getNumberOfFacesForName(Nhl& nextHopList, int maxFacesPerPrefix)
{
int endFace=0;
if((maxFacesPerPrefix == 0) || (nextHopList.getNhlSize() <= maxFacesPerPrefix))
{
return nextHopList.getNhlSize();
}
else
{
return maxFacesPerPrefix;
}
return endFace;
}
void
Fib::printFib()
{
cout<<"-------------------FIB-----------------------------"<<endl;
for(std::list<FibEntry>::iterator it = fibTable.begin(); it!=fibTable.end();
++it)
{
cout<<(*it);
}
}