|
INET Framework for OMNeT++/OMNEST
|
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 }