#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) |
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] |
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().