INET Framework for OMNeT++/OMNEST
AnsaRouterLSA.cc
Go to the documentation of this file.
00001 #include "AnsaLSA.h"
00002 
00003 bool AnsaOSPF::RouterLSA::Update(const OSPFRouterLSA* lsa)
00004 {
00005     EV << "-----------------------------------------------------\n";
00006     PrintLSAHeader(lsa->getHeader(), ev.getOStream());
00007     EV << "-----------------------------------------------------\n";
00008     PrintLSAHeader(this->getHeader(), ev.getOStream());
00009     EV << "-----------------------------------------------------\n";
00010     bool different = DiffersFrom(lsa);
00011     (*this) = (*lsa);
00012     ResetInstallTime();
00013     if (different) {
00014         ClearNextHops();
00015         return true;
00016     } else {
00017         return false;
00018     }
00019 }
00020 
00021 bool AnsaOSPF::RouterLSA::DiffersFrom(const OSPFRouterLSA* routerLSA) const
00022 {
00023     const OSPFLSAHeader& lsaHeader = routerLSA->getHeader();
00024     bool differentHeader = ((header_var.getLsOptions() != lsaHeader.getLsOptions()) ||
00025                             ((header_var.getLsAge() == MAX_AGE) && (lsaHeader.getLsAge() != MAX_AGE)) ||
00026                             ((header_var.getLsAge() != MAX_AGE) && (lsaHeader.getLsAge() == MAX_AGE)) ||
00027                             (header_var.getLsaLength() != lsaHeader.getLsaLength()));
00028     bool differentBody   = false;
00029 
00030     if (!differentHeader) {
00031         differentBody = ((V_VirtualLinkEndpoint_var != routerLSA->getV_VirtualLinkEndpoint()) ||
00032                          (E_ASBoundaryRouter_var != routerLSA->getE_ASBoundaryRouter()) ||
00033                          (B_AreaBorderRouter_var != routerLSA->getB_AreaBorderRouter()) ||
00034                          (numberOfLinks_var != routerLSA->getNumberOfLinks()) ||
00035                          (links_arraysize != routerLSA->getLinksArraySize()));
00036 
00037         if (!differentBody) {
00038             unsigned int linkCount = links_arraysize;
00039             for (unsigned int i = 0; i < linkCount; i++) {
00040                 bool differentLink = ((links_var[i].getLinkID() != routerLSA->getLinks(i).getLinkID()) ||
00041                                       (links_var[i].getLinkData() != routerLSA->getLinks(i).getLinkData()) ||
00042                                       (links_var[i].getType() != routerLSA->getLinks(i).getType()) ||
00043                                       (links_var[i].getNumberOfTOS() != routerLSA->getLinks(i).getNumberOfTOS()) ||
00044                                       (links_var[i].getLinkCost() != routerLSA->getLinks(i).getLinkCost()) ||
00045                                       (links_var[i].getTosDataArraySize() != routerLSA->getLinks(i).getTosDataArraySize()));
00046 
00047                 if (!differentLink) {
00048                     unsigned int tosCount = links_var[i].getTosDataArraySize();
00049                     for (unsigned int j = 0; j < tosCount; j++) {
00050                         bool differentTOS = ((links_var[i].getTosData(j).tos != routerLSA->getLinks(i).getTosData(j).tos) ||
00051                                              (links_var[i].getTosData(j).tosMetric[0] != routerLSA->getLinks(i).getTosData(j).tosMetric[0]) ||
00052                                              (links_var[i].getTosData(j).tosMetric[1] != routerLSA->getLinks(i).getTosData(j).tosMetric[1]) ||
00053                                              (links_var[i].getTosData(j).tosMetric[2] != routerLSA->getLinks(i).getTosData(j).tosMetric[2]));
00054 
00055                         if (differentTOS) {
00056                             differentLink = true;
00057                             break;
00058                         }
00059                     }
00060                 }
00061 
00062                 if (differentLink) {
00063                     differentBody = true;
00064                     break;
00065                 }
00066             }
00067         }
00068     }
00069 
00070     return (differentHeader || differentBody);
00071 }