|
INET Framework for OMNeT++/OMNEST
|
00001 #include "AnsaOSPFInterfaceStateDown.h" 00002 #include "AnsaMessageHandler.h" 00003 #include "AnsaOSPFArea.h" 00004 #include "AnsaOSPFRouter.h" 00005 #include "AnsaOSPFInterfaceStatePointToPoint.h" 00006 #include "AnsaOSPFInterfaceStateNotDesignatedRouter.h" 00007 #include "AnsaOSPFInterfaceStateWaiting.h" 00008 #include "AnsaOSPFInterfaceStateLoopback.h" 00009 00010 void AnsaOSPF::InterfaceStateDown::ProcessEvent(AnsaOSPF::Interface* intf, AnsaOSPF::Interface::InterfaceEventType event) 00011 { 00012 if (event == AnsaOSPF::Interface::InterfaceUp) { 00013 AnsaOSPF::MessageHandler* messageHandler = intf->GetArea()->GetRouter()->GetMessageHandler(); 00014 messageHandler->StartTimer(intf->GetHelloTimer(), truncnormal(0.1, 0.01)); // add some deviation to avoid startup collisions 00015 messageHandler->StartTimer(intf->GetAcknowledgementTimer(), intf->GetAcknowledgementDelay()); 00016 switch (intf->GetType()) { 00017 case AnsaOSPF::Interface::PointToPoint: 00018 case AnsaOSPF::Interface::PointToMultiPoint: 00019 case AnsaOSPF::Interface::Virtual: 00020 ChangeState(intf, new AnsaOSPF::InterfaceStatePointToPoint, this); 00021 break; 00022 00023 case AnsaOSPF::Interface::NBMA: 00024 if (intf->GetRouterPriority() == 0) { 00025 ChangeState(intf, new AnsaOSPF::InterfaceStateNotDesignatedRouter, this); 00026 } else { 00027 ChangeState(intf, new AnsaOSPF::InterfaceStateWaiting, this); 00028 messageHandler->StartTimer(intf->GetWaitTimer(), intf->GetRouterDeadInterval()); 00029 00030 long neighborCount = intf->GetNeighborCount(); 00031 for (long i = 0; i < neighborCount; i++) { 00032 AnsaOSPF::Neighbor* neighbor = intf->GetNeighbor(i); 00033 if (neighbor->GetPriority() > 0) { 00034 neighbor->ProcessEvent(AnsaOSPF::Neighbor::Start); 00035 } 00036 } 00037 } 00038 break; 00039 00040 case AnsaOSPF::Interface::Broadcast: 00041 if (intf->GetRouterPriority() == 0) { 00042 ChangeState(intf, new AnsaOSPF::InterfaceStateNotDesignatedRouter, this); 00043 } else { 00044 ChangeState(intf, new AnsaOSPF::InterfaceStateWaiting, this); 00045 messageHandler->StartTimer(intf->GetWaitTimer(), intf->GetRouterDeadInterval()); 00046 } 00047 break; 00048 00049 default: 00050 break; 00051 } 00052 } 00053 if (event == AnsaOSPF::Interface::LoopIndication) { 00054 intf->Reset(); 00055 ChangeState(intf, new AnsaOSPF::InterfaceStateLoopback, this); 00056 } 00057 } 00058