INET Framework for OMNeT++/OMNEST
ansaOspfNeighborStateExchange6.cc
Go to the documentation of this file.
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 }