#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] |
1.7.1