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