#include <OSPFInterfaceStateDown.h>
Inheritance diagram for OSPF::InterfaceStateDown:
Public Member Functions | |
virtual void | ProcessEvent (Interface *intf, Interface::InterfaceEventType event) |
virtual Interface::InterfaceStateType | GetState (void) const |
virtual Interface::InterfaceStateType OSPF::InterfaceStateDown::GetState | ( | void | ) | const [inline, virtual] |
void OSPF::InterfaceStateDown::ProcessEvent | ( | Interface * | intf, | |
Interface::InterfaceEventType | event | |||
) | [virtual] |
Implements OSPF::InterfaceState.
00011 { 00012 if (event == OSPF::Interface::InterfaceUp) { 00013 OSPF::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 OSPF::Interface::PointToPoint: 00018 case OSPF::Interface::PointToMultiPoint: 00019 case OSPF::Interface::Virtual: 00020 ChangeState (intf, new OSPF::InterfaceStatePointToPoint, this); 00021 break; 00022 00023 case OSPF::Interface::NBMA: 00024 if (intf->GetRouterPriority () == 0) { 00025 ChangeState (intf, new OSPF::InterfaceStateNotDesignatedRouter, this); 00026 } else { 00027 ChangeState (intf, new OSPF::InterfaceStateWaiting, this); 00028 messageHandler->StartTimer (intf->GetWaitTimer (), intf->GetRouterDeadInterval ()); 00029 00030 long neighborCount = intf->GetNeighborCount (); 00031 for (long i = 0; i < neighborCount; i++) { 00032 OSPF::Neighbor* neighbor = intf->GetNeighbor (i); 00033 if (neighbor->GetPriority () > 0) { 00034 neighbor->ProcessEvent (OSPF::Neighbor::Start); 00035 } 00036 } 00037 } 00038 break; 00039 00040 case OSPF::Interface::Broadcast: 00041 if (intf->GetRouterPriority () == 0) { 00042 ChangeState (intf, new OSPF::InterfaceStateNotDesignatedRouter, this); 00043 } else { 00044 ChangeState (intf, new OSPF::InterfaceStateWaiting, this); 00045 messageHandler->StartTimer (intf->GetWaitTimer (), intf->GetRouterDeadInterval ()); 00046 } 00047 break; 00048 00049 default: 00050 break; 00051 } 00052 } 00053 if (event == OSPF::Interface::LoopIndication) { 00054 intf->Reset (); 00055 ChangeState (intf, new OSPF::InterfaceStateLoopback, this); 00056 } 00057 }