OSPF::NeighborState Class Reference

#include <OSPFNeighborState.h>

Inheritance diagram for OSPF::NeighborState:

OSPF::NeighborStateAttempt OSPF::NeighborStateDown OSPF::NeighborStateExchange OSPF::NeighborStateExchangeStart OSPF::NeighborStateFull OSPF::NeighborStateInit OSPF::NeighborStateLoading OSPF::NeighborStateTwoWay

List of all members.

Public Member Functions

virtual ~NeighborState ()
virtual void ProcessEvent (Neighbor *neighbor, Neighbor::NeighborEventType event)=0
virtual Neighbor::NeighborStateType GetState (void) const =0

Protected Member Functions

void ChangeState (Neighbor *neighbor, NeighborState *newState, NeighborState *currentState)


Constructor & Destructor Documentation

virtual OSPF::NeighborState::~NeighborState (  )  [inline, virtual]

00030 {}


Member Function Documentation

void OSPF::NeighborState::ChangeState ( OSPF::Neighbor neighbor,
OSPF::NeighborState newState,
OSPF::NeighborState currentState 
) [protected]

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

00024 {
00025 
00026     OSPF::Neighbor::NeighborStateType   oldState            = currentState->GetState();
00027     OSPF::Neighbor::NeighborStateType   nextState           = newState->GetState();
00028     bool                                rebuildRoutingTable = false;
00029 
00030     neighbor->ChangeState(newState, currentState);
00031 
00032     if ((oldState == OSPF::Neighbor::FullState) || (nextState == OSPF::Neighbor::FullState)) {
00033         OSPF::RouterID   routerID  = neighbor->GetInterface()->GetArea()->GetRouter()->GetRouterID();
00034         OSPF::RouterLSA* routerLSA = neighbor->GetInterface()->GetArea()->FindRouterLSA(routerID);
00035 
00036         if (routerLSA != NULL) {
00037             long sequenceNumber = routerLSA->getHeader().getLsSequenceNumber();
00038             if (sequenceNumber == MAX_SEQUENCE_NUMBER) {
00039                 routerLSA->getHeader().setLsAge(MAX_AGE);
00040                 neighbor->GetInterface()->GetArea()->FloodLSA(routerLSA);
00041                 routerLSA->IncrementInstallTime();
00042             } else {
00043                 OSPF::RouterLSA* newLSA = neighbor->GetInterface()->GetArea()->OriginateRouterLSA();
00044 
00045                 newLSA->getHeader().setLsSequenceNumber(sequenceNumber + 1);
00046                 newLSA->getHeader().setLsChecksum(0);    // TODO: calculate correct LS checksum
00047                 rebuildRoutingTable |= routerLSA->Update(newLSA);
00048                 delete newLSA;
00049 
00050                 neighbor->GetInterface()->GetArea()->FloodLSA(routerLSA);
00051             }
00052         }
00053 
00054         if (neighbor->GetInterface()->GetState() == OSPF::Interface::DesignatedRouterState) {
00055             OSPF::NetworkLSA* networkLSA = neighbor->GetInterface()->GetArea()->FindNetworkLSA(ULongFromIPv4Address(neighbor->GetInterface()->GetAddressRange().address));
00056 
00057             if (networkLSA != NULL) {
00058                 long sequenceNumber = networkLSA->getHeader().getLsSequenceNumber();
00059                 if (sequenceNumber == MAX_SEQUENCE_NUMBER) {
00060                     networkLSA->getHeader().setLsAge(MAX_AGE);
00061                     neighbor->GetInterface()->GetArea()->FloodLSA(networkLSA);
00062                     networkLSA->IncrementInstallTime();
00063                 } else {
00064                     OSPF::NetworkLSA* newLSA = neighbor->GetInterface()->GetArea()->OriginateNetworkLSA(neighbor->GetInterface());
00065 
00066                     if (newLSA != NULL) {
00067                         newLSA->getHeader().setLsSequenceNumber(sequenceNumber + 1);
00068                         newLSA->getHeader().setLsChecksum(0);    // TODO: calculate correct LS checksum
00069                         rebuildRoutingTable |= networkLSA->Update(newLSA);
00070                         delete newLSA;
00071                     } else {    // no neighbors on the network -> old NetworkLSA must be flushed
00072                         networkLSA->getHeader().setLsAge(MAX_AGE);
00073                         networkLSA->IncrementInstallTime();
00074                     }
00075 
00076                     neighbor->GetInterface()->GetArea()->FloodLSA(networkLSA);
00077                 }
00078             }
00079         }
00080     }
00081 
00082     if (rebuildRoutingTable) {
00083         neighbor->GetInterface()->GetArea()->GetRouter()->RebuildRoutingTable();
00084     }
00085 }

virtual void OSPF::NeighborState::ProcessEvent ( Neighbor neighbor,
Neighbor::NeighborEventType  event 
) [pure virtual]

virtual Neighbor::NeighborStateType OSPF::NeighborState::GetState ( void   )  const [pure virtual]


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

Generated on Fri Mar 20 18:51:23 2009 for INET Framework for OMNeT++/OMNEST by  doxygen 1.5.5