|
INET Framework for OMNeT++/OMNEST
|
#include <MessageHandler.h>
Public Member Functions | |
| MessageHandler (Router *containingRouter, cSimpleModule *containingModule) | |
| void | MessageReceived (cMessage *message) |
| void | HandleTimer (OSPFTimer *timer) |
| void | ProcessPacket (OSPFPacket *packet, Interface *unused1=NULL, Neighbor *unused2=NULL) |
| void | SendPacket (OSPFPacket *packet, IPv4Address destination, int outputIfIndex, short ttl=1) |
| void | ClearTimer (OSPFTimer *timer) |
| void | StartTimer (OSPFTimer *timer, simtime_t delay) |
| void | PrintEvent (const char *eventString, const Interface *onInterface=NULL, const Neighbor *forNeighbor=NULL) const |
| void | PrintHelloPacket (const OSPFHelloPacket *helloPacket, IPv4Address destination, int outputIfIndex) const |
| void | PrintDatabaseDescriptionPacket (const OSPFDatabaseDescriptionPacket *ddPacket, IPv4Address destination, int outputIfIndex) const |
| void | PrintLinkStateRequestPacket (const OSPFLinkStateRequestPacket *requestPacket, IPv4Address destination, int outputIfIndex) const |
| void | PrintLinkStateUpdatePacket (const OSPFLinkStateUpdatePacket *updatePacket, IPv4Address destination, int outputIfIndex) const |
| void | PrintLinkStateAcknowledgementPacket (const OSPFLinkStateAcknowledgementPacket *ackPacket, IPv4Address destination, int outputIfIndex) const |
| bool | AuthenticatePacket (OSPFPacket *packet) |
Private Attributes | |
| cSimpleModule * | ospfModule |
| HelloHandler | helloHandler |
| DatabaseDescriptionHandler | ddHandler |
| LinkStateRequestHandler | lsRequestHandler |
| LinkStateUpdateHandler | lsUpdateHandler |
| LinkStateAcknowledgementHandler | lsAckHandler |
| OSPF::MessageHandler::MessageHandler | ( | OSPF::Router * | containingRouter, |
| cSimpleModule * | containingModule | ||
| ) |
:
OSPF::IMessageHandler(containingRouter),
ospfModule(containingModule),
helloHandler(containingRouter),
ddHandler(containingRouter),
lsRequestHandler(containingRouter),
lsUpdateHandler(containingRouter),
lsAckHandler(containingRouter)
{
}
| bool OSPF::MessageHandler::AuthenticatePacket | ( | OSPFPacket * | packet | ) | [inline] |
{ return true; }
| void OSPF::MessageHandler::ClearTimer | ( | OSPFTimer * | timer | ) |
Referenced by OSPF::Neighbor::ClearRequestRetransmissionTimer(), OSPF::Neighbor::ClearUpdateRetransmissionTimer(), OSPF::NeighborStateTwoWay::ProcessEvent(), OSPF::NeighborStateLoading::ProcessEvent(), OSPF::NeighborStateInit::ProcessEvent(), OSPF::NeighborStateFull::ProcessEvent(), OSPF::NeighborStateExchangeStart::ProcessEvent(), OSPF::NeighborStateExchange::ProcessEvent(), OSPF::NeighborStateDown::ProcessEvent(), OSPF::NeighborStateAttempt::ProcessEvent(), OSPF::Interface::Reset(), OSPF::Interface::~Interface(), and OSPF::Neighbor::~Neighbor().
{
ospfModule->cancelEvent(timer);
}
| void OSPF::MessageHandler::HandleTimer | ( | OSPFTimer * | timer | ) |
{
switch (timer->getTimerKind()) {
case InterfaceHelloTimer:
{
OSPF::Interface* intf;
if (! (intf = reinterpret_cast <OSPF::Interface*> (timer->getContextPointer()))) {
// should not reach this point
EV << "Discarding invalid InterfaceHelloTimer.\n";
delete timer;
} else {
PrintEvent("Hello Timer expired", intf);
intf->ProcessEvent(OSPF::Interface::HelloTimer);
}
}
break;
case InterfaceWaitTimer:
{
OSPF::Interface* intf;
if (! (intf = reinterpret_cast <OSPF::Interface*> (timer->getContextPointer()))) {
// should not reach this point
EV << "Discarding invalid InterfaceWaitTimer.\n";
delete timer;
} else {
PrintEvent("Wait Timer expired", intf);
intf->ProcessEvent(OSPF::Interface::WaitTimer);
}
}
break;
case InterfaceAcknowledgementTimer:
{
OSPF::Interface* intf;
if (! (intf = reinterpret_cast <OSPF::Interface*> (timer->getContextPointer()))) {
// should not reach this point
EV << "Discarding invalid InterfaceAcknowledgementTimer.\n";
delete timer;
} else {
PrintEvent("Acknowledgement Timer expired", intf);
intf->ProcessEvent(OSPF::Interface::AcknowledgementTimer);
}
}
break;
case NeighborInactivityTimer:
{
OSPF::Neighbor* neighbor;
if (! (neighbor = reinterpret_cast <OSPF::Neighbor*> (timer->getContextPointer()))) {
// should not reach this point
EV << "Discarding invalid NeighborInactivityTimer.\n";
delete timer;
} else {
PrintEvent("Inactivity Timer expired", neighbor->GetInterface(), neighbor);
neighbor->ProcessEvent(OSPF::Neighbor::InactivityTimer);
}
}
break;
case NeighborPollTimer:
{
OSPF::Neighbor* neighbor;
if (! (neighbor = reinterpret_cast <OSPF::Neighbor*> (timer->getContextPointer()))) {
// should not reach this point
EV << "Discarding invalid NeighborInactivityTimer.\n";
delete timer;
} else {
PrintEvent("Poll Timer expired", neighbor->GetInterface(), neighbor);
neighbor->ProcessEvent(OSPF::Neighbor::PollTimer);
}
}
break;
case NeighborDDRetransmissionTimer:
{
OSPF::Neighbor* neighbor;
if (! (neighbor = reinterpret_cast <OSPF::Neighbor*> (timer->getContextPointer()))) {
// should not reach this point
EV << "Discarding invalid NeighborDDRetransmissionTimer.\n";
delete timer;
} else {
PrintEvent("Database Description Retransmission Timer expired", neighbor->GetInterface(), neighbor);
neighbor->ProcessEvent(OSPF::Neighbor::DDRetransmissionTimer);
}
}
break;
case NeighborUpdateRetransmissionTimer:
{
OSPF::Neighbor* neighbor;
if (! (neighbor = reinterpret_cast <OSPF::Neighbor*> (timer->getContextPointer()))) {
// should not reach this point
EV << "Discarding invalid NeighborUpdateRetransmissionTimer.\n";
delete timer;
} else {
PrintEvent("Update Retransmission Timer expired", neighbor->GetInterface(), neighbor);
neighbor->ProcessEvent(OSPF::Neighbor::UpdateRetransmissionTimer);
}
}
break;
case NeighborRequestRetransmissionTimer:
{
OSPF::Neighbor* neighbor;
if (! (neighbor = reinterpret_cast <OSPF::Neighbor*> (timer->getContextPointer()))) {
// should not reach this point
EV << "Discarding invalid NeighborRequestRetransmissionTimer.\n";
delete timer;
} else {
PrintEvent("Request Retransmission Timer expired", neighbor->GetInterface(), neighbor);
neighbor->ProcessEvent(OSPF::Neighbor::RequestRetransmissionTimer);
}
}
break;
case DatabaseAgeTimer:
{
PrintEvent("Ageing the database");
router->AgeDatabase();
}
break;
default: break;
}
}
| void OSPF::MessageHandler::MessageReceived | ( | cMessage * | message | ) |
{
if (message->isSelfMessage()) {
HandleTimer(check_and_cast<OSPFTimer*> (message));
} else {
OSPFPacket* packet = check_and_cast<OSPFPacket*> (message);
EV << "Received packet: (" << packet->getClassName() << ")" << packet->getName() << "\n";
if (packet->getRouterID() == router->GetRouterID()) {
EV << "This packet is from ourselves, discarding.\n";
delete message;
} else {
ProcessPacket(packet);
}
}
}
| void OSPF::MessageHandler::PrintDatabaseDescriptionPacket | ( | const OSPFDatabaseDescriptionPacket * | ddPacket, |
| IPv4Address | destination, | ||
| int | outputIfIndex | ||
| ) | const |
{
char addressString[16];
EV << "Sending Database Description packet to "
<< AddressStringFromIPv4Address(addressString, sizeof(addressString), destination)
<< " on interface["
<< outputIfIndex
<< "] with contents:\n";
const OSPFDDOptions& ddOptions = ddPacket->getDdOptions();
EV << " ddOptions="
<< ((ddOptions.I_Init) ? "I " : "_ ")
<< ((ddOptions.M_More) ? "M " : "_ ")
<< ((ddOptions.MS_MasterSlave) ? "MS" : "__")
<< "\n";
EV << " seqNumber="
<< ddPacket->getDdSequenceNumber()
<< "\n";
EV << " LSA headers:\n";
unsigned int lsaCount = ddPacket->getLsaHeadersArraySize();
for (unsigned int i = 0; i < lsaCount; i++) {
EV << " ";
PrintLSAHeader(ddPacket->getLsaHeaders(i), ev.getOStream());
EV << "\n";
}
}
| void OSPF::MessageHandler::PrintEvent | ( | const char * | eventString, |
| const Interface * | onInterface = NULL, |
||
| const Neighbor * | forNeighbor = NULL |
||
| ) | const |
{
EV << eventString;
if ((onInterface != NULL) || (forNeighbor != NULL)) {
EV << ": ";
}
if (forNeighbor != NULL) {
char addressString[16];
EV << "neighbor["
<< AddressStringFromULong(addressString, sizeof(addressString), forNeighbor->GetNeighborID())
<< "] (state: "
<< forNeighbor->GetStateString(forNeighbor->GetState())
<< "); ";
}
if (onInterface != NULL) {
EV << "interface["
<< static_cast <short> (onInterface->GetIfIndex())
<< "] ";
switch (onInterface->GetType()) {
case OSPF::Interface::PointToPoint: EV << "(PointToPoint)";
break;
case OSPF::Interface::Broadcast: EV << "(Broadcast)";
break;
case OSPF::Interface::NBMA: EV << "(NBMA).\n";
break;
case OSPF::Interface::PointToMultiPoint: EV << "(PointToMultiPoint)";
break;
case OSPF::Interface::Virtual: EV << "(Virtual)";
break;
default: EV << "(Unknown)";
}
EV << " (state: "
<< onInterface->GetStateString(onInterface->GetState())
<< ")";
}
EV << ".\n";
}
| void OSPF::MessageHandler::PrintHelloPacket | ( | const OSPFHelloPacket * | helloPacket, |
| IPv4Address | destination, | ||
| int | outputIfIndex | ||
| ) | const |
{
char addressString[16];
EV << "Sending Hello packet to "
<< AddressStringFromIPv4Address(addressString, sizeof(addressString), destination)
<< " on interface["
<< outputIfIndex
<< "] with contents:\n";
EV << " netMask="
<< AddressStringFromULong(addressString, sizeof(addressString), helloPacket->getNetworkMask().getInt())
<< "\n";
EV << " DR="
<< AddressStringFromULong(addressString, sizeof(addressString), helloPacket->getDesignatedRouter().getInt())
<< "\n";
EV << " BDR="
<< AddressStringFromULong(addressString, sizeof(addressString), helloPacket->getBackupDesignatedRouter().getInt())
<< "\n";
EV << " neighbors:\n";
unsigned int neighborCount = helloPacket->getNeighborArraySize();
for (unsigned int i = 0; i < neighborCount; i++) {
EV << " "
<< AddressStringFromULong(addressString, sizeof(addressString), helloPacket->getNeighbor(i).getInt())
<< "\n";
}
}
| void OSPF::MessageHandler::PrintLinkStateAcknowledgementPacket | ( | const OSPFLinkStateAcknowledgementPacket * | ackPacket, |
| IPv4Address | destination, | ||
| int | outputIfIndex | ||
| ) | const |
{
char addressString[16];
EV << "Sending Link State Acknowledgement packet to "
<< AddressStringFromIPv4Address(addressString, sizeof(addressString), destination)
<< " on interface["
<< outputIfIndex
<< "] with acknowledgements:\n";
unsigned int lsaCount = ackPacket->getLsaHeadersArraySize();
for (unsigned int i = 0; i < lsaCount; i++) {
EV << " ";
PrintLSAHeader(ackPacket->getLsaHeaders(i), ev.getOStream());
EV << "\n";
}
}
| void OSPF::MessageHandler::PrintLinkStateRequestPacket | ( | const OSPFLinkStateRequestPacket * | requestPacket, |
| IPv4Address | destination, | ||
| int | outputIfIndex | ||
| ) | const |
{
char addressString[16];
EV << "Sending Link State Request packet to "
<< AddressStringFromIPv4Address(addressString, sizeof(addressString), destination)
<< " on interface["
<< outputIfIndex
<< "] with requests:\n";
unsigned int requestCount = requestPacket->getRequestsArraySize();
for (unsigned int i = 0; i < requestCount; i++) {
const LSARequest& request = requestPacket->getRequests(i);
EV << " type="
<< request.lsType
<< ", LSID="
<< AddressStringFromULong(addressString, sizeof(addressString), request.linkStateID);
EV << ", advertisingRouter="
<< AddressStringFromULong(addressString, sizeof(addressString), request.advertisingRouter.getInt())
<< "\n";
}
}
| void OSPF::MessageHandler::PrintLinkStateUpdatePacket | ( | const OSPFLinkStateUpdatePacket * | updatePacket, |
| IPv4Address | destination, | ||
| int | outputIfIndex | ||
| ) | const |
{
char addressString[16];
EV << "Sending Link State Update packet to "
<< AddressStringFromIPv4Address(addressString, sizeof(addressString), destination)
<< " on interface["
<< outputIfIndex
<< "] with updates:\n";
unsigned int i = 0;
unsigned int updateCount = updatePacket->getRouterLSAsArraySize();
for (i = 0; i < updateCount; i++) {
const OSPFRouterLSA& lsa = updatePacket->getRouterLSAs(i);
EV << " ";
PrintLSAHeader(lsa.getHeader(), ev.getOStream());
EV << "\n";
EV << " bits="
<< ((lsa.getV_VirtualLinkEndpoint()) ? "V " : "_ ")
<< ((lsa.getE_ASBoundaryRouter()) ? "E " : "_ ")
<< ((lsa.getB_AreaBorderRouter()) ? "B" : "_")
<< "\n";
EV << " links:\n";
unsigned int linkCount = lsa.getLinksArraySize();
for (unsigned int j = 0; j < linkCount; j++) {
const Link& link = lsa.getLinks(j);
EV << " ID="
<< AddressStringFromULong(addressString, sizeof(addressString), link.getLinkID().getInt())
<< ",";
EV << " data="
<< AddressStringFromULong(addressString, sizeof(addressString), link.getLinkData())
<< ", type=";
switch (link.getType()) {
case PointToPointLink: EV << "PointToPoint"; break;
case TransitLink: EV << "Transit"; break;
case StubLink: EV << "Stub"; break;
case VirtualLink: EV << "Virtual"; break;
default: EV << "Unknown"; break;
}
EV << ", cost="
<< link.getLinkCost()
<< "\n";
}
}
updateCount = updatePacket->getNetworkLSAsArraySize();
for (i = 0; i < updateCount; i++) {
const OSPFNetworkLSA& lsa = updatePacket->getNetworkLSAs(i);
EV << " ";
PrintLSAHeader(lsa.getHeader(), ev.getOStream());
EV << "\n";
EV << " netMask="
<< AddressStringFromULong(addressString, sizeof(addressString), lsa.getNetworkMask().getInt())
<< "\n";
EV << " attachedRouters:\n";
unsigned int routerCount = lsa.getAttachedRoutersArraySize();
for (unsigned int j = 0; j < routerCount; j++) {
EV << " "
<< AddressStringFromULong(addressString, sizeof(addressString), lsa.getAttachedRouters(j).getInt())
<< "\n";
}
}
updateCount = updatePacket->getSummaryLSAsArraySize();
for (i = 0; i < updateCount; i++) {
const OSPFSummaryLSA& lsa = updatePacket->getSummaryLSAs(i);
EV << " ";
PrintLSAHeader(lsa.getHeader(), ev.getOStream());
EV << "\n";
EV << " netMask="
<< AddressStringFromULong(addressString, sizeof(addressString), lsa.getNetworkMask().getInt())
<< "\n";
EV << " cost="
<< lsa.getRouteCost()
<< "\n";
}
updateCount = updatePacket->getAsExternalLSAsArraySize();
for (i = 0; i < updateCount; i++) {
const OSPFASExternalLSA& lsa = updatePacket->getAsExternalLSAs(i);
EV << " ";
PrintLSAHeader(lsa.getHeader(), ev.getOStream());
EV << "\n";
const OSPFASExternalLSAContents& contents = lsa.getContents();
EV << " netMask="
<< AddressStringFromULong(addressString, sizeof(addressString), contents.getNetworkMask().getInt())
<< "\n";
EV << " bits="
<< ((contents.getE_ExternalMetricType()) ? "E\n" : "_\n");
EV << " cost="
<< contents.getRouteCost()
<< "\n";
EV << " forward="
<< AddressStringFromULong(addressString, sizeof(addressString), contents.getForwardingAddress().getInt())
<< "\n";
}
}
| void OSPF::MessageHandler::ProcessPacket | ( | OSPFPacket * | packet, |
| OSPF::Interface * | unused1 = NULL, |
||
| OSPF::Neighbor * | unused2 = NULL |
||
| ) | [virtual] |
Implements OSPF::IMessageHandler.
{
// packet version must be OSPF version 2
if (packet->getVersion() == 2) {
IPControlInfo* controlInfo = check_and_cast<IPControlInfo *> (packet->getControlInfo());
int interfaceId = controlInfo->getInterfaceId();
OSPF::AreaID areaID = packet->getAreaID().getInt();
OSPF::Area* area = router->GetArea(areaID);
if (area != NULL) {
// packet Area ID must either match the Area ID of the receiving interface or...
OSPF::Interface* intf = area->GetInterface(interfaceId);
if (intf == NULL) {
// it must be the backbone area and...
if (areaID == BackboneAreaID) {
if (router->GetAreaCount() > 1) {
// it must be a virtual link and the source router's router ID must be the endpoint of this virtual link and...
intf = area->FindVirtualLink(packet->getRouterID().getInt());
if (intf != NULL) {
OSPF::Area* virtualLinkTransitArea = router->GetArea(intf->GetTransitAreaID());
if (virtualLinkTransitArea != NULL) {
// the receiving interface must attach to the virtual link's configured transit area
OSPF::Interface* virtualLinkInterface = virtualLinkTransitArea->GetInterface(interfaceId);
if (virtualLinkInterface == NULL) {
intf = NULL;
}
} else {
intf = NULL;
}
}
}
}
}
if (intf != NULL) {
unsigned long destinationAddress = controlInfo->getDestAddr().getInt();
unsigned long allDRouters = ULongFromIPv4Address(OSPF::AllDRouters);
OSPF::Interface::InterfaceStateType interfaceState = intf->GetState();
// if destination address is AllDRouters the receiving interface must be in DesignatedRouter or Backup state
if (
((destinationAddress == allDRouters) &&
(
(interfaceState == OSPF::Interface::DesignatedRouterState) ||
(interfaceState == OSPF::Interface::BackupState)
)
) ||
(destinationAddress != allDRouters)
)
{
// packet authentication
if (AuthenticatePacket(packet)) {
OSPFPacketType packetType = static_cast<OSPFPacketType> (packet->getType());
OSPF::Neighbor* neighbor = NULL;
// all packets except HelloPackets are sent only along adjacencies, so a Neighbor must exist
if (packetType != HelloPacket) {
switch (intf->GetType()) {
case OSPF::Interface::Broadcast:
case OSPF::Interface::NBMA:
case OSPF::Interface::PointToMultiPoint:
neighbor = intf->GetNeighborByAddress(IPv4AddressFromULong(controlInfo->getSrcAddr().getInt()));
break;
case OSPF::Interface::PointToPoint:
case OSPF::Interface::Virtual:
neighbor = intf->GetNeighborByID(packet->getRouterID().getInt());
break;
default: break;
}
}
switch (packetType) {
case HelloPacket:
helloHandler.ProcessPacket(packet, intf);
break;
case DatabaseDescriptionPacket:
if (neighbor != NULL) {
ddHandler.ProcessPacket(packet, intf, neighbor);
}
break;
case LinkStateRequestPacket:
if (neighbor != NULL) {
lsRequestHandler.ProcessPacket(packet, intf, neighbor);
}
break;
case LinkStateUpdatePacket:
if (neighbor != NULL) {
lsUpdateHandler.ProcessPacket(packet, intf, neighbor);
}
break;
case LinkStateAcknowledgementPacket:
if (neighbor != NULL) {
lsAckHandler.ProcessPacket(packet, intf, neighbor);
}
break;
default: break;
}
}
}
}
}
}
delete packet;
}
| void OSPF::MessageHandler::SendPacket | ( | OSPFPacket * | packet, |
| IPv4Address | destination, | ||
| int | outputIfIndex, | ||
| short | ttl = 1 |
||
| ) |
Referenced by OSPF::Interface::FloodLSA(), OSPF::LinkStateRequestHandler::ProcessPacket(), OSPF::Neighbor::RetransmitDatabaseDescriptionPacket(), OSPF::Neighbor::RetransmitUpdatePacket(), OSPF::Neighbor::SendDatabaseDescriptionPacket(), OSPF::Interface::SendDelayedAcknowledgements(), and OSPF::Neighbor::SendLinkStateRequestPacket().
{
IPControlInfo *ipControlInfo = new IPControlInfo();
ipControlInfo->setProtocol(IP_PROT_OSPF);
ipControlInfo->setDestAddr(ULongFromIPv4Address(destination));
ipControlInfo->setTimeToLive(ttl);
ipControlInfo->setInterfaceId(outputIfIndex);
packet->setControlInfo(ipControlInfo);
switch (packet->getType()) {
case HelloPacket:
{
packet->setKind(HelloPacket);
packet->setName("OSPF_HelloPacket");
OSPFHelloPacket* helloPacket = check_and_cast<OSPFHelloPacket*> (packet);
PrintHelloPacket(helloPacket, destination, outputIfIndex);
}
break;
case DatabaseDescriptionPacket:
{
packet->setKind(DatabaseDescriptionPacket);
packet->setName("OSPF_DDPacket");
OSPFDatabaseDescriptionPacket* ddPacket = check_and_cast<OSPFDatabaseDescriptionPacket*> (packet);
PrintDatabaseDescriptionPacket(ddPacket, destination, outputIfIndex);
}
break;
case LinkStateRequestPacket:
{
packet->setKind(LinkStateRequestPacket);
packet->setName("OSPF_LSReqPacket");
OSPFLinkStateRequestPacket* requestPacket = check_and_cast<OSPFLinkStateRequestPacket*> (packet);
PrintLinkStateRequestPacket(requestPacket, destination, outputIfIndex);
}
break;
case LinkStateUpdatePacket:
{
packet->setKind(LinkStateUpdatePacket);
packet->setName("OSPF_LSUpdPacket");
OSPFLinkStateUpdatePacket* updatePacket = check_and_cast<OSPFLinkStateUpdatePacket*> (packet);
PrintLinkStateUpdatePacket(updatePacket, destination, outputIfIndex);
}
break;
case LinkStateAcknowledgementPacket:
{
packet->setKind(LinkStateAcknowledgementPacket);
packet->setName("OSPF_LSAckPacket");
OSPFLinkStateAcknowledgementPacket* ackPacket = check_and_cast<OSPFLinkStateAcknowledgementPacket*> (packet);
PrintLinkStateAcknowledgementPacket(ackPacket, destination, outputIfIndex);
}
break;
default: break;
}
ospfModule->send(packet,"ipOut");
}
| void OSPF::MessageHandler::StartTimer | ( | OSPFTimer * | timer, |
| simtime_t | delay | ||
| ) |
Referenced by OSPF::NeighborStateTwoWay::ProcessEvent(), OSPF::NeighborStateLoading::ProcessEvent(), OSPF::NeighborStateInit::ProcessEvent(), OSPF::NeighborStateFull::ProcessEvent(), OSPF::NeighborStateExchangeStart::ProcessEvent(), OSPF::NeighborStateExchange::ProcessEvent(), OSPF::NeighborStateDown::ProcessEvent(), OSPF::NeighborStateAttempt::ProcessEvent(), OSPF::InterfaceStateWaiting::ProcessEvent(), OSPF::InterfaceStatePointToPoint::ProcessEvent(), OSPF::InterfaceStateNotDesignatedRouter::ProcessEvent(), OSPF::InterfaceStateDown::ProcessEvent(), OSPF::InterfaceStateDesignatedRouter::ProcessEvent(), OSPF::InterfaceStateBackup::ProcessEvent(), OSPF::Router::Router(), OSPF::Interface::SendDelayedAcknowledgements(), OSPF::Neighbor::StartRequestRetransmissionTimer(), and OSPF::Neighbor::StartUpdateRetransmissionTimer().
{
ospfModule->scheduleAt(simTime() + delay, timer);
}
cSimpleModule* OSPF::MessageHandler::ospfModule [private] |