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