|
INET Framework for OMNeT++/OMNEST
|
00001 // 00002 // Copyright (C) 2006 Andras Babos and Andras Varga 00003 // 00004 // This program is free software; you can redistribute it and/or 00005 // modify it under the terms of the GNU Lesser General Public License 00006 // as published by the Free Software Foundation; either version 2 00007 // of the License, or (at your option) any later version. 00008 // 00009 // This program is distributed in the hope that it will be useful, 00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00012 // GNU Lesser General Public License for more details. 00013 // 00014 // You should have received a copy of the GNU Lesser General Public License 00015 // along with this program; if not, see <http://www.gnu.org/licenses/>. 00016 // 00017 00018 #include "OSPFNeighborStateLoading.h" 00019 #include "OSPFNeighborStateDown.h" 00020 #include "OSPFNeighborStateInit.h" 00021 #include "OSPFNeighborStateFull.h" 00022 #include "OSPFNeighborStateTwoWay.h" 00023 #include "OSPFNeighborStateExchangeStart.h" 00024 #include "MessageHandler.h" 00025 #include "OSPFInterface.h" 00026 #include "OSPFArea.h" 00027 #include "OSPFRouter.h" 00028 00029 void OSPF::NeighborStateLoading::ProcessEvent(OSPF::Neighbor* neighbor, OSPF::Neighbor::NeighborEventType event) 00030 { 00031 if ((event == OSPF::Neighbor::KillNeighbor) || (event == OSPF::Neighbor::LinkDown)) { 00032 MessageHandler* messageHandler = neighbor->GetInterface()->GetArea()->GetRouter()->GetMessageHandler(); 00033 neighbor->Reset(); 00034 messageHandler->ClearTimer(neighbor->GetInactivityTimer()); 00035 ChangeState(neighbor, new OSPF::NeighborStateDown, this); 00036 } 00037 if (event == OSPF::Neighbor::InactivityTimer) { 00038 neighbor->Reset(); 00039 if (neighbor->GetInterface()->GetType() == OSPF::Interface::NBMA) { 00040 MessageHandler* messageHandler = neighbor->GetInterface()->GetArea()->GetRouter()->GetMessageHandler(); 00041 messageHandler->StartTimer(neighbor->GetPollTimer(), neighbor->GetInterface()->GetPollInterval()); 00042 } 00043 ChangeState(neighbor, new OSPF::NeighborStateDown, this); 00044 } 00045 if (event == OSPF::Neighbor::OneWayReceived) { 00046 neighbor->Reset(); 00047 ChangeState(neighbor, new OSPF::NeighborStateInit, this); 00048 } 00049 if (event == OSPF::Neighbor::HelloReceived) { 00050 MessageHandler* messageHandler = neighbor->GetInterface()->GetArea()->GetRouter()->GetMessageHandler(); 00051 messageHandler->ClearTimer(neighbor->GetInactivityTimer()); 00052 messageHandler->StartTimer(neighbor->GetInactivityTimer(), neighbor->GetRouterDeadInterval()); 00053 } 00054 if (event == OSPF::Neighbor::LoadingDone) { 00055 neighbor->ClearRequestRetransmissionTimer(); 00056 ChangeState(neighbor, new OSPF::NeighborStateFull, this); 00057 } 00058 if (event == OSPF::Neighbor::IsAdjacencyOK) { 00059 if (!neighbor->NeedAdjacency()) { 00060 neighbor->Reset(); 00061 ChangeState(neighbor, new OSPF::NeighborStateTwoWay, this); 00062 } 00063 } 00064 if ((event == OSPF::Neighbor::SequenceNumberMismatch) || (event == OSPF::Neighbor::BadLinkStateRequest)) { 00065 MessageHandler* messageHandler = neighbor->GetInterface()->GetArea()->GetRouter()->GetMessageHandler(); 00066 neighbor->Reset(); 00067 neighbor->IncrementDDSequenceNumber(); 00068 neighbor->SendDatabaseDescriptionPacket(true); 00069 messageHandler->StartTimer(neighbor->GetDDRetransmissionTimer(), neighbor->GetInterface()->GetRetransmissionInterval()); 00070 ChangeState(neighbor, new OSPF::NeighborStateExchangeStart, this); 00071 } 00072 if (event == OSPF::Neighbor::RequestRetransmissionTimer) { 00073 neighbor->SendLinkStateRequestPacket(); 00074 neighbor->StartRequestRetransmissionTimer(); 00075 } 00076 if (event == OSPF::Neighbor::UpdateRetransmissionTimer) { 00077 neighbor->RetransmitUpdatePacket(); 00078 neighbor->StartUpdateRetransmissionTimer(); 00079 } 00080 if (event == OSPF::Neighbor::DDRetransmissionTimer) { 00081 neighbor->DeleteLastSentDDPacket(); 00082 } 00083 }