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::ASExternalLSA::Update(const OSPFASExternalLSA* 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::ASExternalLSA::DiffersFrom(const OSPFASExternalLSA* asExternalLSA) const
00034 {
00035 const OSPFLSAHeader& lsaHeader = asExternalLSA->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 const OSPFASExternalLSAContents& lsaContents = asExternalLSA->getContents();
00044 unsigned int tosInfoCount = contents_var.getExternalTOSInfoArraySize();
00045
00046 differentBody = ((contents_var.getNetworkMask() != lsaContents.getNetworkMask()) ||
00047 (contents_var.getE_ExternalMetricType() != lsaContents.getE_ExternalMetricType()) ||
00048 (contents_var.getRouteCost() != lsaContents.getRouteCost()) ||
00049 (contents_var.getForwardingAddress() != lsaContents.getForwardingAddress()) ||
00050 (contents_var.getExternalRouteTag() != lsaContents.getExternalRouteTag()) ||
00051 (tosInfoCount != lsaContents.getExternalTOSInfoArraySize()));
00052
00053 if (!differentBody) {
00054 for (unsigned int i = 0; i < tosInfoCount; i++) {
00055 const ExternalTOSInfo& currentTOSInfo = contents_var.getExternalTOSInfo(i);
00056 const ExternalTOSInfo& lsaTOSInfo = lsaContents.getExternalTOSInfo(i);
00057
00058 if ((currentTOSInfo.tosData.tos != lsaTOSInfo.tosData.tos) ||
00059 (currentTOSInfo.tosData.tosMetric[0] != lsaTOSInfo.tosData.tosMetric[0]) ||
00060 (currentTOSInfo.tosData.tosMetric[1] != lsaTOSInfo.tosData.tosMetric[1]) ||
00061 (currentTOSInfo.tosData.tosMetric[2] != lsaTOSInfo.tosData.tosMetric[2]) ||
00062 (currentTOSInfo.E_ExternalMetricType != lsaTOSInfo.E_ExternalMetricType) ||
00063 (currentTOSInfo.forwardingAddress != lsaTOSInfo.forwardingAddress) ||
00064 (currentTOSInfo.externalRouteTag != lsaTOSInfo.externalRouteTag))
00065 {
00066 differentBody = true;
00067 break;
00068 }
00069 }
00070 }
00071 }
00072
00073 return (differentHeader || differentBody);
00074 }