INET Framework for OMNeT++/OMNEST
AnsaOspf6::Neighbor Class Reference

#include <ansaOspfNeighbor6.h>

List of all members.

Classes

struct  DDPacketID
struct  TransmittedLSA

Public Types

enum  NeighborEventType {
  HelloReceived = 0, Start = 1, TwoWayReceived = 2, NegotiationDone = 3,
  ExchangeDone = 4, BadLinkStateRequest = 5, LoadingDone = 6, IsAdjacencyOK = 7,
  SequenceNumberMismatch = 8, OneWayReceived = 9, KillNeighbor = 10, InactivityTimer = 11,
  PollTimer = 12, LinkDown = 13, DDRetransmissionTimer = 14, UpdateRetransmissionTimer = 15,
  RequestRetransmissionTimer = 16
}
enum  NeighborStateType {
  DownState = 0, AttemptState = 1, InitState = 2, TwoWayState = 4,
  ExchangeStartState = 8, ExchangeState = 16, LoadingState = 32, FullState = 64
}
enum  DatabaseExchangeRelationshipType { Master = 0, Slave = 1 }

Public Member Functions

 Neighbor (RouterID neighbor=NullRouterID)
virtual ~Neighbor (void)
void ProcessEvent (NeighborEventType event)
void Reset (void)
void InitFirstAdjacency (void)
NeighborStateType GetState (void) const
void SendDatabaseDescriptionPacket (bool init=false)
bool RetransmitDatabaseDescriptionPacket (void)
void CreateDatabaseSummary (void)
void SendLinkStateRequestPacket (void)
void RetransmitUpdatePacket (void)
bool NeedAdjacency (void)
void AddToRetransmissionList (OspfLsa6 *lsa)
void RemoveFromRetransmissionList (LsaKeyType6 lsaKey)
bool IsLSAOnRetransmissionList (LsaKeyType6 lsaKey) const
OspfLsa6FindOnRetransmissionList (LsaKeyType6 lsaKey)
void StartUpdateRetransmissionTimer (void)
void ClearUpdateRetransmissionTimer (void)
void AddToRequestList (OspfLsaHeader6 *lsaHeader)
void RemoveFromRequestList (LsaKeyType6 lsaKey)
bool IsLSAOnRequestList (LsaKeyType6 lsaKey) const
OspfLsaHeader6FindOnRequestList (LsaKeyType6 lsaKey)
void StartRequestRetransmissionTimer (void)
void ClearRequestRetransmissionTimer (void)
void AddToTransmittedLSAList (LsaKeyType6 lsaKey)
bool IsOnTransmittedLSAList (LsaKeyType6 lsaKey) const
void AgeTransmittedLSAList (void)
unsigned long GetUniqueULong (void)
void DeleteLastSentDDPacket (void)
void SetNeighborID (RouterID id)
RouterID GetNeighborID (void) const
void SetPriority (unsigned char priority)
unsigned char GetPriority (void) const
void SetAddress (IPv6Address address)
IPv6Address GetAddress (void) const
void SetDesignatedRouter (DesignatedRouterID routerID)
DesignatedRouterID GetDesignatedRouter (void) const
void SetBackupDesignatedRouter (DesignatedRouterID routerID)
DesignatedRouterID GetBackupDesignatedRouter (void) const
void SetRouterDeadInterval (short interval)
short GetRouterDeadInterval (void) const
void SetDDSequenceNumber (unsigned long sequenceNumber)
unsigned long GetDDSequenceNumber (void) const
void SetOptions (OspfOptions6 options)
OspfOptions6 GetOptions (void) const
void SetLastReceivedDDPacket (DDPacketID packetID)
DDPacketID GetLastReceivedDDPacket (void) const
void SetDatabaseExchangeRelationship (DatabaseExchangeRelationshipType relation)
DatabaseExchangeRelationshipType GetDatabaseExchangeRelationship (void) const
void SetInterface (Interface *intf)
InterfaceGetInterface (void)
const InterfaceGetInterface (void) const
OspfTimer6GetInactivityTimer (void)
OspfTimer6GetPollTimer (void)
OspfTimer6GetDDRetransmissionTimer (void)
OspfTimer6GetUpdateRetransmissionTimer (void)
bool IsUpdateRetransmissionTimerActive (void) const
bool IsRequestRetransmissionTimerActive (void) const
bool IsFirstAdjacencyInited (void) const
bool DesignatedRoutersAreSetUp (void) const
void SetUpDesignatedRouters (bool setUp)
unsigned long GetDatabaseSummaryListCount (void) const
void IncrementDDSequenceNumber (void)
bool IsLinkStateRequestListEmpty (void) const
bool IsLinkStateRetransmissionListEmpty (void) const
void PopFirstLinkStateRequest (void)

Static Public Member Functions

static const char * GetStateString (NeighborStateType stateType)

Private Member Functions

void ChangeState (NeighborState *newState, NeighborState *currentState)

Private Attributes

NeighborStatestate
NeighborStatepreviousState
OspfTimer6inactivityTimer
OspfTimer6pollTimer
OspfTimer6ddRetransmissionTimer
OspfTimer6updateRetransmissionTimer
bool updateRetransmissionTimerActive
OspfTimer6requestRetransmissionTimer
bool requestRetransmissionTimerActive
DatabaseExchangeRelationshipType databaseExchangeRelationship
bool firstAdjacencyInited
unsigned long ddSequenceNumber
DDPacketID lastReceivedDDPacket
RouterID neighborID
unsigned char neighborPriority
IPv6Address neighborIPAddress
OspfOptions6 neighborOptions
DesignatedRouterID neighborsDesignatedRouter
DesignatedRouterID neighborsBackupDesignatedRouter
bool designatedRoutersSetUp
short neighborsRouterDeadInterval
std::list< OspfLsa6 * > linkStateRetransmissionList
std::list< OspfLsaHeader6 * > databaseSummaryList
std::list< OspfLsaHeader6 * > linkStateRequestList
std::list< TransmittedLSAtransmittedLSAs
OspfDatabaseDescriptionPacket6lastTransmittedDDPacket
InterfaceparentInterface

Static Private Attributes

static unsigned long ddSequenceNumberInitSeed = 0

Friends

class NeighborState

Detailed Description

Definition at line 29 of file ansaOspfNeighbor6.h.


Member Enumeration Documentation

Enumerator:
Master 
Slave 

Definition at line 65 of file ansaOspfNeighbor6.h.

                                         {
       Master = 0,
       Slave = 1
   };
Enumerator:
HelloReceived 
Start 
TwoWayReceived 
NegotiationDone 
ExchangeDone 
BadLinkStateRequest 
LoadingDone 
IsAdjacencyOK 
SequenceNumberMismatch 
OneWayReceived 
KillNeighbor 
InactivityTimer 
PollTimer 
LinkDown 
DDRetransmissionTimer 
UpdateRetransmissionTimer 
RequestRetransmissionTimer 

Definition at line 34 of file ansaOspfNeighbor6.h.

Enumerator:
DownState 
AttemptState 
InitState 
TwoWayState 
ExchangeStartState 
ExchangeState 
LoadingState 
FullState 

Definition at line 54 of file ansaOspfNeighbor6.h.


Constructor & Destructor Documentation

Definition at line 27 of file ansaOspfNeighbor6.cc.

                                             :
      updateRetransmissionTimerActive(false),
      requestRetransmissionTimerActive(false),
      firstAdjacencyInited(false),
      ddSequenceNumber(0),
      neighborID(neighbor),
      neighborPriority(0),
      neighborIPAddress(IPv6Address::UNSPECIFIED_ADDRESS),
      neighborsDesignatedRouter(AnsaOspf6::NullDesignatedRouterID),
      neighborsBackupDesignatedRouter(AnsaOspf6::NullDesignatedRouterID),
      designatedRoutersSetUp(false),
      neighborsRouterDeadInterval(40),
      lastTransmittedDDPacket(NULL){

   inactivityTimer = new OspfTimer6;
   inactivityTimer->setTimerKind(NeighborInactivityTimer);
   inactivityTimer->setContextPointer(this);
   inactivityTimer->setName("AnsaOspf6::Neighbor::NeighborInactivityTimer");
   pollTimer = new OspfTimer6;
   pollTimer->setTimerKind(NeighborPollTimer);
   pollTimer->setContextPointer(this);
   pollTimer->setName("AnsaOspf6::Neighbor::NeighborPollTimer");

   /* TODO
   ddRetransmissionTimer = new OspfTimer6;
   ddRetransmissionTimer->setTimerKind(NeighborDDRetransmissionTimer);
   ddRetransmissionTimer->setContextPointer(this);
   ddRetransmissionTimer->setName("AnsaOspf6::Neighbor::NeighborDDRetransmissionTimer");
   updateRetransmissionTimer = new OspfTimer6;
   updateRetransmissionTimer->setTimerKind(NeighborUpdateRetransmissionTimer);
   updateRetransmissionTimer->setContextPointer(this);
   updateRetransmissionTimer->setName("AnsaOspf6::Neighbor::Neighbor::NeighborUpdateRetransmissionTimer");
   requestRetransmissionTimer = new OspfTimer6;
   requestRetransmissionTimer->setTimerKind(NeighborRequestRetransmissionTimer);
   requestRetransmissionTimer->setContextPointer(this);
   requestRetransmissionTimer->setName("AnsaOspf6::Neighbor::NeighborRequestRetransmissionTimer");

   memset(&lastReceivedDDPacket, 0, sizeof(AnsaOspf6::Neighbor::DDPacketID));
   // setting only I and M bits is invalid -> good initializer
   lastReceivedDDPacket.ddOptions.I_Init = true;
   lastReceivedDDPacket.ddOptions.M_More = true;
   */

   state = new AnsaOspf6::NeighborStateDown;
   previousState = NULL;
}
AnsaOspf6::Neighbor::~Neighbor ( void  ) [virtual]

Definition at line 74 of file ansaOspfNeighbor6.cc.

                                {
   Reset();
   MessageHandler* messageHandler = parentInterface->GetArea()->GetRouter()->GetMessageHandler();

   if (inactivityTimer != NULL){
      messageHandler->ClearTimer(inactivityTimer);
      delete inactivityTimer;
   }

   if (pollTimer != NULL){
      messageHandler->ClearTimer(pollTimer);
      delete pollTimer;
   }

   /*
   delete ddRetransmissionTimer;
   delete updateRetransmissionTimer;
   delete requestRetransmissionTimer;
   */

   if (previousState != NULL) {
      delete previousState;
   }
   delete state;
}

Member Function Documentation

If the LSA is already on the retransmission list then it is replaced, else a copy of the LSA is added to the end of the retransmission list.

Parameters:
lsa[in] The LSA to be added.

Definition at line 397 of file ansaOspfNeighbor6.cc.

                                                             {
   std::list<OspfLsa6*>::iterator it;
   for (it = linkStateRetransmissionList.begin(); it != linkStateRetransmissionList.end(); it++){
      if (  ((*it)->getHeader().getLinkStateID() == lsa->getHeader().getLinkStateID())
         && ((*it)->getHeader().getAdvertisingRouter() == lsa->getHeader().getAdvertisingRouter())){
         break;
      }
   }

   OspfLsa6* lsaCopy = NULL;
   switch (lsa->getHeader().getLsType()){
      case RouterLsaType:
         lsaCopy = new OspfRouterLsa6(*(check_and_cast<OspfRouterLsa6*> (lsa)));
         break;
      case NetworkLsaType:
         lsaCopy = new OspfNetworkLsa6(*(check_and_cast<OspfNetworkLsa6*> (lsa)));
         break;
      case InterAreaPrefixLsaType:
         lsaCopy = new OspfInterAreaPrefixLsa6(*(check_and_cast<OspfInterAreaPrefixLsa6*> (lsa)));
         break;
      case InterAreaRouterLsaType:
         lsaCopy = new OspfInterAreaRouterLsa6(*(check_and_cast<OspfInterAreaRouterLsa6*> (lsa)));
         break;
      case AsExternalLsaType:
         lsaCopy = new OspfAsExternalLsa6(*(check_and_cast<OspfAsExternalLsa6*> (lsa)));
         break;
      // TODO ?? patøí to sem
      case LinkLsaType:
         lsaCopy = new OspfLinkLsa6(*(check_and_cast<OspfLinkLsa6*> (lsa)));
         break;
      case IntraAreaPrefixLsaType:
         lsaCopy = new OspfIntraAreaPrefixLsa6(*(check_and_cast<OspfIntraAreaPrefixLsa6*> (lsa)));
         break;
      default:
         ASSERT(false); // error
         break;
   }

   if (it != linkStateRetransmissionList.end()){
      delete (*it);
      *it = static_cast<OspfLsa6*> (lsaCopy);
   }else{
      linkStateRetransmissionList.push_back(static_cast<OspfLsa6*> (lsaCopy));
   }
}

Definition at line 550 of file ansaOspfNeighbor6.cc.

Referenced by AnsaOspf6::Interface::FloodLSA().

                                                                           {
   TransmittedLSA transmit;

   transmit.lsaKey = lsaKey;
   transmit.age = 0;

   transmittedLSAs.push_back(transmit);
}

Definition at line 570 of file ansaOspfNeighbor6.cc.

                                                  {
   std::list<TransmittedLSA>::iterator it = transmittedLSAs.begin();
   while ((it != transmittedLSAs.end()) && (it->age == MIN_LS_ARRIVAL)){
      transmittedLSAs.pop_front();
      it = transmittedLSAs.begin();
   }
   for (it = transmittedLSAs.begin(); it != transmittedLSAs.end(); it++){
      it->age++;
   }
}
void AnsaOspf6::Neighbor::ChangeState ( NeighborState newState,
NeighborState currentState 
) [private]

Definition at line 100 of file ansaOspfNeighbor6.cc.

Referenced by AnsaOspf6::NeighborState::ChangeState().

                                                                                        {
   if (previousState != NULL){
      delete previousState;
   }
   state = newState;
   previousState = currentState;
}

Definition at line 262 of file ansaOspfNeighbor6.cc.

Referenced by AnsaOspf6::NeighborStateExchangeStart::ProcessEvent().

                                                  {

   AnsaOspf6::Area* area = parentInterface->GetArea();
   unsigned long routerLSACount = area->GetRouterLSACount();

   for (unsigned long i = 0; i < routerLSACount; i++){
      if (area->GetRouterLSA(i)->getHeader().getLsAge() < MAX_AGE){
         OspfLsaHeader6* routerLSA = new OspfLsaHeader6(area->GetRouterLSA(i)->getHeader());
         databaseSummaryList.push_back(routerLSA);
      }
   }

   unsigned long networkLSACount = area->GetNetworkLSACount();
   for (unsigned long j = 0; j < networkLSACount; j++){
      if (area->GetNetworkLSA(j)->getHeader().getLsAge() < MAX_AGE){
         OspfLsaHeader6* networkLSA = new OspfLsaHeader6(area->GetNetworkLSA(j)->getHeader());
         databaseSummaryList.push_back(networkLSA);
      }
   }

   unsigned long interAreaPrefixLSACount = area->GetInterAreaPrefixLSACount();
   for (unsigned long j = 0; j < interAreaPrefixLSACount; j++){
      if (area->GetInterAreaPrefixLSA(j)->getHeader().getLsAge() < MAX_AGE){
         OspfLsaHeader6* interAreaPrefixLSA = new OspfLsaHeader6(area->GetInterAreaPrefixLSA(j)->getHeader());
         databaseSummaryList.push_back(interAreaPrefixLSA);
      }
   }

   unsigned long interAreaRouterLSACount = area->GetInterAreaRouterLSACount();
   for (unsigned long j = 0; j < interAreaRouterLSACount; j++){
      if (area->GetInterAreaRouterLSA(j)->getHeader().getLsAge() < MAX_AGE){
         OspfLsaHeader6* interAreaRouterLSA = new OspfLsaHeader6(area->GetInterAreaRouterLSA(j)->getHeader());
         databaseSummaryList.push_back(interAreaRouterLSA);
      }
   }

   /* TODO: link lsa?
   unsigned long networkLSACount = area->GetNetworkLSACount();
   for (unsigned long j = 0; j < networkLSACount; j++){
      if (area->GetNetworkLSA(j)->getHeader().getLsAge() < MAX_AGE){
         OspfLsaHeader6* networkLSA = new OspfLsaHeader6(area->GetNetworkLSA(j)->getHeader());
         databaseSummaryList.push_back(networkLSA);
      }
   }
   */

   if (  (parentInterface->GetType() != AnsaOspf6::Interface::Virtual)
      && (area->GetExternalRoutingCapability())){
      AnsaOspf6::Router* router = area->GetRouter();
      unsigned long asExternalLSACount = router->GetASExternalLSACount();

      for (unsigned long m = 0; m < asExternalLSACount; m++){
         if (router->GetASExternalLSA(m)->getHeader().getLsAge() < MAX_AGE){
            OspfLsaHeader6* asExternalLSA = new OspfLsaHeader6(router->GetASExternalLSA(m)->getHeader());
            databaseSummaryList.push_back(asExternalLSA);
         }
      }
   }

   unsigned long intraAreaPrefixLSACount = area->GetIntraAreaPrefixLSACount();
   for (unsigned long j = 0; j < intraAreaPrefixLSACount; j++){
      if (area->GetIntraAreaPrefixLSA(j)->getHeader().getLsAge() < MAX_AGE){
         OspfLsaHeader6* intraAreaPrefixLSA = new OspfLsaHeader6(area->GetIntraAreaPrefixLSA(j)->getHeader());
         databaseSummaryList.push_back(intraAreaPrefixLSA);
      }
   }
}
bool AnsaOspf6::Neighbor::DesignatedRoutersAreSetUp ( void  ) const [inline]

Definition at line 183 of file ansaOspfNeighbor6.h.

Definition at line 526 of file ansaOspfNeighbor6.cc.

                                                                                {
   for (std::list<OspfLsaHeader6*>::iterator it = linkStateRequestList.begin(); it
         != linkStateRequestList.end(); it++){
      if (((*it)->getLinkStateID() == lsaKey.linkStateID)
            && ((*it)->getAdvertisingRouter() == lsaKey.advertisingRouter)){
         return (*it);
      }
   }
   return NULL;
}

Definition at line 468 of file ansaOspfNeighbor6.cc.

Referenced by AnsaOspf6::LinkStateAcknowledgementHandler::ProcessPacket().

                                                                                 {
   for (std::list<OspfLsa6*>::iterator it = linkStateRetransmissionList.begin(); it
         != linkStateRetransmissionList.end(); it++){
      if (((*it)->getHeader().getLinkStateID() == lsaKey.linkStateID)
            && ((*it)->getHeader().getAdvertisingRouter() == lsaKey.advertisingRouter)){
         return (*it);
      }
   }
   return NULL;
}
unsigned long AnsaOspf6::Neighbor::GetDatabaseSummaryListCount ( void  ) const [inline]

Definition at line 185 of file ansaOspfNeighbor6.h.

Referenced by AnsaOspf6::DatabaseDescriptionHandler::ProcessDDPacket().

{ return databaseSummaryList.size(); }
unsigned long AnsaOspf6::Neighbor::GetDDSequenceNumber ( void  ) const [inline]
const Interface* AnsaOspf6::Neighbor::GetInterface ( void  ) const [inline]

Definition at line 174 of file ansaOspfNeighbor6.h.

{ return parentInterface; }
OspfOptions6 AnsaOspf6::Neighbor::GetOptions ( void  ) const [inline]

Definition at line 165 of file ansaOspfNeighbor6.h.

{ return neighborOptions; }
const char * AnsaOspf6::Neighbor::GetStateString ( NeighborStateType  stateType) [static]

Definition at line 155 of file ansaOspfNeighbor6.cc.

Referenced by operator<<(), and AnsaOspf6::MessageHandler::PrintEvent().

                                                                                          {
   switch (stateType){
      case DownState:
         return "Down";
      case AttemptState:
         return "Attempt";
      case InitState:
         return "Init";
      case TwoWayState:
         return "TwoWay";
      case ExchangeStartState:
         return "ExchangeStart";
      case ExchangeState:
         return "Exchange";
      case LoadingState:
         return "Loading";
      case FullState:
         return "Full";
      default:
         ASSERT(false);
   }
   return "";
}
unsigned long AnsaOspf6::Neighbor::GetUniqueULong ( void  )

Definition at line 147 of file ansaOspfNeighbor6.cc.

                                                    {
   return (ddSequenceNumberInitSeed++);
}

Definition at line 514 of file ansaOspfNeighbor6.cc.

Referenced by AnsaOspf6::LinkStateUpdateHandler::ProcessPacket().

                                                                            {
   for (std::list<OspfLsaHeader6*>::const_iterator it = linkStateRequestList.begin(); it
         != linkStateRequestList.end(); it++){
      const OspfLsaHeader6* lsaHeader = *it;
      if ((lsaHeader->getLinkStateID() == lsaKey.linkStateID)
            && (lsaHeader->getAdvertisingRouter() == lsaKey.advertisingRouter)){
         return true;
      }
   }
   return false;
}

Definition at line 456 of file ansaOspfNeighbor6.cc.

Referenced by AnsaOspf6::LinkStateUpdateHandler::ProcessPacket().

                                                                                   {
   for (std::list<OspfLsa6*>::const_iterator it = linkStateRetransmissionList.begin(); it
         != linkStateRetransmissionList.end(); it++){
      const OspfLsa6* lsa = *it;
      if ((lsa->getHeader().getLinkStateID() == lsaKey.linkStateID)
            && (lsa->getHeader().getAdvertisingRouter() == lsaKey.advertisingRouter)){
         return true;
      }
   }
   return false;
}

Definition at line 559 of file ansaOspfNeighbor6.cc.

Referenced by AnsaOspf6::LinkStateUpdateHandler::ProcessPacket().

                                                                                {
   for (std::list<TransmittedLSA>::const_iterator it = transmittedLSAs.begin(); it
         != transmittedLSAs.end(); it++){
      if ((it->lsaKey.linkStateID == lsaKey.linkStateID) && (it->lsaKey.advertisingRouter
            == lsaKey.advertisingRouter)){
         return true;
      }
   }
   return false;
}

Definition at line 367 of file ansaOspfNeighbor6.cc.

Referenced by AnsaOspf6::NeighborStateExchange::ProcessEvent(), AnsaOspf6::NeighborStateTwoWay::ProcessEvent(), AnsaOspf6::NeighborStateLoading::ProcessEvent(), AnsaOspf6::NeighborStateInit::ProcessEvent(), AnsaOspf6::NeighborStateFull::ProcessEvent(), and AnsaOspf6::NeighborStateExchangeStart::ProcessEvent().

                                          {

   /* TODO:
   AnsaOspf6::Interface::OspfInterfaceType interfaceType = parentInterface->GetType();
   AnsaOspf6::RouterID routerID = parentInterface->GetArea()->GetRouter()->GetRouterID();
   AnsaOspf6::DesignatedRouterID dRouter = parentInterface->GetDesignatedRouter();
   AnsaOspf6::DesignatedRouterID backupDRouter = parentInterface->GetBackupDesignatedRouter();

   if (  (interfaceType == AnsaOspf6::Interface::PointToPoint)
      || (interfaceType == AnsaOspf6::Interface::PointToMultiPoint)
      || (interfaceType == AnsaOspf6::Interface::Virtual)
      || (dRouter == routerID)
      || (backupDRouter == routerID)
      || ((neighborsDesignatedRouter == dRouter) || (!designatedRoutersSetUp))
      || (neighborsBackupDesignatedRouter == backupDRouter)
      || (!designatedRoutersSetUp)){
      return true;
   }else{
      return false;
   }
   */

   return false;
}

Definition at line 190 of file ansaOspfNeighbor6.h.

{ linkStateRequestList.pop_front(); }

Definition at line 496 of file ansaOspfNeighbor6.cc.

                                                                         {
   std::list<OspfLsaHeader6*>::iterator it = linkStateRequestList.begin();
   while (it != linkStateRequestList.end()){
      if (((*it)->getLinkStateID() == lsaKey.linkStateID)
            && ((*it)->getAdvertisingRouter() == lsaKey.advertisingRouter)){
         delete (*it);
         it = linkStateRequestList.erase(it);
      }else{
         it++;
      }
   }

   if ((GetState() == AnsaOspf6::Neighbor::LoadingState) && (linkStateRequestList.empty())){
      ClearRequestRetransmissionTimer();
      ProcessEvent(AnsaOspf6::Neighbor::LoadingDone);
   }
}

Definition at line 443 of file ansaOspfNeighbor6.cc.

Referenced by AnsaOspf6::LinkStateAcknowledgementHandler::ProcessPacket(), and AnsaOspf6::LinkStateUpdateHandler::ProcessPacket().

                                                                                {
   std::list<OspfLsa6*>::iterator it = linkStateRetransmissionList.begin();
   while (it != linkStateRetransmissionList.end()){
      if (((*it)->getHeader().getLinkStateID() == lsaKey.linkStateID)
            && ((*it)->getHeader().getAdvertisingRouter() == lsaKey.advertisingRouter)){
         delete (*it);
         it = linkStateRetransmissionList.erase(it);
      }else{
         it++;
      }
   }
}
void AnsaOspf6::Neighbor::Reset ( void  )

Definition at line 112 of file ansaOspfNeighbor6.cc.

Referenced by AnsaOspf6::NeighborStateAttempt::ProcessEvent(), AnsaOspf6::NeighborStateTwoWay::ProcessEvent(), AnsaOspf6::NeighborStateLoading::ProcessEvent(), AnsaOspf6::NeighborStateInit::ProcessEvent(), AnsaOspf6::NeighborStateFull::ProcessEvent(), AnsaOspf6::NeighborStateExchangeStart::ProcessEvent(), and AnsaOspf6::NeighborStateExchange::ProcessEvent().

                                  {

   /* TODO:
   for (std::list<OspfLsa6*>::iterator retIt = linkStateRetransmissionList.begin(); retIt
         != linkStateRetransmissionList.end(); retIt++){
      delete (*retIt);
   }
   linkStateRetransmissionList.clear();

   std::list<OspfLsaHeader6*>::iterator it;
   for (it = databaseSummaryList.begin(); it != databaseSummaryList.end(); it++){
      delete (*it);
   }
   databaseSummaryList.clear();
   for (it = linkStateRequestList.begin(); it != linkStateRequestList.end(); it++){
      delete (*it);
   }
   linkStateRequestList.clear();

   parentInterface->GetArea()->GetRouter()->GetMessageHandler()->ClearTimer(ddRetransmissionTimer);
   ClearUpdateRetransmissionTimer();
   ClearRequestRetransmissionTimer();

   if (lastTransmittedDDPacket != NULL){
      delete lastTransmittedDDPacket;
      lastTransmittedDDPacket = NULL;
   }
   */
}

Definition at line 581 of file ansaOspfNeighbor6.cc.

Referenced by AnsaOspf6::NeighborStateExchange::ProcessEvent(), AnsaOspf6::NeighborStateLoading::ProcessEvent(), and AnsaOspf6::NeighborStateFull::ProcessEvent().

                                                   {
   OspfLinkStateUpdatePacket6* updatePacket = new OspfLinkStateUpdatePacket6;

   updatePacket->setType(LinkStateUpdatePacket);
   updatePacket->setRouterID(parentInterface->GetArea()->GetRouter()->GetRouterID());
   updatePacket->setAreaID(parentInterface->GetArea()->GetAreaID());

   bool packetFull = false;
   unsigned short lsaCount = 0;
   std::list<OspfLsa6*>::iterator it = linkStateRetransmissionList.begin();

   while (!packetFull && (it != linkStateRetransmissionList.end())){
      LsaType6 lsaType = static_cast<LsaType6> ((*it)->getHeader().getLsType());
      OspfRouterLsa6* routerLSA = (lsaType == RouterLsaType) ? dynamic_cast<OspfRouterLsa6*> (*it) : NULL;
      OspfNetworkLsa6* networkLSA = (lsaType == NetworkLsaType) ? dynamic_cast<OspfNetworkLsa6*> (*it) : NULL;
      OspfInterAreaPrefixLsa6* interAreaPrefixLSA = (lsaType = InterAreaPrefixLsaType) ? dynamic_cast<OspfInterAreaPrefixLsa6*> (*it) : NULL;
      OspfInterAreaRouterLsa6* interAreaRouterLSA = (lsaType = InterAreaRouterLsaType) ? dynamic_cast<OspfInterAreaRouterLsa6*> (*it) : NULL;
      OspfAsExternalLsa6* asExternalLSA = (lsaType == AsExternalLsaType) ? dynamic_cast<OspfAsExternalLsa6*> (*it) : NULL;
      OspfLinkLsa6* linkLSA = (lsaType == LinkLsaType) ?  dynamic_cast<OspfLinkLsa6*> (*it) : NULL;
      OspfIntraAreaPrefixLsa6* intraAreaPrefixLSA = (lsaType = IntraAreaPrefixLsaType) ?  dynamic_cast<OspfIntraAreaPrefixLsa6*> (*it) : NULL;

      long lsaSize = 0;
      bool includeLSA = true;
      lsaCount++;

      if (includeLSA){
         switch (lsaType){
            case RouterLsaType:
               if (routerLSA != NULL){
                  unsigned int routerLSACount = updatePacket->getRouterLsasArraySize();

                  updatePacket->setRouterLsasArraySize(routerLSACount + 1);
                  updatePacket->setRouterLsas(routerLSACount, *routerLSA);

                  unsigned short lsAge = updatePacket->getRouterLsas(routerLSACount).getHeader().getLsAge();
                  if (lsAge < MAX_AGE - parentInterface->GetTransmissionDelay()){
                     updatePacket->getRouterLsas(routerLSACount).getHeader().setLsAge(lsAge + parentInterface->GetTransmissionDelay());
                  }else{
                     updatePacket->getRouterLsas(routerLSACount).getHeader().setLsAge(MAX_AGE);
                  }
               }
               break;
            case NetworkLsaType:
               if (networkLSA != NULL){
                  unsigned int networkLSACount = updatePacket->getNetworkLsasArraySize();

                  updatePacket->setNetworkLsasArraySize(networkLSACount + 1);
                  updatePacket->setNetworkLsas(networkLSACount, *networkLSA);

                  unsigned short lsAge = updatePacket->getNetworkLsas(networkLSACount).getHeader().getLsAge();
                  if (lsAge < MAX_AGE - parentInterface->GetTransmissionDelay()){
                     updatePacket->getNetworkLsas(networkLSACount).getHeader().setLsAge(lsAge + parentInterface->GetTransmissionDelay());
                  }else{
                     updatePacket->getNetworkLsas(networkLSACount).getHeader().setLsAge(MAX_AGE);
                  }
               }
               break;
            case InterAreaPrefixLsaType:
               if (interAreaPrefixLSA != NULL){
                  unsigned int interAreaPrefixLSACount = updatePacket->getInterAreaPrefixLsasArraySize();

                  updatePacket->setInterAreaPrefixLsasArraySize(interAreaPrefixLSACount + 1);
                  updatePacket->setInterAreaPrefixLsas(interAreaPrefixLSACount, *interAreaPrefixLSA);

                  unsigned short lsAge = updatePacket->getInterAreaPrefixLsas(interAreaPrefixLSACount).getHeader().getLsAge();
                  if (lsAge < MAX_AGE - parentInterface->GetTransmissionDelay()){
                     updatePacket->getInterAreaPrefixLsas(interAreaPrefixLSACount).getHeader().setLsAge(lsAge + parentInterface->GetTransmissionDelay());
                  }else{
                     updatePacket->getInterAreaPrefixLsas(interAreaPrefixLSACount).getHeader().setLsAge(MAX_AGE);
                  }
               }
               break;
            case InterAreaRouterLsaType:
               if (interAreaRouterLSA != NULL){
                  unsigned int interAreaRouterLSACount = updatePacket->getInterAreaRouterLsasArraySize();

                  updatePacket->setInterAreaRouterLsasArraySize(interAreaRouterLSACount + 1);
                  updatePacket->setInterAreaRouterLsas(interAreaRouterLSACount, *interAreaRouterLSA);

                  unsigned short lsAge = updatePacket->getInterAreaRouterLsas(interAreaRouterLSACount).getHeader().getLsAge();
                  if (lsAge < MAX_AGE - parentInterface->GetTransmissionDelay()){
                     updatePacket->getInterAreaRouterLsas(interAreaRouterLSACount).getHeader().setLsAge(lsAge + parentInterface->GetTransmissionDelay());
                  }else{
                     updatePacket->getInterAreaRouterLsas(interAreaRouterLSACount).getHeader().setLsAge(MAX_AGE);
                  }
               }
               break;
            case AsExternalLsaType:
               if (asExternalLSA != NULL){
                  unsigned int asExternalLSACount = updatePacket->getAsExternalLsasArraySize();

                  updatePacket->setAsExternalLsasArraySize(asExternalLSACount + 1);
                  updatePacket->setAsExternalLsas(asExternalLSACount, *asExternalLSA);

                  unsigned short lsAge =
                        updatePacket->getAsExternalLsas(asExternalLSACount).getHeader().getLsAge();
                  if (lsAge < MAX_AGE - parentInterface->GetTransmissionDelay()){
                     updatePacket->getAsExternalLsas(asExternalLSACount).getHeader().setLsAge(lsAge
                           + parentInterface->GetTransmissionDelay());
                  }else{
                     updatePacket->getAsExternalLsas(asExternalLSACount).getHeader().setLsAge(
                           MAX_AGE);
                  }
               }
               break;
            case LinkLsaType:
               if (linkLSA != NULL){
                  unsigned int linkLSACount = updatePacket->getLinkLsasArraySize();

                  updatePacket->setLinkLsasArraySize(linkLSACount + 1);
                  updatePacket->setLinkLsas(linkLSACount, *linkLSA);

                  unsigned short lsAge = updatePacket->getLinkLsas(linkLSACount).getHeader().getLsAge();
                  if (lsAge < MAX_AGE - parentInterface->GetTransmissionDelay()){
                     updatePacket->getLinkLsas(linkLSACount).getHeader().setLsAge(lsAge + parentInterface->GetTransmissionDelay());
                  }else{
                     updatePacket->getLinkLsas(linkLSACount).getHeader().setLsAge(MAX_AGE);
                  }
               }
               break;
            case IntraAreaPrefixLsaType:
               if (intraAreaPrefixLSA != NULL){
                  unsigned int intraAreaPrefixLSACount = updatePacket->getIntraAreaPrefixLsasArraySize();

                  updatePacket->setIntraAreaPrefixLsasArraySize(intraAreaPrefixLSACount + 1);
                  updatePacket->setIntraAreaPrefixLsas(intraAreaPrefixLSACount, *intraAreaPrefixLSA);

                  unsigned short lsAge = updatePacket->getIntraAreaPrefixLsas(intraAreaPrefixLSACount).getHeader().getLsAge();
                  if (lsAge < MAX_AGE - parentInterface->GetTransmissionDelay()){
                     updatePacket->getIntraAreaPrefixLsas(intraAreaPrefixLSACount).getHeader().setLsAge(lsAge + parentInterface->GetTransmissionDelay());
                  }else{
                     updatePacket->getIntraAreaPrefixLsas(intraAreaPrefixLSACount).getHeader().setLsAge(MAX_AGE);
                  }
               }
               break;
            default:
               break;
         }
      }

      it++;
   }

   AnsaOspf6::MessageHandler* messageHandler = parentInterface->GetArea()->GetRouter()->GetMessageHandler();
   int ttl = (parentInterface->GetType() == AnsaOspf6::Interface::Virtual) ? VIRTUAL_LINK_TTL : 1;
   messageHandler->SendPacket(updatePacket, neighborIPAddress, parentInterface->GetIfIndex(), ttl);
}

Definition at line 179 of file ansaOspfNeighbor6.cc.

Referenced by AnsaOspf6::DatabaseDescriptionHandler::ProcessDDPacket(), AnsaOspf6::NeighborStateExchangeStart::ProcessEvent(), AnsaOspf6::NeighborStateLoading::ProcessEvent(), AnsaOspf6::NeighborStateInit::ProcessEvent(), AnsaOspf6::NeighborStateFull::ProcessEvent(), AnsaOspf6::NeighborStateTwoWay::ProcessEvent(), AnsaOspf6::NeighborStateExchange::ProcessEvent(), and AnsaOspf6::DatabaseDescriptionHandler::ProcessPacket().

                                                               {
   OspfDatabaseDescriptionPacket6* ddPacket = new OspfDatabaseDescriptionPacket6;

   ddPacket->setType(DatabaseDescriptionPacket);
   ddPacket->setRouterID(parentInterface->GetArea()->GetRouter()->GetRouterID());
   ddPacket->setAreaID(parentInterface->GetArea()->GetAreaID());

   if (parentInterface->GetType() != AnsaOspf6::Interface::Virtual){
      ddPacket->setInterfaceMtu(parentInterface->GetMtu());
   }else{
      ddPacket->setInterfaceMtu(0);
   }

   OspfOptions6 options;
   memset(&options, 0, sizeof(OspfOptions6));
   options.E_ExternalRoutingCapability = parentInterface->GetArea()->GetExternalRoutingCapability();
   ddPacket->setOptions(options);

   ddPacket->setDdSequenceNumber(ddSequenceNumber);

   if (init || databaseSummaryList.empty()){
      ddPacket->setLsaHeadersArraySize(0);
   }else{
      // delete included LSAs from summary list
      // (they are still in lastTransmittedDDPacket)
      while (!databaseSummaryList.empty()){
         unsigned long headerCount = ddPacket->getLsaHeadersArraySize();
         OspfLsaHeader6* lsaHeader = *(databaseSummaryList.begin());
         ddPacket->setLsaHeadersArraySize(headerCount + 1);
         ddPacket->setLsaHeaders(headerCount, *lsaHeader);
         delete lsaHeader;
         databaseSummaryList.pop_front();
      }
   }

   OspfDdOptions6 ddOptions;
   memset(&ddOptions, 0, sizeof(OspfDdOptions6));
   if (init){
      ddOptions.I_Init = true;
      ddOptions.M_More = true;
      ddOptions.MS_MasterSlave = true;
   }else{
      ddOptions.I_Init = false;
      ddOptions.M_More = (databaseSummaryList.empty()) ? false : true;
      ddOptions.MS_MasterSlave = (databaseExchangeRelationship == AnsaOspf6::Neighbor::Master) ? true : false;
   }
   ddPacket->setDdOptions(ddOptions);

   AnsaOspf6::MessageHandler* messageHandler = parentInterface->GetArea()->GetRouter()->GetMessageHandler();
   int ttl = (parentInterface->GetType() == AnsaOspf6::Interface::Virtual) ? VIRTUAL_LINK_TTL : 1;
   if (parentInterface->GetType() == AnsaOspf6::Interface::PointToPoint){
      messageHandler->SendPacket(ddPacket, AnsaOspf6::AllSPFRouters, parentInterface->GetIfIndex(), ttl);
   }else{
      messageHandler->SendPacket(ddPacket, neighborIPAddress, parentInterface->GetIfIndex(), ttl);
   }

   if (lastTransmittedDDPacket != NULL){
      delete lastTransmittedDDPacket;
   }
   lastTransmittedDDPacket = new OspfDatabaseDescriptionPacket6(*ddPacket);
}

Definition at line 330 of file ansaOspfNeighbor6.cc.

Referenced by AnsaOspf6::NeighborStateExchange::ProcessEvent(), AnsaOspf6::NeighborStateLoading::ProcessEvent(), and AnsaOspf6::DatabaseDescriptionHandler::ProcessPacket().

                                                       {
   OspfLinkStateRequestPacket6* requestPacket = new OspfLinkStateRequestPacket6;

   requestPacket->setType(LinkStateRequestPacket);
   requestPacket->setRouterID(parentInterface->GetArea()->GetRouter()->GetRouterID());
   requestPacket->setAreaID(parentInterface->GetArea()->GetAreaID());

   if (linkStateRequestList.empty()){
      requestPacket->setRequestsArraySize(0);
   }else{
      std::list<OspfLsaHeader6*>::iterator it = linkStateRequestList.begin();

      while (it != linkStateRequestList.end()){
         unsigned long requestCount = requestPacket->getRequestsArraySize();
         OspfLsaHeader6* requestHeader = (*it);
         OspfLsaRequest6 request;

         request.lsType = requestHeader->getLsType();
         request.linkStateID = requestHeader->getLinkStateID();
         request.advertisingRouter = requestHeader->getAdvertisingRouter();

         requestPacket->setRequestsArraySize(requestCount + 1);
         requestPacket->setRequests(requestCount, request);

         it++;
      }
   }

   AnsaOspf6::MessageHandler* messageHandler = parentInterface->GetArea()->GetRouter()->GetMessageHandler();
   int ttl = (parentInterface->GetType() == AnsaOspf6::Interface::Virtual) ? VIRTUAL_LINK_TTL : 1;
   if (parentInterface->GetType() == AnsaOspf6::Interface::PointToPoint){
      messageHandler->SendPacket(requestPacket, AnsaOspf6::AllSPFRouters, parentInterface->GetIfIndex(), ttl);
   }else{
      messageHandler->SendPacket(requestPacket, neighborIPAddress, parentInterface->GetIfIndex(), ttl);
   }
}
void AnsaOspf6::Neighbor::SetAddress ( IPv6Address  address) [inline]

Definition at line 154 of file ansaOspfNeighbor6.h.

Referenced by AnsaOspf6::HelloHandler::ProcessPacket().

{ neighborIPAddress = address; }
void AnsaOspf6::Neighbor::SetInterface ( Interface intf) [inline]

Definition at line 172 of file ansaOspfNeighbor6.h.

Referenced by AnsaOspf6::Interface::AddNeighbor().

{ parentInterface = intf; }

Definition at line 150 of file ansaOspfNeighbor6.h.

{ neighborID = id; }
void AnsaOspf6::Neighbor::SetOptions ( OspfOptions6  options) [inline]

Definition at line 164 of file ansaOspfNeighbor6.h.

Referenced by AnsaOspf6::DatabaseDescriptionHandler::ProcessPacket().

{ neighborOptions = options; }
void AnsaOspf6::Neighbor::SetPriority ( unsigned char  priority) [inline]

Definition at line 152 of file ansaOspfNeighbor6.h.

Referenced by AnsaOspf6::HelloHandler::ProcessPacket().

{ neighborPriority = priority; }
void AnsaOspf6::Neighbor::SetRouterDeadInterval ( short  interval) [inline]

Definition at line 160 of file ansaOspfNeighbor6.h.

Referenced by AnsaOspf6::HelloHandler::ProcessPacket().

void AnsaOspf6::Neighbor::SetUpDesignatedRouters ( bool  setUp) [inline]

Definition at line 184 of file ansaOspfNeighbor6.h.


Friends And Related Function Documentation

friend class NeighborState [friend]

Definition at line 31 of file ansaOspfNeighbor6.h.


Member Data Documentation

Definition at line 104 of file ansaOspfNeighbor6.h.

Referenced by GetDatabaseSummaryListCount().

unsigned long AnsaOspf6::Neighbor::ddSequenceNumberInitSeed = 0 [static, private]

Definition at line 112 of file ansaOspfNeighbor6.h.

Definition at line 92 of file ansaOspfNeighbor6.h.

Referenced by IsFirstAdjacencyInited().

Definition at line 84 of file ansaOspfNeighbor6.h.

Referenced by GetInactivityTimer(), and Neighbor().

Definition at line 95 of file ansaOspfNeighbor6.h.

Referenced by GetNeighborID(), and SetNeighborID().

Definition at line 97 of file ansaOspfNeighbor6.h.

Referenced by GetAddress(), and SetAddress().

Definition at line 98 of file ansaOspfNeighbor6.h.

Referenced by GetOptions(), and SetOptions().

unsigned char AnsaOspf6::Neighbor::neighborPriority [private]

Definition at line 96 of file ansaOspfNeighbor6.h.

Referenced by GetPriority(), and SetPriority().

Definition at line 109 of file ansaOspfNeighbor6.h.

Referenced by GetInterface(), and SetInterface().

Definition at line 85 of file ansaOspfNeighbor6.h.

Referenced by GetPollTimer(), and Neighbor().

Definition at line 83 of file ansaOspfNeighbor6.h.

Referenced by Neighbor().

Definition at line 82 of file ansaOspfNeighbor6.h.

Referenced by Neighbor().

Definition at line 106 of file ansaOspfNeighbor6.h.


The documentation for this class was generated from the following files: