INET Framework for OMNeT++/OMNEST
AnsaOspf6::LinkStateRequestHandler Class Reference

#include <ansaLinkStateRequestHandler6.h>

Inheritance diagram for AnsaOspf6::LinkStateRequestHandler:
AnsaOspf6::IMessageHandler

List of all members.

Public Member Functions

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

Detailed Description

Definition at line 23 of file ansaLinkStateRequestHandler6.h.


Constructor & Destructor Documentation


Member Function Documentation

Implements AnsaOspf6::IMessageHandler.

Definition at line 25 of file ansaLinkStateRequestHandler6.cc.

                                                             {

   router->GetMessageHandler()->PrintEvent("Link State Request packet received", intf, neighbor);

   AnsaOspf6::Neighbor::NeighborStateType neighborState = neighbor->GetState();

   if ((neighborState == AnsaOspf6::Neighbor::ExchangeState) || (neighborState
         == AnsaOspf6::Neighbor::LoadingState) || (neighborState == AnsaOspf6::Neighbor::FullState)){
      OspfLinkStateRequestPacket6* lsRequestPacket = check_and_cast<OspfLinkStateRequestPacket6*> (packet);

      unsigned long requestCount = lsRequestPacket->getRequestsArraySize();
      bool error = false;
      std::vector<OspfLsa6*> lsas;

      EV<< "  Processing packet contents:\n";

      for (unsigned long i = 0; i < requestCount; i++){
         OspfLsaRequest6& request = lsRequestPacket->getRequests(i);
         AnsaOspf6::LsaKeyType6 lsaKey;
         char addressString[16];

         EV << "    LSARequest: type="
         << request.lsType
         << ", LSID="
         << request.linkStateID
         << ", advertisingRouter="
         << IPAddress(request.advertisingRouter) << endl;

         lsaKey.linkStateID = request.linkStateID;
         lsaKey.advertisingRouter = request.advertisingRouter;

         OspfLsa6* lsaInDatabase = router->FindLSA(static_cast<LsaType6> (request.lsType), lsaKey, intf->GetArea()->GetAreaID());

         if (lsaInDatabase != NULL){
            lsas.push_back(lsaInDatabase);
         }else{
            error = true;
            neighbor->ProcessEvent(AnsaOspf6::Neighbor::BadLinkStateRequest);
            break;
         }
      }

      if (!error){
         int updatesCount = lsas.size();
         int ttl          = (intf->GetType() == AnsaOspf6::Interface::Virtual) ? VIRTUAL_LINK_TTL : 1;
         AnsaOspf6::MessageHandler* messageHandler = router->GetMessageHandler();

         for (int j = 0; j < updatesCount; j++) {
            OspfLinkStateUpdatePacket6* updatePacket = intf->CreateUpdatePacket(lsas[j]);
            if (updatePacket != NULL) {
               if (intf->GetType() == AnsaOspf6::Interface::Broadcast) {
                  if ((intf->GetState() == AnsaOspf6::Interface::DesignatedRouterState) ||
                        (intf->GetState() == AnsaOspf6::Interface::BackupState) ||
                        (intf->GetDesignatedRouter() == AnsaOspf6::NullDesignatedRouterID))
                  {
                     messageHandler->SendPacket(updatePacket, AnsaOspf6::AllSPFRouters, intf->GetIfIndex(), ttl);
                  }else{
                     messageHandler->SendPacket(updatePacket, AnsaOspf6::AllDRouters, intf->GetIfIndex(), ttl);
                  }
               }else{
                  if (intf->GetType() == AnsaOspf6::Interface::PointToPoint) {
                     messageHandler->SendPacket(updatePacket, AnsaOspf6::AllSPFRouters, intf->GetIfIndex(), ttl);
                  }else{
                     messageHandler->SendPacket(updatePacket, neighbor->GetAddress(), intf->GetIfIndex(), ttl);
                  }
               }

            }
         }
      }
   }
}

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