#include <OSPFNeighborState.h>
Inheritance diagram for OSPF::NeighborState:
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) |
|
00013 {}
|
|
00007 { 00008 00009 OSPF::Neighbor::NeighborStateType oldState = currentState->GetState (); 00010 OSPF::Neighbor::NeighborStateType nextState = newState->GetState (); 00011 bool rebuildRoutingTable = false; 00012 00013 neighbor->ChangeState (newState, currentState); 00014 00015 if ((oldState == OSPF::Neighbor::FullState) || (nextState == OSPF::Neighbor::FullState)) { 00016 OSPF::RouterID routerID = neighbor->GetInterface ()->GetArea ()->GetRouter ()->GetRouterID (); 00017 OSPF::RouterLSA* routerLSA = neighbor->GetInterface ()->GetArea ()->FindRouterLSA (routerID); 00018 00019 if (routerLSA != NULL) { 00020 long sequenceNumber = routerLSA->getHeader ().getLsSequenceNumber (); 00021 if (sequenceNumber == MAX_SEQUENCE_NUMBER) { 00022 routerLSA->getHeader ().setLsAge (MAX_AGE); 00023 neighbor->GetInterface ()->GetArea ()->FloodLSA (routerLSA); 00024 routerLSA->IncrementInstallTime (); 00025 } else { 00026 OSPF::RouterLSA* newLSA = neighbor->GetInterface ()->GetArea ()->OriginateRouterLSA (); 00027 00028 newLSA->getHeader ().setLsSequenceNumber (sequenceNumber + 1); 00029 newLSA->getHeader ().setLsChecksum (0); // TODO: calculate correct LS checksum 00030 rebuildRoutingTable |= routerLSA->Update (newLSA); 00031 delete newLSA; 00032 00033 neighbor->GetInterface ()->GetArea ()->FloodLSA (routerLSA); 00034 } 00035 } 00036 00037 if (neighbor->GetInterface ()->GetState () == OSPF::Interface::DesignatedRouterState) { 00038 OSPF::NetworkLSA* networkLSA = neighbor->GetInterface ()->GetArea ()->FindNetworkLSA (ULongFromIPv4Address (neighbor->GetInterface ()->GetAddressRange ().address)); 00039 00040 if (networkLSA != NULL) { 00041 long sequenceNumber = networkLSA->getHeader ().getLsSequenceNumber (); 00042 if (sequenceNumber == MAX_SEQUENCE_NUMBER) { 00043 networkLSA->getHeader ().setLsAge (MAX_AGE); 00044 neighbor->GetInterface ()->GetArea ()->FloodLSA (networkLSA); 00045 networkLSA->IncrementInstallTime (); 00046 } else { 00047 OSPF::NetworkLSA* newLSA = neighbor->GetInterface ()->GetArea ()->OriginateNetworkLSA (neighbor->GetInterface ()); 00048 00049 if (newLSA != NULL) { 00050 newLSA->getHeader ().setLsSequenceNumber (sequenceNumber + 1); 00051 newLSA->getHeader ().setLsChecksum (0); // TODO: calculate correct LS checksum 00052 rebuildRoutingTable |= networkLSA->Update (newLSA); 00053 delete newLSA; 00054 } else { // no neighbors on the network -> old NetworkLSA must be flushed 00055 networkLSA->getHeader ().setLsAge (MAX_AGE); 00056 networkLSA->IncrementInstallTime (); 00057 } 00058 00059 neighbor->GetInterface ()->GetArea ()->FloodLSA (networkLSA); 00060 } 00061 } 00062 } 00063 } 00064 00065 if (rebuildRoutingTable) { 00066 neighbor->GetInterface ()->GetArea ()->GetRouter ()->RebuildRoutingTable (); 00067 } 00068 }
|
|
|
|