blob: 141bf3a200fdf49ccba18e4b7606d0109cc13443 [file] [log] [blame]
#include<list>
#include "nlsr_fe.hpp"
#include "nlsr_fib.hpp"
#include "nlsr_nhl.hpp"
#include "nlsr.hpp"
#include "utility/nlsr_logger.hpp"
#define THIS_FILE "nlsr_fib.cpp"
namespace nlsr
{
using namespace std;
using namespace ndn;
static bool
fibEntryNameCompare(FibEntry& fe, string name)
{
return fe.getName() == name ;
}
void
Fib::cancelScheduledExpiringEvent(Nlsr& pnlsr, EventId eid)
{
pnlsr.getScheduler().cancelEvent(eid);
}
ndn::EventId
Fib::scheduleEntryRefreshing(Nlsr& pnlsr, string name, int feSeqNum,
int refreshTime)
{
return pnlsr.getScheduler().scheduleEvent(ndn::time::seconds(refreshTime),
ndn::bind(&Fib::refreshEntry,this,name,feSeqNum));
}
void
Fib::refreshEntry(string name, int feSeqNum)
{
}
void
Fib::remove(Nlsr& pnlsr, string name)
{
std::list<FibEntry >::iterator it = std::find_if( m_table.begin(),
m_table.end(), bind(&fibEntryNameCompare, _1, name));
if( it != m_table.end() )
{
for(std::list<NextHop>::iterator nhit=(*it).getNhl().getNextHopList().begin();
nhit != (*it).getNhl().getNextHopList().begin(); nhit++)
{
//remove entry from NDN-FIB
}
cancelScheduledExpiringEvent(pnlsr, (*it).getExpiringEventId());
m_table.erase(it);
}
}
void
Fib::update(Nlsr& pnlsr,string name, Nhl& nextHopList)
{
std::cout<<"Fib::updateFib Called"<<std::endl;
int startFace=0;
int endFace=getNumberOfFacesForName(nextHopList,
pnlsr.getConfParameter().getMaxFacesPerPrefix());
std::list<FibEntry >::iterator it = std::find_if( m_table.begin(),
m_table.end(),
bind(&fibEntryNameCompare, _1, name));
if( it == m_table.end() )
{
if( nextHopList.getSize() > 0 )
{
nextHopList.sort();
FibEntry newEntry(name);
std::list<NextHop> nhl=nextHopList.getNextHopList();
std::list<NextHop>::iterator nhit=nhl.begin();
for(int i=startFace; i< endFace && nhit!=nhl.end(); ++nhit, i++)
{
newEntry.getNhl().addNextHop((*nhit));
//Add entry to NDN-FIB
}
newEntry.getNhl().sort();
newEntry.setTimeToRefresh(m_refreshTime);
newEntry.setSeqNo(1);
newEntry.setExpiringEventId(scheduleEntryRefreshing(pnlsr,
name ,1,m_refreshTime));
m_table.push_back(newEntry);
}
}
else
{
std::cout<<"Old FIB Entry"<<std::endl;
if( nextHopList.getSize() > 0 )
{
nextHopList.sort();
if ( !it->isEqualNextHops(nextHopList) )
{
std::list<NextHop> nhl=nextHopList.getNextHopList();
std::list<NextHop>::iterator nhit=nhl.begin();
// Add first Entry to NDN-FIB
removeHop(pnlsr, it->getNhl(),nhit->getConnectingFace());
it->getNhl().reset();
it->getNhl().addNextHop((*nhit));
++startFace;
++nhit;
for(int i=startFace; i< endFace && nhit!=nhl.end(); ++nhit, i++)
{
it->getNhl().addNextHop((*nhit));
//Add Entry to NDN_FIB
}
}
it->setTimeToRefresh(m_refreshTime);
cancelScheduledExpiringEvent(pnlsr, it->getExpiringEventId());
it->setSeqNo(it->getSeqNo()+1);
(*it).setExpiringEventId(scheduleEntryRefreshing(pnlsr,
it->getName() ,
it->getSeqNo(),m_refreshTime));
}
else
{
remove(pnlsr,name);
}
}
}
void Fib::clean(Nlsr& pnlsr)
{
for( std::list<FibEntry >::iterator it=m_table.begin(); it != m_table.end();
++it)
{
for(std::list<NextHop>::iterator nhit=(*it).getNhl().getNextHopList().begin();
nhit != (*it).getNhl().getNextHopList().begin(); nhit++)
{
cancelScheduledExpiringEvent(pnlsr,(*it).getExpiringEventId());
//Remove entry from NDN-FIB
}
}
if ( m_table.size() > 0 )
{
m_table.clear();
}
}
int
Fib::getNumberOfFacesForName(Nhl& nextHopList, int maxFacesPerPrefix)
{
int endFace=0;
if((maxFacesPerPrefix == 0) || (nextHopList.getSize() <= maxFacesPerPrefix))
{
return nextHopList.getSize();
}
else
{
return maxFacesPerPrefix;
}
return endFace;
}
void
Fib::removeHop(Nlsr& pnlsr, Nhl& nl, int doNotRemoveHopFaceId)
{
for( std::list<NextHop >::iterator it=nl.getNextHopList().begin();
it != nl.getNextHopList().end(); ++it)
{
if ( it->getConnectingFace() != doNotRemoveHopFaceId )
{
//Remove FIB Entry from NDN-FIB
}
}
}
void
Fib::print()
{
cout<<"-------------------FIB-----------------------------"<<endl;
for(std::list<FibEntry>::iterator it = m_table.begin(); it!=m_table.end();
++it)
{
cout<<(*it);
}
}
} //namespace nlsr