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