00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "OSPFNeighbor.h"
00019 #include "OSPFNeighborState.h"
00020 #include "OSPFNeighborStateDown.h"
00021 #include "MessageHandler.h"
00022 #include "OSPFArea.h"
00023 #include "OSPFRouter.h"
00024 #include <memory.h>
00025
00026
00027 unsigned long OSPF::Neighbor::ddSequenceNumberInitSeed = 0;
00028
00029 OSPF::Neighbor::Neighbor(RouterID neighbor) :
00030 updateRetransmissionTimerActive(false),
00031 requestRetransmissionTimerActive(false),
00032 firstAdjacencyInited(false),
00033 ddSequenceNumber(0),
00034 neighborID(neighbor),
00035 neighborPriority(0),
00036 neighborIPAddress(OSPF::NullIPv4Address),
00037 neighborsDesignatedRouter(OSPF::NullDesignatedRouterID),
00038 neighborsBackupDesignatedRouter(OSPF::NullDesignatedRouterID),
00039 designatedRoutersSetUp(false),
00040 neighborsRouterDeadInterval(40),
00041 lastTransmittedDDPacket(NULL)
00042 {
00043 memset(&lastReceivedDDPacket, 0, sizeof(OSPF::Neighbor::DDPacketID));
00044
00045 lastReceivedDDPacket.ddOptions.I_Init = true;
00046 lastReceivedDDPacket.ddOptions.M_More = true;
00047 inactivityTimer = new OSPFTimer;
00048 inactivityTimer->setTimerKind(NeighborInactivityTimer);
00049 inactivityTimer->setContextPointer(this);
00050 inactivityTimer->setName("OSPF::Neighbor::NeighborInactivityTimer");
00051 pollTimer = new OSPFTimer;
00052 pollTimer->setTimerKind(NeighborPollTimer);
00053 pollTimer->setContextPointer(this);
00054 pollTimer->setName("OSPF::Neighbor::NeighborPollTimer");
00055 ddRetransmissionTimer = new OSPFTimer;
00056 ddRetransmissionTimer->setTimerKind(NeighborDDRetransmissionTimer);
00057 ddRetransmissionTimer->setContextPointer(this);
00058 ddRetransmissionTimer->setName("OSPF::Neighbor::NeighborDDRetransmissionTimer");
00059 updateRetransmissionTimer = new OSPFTimer;
00060 updateRetransmissionTimer->setTimerKind(NeighborUpdateRetransmissionTimer);
00061 updateRetransmissionTimer->setContextPointer(this);
00062 updateRetransmissionTimer->setName("OSPF::Neighbor::Neighbor::NeighborUpdateRetransmissionTimer");
00063 requestRetransmissionTimer = new OSPFTimer;
00064 requestRetransmissionTimer->setTimerKind(NeighborRequestRetransmissionTimer);
00065 requestRetransmissionTimer->setContextPointer(this);
00066 requestRetransmissionTimer->setName("OSPF::Neighbor::NeighborRequestRetransmissionTimer");
00067 state = new OSPF::NeighborStateDown;
00068 previousState = NULL;
00069 }
00070
00071 OSPF::Neighbor::~Neighbor(void)
00072 {
00073 Reset();
00074 MessageHandler* messageHandler = parentInterface->GetArea()->GetRouter()->GetMessageHandler();
00075 messageHandler->ClearTimer(inactivityTimer);
00076 messageHandler->ClearTimer(pollTimer);
00077 delete inactivityTimer;
00078 delete pollTimer;
00079 delete ddRetransmissionTimer;
00080 delete updateRetransmissionTimer;
00081 delete requestRetransmissionTimer;
00082 if (previousState != NULL) {
00083 delete previousState;
00084 }
00085 delete state;
00086 }
00087
00088 void OSPF::Neighbor::ChangeState(NeighborState* newState, NeighborState* currentState)
00089 {
00090 if (previousState != NULL) {
00091 delete previousState;
00092 }
00093 state = newState;
00094 previousState = currentState;
00095 }
00096
00097 void OSPF::Neighbor::ProcessEvent(OSPF::Neighbor::NeighborEventType event)
00098 {
00099 state->ProcessEvent(this, event);
00100 }
00101
00102 void OSPF::Neighbor::Reset(void)
00103 {
00104 for (std::list<OSPFLSA*>::iterator retIt = linkStateRetransmissionList.begin();
00105 retIt != linkStateRetransmissionList.end();
00106 retIt++)
00107 {
00108 delete(*retIt);
00109 }
00110 linkStateRetransmissionList.clear();
00111
00112 std::list<OSPFLSAHeader*>::iterator it;
00113 for (it = databaseSummaryList.begin(); it != databaseSummaryList.end(); it++) {
00114 delete(*it);
00115 }
00116 databaseSummaryList.clear();
00117 for (it = linkStateRequestList.begin(); it != linkStateRequestList.end(); it++)
00118 {
00119 delete(*it);
00120 }
00121 linkStateRequestList.clear();
00122
00123 parentInterface->GetArea()->GetRouter()->GetMessageHandler()->ClearTimer(ddRetransmissionTimer);
00124 ClearUpdateRetransmissionTimer();
00125 ClearRequestRetransmissionTimer();
00126
00127 if (lastTransmittedDDPacket != NULL) {
00128 delete lastTransmittedDDPacket;
00129 lastTransmittedDDPacket = NULL;
00130 }
00131 }
00132
00133 void OSPF::Neighbor::InitFirstAdjacency(void)
00134 {
00135 ddSequenceNumber = GetUniqueULong();
00136 firstAdjacencyInited = true;
00137 }
00138
00139 unsigned long OSPF::Neighbor::GetUniqueULong(void)
00140 {
00141
00142 return (ddSequenceNumberInitSeed++);
00143 }
00144
00145 OSPF::Neighbor::NeighborStateType OSPF::Neighbor::GetState(void) const
00146 {
00147 return state->GetState();
00148 }
00149
00150 const char* OSPF::Neighbor::GetStateString(OSPF::Neighbor::NeighborStateType stateType)
00151 {
00152 switch (stateType) {
00153 case DownState: return "Down";
00154 case AttemptState: return "Attempt";
00155 case InitState: return "Init";
00156 case TwoWayState: return "TwoWay";
00157 case ExchangeStartState: return "ExchangeStart";
00158 case ExchangeState: return "Exchange";
00159 case LoadingState: return "Loading";
00160 case FullState: return "Full";
00161 default: ASSERT(false);
00162 }
00163 return "";
00164 }
00165
00166 void OSPF::Neighbor::SendDatabaseDescriptionPacket(bool init)
00167 {
00168 OSPFDatabaseDescriptionPacket* ddPacket = new OSPFDatabaseDescriptionPacket;
00169
00170 ddPacket->setType(DatabaseDescriptionPacket);
00171 ddPacket->setRouterID(parentInterface->GetArea()->GetRouter()->GetRouterID());
00172 ddPacket->setAreaID(parentInterface->GetArea()->GetAreaID());
00173 ddPacket->setAuthenticationType(parentInterface->GetAuthenticationType());
00174 OSPF::AuthenticationKeyType authKey = parentInterface->GetAuthenticationKey();
00175 for (int i = 0; i < 8; i++) {
00176 ddPacket->setAuthentication(i, authKey.bytes[i]);
00177 }
00178
00179 if (parentInterface->GetType() != OSPF::Interface::Virtual) {
00180 ddPacket->setInterfaceMTU(parentInterface->GetMTU());
00181 } else {
00182 ddPacket->setInterfaceMTU(0);
00183 }
00184
00185 OSPFOptions options;
00186 memset(&options, 0, sizeof(OSPFOptions));
00187 options.E_ExternalRoutingCapability = parentInterface->GetArea()->GetExternalRoutingCapability();
00188 ddPacket->setOptions(options);
00189
00190 ddPacket->setDdSequenceNumber(ddSequenceNumber);
00191
00192 long maxPacketSize = ((IPV4_HEADER_LENGTH + OSPF_HEADER_LENGTH + OSPF_DD_HEADER_LENGTH + OSPF_LSA_HEADER_LENGTH) > parentInterface->GetMTU()) ?
00193 IPV4_DATAGRAM_LENGTH :
00194 parentInterface->GetMTU();
00195
00196 if (init || databaseSummaryList.empty()) {
00197 ddPacket->setLsaHeadersArraySize(0);
00198 } else {
00199
00200
00201 long packetSize = IPV4_HEADER_LENGTH + OSPF_HEADER_LENGTH + OSPF_DD_HEADER_LENGTH;
00202 while ((!databaseSummaryList.empty()) && (packetSize <= (maxPacketSize - OSPF_LSA_HEADER_LENGTH))) {
00203 unsigned long headerCount = ddPacket->getLsaHeadersArraySize();
00204 OSPFLSAHeader* lsaHeader = *(databaseSummaryList.begin());
00205 ddPacket->setLsaHeadersArraySize(headerCount + 1);
00206 ddPacket->setLsaHeaders(headerCount, *lsaHeader);
00207 delete lsaHeader;
00208 databaseSummaryList.pop_front();
00209 packetSize += OSPF_LSA_HEADER_LENGTH;
00210 }
00211 }
00212
00213 OSPFDDOptions ddOptions;
00214 memset(&ddOptions, 0, sizeof(OSPFDDOptions));
00215 if (init) {
00216 ddOptions.I_Init = true;
00217 ddOptions.M_More = true;
00218 ddOptions.MS_MasterSlave = true;
00219 } else {
00220 ddOptions.I_Init = false;
00221 ddOptions.M_More = (databaseSummaryList.empty()) ? false : true;
00222 ddOptions.MS_MasterSlave = (databaseExchangeRelationship == OSPF::Neighbor::Master) ? true : false;
00223 }
00224 ddPacket->setDdOptions(ddOptions);
00225
00226 ddPacket->setPacketLength(0);
00227 ddPacket->setChecksum(0);
00228
00229 OSPF::MessageHandler* messageHandler = parentInterface->GetArea()->GetRouter()->GetMessageHandler();
00230 int ttl = (parentInterface->GetType() == OSPF::Interface::Virtual) ? VIRTUAL_LINK_TTL : 1;
00231 if (parentInterface->GetType() == OSPF::Interface::PointToPoint) {
00232 messageHandler->SendPacket(ddPacket, OSPF::AllSPFRouters, parentInterface->GetIfIndex(), ttl);
00233 } else {
00234 messageHandler->SendPacket(ddPacket, neighborIPAddress, parentInterface->GetIfIndex(), ttl);
00235 }
00236
00237 if (lastTransmittedDDPacket != NULL) {
00238 delete lastTransmittedDDPacket;
00239 }
00240 lastTransmittedDDPacket = new OSPFDatabaseDescriptionPacket(*ddPacket);
00241 }
00242
00243 bool OSPF::Neighbor::RetransmitDatabaseDescriptionPacket(void)
00244 {
00245 if (lastTransmittedDDPacket != NULL) {
00246 OSPFDatabaseDescriptionPacket* ddPacket = new OSPFDatabaseDescriptionPacket(*lastTransmittedDDPacket);
00247 OSPF::MessageHandler* messageHandler = parentInterface->GetArea()->GetRouter()->GetMessageHandler();
00248 int ttl = (parentInterface->GetType() == OSPF::Interface::Virtual) ? VIRTUAL_LINK_TTL : 1;
00249
00250 if (parentInterface->GetType() == OSPF::Interface::PointToPoint) {
00251 messageHandler->SendPacket(ddPacket, OSPF::AllSPFRouters, 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 OSPF::Neighbor::CreateDatabaseSummary(void)
00263 {
00264 OSPF::Area* area = parentInterface->GetArea();
00265 unsigned long routerLSACount = area->GetRouterLSACount();
00266
00267
00268
00269
00270
00271
00272
00273 for (unsigned long i = 0; i < routerLSACount; i++) {
00274 if (area->GetRouterLSA(i)->getHeader().getLsAge() < MAX_AGE) {
00275 OSPFLSAHeader* routerLSA = new OSPFLSAHeader(area->GetRouterLSA(i)->getHeader());
00276 databaseSummaryList.push_back(routerLSA);
00277 }
00278 }
00279
00280 unsigned long networkLSACount = area->GetNetworkLSACount();
00281 for (unsigned long j = 0; j < networkLSACount; j++) {
00282 if (area->GetNetworkLSA(j)->getHeader().getLsAge() < MAX_AGE) {
00283 OSPFLSAHeader* networkLSA = new OSPFLSAHeader(area->GetNetworkLSA(j)->getHeader());
00284 databaseSummaryList.push_back(networkLSA);
00285 }
00286 }
00287
00288 unsigned long summaryLSACount = area->GetSummaryLSACount();
00289 for (unsigned long k = 0; k < summaryLSACount; k++) {
00290 if (area->GetSummaryLSA(k)->getHeader().getLsAge() < MAX_AGE) {
00291 OSPFLSAHeader* summaryLSA = new OSPFLSAHeader(area->GetSummaryLSA(k)->getHeader());
00292 databaseSummaryList.push_back(summaryLSA);
00293 }
00294 }
00295
00296 if ((parentInterface->GetType() != OSPF::Interface::Virtual) &&
00297 (area->GetExternalRoutingCapability()))
00298 {
00299 OSPF::Router* router = area->GetRouter();
00300 unsigned long asExternalLSACount = router->GetASExternalLSACount();
00301
00302 for (unsigned long m = 0; m < asExternalLSACount; m++) {
00303 if (router->GetASExternalLSA(m)->getHeader().getLsAge() < MAX_AGE) {
00304 OSPFLSAHeader* asExternalLSA = new OSPFLSAHeader(router->GetASExternalLSA(m)->getHeader());
00305 databaseSummaryList.push_back(asExternalLSA);
00306 }
00307 }
00308 }
00309 }
00310
00311 void OSPF::Neighbor::SendLinkStateRequestPacket(void)
00312 {
00313 OSPFLinkStateRequestPacket* requestPacket = new OSPFLinkStateRequestPacket;
00314
00315 requestPacket->setType(LinkStateRequestPacket);
00316 requestPacket->setRouterID(parentInterface->GetArea()->GetRouter()->GetRouterID());
00317 requestPacket->setAreaID(parentInterface->GetArea()->GetAreaID());
00318 requestPacket->setAuthenticationType(parentInterface->GetAuthenticationType());
00319 OSPF::AuthenticationKeyType authKey = parentInterface->GetAuthenticationKey();
00320 for (int i = 0; i < 8; i++) {
00321 requestPacket->setAuthentication(i, authKey.bytes[i]);
00322 }
00323
00324 long maxPacketSize = ((IPV4_HEADER_LENGTH + OSPF_HEADER_LENGTH + OSPF_REQUEST_LENGTH) > parentInterface->GetMTU()) ?
00325 IPV4_DATAGRAM_LENGTH :
00326 parentInterface->GetMTU();
00327
00328 if (linkStateRequestList.empty()) {
00329 requestPacket->setRequestsArraySize(0);
00330 } else {
00331 long packetSize = IPV4_HEADER_LENGTH + OSPF_HEADER_LENGTH;
00332 std::list<OSPFLSAHeader*>::iterator it = linkStateRequestList.begin();
00333
00334 while ((it != linkStateRequestList.end()) && (packetSize <= (maxPacketSize - OSPF_REQUEST_LENGTH))) {
00335 unsigned long requestCount = requestPacket->getRequestsArraySize();
00336 OSPFLSAHeader* requestHeader = (*it);
00337 LSARequest request;
00338
00339 request.lsType = requestHeader->getLsType();
00340 request.linkStateID = requestHeader->getLinkStateID();
00341 request.advertisingRouter = requestHeader->getAdvertisingRouter();
00342
00343 requestPacket->setRequestsArraySize(requestCount + 1);
00344 requestPacket->setRequests(requestCount, request);
00345
00346 packetSize += OSPF_REQUEST_LENGTH;
00347 it++;
00348 }
00349 }
00350
00351 requestPacket->setPacketLength(0);
00352 requestPacket->setChecksum(0);
00353
00354 OSPF::MessageHandler* messageHandler = parentInterface->GetArea()->GetRouter()->GetMessageHandler();
00355 int ttl = (parentInterface->GetType() == OSPF::Interface::Virtual) ? VIRTUAL_LINK_TTL : 1;
00356 if (parentInterface->GetType() == OSPF::Interface::PointToPoint) {
00357 messageHandler->SendPacket(requestPacket, OSPF::AllSPFRouters, parentInterface->GetIfIndex(), ttl);
00358 } else {
00359 messageHandler->SendPacket(requestPacket, neighborIPAddress, parentInterface->GetIfIndex(), ttl);
00360 }
00361 }
00362
00363 bool OSPF::Neighbor::NeedAdjacency(void)
00364 {
00365 OSPF::Interface::OSPFInterfaceType interfaceType = parentInterface->GetType();
00366 OSPF::RouterID routerID = parentInterface->GetArea()->GetRouter()->GetRouterID();
00367 OSPF::DesignatedRouterID dRouter = parentInterface->GetDesignatedRouter();
00368 OSPF::DesignatedRouterID backupDRouter = parentInterface->GetBackupDesignatedRouter();
00369
00370 if ((interfaceType == OSPF::Interface::PointToPoint) ||
00371 (interfaceType == OSPF::Interface::PointToMultiPoint) ||
00372 (interfaceType == OSPF::Interface::Virtual) ||
00373 (dRouter.routerID == routerID) ||
00374 (backupDRouter.routerID == routerID) ||
00375 ((neighborsDesignatedRouter.routerID == dRouter.routerID) ||
00376 (!designatedRoutersSetUp &&
00377 (neighborsDesignatedRouter.ipInterfaceAddress == dRouter.ipInterfaceAddress))) ||
00378 ((neighborsBackupDesignatedRouter.routerID == backupDRouter.routerID) ||
00379 (!designatedRoutersSetUp &&
00380 (neighborsBackupDesignatedRouter.ipInterfaceAddress == backupDRouter.ipInterfaceAddress))))
00381 {
00382 return true;
00383 } else {
00384 return false;
00385 }
00386 }
00387
00393 void OSPF::Neighbor::AddToRetransmissionList(OSPFLSA* lsa)
00394 {
00395 std::list<OSPFLSA*>::iterator it;
00396 for (it = linkStateRetransmissionList.begin(); it != linkStateRetransmissionList.end(); it++) {
00397 if (((*it)->getHeader().getLinkStateID() == lsa->getHeader().getLinkStateID()) &&
00398 ((*it)->getHeader().getAdvertisingRouter().getInt() == lsa->getHeader().getAdvertisingRouter().getInt()))
00399 {
00400 break;
00401 }
00402 }
00403
00404 OSPFLSA* lsaCopy = NULL;
00405 switch (lsa->getHeader().getLsType()) {
00406 case RouterLSAType:
00407 lsaCopy = new OSPFRouterLSA(*(check_and_cast<OSPFRouterLSA*> (lsa)));
00408 break;
00409 case NetworkLSAType:
00410 lsaCopy = new OSPFNetworkLSA(*(check_and_cast<OSPFNetworkLSA*> (lsa)));
00411 break;
00412 case SummaryLSA_NetworksType:
00413 case SummaryLSA_ASBoundaryRoutersType:
00414 lsaCopy = new OSPFSummaryLSA(*(check_and_cast<OSPFSummaryLSA*> (lsa)));
00415 break;
00416 case ASExternalLSAType:
00417 lsaCopy = new OSPFASExternalLSA(*(check_and_cast<OSPFASExternalLSA*> (lsa)));
00418 break;
00419 default:
00420 ASSERT(false);
00421 break;
00422 }
00423
00424 if (it != linkStateRetransmissionList.end()) {
00425 delete(*it);
00426 *it = static_cast<OSPFLSA*> (lsaCopy);
00427 } else {
00428 linkStateRetransmissionList.push_back(static_cast<OSPFLSA*> (lsaCopy));
00429 }
00430 }
00431
00432 void OSPF::Neighbor::RemoveFromRetransmissionList(OSPF::LSAKeyType lsaKey)
00433 {
00434 std::list<OSPFLSA*>::iterator it = linkStateRetransmissionList.begin();
00435 while (it != linkStateRetransmissionList.end()) {
00436 if (((*it)->getHeader().getLinkStateID() == lsaKey.linkStateID) &&
00437 ((*it)->getHeader().getAdvertisingRouter().getInt() == lsaKey.advertisingRouter))
00438 {
00439 delete(*it);
00440 it = linkStateRetransmissionList.erase(it);
00441 } else {
00442 it++;
00443 }
00444 }
00445 }
00446
00447 bool OSPF::Neighbor::IsLSAOnRetransmissionList(OSPF::LSAKeyType lsaKey) const
00448 {
00449 for (std::list<OSPFLSA*>::const_iterator it = linkStateRetransmissionList.begin(); it != linkStateRetransmissionList.end(); it++) {
00450 const OSPFLSA* lsa = *it;
00451 if ((lsa->getHeader().getLinkStateID() == lsaKey.linkStateID) &&
00452 (lsa->getHeader().getAdvertisingRouter().getInt() == lsaKey.advertisingRouter))
00453 {
00454 return true;
00455 }
00456 }
00457 return false;
00458 }
00459
00460 OSPFLSA* OSPF::Neighbor::FindOnRetransmissionList(OSPF::LSAKeyType lsaKey)
00461 {
00462 for (std::list<OSPFLSA*>::iterator it = linkStateRetransmissionList.begin(); it != linkStateRetransmissionList.end(); it++) {
00463 if (((*it)->getHeader().getLinkStateID() == lsaKey.linkStateID) &&
00464 ((*it)->getHeader().getAdvertisingRouter().getInt() == lsaKey.advertisingRouter))
00465 {
00466 return (*it);
00467 }
00468 }
00469 return NULL;
00470 }
00471
00472 void OSPF::Neighbor::StartUpdateRetransmissionTimer(void)
00473 {
00474 MessageHandler* messageHandler = parentInterface->GetArea()->GetRouter()->GetMessageHandler();
00475 messageHandler->StartTimer(updateRetransmissionTimer, parentInterface->GetRetransmissionInterval());
00476 updateRetransmissionTimerActive = true;
00477 }
00478
00479 void OSPF::Neighbor::ClearUpdateRetransmissionTimer(void)
00480 {
00481 MessageHandler* messageHandler = parentInterface->GetArea()->GetRouter()->GetMessageHandler();
00482 messageHandler->ClearTimer(updateRetransmissionTimer);
00483 updateRetransmissionTimerActive = false;
00484 }
00485
00486 void OSPF::Neighbor::AddToRequestList(OSPFLSAHeader* lsaHeader)
00487 {
00488 linkStateRequestList.push_back(new OSPFLSAHeader(*lsaHeader));
00489 }
00490
00491 void OSPF::Neighbor::RemoveFromRequestList(OSPF::LSAKeyType lsaKey)
00492 {
00493 std::list<OSPFLSAHeader*>::iterator it = linkStateRequestList.begin();
00494 while (it != linkStateRequestList.end()) {
00495 if (((*it)->getLinkStateID() == lsaKey.linkStateID) &&
00496 ((*it)->getAdvertisingRouter().getInt() == lsaKey.advertisingRouter))
00497 {
00498 delete(*it);
00499 it = linkStateRequestList.erase(it);
00500 } else {
00501 it++;
00502 }
00503 }
00504
00505 if ((GetState() == OSPF::Neighbor::LoadingState) && (linkStateRequestList.empty())) {
00506 ClearRequestRetransmissionTimer();
00507 ProcessEvent(OSPF::Neighbor::LoadingDone);
00508 }
00509 }
00510
00511 bool OSPF::Neighbor::IsLSAOnRequestList(OSPF::LSAKeyType lsaKey) const
00512 {
00513 for (std::list<OSPFLSAHeader*>::const_iterator it = linkStateRequestList.begin(); it != linkStateRequestList.end(); it++) {
00514 const OSPFLSAHeader* lsaHeader = *it;
00515 if ((lsaHeader->getLinkStateID() == lsaKey.linkStateID) &&
00516 (lsaHeader->getAdvertisingRouter().getInt() == lsaKey.advertisingRouter))
00517 {
00518 return true;
00519 }
00520 }
00521 return false;
00522 }
00523
00524 OSPFLSAHeader* OSPF::Neighbor::FindOnRequestList(OSPF::LSAKeyType lsaKey)
00525 {
00526 for (std::list<OSPFLSAHeader*>::iterator it = linkStateRequestList.begin(); it != linkStateRequestList.end(); it++) {
00527 if (((*it)->getLinkStateID() == lsaKey.linkStateID) &&
00528 ((*it)->getAdvertisingRouter().getInt() == lsaKey.advertisingRouter))
00529 {
00530 return (*it);
00531 }
00532 }
00533 return NULL;
00534 }
00535
00536 void OSPF::Neighbor::StartRequestRetransmissionTimer(void)
00537 {
00538 MessageHandler* messageHandler = parentInterface->GetArea()->GetRouter()->GetMessageHandler();
00539 messageHandler->StartTimer(requestRetransmissionTimer, parentInterface->GetRetransmissionInterval());
00540 requestRetransmissionTimerActive = true;
00541 }
00542
00543 void OSPF::Neighbor::ClearRequestRetransmissionTimer(void)
00544 {
00545 MessageHandler* messageHandler = parentInterface->GetArea()->GetRouter()->GetMessageHandler();
00546 messageHandler->ClearTimer(requestRetransmissionTimer);
00547 requestRetransmissionTimerActive = false;
00548 }
00549
00550 void OSPF::Neighbor::AddToTransmittedLSAList(OSPF::LSAKeyType lsaKey)
00551 {
00552 TransmittedLSA transmit;
00553
00554 transmit.lsaKey = lsaKey;
00555 transmit.age = 0;
00556
00557 transmittedLSAs.push_back(transmit);
00558 }
00559
00560 bool OSPF::Neighbor::IsOnTransmittedLSAList(OSPF::LSAKeyType lsaKey) const
00561 {
00562 for (std::list<TransmittedLSA>::const_iterator it = transmittedLSAs.begin(); it != transmittedLSAs.end(); it++) {
00563 if ((it->lsaKey.linkStateID == lsaKey.linkStateID) &&
00564 (it->lsaKey.advertisingRouter == lsaKey.advertisingRouter))
00565 {
00566 return true;
00567 }
00568 }
00569 return false;
00570 }
00571
00572 void OSPF::Neighbor::AgeTransmittedLSAList(void)
00573 {
00574 std::list<TransmittedLSA>::iterator it = transmittedLSAs.begin();
00575 while ((it != transmittedLSAs.end()) && (it->age == MIN_LS_ARRIVAL)) {
00576 transmittedLSAs.pop_front();
00577 it = transmittedLSAs.begin();
00578 }
00579 for (it = transmittedLSAs.begin(); it != transmittedLSAs.end(); it++) {
00580 it->age++;
00581 }
00582 }
00583
00584 void OSPF::Neighbor::RetransmitUpdatePacket(void)
00585 {
00586 OSPFLinkStateUpdatePacket* updatePacket = new OSPFLinkStateUpdatePacket;
00587
00588 updatePacket->setType(LinkStateUpdatePacket);
00589 updatePacket->setRouterID(parentInterface->GetArea()->GetRouter()->GetRouterID());
00590 updatePacket->setAreaID(parentInterface->GetArea()->GetAreaID());
00591 updatePacket->setAuthenticationType(parentInterface->GetAuthenticationType());
00592 OSPF::AuthenticationKeyType authKey = parentInterface->GetAuthenticationKey();
00593 for (int i = 0; i < 8; i++) {
00594 updatePacket->setAuthentication(i, authKey.bytes[i]);
00595 }
00596
00597 bool packetFull = false;
00598 unsigned short lsaCount = 0;
00599 unsigned long packetLength = IPV4_HEADER_LENGTH + OSPF_LSA_HEADER_LENGTH;
00600 std::list<OSPFLSA*>::iterator it = linkStateRetransmissionList.begin();
00601
00602 while (!packetFull && (it != linkStateRetransmissionList.end())) {
00603 LSAType lsaType = static_cast<LSAType> ((*it)->getHeader().getLsType());
00604 OSPFRouterLSA* routerLSA = (lsaType == RouterLSAType) ? dynamic_cast<OSPFRouterLSA*> (*it) : NULL;
00605 OSPFNetworkLSA* networkLSA = (lsaType == NetworkLSAType) ? dynamic_cast<OSPFNetworkLSA*> (*it) : NULL;
00606 OSPFSummaryLSA* summaryLSA = ((lsaType == SummaryLSA_NetworksType) ||
00607 (lsaType == SummaryLSA_ASBoundaryRoutersType)) ? dynamic_cast<OSPFSummaryLSA*> (*it) : NULL;
00608 OSPFASExternalLSA* asExternalLSA = (lsaType == ASExternalLSAType) ? dynamic_cast<OSPFASExternalLSA*> (*it) : NULL;
00609 long lsaSize = 0;
00610 bool includeLSA = false;
00611
00612 switch (lsaType) {
00613 case RouterLSAType:
00614 if (routerLSA != NULL) {
00615 lsaSize = CalculateLSASize(routerLSA);
00616 }
00617 break;
00618 case NetworkLSAType:
00619 if (networkLSA != NULL) {
00620 lsaSize = CalculateLSASize(networkLSA);
00621 }
00622 break;
00623 case SummaryLSA_NetworksType:
00624 case SummaryLSA_ASBoundaryRoutersType:
00625 if (summaryLSA != NULL) {
00626 lsaSize = CalculateLSASize(summaryLSA);
00627 }
00628 break;
00629 case ASExternalLSAType:
00630 if (asExternalLSA != NULL) {
00631 lsaSize = CalculateLSASize(asExternalLSA);
00632 }
00633 break;
00634 default: break;
00635 }
00636
00637 if (packetLength + lsaSize < parentInterface->GetMTU()) {
00638 includeLSA = true;
00639 lsaCount++;
00640 } else {
00641 if ((lsaCount == 0) && (packetLength + lsaSize < IPV4_DATAGRAM_LENGTH)) {
00642 includeLSA = true;
00643 lsaCount++;
00644 packetFull = true;
00645 }
00646 }
00647
00648 if (includeLSA) {
00649 switch (lsaType) {
00650 case RouterLSAType:
00651 if (routerLSA != NULL) {
00652 unsigned int routerLSACount = updatePacket->getRouterLSAsArraySize();
00653
00654 updatePacket->setRouterLSAsArraySize(routerLSACount + 1);
00655 updatePacket->setRouterLSAs(routerLSACount, *routerLSA);
00656
00657 unsigned short lsAge = updatePacket->getRouterLSAs(routerLSACount).getHeader().getLsAge();
00658 if (lsAge < MAX_AGE - parentInterface->GetTransmissionDelay()) {
00659 updatePacket->getRouterLSAs(routerLSACount).getHeader().setLsAge(lsAge + parentInterface->GetTransmissionDelay());
00660 } else {
00661 updatePacket->getRouterLSAs(routerLSACount).getHeader().setLsAge(MAX_AGE);
00662 }
00663 }
00664 break;
00665 case NetworkLSAType:
00666 if (networkLSA != NULL) {
00667 unsigned int networkLSACount = updatePacket->getNetworkLSAsArraySize();
00668
00669 updatePacket->setNetworkLSAsArraySize(networkLSACount + 1);
00670 updatePacket->setNetworkLSAs(networkLSACount, *networkLSA);
00671
00672 unsigned short lsAge = updatePacket->getNetworkLSAs(networkLSACount).getHeader().getLsAge();
00673 if (lsAge < MAX_AGE - parentInterface->GetTransmissionDelay()) {
00674 updatePacket->getNetworkLSAs(networkLSACount).getHeader().setLsAge(lsAge + parentInterface->GetTransmissionDelay());
00675 } else {
00676 updatePacket->getNetworkLSAs(networkLSACount).getHeader().setLsAge(MAX_AGE);
00677 }
00678 }
00679 break;
00680 case SummaryLSA_NetworksType:
00681 case SummaryLSA_ASBoundaryRoutersType:
00682 if (summaryLSA != NULL) {
00683 unsigned int summaryLSACount = updatePacket->getSummaryLSAsArraySize();
00684
00685 updatePacket->setSummaryLSAsArraySize(summaryLSACount + 1);
00686 updatePacket->setSummaryLSAs(summaryLSACount, *summaryLSA);
00687
00688 unsigned short lsAge = updatePacket->getSummaryLSAs(summaryLSACount).getHeader().getLsAge();
00689 if (lsAge < MAX_AGE - parentInterface->GetTransmissionDelay()) {
00690 updatePacket->getSummaryLSAs(summaryLSACount).getHeader().setLsAge(lsAge + parentInterface->GetTransmissionDelay());
00691 } else {
00692 updatePacket->getSummaryLSAs(summaryLSACount).getHeader().setLsAge(MAX_AGE);
00693 }
00694 }
00695 break;
00696 case ASExternalLSAType:
00697 if (asExternalLSA != NULL) {
00698 unsigned int asExternalLSACount = updatePacket->getAsExternalLSAsArraySize();
00699
00700 updatePacket->setAsExternalLSAsArraySize(asExternalLSACount + 1);
00701 updatePacket->setAsExternalLSAs(asExternalLSACount, *asExternalLSA);
00702
00703 unsigned short lsAge = updatePacket->getAsExternalLSAs(asExternalLSACount).getHeader().getLsAge();
00704 if (lsAge < MAX_AGE - parentInterface->GetTransmissionDelay()) {
00705 updatePacket->getAsExternalLSAs(asExternalLSACount).getHeader().setLsAge(lsAge + parentInterface->GetTransmissionDelay());
00706 } else {
00707 updatePacket->getAsExternalLSAs(asExternalLSACount).getHeader().setLsAge(MAX_AGE);
00708 }
00709 }
00710 break;
00711 default: break;
00712 }
00713 }
00714
00715 it++;
00716 }
00717
00718 updatePacket->setPacketLength(0);
00719 updatePacket->setChecksum(0);
00720
00721 OSPF::MessageHandler* messageHandler = parentInterface->GetArea()->GetRouter()->GetMessageHandler();
00722 int ttl = (parentInterface->GetType() == OSPF::Interface::Virtual) ? VIRTUAL_LINK_TTL : 1;
00723 messageHandler->SendPacket(updatePacket, neighborIPAddress, parentInterface->GetIfIndex(), ttl);
00724 }
00725
00726 void OSPF::Neighbor::DeleteLastSentDDPacket(void)
00727 {
00728 if (lastTransmittedDDPacket != NULL) {
00729 delete lastTransmittedDDPacket;
00730 lastTransmittedDDPacket = NULL;
00731 }
00732 }