INET Framework for OMNeT++/OMNEST
AnsaOSPFNeighborStateExchange.cc
Go to the documentation of this file.
00001 #include "AnsaOSPFNeighborStateExchange.h"
00002 #include "AnsaOSPFNeighborStateDown.h"
00003 #include "AnsaOSPFNeighborStateInit.h"
00004 #include "AnsaOSPFNeighborStateTwoWay.h"
00005 #include "AnsaOSPFNeighborStateExchangeStart.h"
00006 #include "AnsaOSPFNeighborStateFull.h"
00007 #include "AnsaOSPFNeighborStateLoading.h"
00008 #include "AnsaMessageHandler.h"
00009 #include "AnsaOSPFInterface.h"
00010 #include "AnsaOSPFArea.h"
00011 #include "AnsaOSPFRouter.h"
00012 
00013 void AnsaOSPF::NeighborStateExchange::ProcessEvent(AnsaOSPF::Neighbor* neighbor, AnsaOSPF::Neighbor::NeighborEventType event)
00014 {
00015     if ((event == AnsaOSPF::Neighbor::KillNeighbor) || (event == AnsaOSPF::Neighbor::LinkDown)) {
00016         MessageHandler* messageHandler = neighbor->GetInterface()->GetArea()->GetRouter()->GetMessageHandler();
00017         neighbor->Reset();
00018         messageHandler->ClearTimer(neighbor->GetInactivityTimer());
00019         ChangeState(neighbor, new AnsaOSPF::NeighborStateDown, this);
00020     }
00021     if (event == AnsaOSPF::Neighbor::InactivityTimer) {
00022         neighbor->Reset();
00023         if (neighbor->GetInterface()->GetType() == AnsaOSPF::Interface::NBMA) {
00024             MessageHandler* messageHandler = neighbor->GetInterface()->GetArea()->GetRouter()->GetMessageHandler();
00025             messageHandler->StartTimer(neighbor->GetPollTimer(), neighbor->GetInterface()->GetPollInterval());
00026         }
00027         ChangeState(neighbor, new AnsaOSPF::NeighborStateDown, this);
00028     }
00029     if (event == AnsaOSPF::Neighbor::OneWayReceived) {
00030         neighbor->Reset();
00031         ChangeState(neighbor, new AnsaOSPF::NeighborStateInit, this);
00032     }
00033     if (event == AnsaOSPF::Neighbor::HelloReceived) {
00034         MessageHandler* messageHandler = neighbor->GetInterface()->GetArea()->GetRouter()->GetMessageHandler();
00035         messageHandler->ClearTimer(neighbor->GetInactivityTimer());
00036         messageHandler->StartTimer(neighbor->GetInactivityTimer(), neighbor->GetRouterDeadInterval());
00037     }
00038     if (event == AnsaOSPF::Neighbor::IsAdjacencyOK) {
00039         if (!neighbor->NeedAdjacency()) {
00040             neighbor->Reset();
00041             ChangeState(neighbor, new AnsaOSPF::NeighborStateTwoWay, this);
00042         }
00043     }
00044     if ((event == AnsaOSPF::Neighbor::SequenceNumberMismatch) || (event == AnsaOSPF::Neighbor::BadLinkStateRequest)) {
00045         MessageHandler* messageHandler = neighbor->GetInterface()->GetArea()->GetRouter()->GetMessageHandler();
00046         neighbor->Reset();
00047         neighbor->IncrementDDSequenceNumber();
00048         neighbor->SendDatabaseDescriptionPacket(true);
00049         messageHandler->StartTimer(neighbor->GetDDRetransmissionTimer(), neighbor->GetInterface()->GetRetransmissionInterval());
00050         ChangeState(neighbor, new AnsaOSPF::NeighborStateExchangeStart, this);
00051     }
00052     if (event == AnsaOSPF::Neighbor::ExchangeDone) {
00053         if (neighbor->IsLinkStateRequestListEmpty()) {
00054             MessageHandler* messageHandler = neighbor->GetInterface()->GetArea()->GetRouter()->GetMessageHandler();
00055             messageHandler->StartTimer(neighbor->GetDDRetransmissionTimer(), neighbor->GetRouterDeadInterval());
00056             neighbor->ClearRequestRetransmissionTimer();
00057             ChangeState(neighbor, new AnsaOSPF::NeighborStateFull, this);
00058         } else {
00059             MessageHandler* messageHandler = neighbor->GetInterface()->GetArea()->GetRouter()->GetMessageHandler();
00060             messageHandler->StartTimer(neighbor->GetDDRetransmissionTimer(), neighbor->GetRouterDeadInterval());
00061             ChangeState(neighbor, new AnsaOSPF::NeighborStateLoading, this);
00062         }
00063     }
00064     if (event == AnsaOSPF::Neighbor::UpdateRetransmissionTimer) {
00065         neighbor->RetransmitUpdatePacket();
00066         neighbor->StartUpdateRetransmissionTimer();
00067     }
00068     if (event == AnsaOSPF::Neighbor::RequestRetransmissionTimer) {
00069         neighbor->SendLinkStateRequestPacket();
00070         neighbor->StartRequestRetransmissionTimer();
00071     }
00072 }