Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "LSA.h"
00019
00020 bool OSPF::SummaryLSA::Update(const OSPFSummaryLSA* lsa)
00021 {
00022 bool different = DiffersFrom(lsa);
00023 (*this) = (*lsa);
00024 ResetInstallTime();
00025 if (different) {
00026 ClearNextHops();
00027 return true;
00028 } else {
00029 return false;
00030 }
00031 }
00032
00033 bool OSPF::SummaryLSA::DiffersFrom(const OSPFSummaryLSA* summaryLSA) const
00034 {
00035 const OSPFLSAHeader& lsaHeader = summaryLSA->getHeader();
00036 bool differentHeader = ((header_var.getLsOptions() != lsaHeader.getLsOptions()) ||
00037 ((header_var.getLsAge() == MAX_AGE) && (lsaHeader.getLsAge() != MAX_AGE)) ||
00038 ((header_var.getLsAge() != MAX_AGE) && (lsaHeader.getLsAge() == MAX_AGE)) ||
00039 (header_var.getLsaLength() != lsaHeader.getLsaLength()));
00040 bool differentBody = false;
00041
00042 if (!differentHeader) {
00043 differentBody = ((networkMask_var != summaryLSA->getNetworkMask()) ||
00044 (routeCost_var != summaryLSA->getRouteCost()) ||
00045 (tosData_arraysize != summaryLSA->getTosDataArraySize()));
00046
00047 if (!differentBody) {
00048 unsigned int tosCount = tosData_arraysize;
00049 for (unsigned int i = 0; i < tosCount; i++) {
00050 if ((tosData_var[i].tos != summaryLSA->getTosData(i).tos) ||
00051 (tosData_var[i].tosMetric[0] != summaryLSA->getTosData(i).tosMetric[0]) ||
00052 (tosData_var[i].tosMetric[1] != summaryLSA->getTosData(i).tosMetric[1]) ||
00053 (tosData_var[i].tosMetric[2] != summaryLSA->getTosData(i).tosMetric[2]))
00054 {
00055 differentBody = true;
00056 break;
00057 }
00058 }
00059 }
00060 }
00061
00062 return (differentHeader || differentBody);
00063 }