|
INET Framework for OMNeT++/OMNEST
|
00001 // 00002 // This program is free software: you can redistribute it and/or modify 00003 // it under the terms of the GNU Lesser General Public License as published by 00004 // the Free Software Foundation, either version 3 of the License, or 00005 // (at your option) any later version. 00006 // 00007 // This program is distributed in the hope that it will be useful, 00008 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00009 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00010 // GNU Lesser General Public License for more details. 00011 // 00012 // You should have received a copy of the GNU Lesser General Public License 00013 // along with this program. If not, see http://www.gnu.org/licenses/. 00014 // 00015 00016 #include "ansaOspfArea6.h" 00017 #include "ansaOspfRouter6.h" 00018 #include "ansaMessageHandler6.h" 00019 00020 #include "ansaOspfNeighbor6.h" 00021 #include "ansaOspfNeighborState6.h" 00022 #include "ansaOspfNeighborStateDown6.h" 00023 00024 // FIXME!!! Should come from a global unique number generator module. 00025 unsigned long AnsaOspf6::Neighbor::ddSequenceNumberInitSeed = 0; 00026 00027 AnsaOspf6::Neighbor::Neighbor(RouterID neighbor) : 00028 updateRetransmissionTimerActive(false), 00029 requestRetransmissionTimerActive(false), 00030 firstAdjacencyInited(false), 00031 ddSequenceNumber(0), 00032 neighborID(neighbor), 00033 neighborPriority(0), 00034 neighborIPAddress(IPv6Address::UNSPECIFIED_ADDRESS), 00035 neighborsDesignatedRouter(AnsaOspf6::NullDesignatedRouterID), 00036 neighborsBackupDesignatedRouter(AnsaOspf6::NullDesignatedRouterID), 00037 designatedRoutersSetUp(false), 00038 neighborsRouterDeadInterval(40), 00039 lastTransmittedDDPacket(NULL){ 00040 00041 inactivityTimer = new OspfTimer6; 00042 inactivityTimer->setTimerKind(NeighborInactivityTimer); 00043 inactivityTimer->setContextPointer(this); 00044 inactivityTimer->setName("AnsaOspf6::Neighbor::NeighborInactivityTimer"); 00045 pollTimer = new OspfTimer6; 00046 pollTimer->setTimerKind(NeighborPollTimer); 00047 pollTimer->setContextPointer(this); 00048 pollTimer->setName("AnsaOspf6::Neighbor::NeighborPollTimer"); 00049 00050 /* TODO 00051 ddRetransmissionTimer = new OspfTimer6; 00052 ddRetransmissionTimer->setTimerKind(NeighborDDRetransmissionTimer); 00053 ddRetransmissionTimer->setContextPointer(this); 00054 ddRetransmissionTimer->setName("AnsaOspf6::Neighbor::NeighborDDRetransmissionTimer"); 00055 updateRetransmissionTimer = new OspfTimer6; 00056 updateRetransmissionTimer->setTimerKind(NeighborUpdateRetransmissionTimer); 00057 updateRetransmissionTimer->setContextPointer(this); 00058 updateRetransmissionTimer->setName("AnsaOspf6::Neighbor::Neighbor::NeighborUpdateRetransmissionTimer"); 00059 requestRetransmissionTimer = new OspfTimer6; 00060 requestRetransmissionTimer->setTimerKind(NeighborRequestRetransmissionTimer); 00061 requestRetransmissionTimer->setContextPointer(this); 00062 requestRetransmissionTimer->setName("AnsaOspf6::Neighbor::NeighborRequestRetransmissionTimer"); 00063 00064 memset(&lastReceivedDDPacket, 0, sizeof(AnsaOspf6::Neighbor::DDPacketID)); 00065 // setting only I and M bits is invalid -> good initializer 00066 lastReceivedDDPacket.ddOptions.I_Init = true; 00067 lastReceivedDDPacket.ddOptions.M_More = true; 00068 */ 00069 00070 state = new AnsaOspf6::NeighborStateDown; 00071 previousState = NULL; 00072 } 00073 00074 AnsaOspf6::Neighbor::~Neighbor(void){ 00075 Reset(); 00076 MessageHandler* messageHandler = parentInterface->GetArea()->GetRouter()->GetMessageHandler(); 00077 00078 if (inactivityTimer != NULL){ 00079 messageHandler->ClearTimer(inactivityTimer); 00080 delete inactivityTimer; 00081 } 00082 00083 if (pollTimer != NULL){ 00084 messageHandler->ClearTimer(pollTimer); 00085 delete pollTimer; 00086 } 00087 00088 /* 00089 delete ddRetransmissionTimer; 00090 delete updateRetransmissionTimer; 00091 delete requestRetransmissionTimer; 00092 */ 00093 00094 if (previousState != NULL) { 00095 delete previousState; 00096 } 00097 delete state; 00098 } 00099 00100 void AnsaOspf6::Neighbor::ChangeState(NeighborState* newState, NeighborState* currentState) { 00101 if (previousState != NULL){ 00102 delete previousState; 00103 } 00104 state = newState; 00105 previousState = currentState; 00106 } 00107 00108 void AnsaOspf6::Neighbor::ProcessEvent(AnsaOspf6::Neighbor::NeighborEventType event) { 00109 state->ProcessEvent(this, event); 00110 } 00111 00112 void AnsaOspf6::Neighbor::Reset(void) { 00113 00114 /* TODO: 00115 for (std::list<OspfLsa6*>::iterator retIt = linkStateRetransmissionList.begin(); retIt 00116 != linkStateRetransmissionList.end(); retIt++){ 00117 delete (*retIt); 00118 } 00119 linkStateRetransmissionList.clear(); 00120 00121 std::list<OspfLsaHeader6*>::iterator it; 00122 for (it = databaseSummaryList.begin(); it != databaseSummaryList.end(); it++){ 00123 delete (*it); 00124 } 00125 databaseSummaryList.clear(); 00126 for (it = linkStateRequestList.begin(); it != linkStateRequestList.end(); it++){ 00127 delete (*it); 00128 } 00129 linkStateRequestList.clear(); 00130 00131 parentInterface->GetArea()->GetRouter()->GetMessageHandler()->ClearTimer(ddRetransmissionTimer); 00132 ClearUpdateRetransmissionTimer(); 00133 ClearRequestRetransmissionTimer(); 00134 00135 if (lastTransmittedDDPacket != NULL){ 00136 delete lastTransmittedDDPacket; 00137 lastTransmittedDDPacket = NULL; 00138 } 00139 */ 00140 } 00141 00142 void AnsaOspf6::Neighbor::InitFirstAdjacency(void) { 00143 ddSequenceNumber = GetUniqueULong(); 00144 firstAdjacencyInited = true; 00145 } 00146 00147 unsigned long AnsaOspf6::Neighbor::GetUniqueULong(void) { 00148 return (ddSequenceNumberInitSeed++); 00149 } 00150 00151 AnsaOspf6::Neighbor::NeighborStateType AnsaOspf6::Neighbor::GetState(void) const { 00152 return state->GetState(); 00153 } 00154 00155 const char* AnsaOspf6::Neighbor::GetStateString(AnsaOspf6::Neighbor::NeighborStateType stateType) { 00156 switch (stateType){ 00157 case DownState: 00158 return "Down"; 00159 case AttemptState: 00160 return "Attempt"; 00161 case InitState: 00162 return "Init"; 00163 case TwoWayState: 00164 return "TwoWay"; 00165 case ExchangeStartState: 00166 return "ExchangeStart"; 00167 case ExchangeState: 00168 return "Exchange"; 00169 case LoadingState: 00170 return "Loading"; 00171 case FullState: 00172 return "Full"; 00173 default: 00174 ASSERT(false); 00175 } 00176 return ""; 00177 } 00178 00179 void AnsaOspf6::Neighbor::SendDatabaseDescriptionPacket(bool init) { 00180 OspfDatabaseDescriptionPacket6* ddPacket = new OspfDatabaseDescriptionPacket6; 00181 00182 ddPacket->setType(DatabaseDescriptionPacket); 00183 ddPacket->setRouterID(parentInterface->GetArea()->GetRouter()->GetRouterID()); 00184 ddPacket->setAreaID(parentInterface->GetArea()->GetAreaID()); 00185 00186 if (parentInterface->GetType() != AnsaOspf6::Interface::Virtual){ 00187 ddPacket->setInterfaceMtu(parentInterface->GetMtu()); 00188 }else{ 00189 ddPacket->setInterfaceMtu(0); 00190 } 00191 00192 OspfOptions6 options; 00193 memset(&options, 0, sizeof(OspfOptions6)); 00194 options.E_ExternalRoutingCapability = parentInterface->GetArea()->GetExternalRoutingCapability(); 00195 ddPacket->setOptions(options); 00196 00197 ddPacket->setDdSequenceNumber(ddSequenceNumber); 00198 00199 if (init || databaseSummaryList.empty()){ 00200 ddPacket->setLsaHeadersArraySize(0); 00201 }else{ 00202 // delete included LSAs from summary list 00203 // (they are still in lastTransmittedDDPacket) 00204 while (!databaseSummaryList.empty()){ 00205 unsigned long headerCount = ddPacket->getLsaHeadersArraySize(); 00206 OspfLsaHeader6* lsaHeader = *(databaseSummaryList.begin()); 00207 ddPacket->setLsaHeadersArraySize(headerCount + 1); 00208 ddPacket->setLsaHeaders(headerCount, *lsaHeader); 00209 delete lsaHeader; 00210 databaseSummaryList.pop_front(); 00211 } 00212 } 00213 00214 OspfDdOptions6 ddOptions; 00215 memset(&ddOptions, 0, sizeof(OspfDdOptions6)); 00216 if (init){ 00217 ddOptions.I_Init = true; 00218 ddOptions.M_More = true; 00219 ddOptions.MS_MasterSlave = true; 00220 }else{ 00221 ddOptions.I_Init = false; 00222 ddOptions.M_More = (databaseSummaryList.empty()) ? false : true; 00223 ddOptions.MS_MasterSlave = (databaseExchangeRelationship == AnsaOspf6::Neighbor::Master) ? true : false; 00224 } 00225 ddPacket->setDdOptions(ddOptions); 00226 00227 AnsaOspf6::MessageHandler* messageHandler = parentInterface->GetArea()->GetRouter()->GetMessageHandler(); 00228 int ttl = (parentInterface->GetType() == AnsaOspf6::Interface::Virtual) ? VIRTUAL_LINK_TTL : 1; 00229 if (parentInterface->GetType() == AnsaOspf6::Interface::PointToPoint){ 00230 messageHandler->SendPacket(ddPacket, AnsaOspf6::AllSPFRouters, parentInterface->GetIfIndex(), ttl); 00231 }else{ 00232 messageHandler->SendPacket(ddPacket, neighborIPAddress, parentInterface->GetIfIndex(), ttl); 00233 } 00234 00235 if (lastTransmittedDDPacket != NULL){ 00236 delete lastTransmittedDDPacket; 00237 } 00238 lastTransmittedDDPacket = new OspfDatabaseDescriptionPacket6(*ddPacket); 00239 } 00240 00241 bool AnsaOspf6::Neighbor::RetransmitDatabaseDescriptionPacket(void) { 00242 if (lastTransmittedDDPacket != NULL){ 00243 OspfDatabaseDescriptionPacket6* ddPacket = new OspfDatabaseDescriptionPacket6( 00244 *lastTransmittedDDPacket); 00245 AnsaOspf6::MessageHandler* messageHandler = 00246 parentInterface->GetArea()->GetRouter()->GetMessageHandler(); 00247 int ttl = (parentInterface->GetType() == AnsaOspf6::Interface::Virtual) ? VIRTUAL_LINK_TTL : 1; 00248 00249 if (parentInterface->GetType() == AnsaOspf6::Interface::PointToPoint){ 00250 messageHandler->SendPacket(ddPacket, AnsaOspf6::AllSPFRouters, 00251 parentInterface->GetIfIndex(), ttl); 00252 }else{ 00253 messageHandler->SendPacket(ddPacket, neighborIPAddress, parentInterface->GetIfIndex(), ttl); 00254 } 00255 00256 return true; 00257 }else{ 00258 return false; 00259 } 00260 } 00261 00262 void AnsaOspf6::Neighbor::CreateDatabaseSummary(void) { 00263 00264 AnsaOspf6::Area* area = parentInterface->GetArea(); 00265 unsigned long routerLSACount = area->GetRouterLSACount(); 00266 00267 for (unsigned long i = 0; i < routerLSACount; i++){ 00268 if (area->GetRouterLSA(i)->getHeader().getLsAge() < MAX_AGE){ 00269 OspfLsaHeader6* routerLSA = new OspfLsaHeader6(area->GetRouterLSA(i)->getHeader()); 00270 databaseSummaryList.push_back(routerLSA); 00271 } 00272 } 00273 00274 unsigned long networkLSACount = area->GetNetworkLSACount(); 00275 for (unsigned long j = 0; j < networkLSACount; j++){ 00276 if (area->GetNetworkLSA(j)->getHeader().getLsAge() < MAX_AGE){ 00277 OspfLsaHeader6* networkLSA = new OspfLsaHeader6(area->GetNetworkLSA(j)->getHeader()); 00278 databaseSummaryList.push_back(networkLSA); 00279 } 00280 } 00281 00282 unsigned long interAreaPrefixLSACount = area->GetInterAreaPrefixLSACount(); 00283 for (unsigned long j = 0; j < interAreaPrefixLSACount; j++){ 00284 if (area->GetInterAreaPrefixLSA(j)->getHeader().getLsAge() < MAX_AGE){ 00285 OspfLsaHeader6* interAreaPrefixLSA = new OspfLsaHeader6(area->GetInterAreaPrefixLSA(j)->getHeader()); 00286 databaseSummaryList.push_back(interAreaPrefixLSA); 00287 } 00288 } 00289 00290 unsigned long interAreaRouterLSACount = area->GetInterAreaRouterLSACount(); 00291 for (unsigned long j = 0; j < interAreaRouterLSACount; j++){ 00292 if (area->GetInterAreaRouterLSA(j)->getHeader().getLsAge() < MAX_AGE){ 00293 OspfLsaHeader6* interAreaRouterLSA = new OspfLsaHeader6(area->GetInterAreaRouterLSA(j)->getHeader()); 00294 databaseSummaryList.push_back(interAreaRouterLSA); 00295 } 00296 } 00297 00298 /* TODO: link lsa? 00299 unsigned long networkLSACount = area->GetNetworkLSACount(); 00300 for (unsigned long j = 0; j < networkLSACount; j++){ 00301 if (area->GetNetworkLSA(j)->getHeader().getLsAge() < MAX_AGE){ 00302 OspfLsaHeader6* networkLSA = new OspfLsaHeader6(area->GetNetworkLSA(j)->getHeader()); 00303 databaseSummaryList.push_back(networkLSA); 00304 } 00305 } 00306 */ 00307 00308 if ( (parentInterface->GetType() != AnsaOspf6::Interface::Virtual) 00309 && (area->GetExternalRoutingCapability())){ 00310 AnsaOspf6::Router* router = area->GetRouter(); 00311 unsigned long asExternalLSACount = router->GetASExternalLSACount(); 00312 00313 for (unsigned long m = 0; m < asExternalLSACount; m++){ 00314 if (router->GetASExternalLSA(m)->getHeader().getLsAge() < MAX_AGE){ 00315 OspfLsaHeader6* asExternalLSA = new OspfLsaHeader6(router->GetASExternalLSA(m)->getHeader()); 00316 databaseSummaryList.push_back(asExternalLSA); 00317 } 00318 } 00319 } 00320 00321 unsigned long intraAreaPrefixLSACount = area->GetIntraAreaPrefixLSACount(); 00322 for (unsigned long j = 0; j < intraAreaPrefixLSACount; j++){ 00323 if (area->GetIntraAreaPrefixLSA(j)->getHeader().getLsAge() < MAX_AGE){ 00324 OspfLsaHeader6* intraAreaPrefixLSA = new OspfLsaHeader6(area->GetIntraAreaPrefixLSA(j)->getHeader()); 00325 databaseSummaryList.push_back(intraAreaPrefixLSA); 00326 } 00327 } 00328 } 00329 00330 void AnsaOspf6::Neighbor::SendLinkStateRequestPacket(void) { 00331 OspfLinkStateRequestPacket6* requestPacket = new OspfLinkStateRequestPacket6; 00332 00333 requestPacket->setType(LinkStateRequestPacket); 00334 requestPacket->setRouterID(parentInterface->GetArea()->GetRouter()->GetRouterID()); 00335 requestPacket->setAreaID(parentInterface->GetArea()->GetAreaID()); 00336 00337 if (linkStateRequestList.empty()){ 00338 requestPacket->setRequestsArraySize(0); 00339 }else{ 00340 std::list<OspfLsaHeader6*>::iterator it = linkStateRequestList.begin(); 00341 00342 while (it != linkStateRequestList.end()){ 00343 unsigned long requestCount = requestPacket->getRequestsArraySize(); 00344 OspfLsaHeader6* requestHeader = (*it); 00345 OspfLsaRequest6 request; 00346 00347 request.lsType = requestHeader->getLsType(); 00348 request.linkStateID = requestHeader->getLinkStateID(); 00349 request.advertisingRouter = requestHeader->getAdvertisingRouter(); 00350 00351 requestPacket->setRequestsArraySize(requestCount + 1); 00352 requestPacket->setRequests(requestCount, request); 00353 00354 it++; 00355 } 00356 } 00357 00358 AnsaOspf6::MessageHandler* messageHandler = parentInterface->GetArea()->GetRouter()->GetMessageHandler(); 00359 int ttl = (parentInterface->GetType() == AnsaOspf6::Interface::Virtual) ? VIRTUAL_LINK_TTL : 1; 00360 if (parentInterface->GetType() == AnsaOspf6::Interface::PointToPoint){ 00361 messageHandler->SendPacket(requestPacket, AnsaOspf6::AllSPFRouters, parentInterface->GetIfIndex(), ttl); 00362 }else{ 00363 messageHandler->SendPacket(requestPacket, neighborIPAddress, parentInterface->GetIfIndex(), ttl); 00364 } 00365 } 00366 00367 bool AnsaOspf6::Neighbor::NeedAdjacency(void) { 00368 00369 /* TODO: 00370 AnsaOspf6::Interface::OspfInterfaceType interfaceType = parentInterface->GetType(); 00371 AnsaOspf6::RouterID routerID = parentInterface->GetArea()->GetRouter()->GetRouterID(); 00372 AnsaOspf6::DesignatedRouterID dRouter = parentInterface->GetDesignatedRouter(); 00373 AnsaOspf6::DesignatedRouterID backupDRouter = parentInterface->GetBackupDesignatedRouter(); 00374 00375 if ( (interfaceType == AnsaOspf6::Interface::PointToPoint) 00376 || (interfaceType == AnsaOspf6::Interface::PointToMultiPoint) 00377 || (interfaceType == AnsaOspf6::Interface::Virtual) 00378 || (dRouter == routerID) 00379 || (backupDRouter == routerID) 00380 || ((neighborsDesignatedRouter == dRouter) || (!designatedRoutersSetUp)) 00381 || (neighborsBackupDesignatedRouter == backupDRouter) 00382 || (!designatedRoutersSetUp)){ 00383 return true; 00384 }else{ 00385 return false; 00386 } 00387 */ 00388 00389 return false; 00390 } 00391 00397 void AnsaOspf6::Neighbor::AddToRetransmissionList(OspfLsa6* lsa) { 00398 std::list<OspfLsa6*>::iterator it; 00399 for (it = linkStateRetransmissionList.begin(); it != linkStateRetransmissionList.end(); it++){ 00400 if ( ((*it)->getHeader().getLinkStateID() == lsa->getHeader().getLinkStateID()) 00401 && ((*it)->getHeader().getAdvertisingRouter() == lsa->getHeader().getAdvertisingRouter())){ 00402 break; 00403 } 00404 } 00405 00406 OspfLsa6* lsaCopy = NULL; 00407 switch (lsa->getHeader().getLsType()){ 00408 case RouterLsaType: 00409 lsaCopy = new OspfRouterLsa6(*(check_and_cast<OspfRouterLsa6*> (lsa))); 00410 break; 00411 case NetworkLsaType: 00412 lsaCopy = new OspfNetworkLsa6(*(check_and_cast<OspfNetworkLsa6*> (lsa))); 00413 break; 00414 case InterAreaPrefixLsaType: 00415 lsaCopy = new OspfInterAreaPrefixLsa6(*(check_and_cast<OspfInterAreaPrefixLsa6*> (lsa))); 00416 break; 00417 case InterAreaRouterLsaType: 00418 lsaCopy = new OspfInterAreaRouterLsa6(*(check_and_cast<OspfInterAreaRouterLsa6*> (lsa))); 00419 break; 00420 case AsExternalLsaType: 00421 lsaCopy = new OspfAsExternalLsa6(*(check_and_cast<OspfAsExternalLsa6*> (lsa))); 00422 break; 00423 // TODO ?? patří to sem 00424 case LinkLsaType: 00425 lsaCopy = new OspfLinkLsa6(*(check_and_cast<OspfLinkLsa6*> (lsa))); 00426 break; 00427 case IntraAreaPrefixLsaType: 00428 lsaCopy = new OspfIntraAreaPrefixLsa6(*(check_and_cast<OspfIntraAreaPrefixLsa6*> (lsa))); 00429 break; 00430 default: 00431 ASSERT(false); // error 00432 break; 00433 } 00434 00435 if (it != linkStateRetransmissionList.end()){ 00436 delete (*it); 00437 *it = static_cast<OspfLsa6*> (lsaCopy); 00438 }else{ 00439 linkStateRetransmissionList.push_back(static_cast<OspfLsa6*> (lsaCopy)); 00440 } 00441 } 00442 00443 void AnsaOspf6::Neighbor::RemoveFromRetransmissionList(AnsaOspf6::LsaKeyType6 lsaKey) { 00444 std::list<OspfLsa6*>::iterator it = linkStateRetransmissionList.begin(); 00445 while (it != linkStateRetransmissionList.end()){ 00446 if (((*it)->getHeader().getLinkStateID() == lsaKey.linkStateID) 00447 && ((*it)->getHeader().getAdvertisingRouter() == lsaKey.advertisingRouter)){ 00448 delete (*it); 00449 it = linkStateRetransmissionList.erase(it); 00450 }else{ 00451 it++; 00452 } 00453 } 00454 } 00455 00456 bool AnsaOspf6::Neighbor::IsLSAOnRetransmissionList(AnsaOspf6::LsaKeyType6 lsaKey) const { 00457 for (std::list<OspfLsa6*>::const_iterator it = linkStateRetransmissionList.begin(); it 00458 != linkStateRetransmissionList.end(); it++){ 00459 const OspfLsa6* lsa = *it; 00460 if ((lsa->getHeader().getLinkStateID() == lsaKey.linkStateID) 00461 && (lsa->getHeader().getAdvertisingRouter() == lsaKey.advertisingRouter)){ 00462 return true; 00463 } 00464 } 00465 return false; 00466 } 00467 00468 OspfLsa6* AnsaOspf6::Neighbor::FindOnRetransmissionList(AnsaOspf6::LsaKeyType6 lsaKey) { 00469 for (std::list<OspfLsa6*>::iterator it = linkStateRetransmissionList.begin(); it 00470 != linkStateRetransmissionList.end(); it++){ 00471 if (((*it)->getHeader().getLinkStateID() == lsaKey.linkStateID) 00472 && ((*it)->getHeader().getAdvertisingRouter() == lsaKey.advertisingRouter)){ 00473 return (*it); 00474 } 00475 } 00476 return NULL; 00477 } 00478 00479 void AnsaOspf6::Neighbor::StartUpdateRetransmissionTimer(void) { 00480 MessageHandler* messageHandler = parentInterface->GetArea()->GetRouter()->GetMessageHandler(); 00481 messageHandler->StartTimer(updateRetransmissionTimer, 00482 parentInterface->GetRetransmissionInterval()); 00483 updateRetransmissionTimerActive = true; 00484 } 00485 00486 void AnsaOspf6::Neighbor::ClearUpdateRetransmissionTimer(void) { 00487 MessageHandler* messageHandler = parentInterface->GetArea()->GetRouter()->GetMessageHandler(); 00488 messageHandler->ClearTimer(updateRetransmissionTimer); 00489 updateRetransmissionTimerActive = false; 00490 } 00491 00492 void AnsaOspf6::Neighbor::AddToRequestList(OspfLsaHeader6* lsaHeader) { 00493 linkStateRequestList.push_back(new OspfLsaHeader6 (*lsaHeader)); 00494 } 00495 00496 void AnsaOspf6::Neighbor::RemoveFromRequestList(AnsaOspf6::LsaKeyType6 lsaKey) { 00497 std::list<OspfLsaHeader6*>::iterator it = linkStateRequestList.begin(); 00498 while (it != linkStateRequestList.end()){ 00499 if (((*it)->getLinkStateID() == lsaKey.linkStateID) 00500 && ((*it)->getAdvertisingRouter() == lsaKey.advertisingRouter)){ 00501 delete (*it); 00502 it = linkStateRequestList.erase(it); 00503 }else{ 00504 it++; 00505 } 00506 } 00507 00508 if ((GetState() == AnsaOspf6::Neighbor::LoadingState) && (linkStateRequestList.empty())){ 00509 ClearRequestRetransmissionTimer(); 00510 ProcessEvent(AnsaOspf6::Neighbor::LoadingDone); 00511 } 00512 } 00513 00514 bool AnsaOspf6::Neighbor::IsLSAOnRequestList(AnsaOspf6::LsaKeyType6 lsaKey) const { 00515 for (std::list<OspfLsaHeader6*>::const_iterator it = linkStateRequestList.begin(); it 00516 != linkStateRequestList.end(); it++){ 00517 const OspfLsaHeader6* lsaHeader = *it; 00518 if ((lsaHeader->getLinkStateID() == lsaKey.linkStateID) 00519 && (lsaHeader->getAdvertisingRouter() == lsaKey.advertisingRouter)){ 00520 return true; 00521 } 00522 } 00523 return false; 00524 } 00525 00526 OspfLsaHeader6* AnsaOspf6::Neighbor::FindOnRequestList(AnsaOspf6::LsaKeyType6 lsaKey) { 00527 for (std::list<OspfLsaHeader6*>::iterator it = linkStateRequestList.begin(); it 00528 != linkStateRequestList.end(); it++){ 00529 if (((*it)->getLinkStateID() == lsaKey.linkStateID) 00530 && ((*it)->getAdvertisingRouter() == lsaKey.advertisingRouter)){ 00531 return (*it); 00532 } 00533 } 00534 return NULL; 00535 } 00536 00537 void AnsaOspf6::Neighbor::StartRequestRetransmissionTimer(void) { 00538 MessageHandler* messageHandler = parentInterface->GetArea()->GetRouter()->GetMessageHandler(); 00539 messageHandler->StartTimer(requestRetransmissionTimer, 00540 parentInterface->GetRetransmissionInterval()); 00541 requestRetransmissionTimerActive = true; 00542 } 00543 00544 void AnsaOspf6::Neighbor::ClearRequestRetransmissionTimer(void) { 00545 MessageHandler* messageHandler = parentInterface->GetArea()->GetRouter()->GetMessageHandler(); 00546 messageHandler->ClearTimer(requestRetransmissionTimer); 00547 requestRetransmissionTimerActive = false; 00548 } 00549 00550 void AnsaOspf6::Neighbor::AddToTransmittedLSAList(AnsaOspf6::LsaKeyType6 lsaKey) { 00551 TransmittedLSA transmit; 00552 00553 transmit.lsaKey = lsaKey; 00554 transmit.age = 0; 00555 00556 transmittedLSAs.push_back(transmit); 00557 } 00558 00559 bool AnsaOspf6::Neighbor::IsOnTransmittedLSAList(AnsaOspf6::LsaKeyType6 lsaKey) const { 00560 for (std::list<TransmittedLSA>::const_iterator it = transmittedLSAs.begin(); it 00561 != transmittedLSAs.end(); it++){ 00562 if ((it->lsaKey.linkStateID == lsaKey.linkStateID) && (it->lsaKey.advertisingRouter 00563 == lsaKey.advertisingRouter)){ 00564 return true; 00565 } 00566 } 00567 return false; 00568 } 00569 00570 void AnsaOspf6::Neighbor::AgeTransmittedLSAList(void) { 00571 std::list<TransmittedLSA>::iterator it = transmittedLSAs.begin(); 00572 while ((it != transmittedLSAs.end()) && (it->age == MIN_LS_ARRIVAL)){ 00573 transmittedLSAs.pop_front(); 00574 it = transmittedLSAs.begin(); 00575 } 00576 for (it = transmittedLSAs.begin(); it != transmittedLSAs.end(); it++){ 00577 it->age++; 00578 } 00579 } 00580 00581 void AnsaOspf6::Neighbor::RetransmitUpdatePacket(void) { 00582 OspfLinkStateUpdatePacket6* updatePacket = new OspfLinkStateUpdatePacket6; 00583 00584 updatePacket->setType(LinkStateUpdatePacket); 00585 updatePacket->setRouterID(parentInterface->GetArea()->GetRouter()->GetRouterID()); 00586 updatePacket->setAreaID(parentInterface->GetArea()->GetAreaID()); 00587 00588 bool packetFull = false; 00589 unsigned short lsaCount = 0; 00590 std::list<OspfLsa6*>::iterator it = linkStateRetransmissionList.begin(); 00591 00592 while (!packetFull && (it != linkStateRetransmissionList.end())){ 00593 LsaType6 lsaType = static_cast<LsaType6> ((*it)->getHeader().getLsType()); 00594 OspfRouterLsa6* routerLSA = (lsaType == RouterLsaType) ? dynamic_cast<OspfRouterLsa6*> (*it) : NULL; 00595 OspfNetworkLsa6* networkLSA = (lsaType == NetworkLsaType) ? dynamic_cast<OspfNetworkLsa6*> (*it) : NULL; 00596 OspfInterAreaPrefixLsa6* interAreaPrefixLSA = (lsaType = InterAreaPrefixLsaType) ? dynamic_cast<OspfInterAreaPrefixLsa6*> (*it) : NULL; 00597 OspfInterAreaRouterLsa6* interAreaRouterLSA = (lsaType = InterAreaRouterLsaType) ? dynamic_cast<OspfInterAreaRouterLsa6*> (*it) : NULL; 00598 OspfAsExternalLsa6* asExternalLSA = (lsaType == AsExternalLsaType) ? dynamic_cast<OspfAsExternalLsa6*> (*it) : NULL; 00599 OspfLinkLsa6* linkLSA = (lsaType == LinkLsaType) ? dynamic_cast<OspfLinkLsa6*> (*it) : NULL; 00600 OspfIntraAreaPrefixLsa6* intraAreaPrefixLSA = (lsaType = IntraAreaPrefixLsaType) ? dynamic_cast<OspfIntraAreaPrefixLsa6*> (*it) : NULL; 00601 00602 long lsaSize = 0; 00603 bool includeLSA = true; 00604 lsaCount++; 00605 00606 if (includeLSA){ 00607 switch (lsaType){ 00608 case RouterLsaType: 00609 if (routerLSA != NULL){ 00610 unsigned int routerLSACount = updatePacket->getRouterLsasArraySize(); 00611 00612 updatePacket->setRouterLsasArraySize(routerLSACount + 1); 00613 updatePacket->setRouterLsas(routerLSACount, *routerLSA); 00614 00615 unsigned short lsAge = updatePacket->getRouterLsas(routerLSACount).getHeader().getLsAge(); 00616 if (lsAge < MAX_AGE - parentInterface->GetTransmissionDelay()){ 00617 updatePacket->getRouterLsas(routerLSACount).getHeader().setLsAge(lsAge + parentInterface->GetTransmissionDelay()); 00618 }else{ 00619 updatePacket->getRouterLsas(routerLSACount).getHeader().setLsAge(MAX_AGE); 00620 } 00621 } 00622 break; 00623 case NetworkLsaType: 00624 if (networkLSA != NULL){ 00625 unsigned int networkLSACount = updatePacket->getNetworkLsasArraySize(); 00626 00627 updatePacket->setNetworkLsasArraySize(networkLSACount + 1); 00628 updatePacket->setNetworkLsas(networkLSACount, *networkLSA); 00629 00630 unsigned short lsAge = updatePacket->getNetworkLsas(networkLSACount).getHeader().getLsAge(); 00631 if (lsAge < MAX_AGE - parentInterface->GetTransmissionDelay()){ 00632 updatePacket->getNetworkLsas(networkLSACount).getHeader().setLsAge(lsAge + parentInterface->GetTransmissionDelay()); 00633 }else{ 00634 updatePacket->getNetworkLsas(networkLSACount).getHeader().setLsAge(MAX_AGE); 00635 } 00636 } 00637 break; 00638 case InterAreaPrefixLsaType: 00639 if (interAreaPrefixLSA != NULL){ 00640 unsigned int interAreaPrefixLSACount = updatePacket->getInterAreaPrefixLsasArraySize(); 00641 00642 updatePacket->setInterAreaPrefixLsasArraySize(interAreaPrefixLSACount + 1); 00643 updatePacket->setInterAreaPrefixLsas(interAreaPrefixLSACount, *interAreaPrefixLSA); 00644 00645 unsigned short lsAge = updatePacket->getInterAreaPrefixLsas(interAreaPrefixLSACount).getHeader().getLsAge(); 00646 if (lsAge < MAX_AGE - parentInterface->GetTransmissionDelay()){ 00647 updatePacket->getInterAreaPrefixLsas(interAreaPrefixLSACount).getHeader().setLsAge(lsAge + parentInterface->GetTransmissionDelay()); 00648 }else{ 00649 updatePacket->getInterAreaPrefixLsas(interAreaPrefixLSACount).getHeader().setLsAge(MAX_AGE); 00650 } 00651 } 00652 break; 00653 case InterAreaRouterLsaType: 00654 if (interAreaRouterLSA != NULL){ 00655 unsigned int interAreaRouterLSACount = updatePacket->getInterAreaRouterLsasArraySize(); 00656 00657 updatePacket->setInterAreaRouterLsasArraySize(interAreaRouterLSACount + 1); 00658 updatePacket->setInterAreaRouterLsas(interAreaRouterLSACount, *interAreaRouterLSA); 00659 00660 unsigned short lsAge = updatePacket->getInterAreaRouterLsas(interAreaRouterLSACount).getHeader().getLsAge(); 00661 if (lsAge < MAX_AGE - parentInterface->GetTransmissionDelay()){ 00662 updatePacket->getInterAreaRouterLsas(interAreaRouterLSACount).getHeader().setLsAge(lsAge + parentInterface->GetTransmissionDelay()); 00663 }else{ 00664 updatePacket->getInterAreaRouterLsas(interAreaRouterLSACount).getHeader().setLsAge(MAX_AGE); 00665 } 00666 } 00667 break; 00668 case AsExternalLsaType: 00669 if (asExternalLSA != NULL){ 00670 unsigned int asExternalLSACount = updatePacket->getAsExternalLsasArraySize(); 00671 00672 updatePacket->setAsExternalLsasArraySize(asExternalLSACount + 1); 00673 updatePacket->setAsExternalLsas(asExternalLSACount, *asExternalLSA); 00674 00675 unsigned short lsAge = 00676 updatePacket->getAsExternalLsas(asExternalLSACount).getHeader().getLsAge(); 00677 if (lsAge < MAX_AGE - parentInterface->GetTransmissionDelay()){ 00678 updatePacket->getAsExternalLsas(asExternalLSACount).getHeader().setLsAge(lsAge 00679 + parentInterface->GetTransmissionDelay()); 00680 }else{ 00681 updatePacket->getAsExternalLsas(asExternalLSACount).getHeader().setLsAge( 00682 MAX_AGE); 00683 } 00684 } 00685 break; 00686 case LinkLsaType: 00687 if (linkLSA != NULL){ 00688 unsigned int linkLSACount = updatePacket->getLinkLsasArraySize(); 00689 00690 updatePacket->setLinkLsasArraySize(linkLSACount + 1); 00691 updatePacket->setLinkLsas(linkLSACount, *linkLSA); 00692 00693 unsigned short lsAge = updatePacket->getLinkLsas(linkLSACount).getHeader().getLsAge(); 00694 if (lsAge < MAX_AGE - parentInterface->GetTransmissionDelay()){ 00695 updatePacket->getLinkLsas(linkLSACount).getHeader().setLsAge(lsAge + parentInterface->GetTransmissionDelay()); 00696 }else{ 00697 updatePacket->getLinkLsas(linkLSACount).getHeader().setLsAge(MAX_AGE); 00698 } 00699 } 00700 break; 00701 case IntraAreaPrefixLsaType: 00702 if (intraAreaPrefixLSA != NULL){ 00703 unsigned int intraAreaPrefixLSACount = updatePacket->getIntraAreaPrefixLsasArraySize(); 00704 00705 updatePacket->setIntraAreaPrefixLsasArraySize(intraAreaPrefixLSACount + 1); 00706 updatePacket->setIntraAreaPrefixLsas(intraAreaPrefixLSACount, *intraAreaPrefixLSA); 00707 00708 unsigned short lsAge = updatePacket->getIntraAreaPrefixLsas(intraAreaPrefixLSACount).getHeader().getLsAge(); 00709 if (lsAge < MAX_AGE - parentInterface->GetTransmissionDelay()){ 00710 updatePacket->getIntraAreaPrefixLsas(intraAreaPrefixLSACount).getHeader().setLsAge(lsAge + parentInterface->GetTransmissionDelay()); 00711 }else{ 00712 updatePacket->getIntraAreaPrefixLsas(intraAreaPrefixLSACount).getHeader().setLsAge(MAX_AGE); 00713 } 00714 } 00715 break; 00716 default: 00717 break; 00718 } 00719 } 00720 00721 it++; 00722 } 00723 00724 AnsaOspf6::MessageHandler* messageHandler = parentInterface->GetArea()->GetRouter()->GetMessageHandler(); 00725 int ttl = (parentInterface->GetType() == AnsaOspf6::Interface::Virtual) ? VIRTUAL_LINK_TTL : 1; 00726 messageHandler->SendPacket(updatePacket, neighborIPAddress, parentInterface->GetIfIndex(), ttl); 00727 } 00728 00729 void AnsaOspf6::Neighbor::DeleteLastSentDDPacket(void) { 00730 if (lastTransmittedDDPacket != NULL){ 00731 delete lastTransmittedDDPacket; 00732 lastTransmittedDDPacket = NULL; 00733 } 00734 }