INET Framework for OMNeT++/OMNEST
AnsaOSPFNeighborStateTwoWay.cc
Go to the documentation of this file.
00001 #include "AnsaOSPFNeighborStateTwoWay.h"
00002 #include "AnsaOSPFNeighborStateDown.h"
00003 #include "AnsaOSPFNeighborStateInit.h"
00004 #include "AnsaOSPFNeighborStateExchangeStart.h"
00005 #include "AnsaMessageHandler.h"
00006 #include "AnsaOSPFInterface.h"
00007 #include "AnsaOSPFArea.h"
00008 #include "AnsaOSPFRouter.h"
00009 
00010 void AnsaOSPF::NeighborStateTwoWay::ProcessEvent(AnsaOSPF::Neighbor* neighbor, AnsaOSPF::Neighbor::NeighborEventType event)
00011 {
00012     if ((event == AnsaOSPF::Neighbor::KillNeighbor) || (event == AnsaOSPF::Neighbor::LinkDown)) {
00013         MessageHandler* messageHandler = neighbor->GetInterface()->GetArea()->GetRouter()->GetMessageHandler();
00014         neighbor->Reset();
00015         messageHandler->ClearTimer(neighbor->GetInactivityTimer());
00016         ChangeState(neighbor, new AnsaOSPF::NeighborStateDown, this);
00017     }
00018     if (event == AnsaOSPF::Neighbor::InactivityTimer) {
00019         neighbor->Reset();
00020         if (neighbor->GetInterface()->GetType() == AnsaOSPF::Interface::NBMA) {
00021             MessageHandler* messageHandler = neighbor->GetInterface()->GetArea()->GetRouter()->GetMessageHandler();
00022             messageHandler->StartTimer(neighbor->GetPollTimer(), neighbor->GetInterface()->GetPollInterval());
00023         }
00024         ChangeState(neighbor, new AnsaOSPF::NeighborStateDown, this);
00025     }
00026     if (event == AnsaOSPF::Neighbor::OneWayReceived) {
00027         neighbor->Reset();
00028         ChangeState(neighbor, new AnsaOSPF::NeighborStateInit, this);
00029     }
00030     if (event == AnsaOSPF::Neighbor::HelloReceived) {
00031         MessageHandler* messageHandler = neighbor->GetInterface()->GetArea()->GetRouter()->GetMessageHandler();
00032         messageHandler->ClearTimer(neighbor->GetInactivityTimer());
00033         messageHandler->StartTimer(neighbor->GetInactivityTimer(), neighbor->GetRouterDeadInterval());
00034     }
00035     if (event == AnsaOSPF::Neighbor::IsAdjacencyOK) {
00036         if (neighbor->NeedAdjacency()) {
00037             MessageHandler* messageHandler = neighbor->GetInterface()->GetArea()->GetRouter()->GetMessageHandler();
00038             if (!(neighbor->IsFirstAdjacencyInited())) {
00039                 neighbor->InitFirstAdjacency();
00040             } else {
00041                 neighbor->IncrementDDSequenceNumber();
00042             }
00043             neighbor->SendDatabaseDescriptionPacket(true);
00044             messageHandler->StartTimer(neighbor->GetDDRetransmissionTimer(), neighbor->GetInterface()->GetRetransmissionInterval());
00045             ChangeState(neighbor, new AnsaOSPF::NeighborStateExchangeStart, this);
00046         }
00047     }
00048 }