OSPF::MessageHandler Class Reference

#include <MessageHandler.h>

Inheritance diagram for OSPF::MessageHandler:

OSPF::IMessageHandler

List of all members.

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


Constructor & Destructor Documentation

OSPF::MessageHandler::MessageHandler ( OSPF::Router containingRouter,
cSimpleModule *  containingModule 
)

00021                                                                                                 :
00022     OSPF::IMessageHandler(containingRouter),
00023     ospfModule(containingModule),
00024     helloHandler(containingRouter),
00025     ddHandler(containingRouter),
00026     lsRequestHandler(containingRouter),
00027     lsUpdateHandler(containingRouter),
00028     lsAckHandler(containingRouter)
00029 {
00030 }


Member Function Documentation

void OSPF::MessageHandler::MessageReceived ( cMessage *  message  ) 

00033 {
00034     if (message->isSelfMessage()) {
00035         HandleTimer(check_and_cast<OSPFTimer*> (message));
00036     } else {
00037         OSPFPacket* packet = check_and_cast<OSPFPacket*> (message);
00038         EV << "Received packet: (" << packet->getClassName() << ")" << packet->getName() << "\n";
00039         if (packet->getRouterID() == router->GetRouterID()) {
00040             EV << "This packet is from ourselves, discarding.\n";
00041             delete message;
00042         } else {
00043             ProcessPacket(packet);
00044         }
00045     }
00046 }

void OSPF::MessageHandler::HandleTimer ( OSPFTimer *  timer  ) 

Referenced by MessageReceived().

00049 {
00050     switch (timer->getTimerKind()) {
00051         case InterfaceHelloTimer:
00052             {
00053                 OSPF::Interface* intf;
00054                 if (! (intf = reinterpret_cast <OSPF::Interface*> (timer->getContextPointer()))) {
00055                     // should not reach this point
00056                     EV << "Discarding invalid InterfaceHelloTimer.\n";
00057                     delete timer;
00058                 } else {
00059                     PrintEvent("Hello Timer expired", intf);
00060                     intf->ProcessEvent(OSPF::Interface::HelloTimer);
00061                 }
00062             }
00063             break;
00064         case InterfaceWaitTimer:
00065             {
00066                 OSPF::Interface* intf;
00067                 if (! (intf = reinterpret_cast <OSPF::Interface*> (timer->getContextPointer()))) {
00068                     // should not reach this point
00069                     EV << "Discarding invalid InterfaceWaitTimer.\n";
00070                     delete timer;
00071                 } else {
00072                     PrintEvent("Wait Timer expired", intf);
00073                     intf->ProcessEvent(OSPF::Interface::WaitTimer);
00074                 }
00075             }
00076             break;
00077         case InterfaceAcknowledgementTimer:
00078             {
00079                 OSPF::Interface* intf;
00080                 if (! (intf = reinterpret_cast <OSPF::Interface*> (timer->getContextPointer()))) {
00081                     // should not reach this point
00082                     EV << "Discarding invalid InterfaceAcknowledgementTimer.\n";
00083                     delete timer;
00084                 } else {
00085                     PrintEvent("Acknowledgement Timer expired", intf);
00086                     intf->ProcessEvent(OSPF::Interface::AcknowledgementTimer);
00087                 }
00088             }
00089             break;
00090         case NeighborInactivityTimer:
00091             {
00092                 OSPF::Neighbor* neighbor;
00093                 if (! (neighbor = reinterpret_cast <OSPF::Neighbor*> (timer->getContextPointer()))) {
00094                     // should not reach this point
00095                     EV << "Discarding invalid NeighborInactivityTimer.\n";
00096                     delete timer;
00097                 } else {
00098                     PrintEvent("Inactivity Timer expired", neighbor->GetInterface(), neighbor);
00099                     neighbor->ProcessEvent(OSPF::Neighbor::InactivityTimer);
00100                 }
00101             }
00102             break;
00103         case NeighborPollTimer:
00104             {
00105                 OSPF::Neighbor* neighbor;
00106                 if (! (neighbor = reinterpret_cast <OSPF::Neighbor*> (timer->getContextPointer()))) {
00107                     // should not reach this point
00108                     EV << "Discarding invalid NeighborInactivityTimer.\n";
00109                     delete timer;
00110                 } else {
00111                     PrintEvent("Poll Timer expired", neighbor->GetInterface(), neighbor);
00112                     neighbor->ProcessEvent(OSPF::Neighbor::PollTimer);
00113                 }
00114             }
00115             break;
00116         case NeighborDDRetransmissionTimer:
00117             {
00118                 OSPF::Neighbor* neighbor;
00119                 if (! (neighbor = reinterpret_cast <OSPF::Neighbor*> (timer->getContextPointer()))) {
00120                     // should not reach this point
00121                     EV << "Discarding invalid NeighborDDRetransmissionTimer.\n";
00122                     delete timer;
00123                 } else {
00124                     PrintEvent("Database Description Retransmission Timer expired", neighbor->GetInterface(), neighbor);
00125                     neighbor->ProcessEvent(OSPF::Neighbor::DDRetransmissionTimer);
00126                 }
00127             }
00128             break;
00129         case NeighborUpdateRetransmissionTimer:
00130             {
00131                 OSPF::Neighbor* neighbor;
00132                 if (! (neighbor = reinterpret_cast <OSPF::Neighbor*> (timer->getContextPointer()))) {
00133                     // should not reach this point
00134                     EV << "Discarding invalid NeighborUpdateRetransmissionTimer.\n";
00135                     delete timer;
00136                 } else {
00137                     PrintEvent("Update Retransmission Timer expired", neighbor->GetInterface(), neighbor);
00138                     neighbor->ProcessEvent(OSPF::Neighbor::UpdateRetransmissionTimer);
00139                 }
00140             }
00141             break;
00142         case NeighborRequestRetransmissionTimer:
00143             {
00144                 OSPF::Neighbor* neighbor;
00145                 if (! (neighbor = reinterpret_cast <OSPF::Neighbor*> (timer->getContextPointer()))) {
00146                     // should not reach this point
00147                     EV << "Discarding invalid NeighborRequestRetransmissionTimer.\n";
00148                     delete timer;
00149                 } else {
00150                     PrintEvent("Request Retransmission Timer expired", neighbor->GetInterface(), neighbor);
00151                     neighbor->ProcessEvent(OSPF::Neighbor::RequestRetransmissionTimer);
00152                 }
00153             }
00154             break;
00155         case DatabaseAgeTimer:
00156             {
00157                 PrintEvent("Ageing the database");
00158                 router->AgeDatabase();
00159             }
00160             break;
00161         default: break;
00162     }
00163 }

void OSPF::MessageHandler::ProcessPacket ( OSPFPacket *  packet,
OSPF::Interface unused1 = NULL,
OSPF::Neighbor unused2 = NULL 
) [virtual]

Implements OSPF::IMessageHandler.

Referenced by MessageReceived().

00166 {
00167     // packet version must be OSPF version 2
00168     if (packet->getVersion() == 2) {
00169         IPControlInfo*  controlInfo = check_and_cast<IPControlInfo *> (packet->getControlInfo());
00170         int             interfaceId = controlInfo->getInterfaceId();
00171         OSPF::AreaID    areaID      = packet->getAreaID().getInt();
00172         OSPF::Area*     area        = router->GetArea(areaID);
00173 
00174         if (area != NULL) {
00175             // packet Area ID must either match the Area ID of the receiving interface or...
00176             OSPF::Interface* intf = area->GetInterface(interfaceId);
00177 
00178             if (intf == NULL) {
00179                 // it must be the backbone area and...
00180                 if (areaID == BackboneAreaID) {
00181                     if (router->GetAreaCount() > 1) {
00182                         // it must be a virtual link and the source router's router ID must be the endpoint of this virtual link and...
00183                         intf = area->FindVirtualLink(packet->getRouterID().getInt());
00184 
00185                         if (intf != NULL) {
00186                             OSPF::Area* virtualLinkTransitArea = router->GetArea(intf->GetTransitAreaID());
00187 
00188                             if (virtualLinkTransitArea != NULL) {
00189                                 // the receiving interface must attach to the virtual link's configured transit area
00190                                 OSPF::Interface* virtualLinkInterface = virtualLinkTransitArea->GetInterface(interfaceId);
00191 
00192                                 if (virtualLinkInterface == NULL) {
00193                                     intf = NULL;
00194                                 }
00195                             } else {
00196                                 intf = NULL;
00197                             }
00198                         }
00199                     }
00200                 }
00201             }
00202             if (intf != NULL) {
00203                 unsigned long                       destinationAddress = controlInfo->getDestAddr().getInt();
00204                 unsigned long                       allDRouters        = ULongFromIPv4Address(OSPF::AllDRouters);
00205                 OSPF::Interface::InterfaceStateType interfaceState     = intf->GetState();
00206 
00207                 // if destination address is AllDRouters the receiving interface must be in DesignatedRouter or Backup state
00208                 if (
00209                     ((destinationAddress == allDRouters) &&
00210                      (
00211                       (interfaceState == OSPF::Interface::DesignatedRouterState) ||
00212                       (interfaceState == OSPF::Interface::BackupState)
00213                      )
00214                     ) ||
00215                     (destinationAddress != allDRouters)
00216                    )
00217                 {
00218                     // packet authentication
00219                     if (AuthenticatePacket(packet)) {
00220                         OSPFPacketType  packetType = static_cast<OSPFPacketType> (packet->getType());
00221                         OSPF::Neighbor* neighbor   = NULL;
00222 
00223                         // all packets except HelloPackets are sent only along adjacencies, so a Neighbor must exist
00224                         if (packetType != HelloPacket) {
00225                             switch (intf->GetType()) {
00226                                 case OSPF::Interface::Broadcast:
00227                                 case OSPF::Interface::NBMA:
00228                                 case OSPF::Interface::PointToMultiPoint:
00229                                     neighbor = intf->GetNeighborByAddress(IPv4AddressFromULong(controlInfo->getSrcAddr().getInt()));
00230                                     break;
00231                                 case OSPF::Interface::PointToPoint:
00232                                 case OSPF::Interface::Virtual:
00233                                     neighbor = intf->GetNeighborByID(packet->getRouterID().getInt());
00234                                     break;
00235                                 default: break;
00236                             }
00237                         }
00238                         switch (packetType) {
00239                             case HelloPacket:
00240                                 helloHandler.ProcessPacket(packet, intf);
00241                                 break;
00242                             case DatabaseDescriptionPacket:
00243                                 if (neighbor != NULL) {
00244                                     ddHandler.ProcessPacket(packet, intf, neighbor);
00245                                 }
00246                                 break;
00247                             case LinkStateRequestPacket:
00248                                 if (neighbor != NULL) {
00249                                     lsRequestHandler.ProcessPacket(packet, intf, neighbor);
00250                                 }
00251                                 break;
00252                             case LinkStateUpdatePacket:
00253                                 if (neighbor != NULL) {
00254                                     lsUpdateHandler.ProcessPacket(packet, intf, neighbor);
00255                                 }
00256                                 break;
00257                             case LinkStateAcknowledgementPacket:
00258                                 if (neighbor != NULL) {
00259                                     lsAckHandler.ProcessPacket(packet, intf, neighbor);
00260                                 }
00261                                 break;
00262                             default: break;
00263                         }
00264                     }
00265                 }
00266             }
00267         }
00268     }
00269     delete packet;
00270 }

void OSPF::MessageHandler::SendPacket ( OSPFPacket *  packet,
IPv4Address  destination,
int  outputIfIndex,
short  ttl = 1 
)

Referenced by OSPF::LinkStateUpdateHandler::AcknowledgeLSA(), OSPF::Interface::FloodLSA(), OSPF::LinkStateUpdateHandler::ProcessPacket(), OSPF::LinkStateRequestHandler::ProcessPacket(), OSPF::Neighbor::RetransmitDatabaseDescriptionPacket(), OSPF::Neighbor::RetransmitUpdatePacket(), OSPF::Neighbor::SendDatabaseDescriptionPacket(), OSPF::Interface::SendDelayedAcknowledgements(), OSPF::Interface::SendHelloPacket(), OSPF::Neighbor::SendLinkStateRequestPacket(), and OSPF::Interface::SendLSAcknowledgement().

00273 {
00274     IPControlInfo *ipControlInfo = new IPControlInfo();
00275     ipControlInfo->setProtocol(IP_PROT_OSPF);
00276     ipControlInfo->setDestAddr(ULongFromIPv4Address(destination));
00277     ipControlInfo->setTimeToLive(ttl);
00278     ipControlInfo->setInterfaceId(outputIfIndex);
00279 
00280     packet->setControlInfo(ipControlInfo);
00281     switch (packet->getType()) {
00282         case HelloPacket:
00283             {
00284                 packet->setKind(HelloPacket);
00285                 packet->setName("OSPF_HelloPacket");
00286 
00287                 OSPFHelloPacket* helloPacket = check_and_cast<OSPFHelloPacket*> (packet);
00288                 PrintHelloPacket(helloPacket, destination, outputIfIndex);
00289             }
00290             break;
00291         case DatabaseDescriptionPacket:
00292             {
00293                 packet->setKind(DatabaseDescriptionPacket);
00294                 packet->setName("OSPF_DDPacket");
00295 
00296                 OSPFDatabaseDescriptionPacket* ddPacket = check_and_cast<OSPFDatabaseDescriptionPacket*> (packet);
00297                 PrintDatabaseDescriptionPacket(ddPacket, destination, outputIfIndex);
00298             }
00299             break;
00300         case LinkStateRequestPacket:
00301             {
00302                 packet->setKind(LinkStateRequestPacket);
00303                 packet->setName("OSPF_LSReqPacket");
00304 
00305                 OSPFLinkStateRequestPacket* requestPacket = check_and_cast<OSPFLinkStateRequestPacket*> (packet);
00306                 PrintLinkStateRequestPacket(requestPacket, destination, outputIfIndex);
00307             }
00308             break;
00309         case LinkStateUpdatePacket:
00310             {
00311                 packet->setKind(LinkStateUpdatePacket);
00312                 packet->setName("OSPF_LSUpdPacket");
00313 
00314                 OSPFLinkStateUpdatePacket* updatePacket = check_and_cast<OSPFLinkStateUpdatePacket*> (packet);
00315                 PrintLinkStateUpdatePacket(updatePacket, destination, outputIfIndex);
00316             }
00317             break;
00318         case LinkStateAcknowledgementPacket:
00319             {
00320                 packet->setKind(LinkStateAcknowledgementPacket);
00321                 packet->setName("OSPF_LSAckPacket");
00322 
00323                 OSPFLinkStateAcknowledgementPacket* ackPacket = check_and_cast<OSPFLinkStateAcknowledgementPacket*> (packet);
00324                 PrintLinkStateAcknowledgementPacket(ackPacket, destination, outputIfIndex);
00325             }
00326             break;
00327         default: break;
00328     }
00329 
00330     ospfModule->send(packet,"ipOut");
00331 }

void OSPF::MessageHandler::ClearTimer ( OSPFTimer *  timer  ) 

void OSPF::MessageHandler::StartTimer ( OSPFTimer *  timer,
simtime_t  delay 
)

void OSPF::MessageHandler::PrintEvent ( const char *  eventString,
const Interface onInterface = NULL,
const Neighbor forNeighbor = NULL 
) const

Referenced by HandleTimer(), OSPF::LinkStateUpdateHandler::ProcessPacket(), OSPF::LinkStateRequestHandler::ProcessPacket(), OSPF::LinkStateAcknowledgementHandler::ProcessPacket(), OSPF::HelloHandler::ProcessPacket(), and OSPF::DatabaseDescriptionHandler::ProcessPacket().

00344 {
00345     EV << eventString;
00346     if ((onInterface != NULL) || (forNeighbor != NULL)) {
00347         EV << ": ";
00348     }
00349     if (forNeighbor != NULL) {
00350         char addressString[16];
00351         EV << "neighbor["
00352            << AddressStringFromULong(addressString, sizeof(addressString), forNeighbor->GetNeighborID())
00353            << "] (state: "
00354            << forNeighbor->GetStateString(forNeighbor->GetState())
00355            << "); ";
00356     }
00357     if (onInterface != NULL) {
00358         EV << "interface["
00359            << static_cast <short> (onInterface->GetIfIndex())
00360            << "] ";
00361         switch (onInterface->GetType()) {
00362             case OSPF::Interface::PointToPoint:      EV << "(PointToPoint)";
00363                                                      break;
00364             case OSPF::Interface::Broadcast:         EV << "(Broadcast)";
00365                                                      break;
00366             case OSPF::Interface::NBMA:              EV << "(NBMA).\n";
00367                                                      break;
00368             case OSPF::Interface::PointToMultiPoint: EV << "(PointToMultiPoint)";
00369                                                      break;
00370             case OSPF::Interface::Virtual:           EV << "(Virtual)";
00371                                                      break;
00372             default:                                 EV << "(Unknown)";
00373         }
00374         EV << " (state: "
00375            << onInterface->GetStateString(onInterface->GetState())
00376            << ")";
00377     }
00378     EV << ".\n";
00379 }

void OSPF::MessageHandler::PrintHelloPacket ( const OSPFHelloPacket *  helloPacket,
IPv4Address  destination,
int  outputIfIndex 
) const

Referenced by SendPacket().

00382 {
00383     char addressString[16];
00384     EV << "Sending Hello packet to "
00385        << AddressStringFromIPv4Address(addressString, sizeof(addressString), destination)
00386        << " on interface["
00387        << outputIfIndex
00388        << "] with contents:\n";
00389     EV << "  netMask="
00390        << AddressStringFromULong(addressString, sizeof(addressString), helloPacket->getNetworkMask().getInt())
00391        << "\n";
00392     EV << "  DR="
00393        << AddressStringFromULong(addressString, sizeof(addressString), helloPacket->getDesignatedRouter().getInt())
00394        << "\n";
00395     EV << "  BDR="
00396        << AddressStringFromULong(addressString, sizeof(addressString), helloPacket->getBackupDesignatedRouter().getInt())
00397        << "\n";
00398     EV << "  neighbors:\n";
00399 
00400     unsigned int neighborCount = helloPacket->getNeighborArraySize();
00401     for (unsigned int i = 0; i < neighborCount; i++) {
00402         EV << "    "
00403            << AddressStringFromULong(addressString, sizeof(addressString), helloPacket->getNeighbor(i).getInt())
00404            << "\n";
00405     }
00406 }

void OSPF::MessageHandler::PrintDatabaseDescriptionPacket ( const OSPFDatabaseDescriptionPacket *  ddPacket,
IPv4Address  destination,
int  outputIfIndex 
) const

Referenced by SendPacket().

00409 {
00410     char addressString[16];
00411     EV << "Sending Database Description packet to "
00412        << AddressStringFromIPv4Address(addressString, sizeof(addressString), destination)
00413        << " on interface["
00414        << outputIfIndex
00415        << "] with contents:\n";
00416 
00417     const OSPFDDOptions& ddOptions = ddPacket->getDdOptions();
00418     EV << "  ddOptions="
00419        << ((ddOptions.I_Init) ? "I " : "_ ")
00420        << ((ddOptions.M_More) ? "M " : "_ ")
00421        << ((ddOptions.MS_MasterSlave) ? "MS" : "__")
00422        << "\n";
00423     EV << "  seqNumber="
00424        << ddPacket->getDdSequenceNumber()
00425        << "\n";
00426     EV << "  LSA headers:\n";
00427 
00428     unsigned int lsaCount = ddPacket->getLsaHeadersArraySize();
00429     for (unsigned int i = 0; i < lsaCount; i++) {
00430         EV << "    ";
00431         PrintLSAHeader(ddPacket->getLsaHeaders(i), ev.getOStream());
00432         EV << "\n";
00433     }
00434 }

void OSPF::MessageHandler::PrintLinkStateRequestPacket ( const OSPFLinkStateRequestPacket *  requestPacket,
IPv4Address  destination,
int  outputIfIndex 
) const

Referenced by SendPacket().

00437 {
00438     char addressString[16];
00439     EV << "Sending Link State Request packet to "
00440        << AddressStringFromIPv4Address(addressString, sizeof(addressString), destination)
00441        << " on interface["
00442        << outputIfIndex
00443        << "] with requests:\n";
00444 
00445     unsigned int requestCount = requestPacket->getRequestsArraySize();
00446     for (unsigned int i = 0; i < requestCount; i++) {
00447         const LSARequest& request = requestPacket->getRequests(i);
00448         EV << "  type="
00449            << request.lsType
00450            << ", LSID="
00451            << AddressStringFromULong(addressString, sizeof(addressString), request.linkStateID);
00452         EV << ", advertisingRouter="
00453            << AddressStringFromULong(addressString, sizeof(addressString), request.advertisingRouter.getInt())
00454            << "\n";
00455     }
00456 }

void OSPF::MessageHandler::PrintLinkStateUpdatePacket ( const OSPFLinkStateUpdatePacket *  updatePacket,
IPv4Address  destination,
int  outputIfIndex 
) const

Referenced by SendPacket().

00459 {
00460     char addressString[16];
00461     EV << "Sending Link State Update packet to "
00462        << AddressStringFromIPv4Address(addressString, sizeof(addressString), destination)
00463        << " on interface["
00464        << outputIfIndex
00465        << "] with updates:\n";
00466 
00467     unsigned int i           = 0;
00468     unsigned int updateCount = updatePacket->getRouterLSAsArraySize();
00469 
00470     for (i = 0; i < updateCount; i++) {
00471         const OSPFRouterLSA& lsa = updatePacket->getRouterLSAs(i);
00472         EV << "  ";
00473         PrintLSAHeader(lsa.getHeader(), ev.getOStream());
00474         EV << "\n";
00475 
00476         EV << "  bits="
00477            << ((lsa.getV_VirtualLinkEndpoint()) ? "V " : "_ ")
00478            << ((lsa.getE_ASBoundaryRouter()) ? "E " : "_ ")
00479            << ((lsa.getB_AreaBorderRouter()) ? "B" : "_")
00480            << "\n";
00481         EV << "  links:\n";
00482 
00483         unsigned int linkCount = lsa.getLinksArraySize();
00484         for (unsigned int j = 0; j < linkCount; j++) {
00485             const Link& link = lsa.getLinks(j);
00486             EV << "    ID="
00487                << AddressStringFromULong(addressString, sizeof(addressString), link.getLinkID().getInt())
00488                << ",";
00489             EV << " data="
00490                << AddressStringFromULong(addressString, sizeof(addressString), link.getLinkData())
00491                << ", type=";
00492             switch (link.getType()) {
00493                 case PointToPointLink:  EV << "PointToPoint";   break;
00494                 case TransitLink:       EV << "Transit";        break;
00495                 case StubLink:          EV << "Stub";           break;
00496                 case VirtualLink:       EV << "Virtual";        break;
00497                 default:                EV << "Unknown";        break;
00498             }
00499             EV << ", cost="
00500                << link.getLinkCost()
00501                << "\n";
00502         }
00503     }
00504 
00505     updateCount = updatePacket->getNetworkLSAsArraySize();
00506     for (i = 0; i < updateCount; i++) {
00507         const OSPFNetworkLSA& lsa = updatePacket->getNetworkLSAs(i);
00508         EV << "  ";
00509         PrintLSAHeader(lsa.getHeader(), ev.getOStream());
00510         EV << "\n";
00511 
00512         EV << "  netMask="
00513            << AddressStringFromULong(addressString, sizeof(addressString), lsa.getNetworkMask().getInt())
00514            << "\n";
00515         EV << "  attachedRouters:\n";
00516 
00517         unsigned int routerCount = lsa.getAttachedRoutersArraySize();
00518         for (unsigned int j = 0; j < routerCount; j++) {
00519             EV << "    "
00520                << AddressStringFromULong(addressString, sizeof(addressString), lsa.getAttachedRouters(j).getInt())
00521                << "\n";
00522         }
00523     }
00524 
00525     updateCount = updatePacket->getSummaryLSAsArraySize();
00526     for (i = 0; i < updateCount; i++) {
00527         const OSPFSummaryLSA& lsa = updatePacket->getSummaryLSAs(i);
00528         EV << "  ";
00529         PrintLSAHeader(lsa.getHeader(), ev.getOStream());
00530         EV << "\n";
00531 
00532         EV << "  netMask="
00533            << AddressStringFromULong(addressString, sizeof(addressString), lsa.getNetworkMask().getInt())
00534            << "\n";
00535         EV << "  cost="
00536            << lsa.getRouteCost()
00537            << "\n";
00538     }
00539 
00540     updateCount = updatePacket->getAsExternalLSAsArraySize();
00541     for (i = 0; i < updateCount; i++) {
00542         const OSPFASExternalLSA& lsa = updatePacket->getAsExternalLSAs(i);
00543         EV << "  ";
00544         PrintLSAHeader(lsa.getHeader(), ev.getOStream());
00545         EV << "\n";
00546 
00547         const OSPFASExternalLSAContents& contents = lsa.getContents();
00548         EV << "  netMask="
00549            << AddressStringFromULong(addressString, sizeof(addressString), contents.getNetworkMask().getInt())
00550            << "\n";
00551         EV << "  bits="
00552            << ((contents.getE_ExternalMetricType()) ? "E\n" : "_\n");
00553         EV << "  cost="
00554            << contents.getRouteCost()
00555            << "\n";
00556         EV << "  forward="
00557            << AddressStringFromULong(addressString, sizeof(addressString), contents.getForwardingAddress().getInt())
00558            << "\n";
00559     }
00560 }

void OSPF::MessageHandler::PrintLinkStateAcknowledgementPacket ( const OSPFLinkStateAcknowledgementPacket *  ackPacket,
IPv4Address  destination,
int  outputIfIndex 
) const

Referenced by SendPacket().

00563 {
00564     char addressString[16];
00565     EV << "Sending Link State Acknowledgement packet to "
00566        << AddressStringFromIPv4Address(addressString, sizeof(addressString), destination)
00567        << " on interface["
00568        << outputIfIndex
00569        << "] with acknowledgements:\n";
00570 
00571     unsigned int lsaCount = ackPacket->getLsaHeadersArraySize();
00572     for (unsigned int i = 0; i < lsaCount; i++) {
00573         EV << "    ";
00574         PrintLSAHeader(ackPacket->getLsaHeaders(i), ev.getOStream());
00575         EV << "\n";
00576     }
00577 }

bool OSPF::MessageHandler::AuthenticatePacket ( OSPFPacket *  packet  )  [inline]

Referenced by ProcessPacket().

00064 { return true; }


Member Data Documentation

cSimpleModule* OSPF::MessageHandler::ospfModule [private]

Referenced by ClearTimer(), SendPacket(), and StartTimer().

Referenced by ProcessPacket().

Referenced by ProcessPacket().

Referenced by ProcessPacket().

Referenced by ProcessPacket().

Referenced by ProcessPacket().


The documentation for this class was generated from the following files:

Generated on Fri Mar 20 18:51:23 2009 for INET Framework for OMNeT++/OMNEST by  doxygen 1.5.5