INET Framework for OMNeT++/OMNEST
AnsaLinkStateAcknowledgementHandler.cc
Go to the documentation of this file.
00001 #include "AnsaLinkStateAcknowledgementHandler.h"
00002 #include "AnsaOSPFRouter.h"
00003 
00004 AnsaOSPF::LinkStateAcknowledgementHandler::LinkStateAcknowledgementHandler(AnsaOSPF::Router* containingRouter) :
00005     AnsaOSPF::IMessageHandler(containingRouter)
00006 {
00007 }
00008 
00009 void AnsaOSPF::LinkStateAcknowledgementHandler::ProcessPacket(OSPFPacket* packet, AnsaOSPF::Interface* intf, AnsaOSPF::Neighbor* neighbor)
00010 {
00011     router->GetMessageHandler()->PrintEvent("Link State Acknowledgement packet received", intf, neighbor);
00012 
00013     if (neighbor->GetState() >= AnsaOSPF::Neighbor::ExchangeState) {
00014         OSPFLinkStateAcknowledgementPacket* lsAckPacket = check_and_cast<OSPFLinkStateAcknowledgementPacket*> (packet);
00015 
00016         int  lsaCount = lsAckPacket->getLsaHeadersArraySize();
00017 
00018         EV << "  Processing packet contents:\n";
00019 
00020         for (int i  = 0; i < lsaCount; i++) {
00021             OSPFLSAHeader&   lsaHeader = lsAckPacket->getLsaHeaders(i);
00022             OSPFLSA*         lsaOnRetransmissionList;
00023             AnsaOSPF::LSAKeyType lsaKey;
00024 
00025             EV << "    ";
00026             PrintLSAHeader(lsaHeader, ev.getOStream());
00027             EV << "\n";
00028 
00029             lsaKey.linkStateID = lsaHeader.getLinkStateID();
00030             lsaKey.advertisingRouter = lsaHeader.getAdvertisingRouter().getInt();
00031 
00032             if ((lsaOnRetransmissionList = neighbor->FindOnRetransmissionList(lsaKey)) != NULL) {
00033                 if (operator== (lsaHeader, lsaOnRetransmissionList->getHeader())) {
00034                     neighbor->RemoveFromRetransmissionList(lsaKey);
00035                 } else {
00036                     EV << "Got an Acknowledgement packet for an unsent Update packet.\n";
00037                 }
00038             }
00039         }
00040         if (neighbor->IsLinkStateRetransmissionListEmpty()) {
00041             neighbor->ClearUpdateRetransmissionTimer();
00042         }
00043     }
00044 }