OSPF::LinkStateRequestHandler Class Reference

#include <LinkStateRequestHandler.h>

Inheritance diagram for OSPF::LinkStateRequestHandler:

OSPF::IMessageHandler List of all members.

Public Member Functions

 LinkStateRequestHandler (Router *containingRouter)
void ProcessPacket (OSPFPacket *packet, Interface *intf, Neighbor *neighbor)

Constructor & Destructor Documentation

OSPF::LinkStateRequestHandler::LinkStateRequestHandler ( Router containingRouter  ) 

00006                                                                                   :
00007     OSPF::IMessageHandler (containingRouter)
00008 {
00009 }


Member Function Documentation

void OSPF::LinkStateRequestHandler::ProcessPacket ( OSPFPacket packet,
Interface intf,
Neighbor neighbor 
) [virtual]

Implements OSPF::IMessageHandler.

00012 {
00013     router->GetMessageHandler ()->PrintEvent ("Link State Request packet received", intf, neighbor);
00014 
00015     OSPF::Neighbor::NeighborStateType neighborState = neighbor->GetState ();
00016 
00017     if ((neighborState == OSPF::Neighbor::ExchangeState) ||
00018         (neighborState == OSPF::Neighbor::LoadingState) ||
00019         (neighborState == OSPF::Neighbor::FullState))
00020     {
00021         OSPFLinkStateRequestPacket* lsRequestPacket = check_and_cast<OSPFLinkStateRequestPacket*> (packet);
00022 
00023         unsigned long         requestCount = lsRequestPacket->getRequestsArraySize ();
00024         bool                  error        = false;
00025         std::vector<OSPFLSA*> lsas;
00026 
00027         EV << "  Processing packet contents:\n";
00028 
00029         for (unsigned long i = 0; i < requestCount; i++) {
00030             LSARequest&      request = lsRequestPacket->getRequests (i);
00031             OSPF::LSAKeyType lsaKey;
00032             char             addressString[16];
00033 
00034             EV << "    LSARequest: type="
00035                << request.lsType
00036                << ", LSID="
00037                << AddressStringFromULong (addressString, sizeof (addressString), request.linkStateID)
00038                << ", advertisingRouter="
00039                << AddressStringFromULong (addressString, sizeof (addressString), request.advertisingRouter.getInt ())
00040                << "\n";
00041 
00042             lsaKey.linkStateID = request.linkStateID;
00043             lsaKey.advertisingRouter = request.advertisingRouter.getInt ();
00044 
00045             OSPFLSA* lsaInDatabase = router->FindLSA (static_cast<LSAType> (request.lsType), lsaKey, intf->GetArea ()->GetAreaID ());
00046 
00047             if (lsaInDatabase != NULL) {
00048                 lsas.push_back (lsaInDatabase);
00049             } else {
00050                 error = true;
00051                 neighbor->ProcessEvent (OSPF::Neighbor::BadLinkStateRequest);
00052                 break;
00053             }
00054         }
00055 
00056         if (!error) {
00057             int                   updatesCount   = lsas.size ();
00058             int                   ttl            = (intf->GetType () == OSPF::Interface::Virtual) ? VIRTUAL_LINK_TTL : 1;
00059             OSPF::MessageHandler* messageHandler = router->GetMessageHandler ();
00060 
00061             for (int j = 0; j < updatesCount; j++) {
00062                 OSPFLinkStateUpdatePacket* updatePacket = intf->CreateUpdatePacket (lsas[j]);
00063                 if (updatePacket != NULL) {
00064                     if (intf->GetType () == OSPF::Interface::Broadcast) {
00065                         if ((intf->GetState () == OSPF::Interface::DesignatedRouterState) ||
00066                             (intf->GetState () == OSPF::Interface::BackupState) ||
00067                             (intf->GetDesignatedRouter () == OSPF::NullDesignatedRouterID))
00068                         {
00069                             messageHandler->SendPacket (updatePacket, OSPF::AllSPFRouters, intf->GetIfIndex (), ttl);
00070                         } else {
00071                             messageHandler->SendPacket (updatePacket, OSPF::AllDRouters, intf->GetIfIndex (), ttl);
00072                         }
00073                     } else {
00074                         if (intf->GetType () == OSPF::Interface::PointToPoint) {
00075                             messageHandler->SendPacket (updatePacket, OSPF::AllSPFRouters, intf->GetIfIndex (), ttl);
00076                         } else {
00077                             messageHandler->SendPacket (updatePacket, neighbor->GetAddress (), intf->GetIfIndex (), ttl);
00078                         }
00079                     }
00080 
00081                 }
00082             }
00083             // These update packets should not be placed on retransmission lists
00084         }
00085     }
00086 }


The documentation for this class was generated from the following files:
Generated on Wed Apr 4 13:20:25 2007 for INET Framework for OMNeT++/OMNEST by  doxygen 1.4.7