#include <OSPFNeighborState.h>
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) |
Definition at line 25 of file OSPFNeighborState.h.
virtual OSPF::NeighborState::~NeighborState | ( | ) | [inline, virtual] |
Definition at line 30 of file OSPFNeighborState.h.
{}
void OSPF::NeighborState::ChangeState | ( | OSPF::Neighbor * | neighbor, | |
OSPF::NeighborState * | newState, | |||
OSPF::NeighborState * | currentState | |||
) | [protected] |
Definition at line 23 of file OSPFNeighborState.cc.
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().
{ OSPF::Neighbor::NeighborStateType oldState = currentState->GetState(); OSPF::Neighbor::NeighborStateType nextState = newState->GetState(); bool rebuildRoutingTable = false; neighbor->ChangeState(newState, currentState); if ((oldState == OSPF::Neighbor::FullState) || (nextState == OSPF::Neighbor::FullState)) { OSPF::RouterID routerID = neighbor->GetInterface()->GetArea()->GetRouter()->GetRouterID(); OSPF::RouterLSA* routerLSA = neighbor->GetInterface()->GetArea()->FindRouterLSA(routerID); if (routerLSA != NULL) { long sequenceNumber = routerLSA->getHeader().getLsSequenceNumber(); if (sequenceNumber == MAX_SEQUENCE_NUMBER) { routerLSA->getHeader().setLsAge(MAX_AGE); neighbor->GetInterface()->GetArea()->FloodLSA(routerLSA); routerLSA->IncrementInstallTime(); } else { OSPF::RouterLSA* newLSA = neighbor->GetInterface()->GetArea()->OriginateRouterLSA(); newLSA->getHeader().setLsSequenceNumber(sequenceNumber + 1); newLSA->getHeader().setLsChecksum(0); // TODO: calculate correct LS checksum rebuildRoutingTable |= routerLSA->Update(newLSA); delete newLSA; neighbor->GetInterface()->GetArea()->FloodLSA(routerLSA); } } if (neighbor->GetInterface()->GetState() == OSPF::Interface::DesignatedRouterState) { OSPF::NetworkLSA* networkLSA = neighbor->GetInterface()->GetArea()->FindNetworkLSA(ULongFromIPv4Address(neighbor->GetInterface()->GetAddressRange().address)); if (networkLSA != NULL) { long sequenceNumber = networkLSA->getHeader().getLsSequenceNumber(); if (sequenceNumber == MAX_SEQUENCE_NUMBER) { networkLSA->getHeader().setLsAge(MAX_AGE); neighbor->GetInterface()->GetArea()->FloodLSA(networkLSA); networkLSA->IncrementInstallTime(); } else { OSPF::NetworkLSA* newLSA = neighbor->GetInterface()->GetArea()->OriginateNetworkLSA(neighbor->GetInterface()); if (newLSA != NULL) { newLSA->getHeader().setLsSequenceNumber(sequenceNumber + 1); newLSA->getHeader().setLsChecksum(0); // TODO: calculate correct LS checksum rebuildRoutingTable |= networkLSA->Update(newLSA); delete newLSA; } else { // no neighbors on the network -> old NetworkLSA must be flushed networkLSA->getHeader().setLsAge(MAX_AGE); networkLSA->IncrementInstallTime(); } neighbor->GetInterface()->GetArea()->FloodLSA(networkLSA); } } } } if (rebuildRoutingTable) { neighbor->GetInterface()->GetArea()->GetRouter()->RebuildRoutingTable(); } }
virtual Neighbor::NeighborStateType OSPF::NeighborState::GetState | ( | void | ) | const [pure virtual] |
Implemented in OSPF::NeighborStateAttempt, OSPF::NeighborStateDown, OSPF::NeighborStateExchange, OSPF::NeighborStateExchangeStart, OSPF::NeighborStateFull, OSPF::NeighborStateInit, OSPF::NeighborStateLoading, and OSPF::NeighborStateTwoWay.
Referenced by ChangeState(), and OSPF::Neighbor::GetState().
virtual void OSPF::NeighborState::ProcessEvent | ( | Neighbor * | neighbor, | |
Neighbor::NeighborEventType | event | |||
) | [pure virtual] |