|
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 "OSPFNeighborStateExchange.h" 00019 #include "OSPFNeighborStateDown.h" 00020 #include "OSPFNeighborStateInit.h" 00021 #include "OSPFNeighborStateTwoWay.h" 00022 #include "OSPFNeighborStateExchangeStart.h" 00023 #include "OSPFNeighborStateFull.h" 00024 #include "OSPFNeighborStateLoading.h" 00025 #include "MessageHandler.h" 00026 #include "OSPFInterface.h" 00027 #include "OSPFArea.h" 00028 #include "OSPFRouter.h" 00029 00030 void OSPF::NeighborStateExchange::ProcessEvent(OSPF::Neighbor* neighbor, OSPF::Neighbor::NeighborEventType event) 00031 { 00032 if ((event == OSPF::Neighbor::KillNeighbor) || (event == OSPF::Neighbor::LinkDown)) { 00033 MessageHandler* messageHandler = neighbor->GetInterface()->GetArea()->GetRouter()->GetMessageHandler(); 00034 neighbor->Reset(); 00035 messageHandler->ClearTimer(neighbor->GetInactivityTimer()); 00036 ChangeState(neighbor, new OSPF::NeighborStateDown, this); 00037 } 00038 if (event == OSPF::Neighbor::InactivityTimer) { 00039 neighbor->Reset(); 00040 if (neighbor->GetInterface()->GetType() == OSPF::Interface::NBMA) { 00041 MessageHandler* messageHandler = neighbor->GetInterface()->GetArea()->GetRouter()->GetMessageHandler(); 00042 messageHandler->StartTimer(neighbor->GetPollTimer(), neighbor->GetInterface()->GetPollInterval()); 00043 } 00044 ChangeState(neighbor, new OSPF::NeighborStateDown, this); 00045 } 00046 if (event == OSPF::Neighbor::OneWayReceived) { 00047 neighbor->Reset(); 00048 ChangeState(neighbor, new OSPF::NeighborStateInit, this); 00049 } 00050 if (event == OSPF::Neighbor::HelloReceived) { 00051 MessageHandler* messageHandler = neighbor->GetInterface()->GetArea()->GetRouter()->GetMessageHandler(); 00052 messageHandler->ClearTimer(neighbor->GetInactivityTimer()); 00053 messageHandler->StartTimer(neighbor->GetInactivityTimer(), neighbor->GetRouterDeadInterval()); 00054 } 00055 if (event == OSPF::Neighbor::IsAdjacencyOK) { 00056 if (!neighbor->NeedAdjacency()) { 00057 neighbor->Reset(); 00058 ChangeState(neighbor, new OSPF::NeighborStateTwoWay, this); 00059 } 00060 } 00061 if ((event == OSPF::Neighbor::SequenceNumberMismatch) || (event == OSPF::Neighbor::BadLinkStateRequest)) { 00062 MessageHandler* messageHandler = neighbor->GetInterface()->GetArea()->GetRouter()->GetMessageHandler(); 00063 neighbor->Reset(); 00064 neighbor->IncrementDDSequenceNumber(); 00065 neighbor->SendDatabaseDescriptionPacket(true); 00066 messageHandler->StartTimer(neighbor->GetDDRetransmissionTimer(), neighbor->GetInterface()->GetRetransmissionInterval()); 00067 ChangeState(neighbor, new OSPF::NeighborStateExchangeStart, this); 00068 } 00069 if (event == OSPF::Neighbor::ExchangeDone) { 00070 if (neighbor->IsLinkStateRequestListEmpty()) { 00071 MessageHandler* messageHandler = neighbor->GetInterface()->GetArea()->GetRouter()->GetMessageHandler(); 00072 messageHandler->StartTimer(neighbor->GetDDRetransmissionTimer(), neighbor->GetRouterDeadInterval()); 00073 neighbor->ClearRequestRetransmissionTimer(); 00074 ChangeState(neighbor, new OSPF::NeighborStateFull, this); 00075 } else { 00076 MessageHandler* messageHandler = neighbor->GetInterface()->GetArea()->GetRouter()->GetMessageHandler(); 00077 messageHandler->StartTimer(neighbor->GetDDRetransmissionTimer(), neighbor->GetRouterDeadInterval()); 00078 ChangeState(neighbor, new OSPF::NeighborStateLoading, this); 00079 } 00080 } 00081 if (event == OSPF::Neighbor::UpdateRetransmissionTimer) { 00082 neighbor->RetransmitUpdatePacket(); 00083 neighbor->StartUpdateRetransmissionTimer(); 00084 } 00085 if (event == OSPF::Neighbor::RequestRetransmissionTimer) { 00086 neighbor->SendLinkStateRequestPacket(); 00087 neighbor->StartRequestRetransmissionTimer(); 00088 } 00089 }