INET Framework for OMNeT++/OMNEST
AnsaOSPFNeighborState.cc
Go to the documentation of this file.
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 }