#include <OSPFNeighbor.h>
|
|
|
00020 { 00021 HelloReceived = 0, 00022 Start = 1, 00023 TwoWayReceived = 2, 00024 NegotiationDone = 3, 00025 ExchangeDone = 4, 00026 BadLinkStateRequest = 5, 00027 LoadingDone = 6, 00028 IsAdjacencyOK = 7, 00029 SequenceNumberMismatch = 8, 00030 OneWayReceived = 9, 00031 KillNeighbor = 10, 00032 InactivityTimer = 11, 00033 PollTimer = 12, 00034 LinkDown = 13, 00035 DDRetransmissionTimer = 14, 00036 UpdateRetransmissionTimer = 15, 00037 RequestRetransmissionTimer = 16 00038 };
|
|
00040 { 00041 DownState = 0, 00042 AttemptState = 1, 00043 InitState = 2, 00044 TwoWayState = 4, 00045 ExchangeStartState = 8, 00046 ExchangeState = 16, 00047 LoadingState = 32, 00048 FullState = 64 00049 };
|
|
00012 : 00013 updateRetransmissionTimerActive (false), 00014 requestRetransmissionTimerActive (false), 00015 firstAdjacencyInited (false), 00016 ddSequenceNumber (0), 00017 neighborID (neighbor), 00018 neighborPriority (0), 00019 neighborIPAddress (OSPF::NullIPv4Address), 00020 neighborsDesignatedRouter (OSPF::NullDesignatedRouterID), 00021 neighborsBackupDesignatedRouter (OSPF::NullDesignatedRouterID), 00022 designatedRoutersSetUp (false), 00023 neighborsRouterDeadInterval (40), 00024 lastTransmittedDDPacket (NULL) 00025 { 00026 memset (&lastReceivedDDPacket, 0, sizeof (OSPF::Neighbor::DDPacketID)); 00027 // setting only I and M bits is invalid -> good initializer 00028 lastReceivedDDPacket.ddOptions.I_Init = true; 00029 lastReceivedDDPacket.ddOptions.M_More = true; 00030 inactivityTimer = new OSPFTimer; 00031 inactivityTimer->setTimerKind (NeighborInactivityTimer); 00032 inactivityTimer->setContextPointer (this); 00033 inactivityTimer->setName ("OSPF::Neighbor::NeighborInactivityTimer"); 00034 pollTimer = new OSPFTimer; 00035 pollTimer->setTimerKind (NeighborPollTimer); 00036 pollTimer->setContextPointer (this); 00037 pollTimer->setName ("OSPF::Neighbor::NeighborPollTimer"); 00038 ddRetransmissionTimer = new OSPFTimer; 00039 ddRetransmissionTimer->setTimerKind (NeighborDDRetransmissionTimer); 00040 ddRetransmissionTimer->setContextPointer (this); 00041 ddRetransmissionTimer->setName ("OSPF::Neighbor::NeighborDDRetransmissionTimer"); 00042 updateRetransmissionTimer = new OSPFTimer; 00043 updateRetransmissionTimer->setTimerKind (NeighborUpdateRetransmissionTimer); 00044 updateRetransmissionTimer->setContextPointer (this); 00045 updateRetransmissionTimer->setName ("OSPF::Neighbor::Neighbor::NeighborUpdateRetransmissionTimer"); 00046 requestRetransmissionTimer = new OSPFTimer; 00047 requestRetransmissionTimer->setTimerKind (NeighborRequestRetransmissionTimer); 00048 requestRetransmissionTimer->setContextPointer (this); 00049 requestRetransmissionTimer->setName ("OSPF::Neighbor::NeighborRequestRetransmissionTimer"); 00050 state = new OSPF::NeighborStateDown; 00051 previousState = NULL; 00052 }
|
|
00055 { 00056 Reset (); 00057 MessageHandler* messageHandler = parentInterface->GetArea ()->GetRouter ()->GetMessageHandler (); 00058 messageHandler->ClearTimer (inactivityTimer); 00059 messageHandler->ClearTimer (pollTimer); 00060 delete inactivityTimer; 00061 delete pollTimer; 00062 delete ddRetransmissionTimer; 00063 delete updateRetransmissionTimer; 00064 delete requestRetransmissionTimer; 00065 if (previousState != NULL) { 00066 delete previousState; 00067 } 00068 delete state; 00069 }
|
|
00470 { 00471 linkStateRequestList.push_back (new OSPFLSAHeader (*lsaHeader)); 00472 }
|
|
If the LSA is already on the retransmission list then it is replaced, else a copy of the LSA is added to the end of the retransmission list.
00377 { 00378 std::list<OSPFLSA*>::iterator it; 00379 for (it = linkStateRetransmissionList.begin (); it != linkStateRetransmissionList.end (); it++) { 00380 if (((*it)->getHeader ().getLinkStateID () == lsa->getHeader ().getLinkStateID ()) && 00381 ((*it)->getHeader ().getAdvertisingRouter ().getInt () == lsa->getHeader ().getAdvertisingRouter ().getInt ())) 00382 { 00383 break; 00384 } 00385 } 00386 00387 OSPFLSA* lsaCopy = NULL; 00388 switch (lsa->getHeader ().getLsType ()) { 00389 case RouterLSAType: 00390 lsaCopy = new OSPFRouterLSA (*(check_and_cast<OSPFRouterLSA*> (lsa))); 00391 break; 00392 case NetworkLSAType: 00393 lsaCopy = new OSPFNetworkLSA (*(check_and_cast<OSPFNetworkLSA*> (lsa))); 00394 break; 00395 case SummaryLSA_NetworksType: 00396 case SummaryLSA_ASBoundaryRoutersType: 00397 lsaCopy = new OSPFSummaryLSA (*(check_and_cast<OSPFSummaryLSA*> (lsa))); 00398 break; 00399 case ASExternalLSAType: 00400 lsaCopy = new OSPFASExternalLSA (*(check_and_cast<OSPFASExternalLSA*> (lsa))); 00401 break; 00402 default: 00403 ASSERT (false); // error 00404 break; 00405 } 00406 00407 if (it != linkStateRetransmissionList.end ()) { 00408 delete (*it); 00409 *it = static_cast<OSPFLSA*> (lsaCopy); 00410 } else { 00411 linkStateRetransmissionList.push_back (static_cast<OSPFLSA*> (lsaCopy)); 00412 } 00413 }
|
|
00534 { 00535 TransmittedLSA transmit; 00536 00537 transmit.lsaKey = lsaKey; 00538 transmit.age = 0; 00539 00540 transmittedLSAs.push_back (transmit); 00541 }
|
|
00556 { 00557 std::list<TransmittedLSA>::iterator it = transmittedLSAs.begin (); 00558 while ((it != transmittedLSAs.end ()) && (it->age == MIN_LS_ARRIVAL)) { 00559 transmittedLSAs.pop_front (); 00560 it = transmittedLSAs.begin (); 00561 } 00562 for (it = transmittedLSAs.begin (); it != transmittedLSAs.end (); it++) { 00563 it->age++; 00564 } 00565 }
|
|
00072 { 00073 if (previousState != NULL) { 00074 delete previousState; 00075 } 00076 state = newState; 00077 previousState = currentState; 00078 }
|
|
00527 { 00528 MessageHandler* messageHandler = parentInterface->GetArea ()->GetRouter ()->GetMessageHandler (); 00529 messageHandler->ClearTimer (requestRetransmissionTimer); 00530 requestRetransmissionTimerActive = false; 00531 }
|
|
00463 { 00464 MessageHandler* messageHandler = parentInterface->GetArea ()->GetRouter ()->GetMessageHandler (); 00465 messageHandler->ClearTimer (updateRetransmissionTimer); 00466 updateRetransmissionTimerActive = false; 00467 }
|
|
00246 { 00247 OSPF::Area* area = parentInterface->GetArea (); 00248 unsigned long routerLSACount = area->GetRouterLSACount (); 00249 00250 /* Note: OSPF specification says: 00251 * "LSAs whose age is equal to MaxAge are instead added to the neighbor's 00252 * Link state retransmission list." 00253 * But this task has been already done during the aging of the database. (???) 00254 * So we'll skip this. 00255 */ 00256 for (unsigned long i = 0; i < routerLSACount; i++) { 00257 if (area->GetRouterLSA (i)->getHeader ().getLsAge () < MAX_AGE) { 00258 OSPFLSAHeader* routerLSA = new OSPFLSAHeader (area->GetRouterLSA (i)->getHeader ()); 00259 databaseSummaryList.push_back (routerLSA); 00260 } 00261 } 00262 00263 unsigned long networkLSACount = area->GetNetworkLSACount (); 00264 for (unsigned long j = 0; j < networkLSACount; j++) { 00265 if (area->GetNetworkLSA (j)->getHeader ().getLsAge () < MAX_AGE) { 00266 OSPFLSAHeader* networkLSA = new OSPFLSAHeader (area->GetNetworkLSA (j)->getHeader ()); 00267 databaseSummaryList.push_back (networkLSA); 00268 } 00269 } 00270 00271 unsigned long summaryLSACount = area->GetSummaryLSACount (); 00272 for (unsigned long k = 0; k < summaryLSACount; k++) { 00273 if (area->GetSummaryLSA (k)->getHeader ().getLsAge () < MAX_AGE) { 00274 OSPFLSAHeader* summaryLSA = new OSPFLSAHeader (area->GetSummaryLSA (k)->getHeader ()); 00275 databaseSummaryList.push_back (summaryLSA); 00276 } 00277 } 00278 00279 if ((parentInterface->GetType () != OSPF::Interface::Virtual) && 00280 (area->GetExternalRoutingCapability ())) 00281 { 00282 OSPF::Router* router = area->GetRouter (); 00283 unsigned long asExternalLSACount = router->GetASExternalLSACount (); 00284 00285 for (unsigned long m = 0; m < asExternalLSACount; m++) { 00286 if (router->GetASExternalLSA (m)->getHeader ().getLsAge () < MAX_AGE) { 00287 OSPFLSAHeader* asExternalLSA = new OSPFLSAHeader (router->GetASExternalLSA (m)->getHeader ()); 00288 databaseSummaryList.push_back (asExternalLSA); 00289 } 00290 } 00291 } 00292 }
|
|
00710 { 00711 if (lastTransmittedDDPacket != NULL) { 00712 delete lastTransmittedDDPacket; 00713 lastTransmittedDDPacket = NULL; 00714 } 00715 }
|
|
00170 { return designatedRoutersSetUp; }
|
|
00508 { 00509 for (std::list<OSPFLSAHeader*>::iterator it = linkStateRequestList.begin (); it != linkStateRequestList.end (); it++) { 00510 if (((*it)->getLinkStateID () == lsaKey.linkStateID) && 00511 ((*it)->getAdvertisingRouter ().getInt () == lsaKey.advertisingRouter)) 00512 { 00513 return (*it); 00514 } 00515 } 00516 return NULL; 00517 }
|
|
00444 { 00445 for (std::list<OSPFLSA*>::iterator it = linkStateRetransmissionList.begin (); it != linkStateRetransmissionList.end (); it++) { 00446 if (((*it)->getHeader ().getLinkStateID () == lsaKey.linkStateID) && 00447 ((*it)->getHeader ().getAdvertisingRouter ().getInt () == lsaKey.advertisingRouter)) 00448 { 00449 return (*it); 00450 } 00451 } 00452 return NULL; 00453 }
|
|
00142 { return neighborIPAddress; }
|
|
00146 { return neighborsBackupDesignatedRouter; }
|
|
00157 { return databaseExchangeRelationship; }
|
|
00172 { return databaseSummaryList.size (); }
|
|
00165 { return ddRetransmissionTimer; }
|
|
00150 { return ddSequenceNumber; }
|
|
00144 { return neighborsDesignatedRouter; }
|
|
00163 { return inactivityTimer; }
|
|
00161 { return parentInterface; }
|
|
00160 { return parentInterface; }
|
|
00154 { return lastReceivedDDPacket; }
|
|
00138 { return neighborID; }
|
|
00152 { return neighborOptions; }
|
|
00164 { return pollTimer; }
|
|
00140 { return neighborPriority; }
|
|
00148 { return neighborsRouterDeadInterval; }
|
|
00129 { 00130 return state->GetState (); 00131 }
|
|
00134 { 00135 switch (stateType) { 00136 case DownState: return "Down"; 00137 case AttemptState: return "Attempt"; 00138 case InitState: return "Init"; 00139 case TwoWayState: return "TwoWay"; 00140 case ExchangeStartState: return "ExchangeStart"; 00141 case ExchangeState: return "Exchange"; 00142 case LoadingState: return "Loading"; 00143 case FullState: return "Full"; 00144 default: ASSERT (false); 00145 } 00146 return ""; 00147 }
|
|
00123 { 00124 // FIXME!!! Should come from a global unique number generator module. 00125 return (ddSequenceNumberInitSeed++); 00126 }
|
|
00166 { return updateRetransmissionTimer; }
|
|
00174 { ddSequenceNumber++; }
|
|
00117 { 00118 ddSequenceNumber = GetUniqueULong (); 00119 firstAdjacencyInited = true; 00120 }
|
|
00169 { return firstAdjacencyInited; }
|
|
00175 { return linkStateRequestList.empty (); }
|
|
00176 { return linkStateRetransmissionList.empty (); }
|
|
00495 { 00496 for (std::list<OSPFLSAHeader*>::const_iterator it = linkStateRequestList.begin (); it != linkStateRequestList.end (); it++) { 00497 const OSPFLSAHeader* lsaHeader = *it; 00498 if ((lsaHeader->getLinkStateID () == lsaKey.linkStateID) && 00499 (lsaHeader->getAdvertisingRouter ().getInt () == lsaKey.advertisingRouter)) 00500 { 00501 return true; 00502 } 00503 } 00504 return false; 00505 }
|
|
00431 { 00432 for (std::list<OSPFLSA*>::const_iterator it = linkStateRetransmissionList.begin (); it != linkStateRetransmissionList.end (); it++) { 00433 const OSPFLSA* lsa = *it; 00434 if ((lsa->getHeader ().getLinkStateID () == lsaKey.linkStateID) && 00435 (lsa->getHeader ().getAdvertisingRouter ().getInt () == lsaKey.advertisingRouter)) 00436 { 00437 return true; 00438 } 00439 } 00440 return false; 00441 }
|
|
00544 { 00545 for (std::list<TransmittedLSA>::const_iterator it = transmittedLSAs.begin (); it != transmittedLSAs.end (); it++) { 00546 if ((it->lsaKey.linkStateID == lsaKey.linkStateID) && 00547 (it->lsaKey.advertisingRouter == lsaKey.advertisingRouter)) 00548 { 00549 return true; 00550 } 00551 } 00552 return false; 00553 }
|
|
00168 { return requestRetransmissionTimerActive; }
|
|
00167 { return updateRetransmissionTimerActive; }
|
|
00347 { 00348 OSPF::Interface::OSPFInterfaceType interfaceType = parentInterface->GetType (); 00349 OSPF::RouterID routerID = parentInterface->GetArea ()->GetRouter ()->GetRouterID (); 00350 OSPF::DesignatedRouterID dRouter = parentInterface->GetDesignatedRouter (); 00351 OSPF::DesignatedRouterID backupDRouter = parentInterface->GetBackupDesignatedRouter (); 00352 00353 if ((interfaceType == OSPF::Interface::PointToPoint) || 00354 (interfaceType == OSPF::Interface::PointToMultiPoint) || 00355 (interfaceType == OSPF::Interface::Virtual) || 00356 (dRouter.routerID == routerID) || 00357 (backupDRouter.routerID == routerID) || 00358 ((neighborsDesignatedRouter.routerID == dRouter.routerID) || 00359 (!designatedRoutersSetUp && 00360 (neighborsDesignatedRouter.ipInterfaceAddress == dRouter.ipInterfaceAddress))) || 00361 ((neighborsBackupDesignatedRouter.routerID == backupDRouter.routerID) || 00362 (!designatedRoutersSetUp && 00363 (neighborsBackupDesignatedRouter.ipInterfaceAddress == backupDRouter.ipInterfaceAddress)))) 00364 { 00365 return true; 00366 } else { 00367 return false; 00368 } 00369 }
|
|
00177 { linkStateRequestList.pop_front (); }
|
|
00081 { 00082 state->ProcessEvent (this, event); 00083 }
|
|
00475 { 00476 std::list<OSPFLSAHeader*>::iterator it = linkStateRequestList.begin (); 00477 while (it != linkStateRequestList.end ()) { 00478 if (((*it)->getLinkStateID () == lsaKey.linkStateID) && 00479 ((*it)->getAdvertisingRouter ().getInt () == lsaKey.advertisingRouter)) 00480 { 00481 delete (*it); 00482 it = linkStateRequestList.erase (it); 00483 } else { 00484 it++; 00485 } 00486 } 00487 00488 if ((GetState () == OSPF::Neighbor::LoadingState) && (linkStateRequestList.empty ())) { 00489 ClearRequestRetransmissionTimer (); 00490 ProcessEvent (OSPF::Neighbor::LoadingDone); 00491 } 00492 }
|
|
00416 { 00417 std::list<OSPFLSA*>::iterator it = linkStateRetransmissionList.begin (); 00418 while (it != linkStateRetransmissionList.end ()) { 00419 if (((*it)->getHeader ().getLinkStateID () == lsaKey.linkStateID) && 00420 ((*it)->getHeader ().getAdvertisingRouter ().getInt () == lsaKey.advertisingRouter)) 00421 { 00422 delete (*it); 00423 it = linkStateRetransmissionList.erase (it); 00424 } else { 00425 it++; 00426 } 00427 } 00428 }
|
|
00086 { 00087 for (std::list<OSPFLSA*>::iterator retIt = linkStateRetransmissionList.begin (); 00088 retIt != linkStateRetransmissionList.end (); 00089 retIt++) 00090 { 00091 delete (*retIt); 00092 } 00093 linkStateRetransmissionList.clear (); 00094 00095 std::list<OSPFLSAHeader*>::iterator it; 00096 for (it = databaseSummaryList.begin (); it != databaseSummaryList.end (); it++) { 00097 delete (*it); 00098 } 00099 databaseSummaryList.clear (); 00100 for (it = linkStateRequestList.begin (); it != linkStateRequestList.end (); it++) 00101 { 00102 delete (*it); 00103 } 00104 linkStateRequestList.clear (); 00105 00106 parentInterface->GetArea ()->GetRouter ()->GetMessageHandler ()->ClearTimer (ddRetransmissionTimer); 00107 ClearUpdateRetransmissionTimer (); 00108 ClearRequestRetransmissionTimer (); 00109 00110 if (lastTransmittedDDPacket != NULL) { 00111 delete lastTransmittedDDPacket; 00112 lastTransmittedDDPacket = NULL; 00113 } 00114 }
|
|
00227 { 00228 if (lastTransmittedDDPacket != NULL) { 00229 OSPFDatabaseDescriptionPacket* ddPacket = new OSPFDatabaseDescriptionPacket (*lastTransmittedDDPacket); 00230 OSPF::MessageHandler* messageHandler = parentInterface->GetArea ()->GetRouter ()->GetMessageHandler (); 00231 int ttl = (parentInterface->GetType () == OSPF::Interface::Virtual) ? VIRTUAL_LINK_TTL : 1; 00232 00233 if (parentInterface->GetType () == OSPF::Interface::PointToPoint) { 00234 messageHandler->SendPacket (ddPacket, OSPF::AllSPFRouters, parentInterface->GetIfIndex (), ttl); 00235 } else { 00236 messageHandler->SendPacket (ddPacket, neighborIPAddress, parentInterface->GetIfIndex (), ttl); 00237 } 00238 00239 return true; 00240 } else { 00241 return false; 00242 } 00243 }
|
|
00568 { 00569 OSPFLinkStateUpdatePacket* updatePacket = new OSPFLinkStateUpdatePacket; 00570 00571 updatePacket->setType (LinkStateUpdatePacket); 00572 updatePacket->setRouterID (parentInterface->GetArea ()->GetRouter ()->GetRouterID ()); 00573 updatePacket->setAreaID (parentInterface->GetArea ()->GetAreaID ()); 00574 updatePacket->setAuthenticationType (parentInterface->GetAuthenticationType ()); 00575 OSPF::AuthenticationKeyType authKey = parentInterface->GetAuthenticationKey (); 00576 for (int i = 0; i < 8; i++) { 00577 updatePacket->setAuthentication (i, authKey.bytes[i]); 00578 } 00579 00580 bool packetFull = false; 00581 unsigned short lsaCount = 0; 00582 unsigned long packetLength = IPV4_HEADER_LENGTH + OSPF_LSA_HEADER_LENGTH; 00583 std::list<OSPFLSA*>::iterator it = linkStateRetransmissionList.begin (); 00584 00585 while (!packetFull && (it != linkStateRetransmissionList.end ())) { 00586 LSAType lsaType = static_cast<LSAType> ((*it)->getHeader ().getLsType ()); 00587 OSPFRouterLSA* routerLSA = (lsaType == RouterLSAType) ? dynamic_cast<OSPFRouterLSA*> (*it) : NULL; 00588 OSPFNetworkLSA* networkLSA = (lsaType == NetworkLSAType) ? dynamic_cast<OSPFNetworkLSA*> (*it) : NULL; 00589 OSPFSummaryLSA* summaryLSA = ((lsaType == SummaryLSA_NetworksType) || 00590 (lsaType == SummaryLSA_ASBoundaryRoutersType)) ? dynamic_cast<OSPFSummaryLSA*> (*it) : NULL; 00591 OSPFASExternalLSA* asExternalLSA = (lsaType == ASExternalLSAType) ? dynamic_cast<OSPFASExternalLSA*> (*it) : NULL; 00592 long lsaSize = 0; 00593 bool includeLSA = false; 00594 00595 switch (lsaType) { 00596 case RouterLSAType: 00597 if (routerLSA != NULL) { 00598 lsaSize = CalculateLSASize (routerLSA); 00599 } 00600 break; 00601 case NetworkLSAType: 00602 if (networkLSA != NULL) { 00603 lsaSize = CalculateLSASize (networkLSA); 00604 } 00605 break; 00606 case SummaryLSA_NetworksType: 00607 case SummaryLSA_ASBoundaryRoutersType: 00608 if (summaryLSA != NULL) { 00609 lsaSize = CalculateLSASize (summaryLSA); 00610 } 00611 break; 00612 case ASExternalLSAType: 00613 if (asExternalLSA != NULL) { 00614 lsaSize = CalculateLSASize (asExternalLSA); 00615 } 00616 break; 00617 default: break; 00618 } 00619 00620 if (packetLength + lsaSize < parentInterface->GetMTU ()) { 00621 includeLSA = true; 00622 lsaCount++; 00623 } else { 00624 if ((lsaCount == 0) && (packetLength + lsaSize < IPV4_DATAGRAM_LENGTH)) { 00625 includeLSA = true; 00626 lsaCount++; 00627 packetFull = true; 00628 } 00629 } 00630 00631 if (includeLSA) { 00632 switch (lsaType) { 00633 case RouterLSAType: 00634 if (routerLSA != NULL) { 00635 unsigned int routerLSACount = updatePacket->getRouterLSAsArraySize (); 00636 00637 updatePacket->setRouterLSAsArraySize (routerLSACount + 1); 00638 updatePacket->setRouterLSAs (routerLSACount, *routerLSA); 00639 00640 unsigned short lsAge = updatePacket->getRouterLSAs (routerLSACount).getHeader ().getLsAge (); 00641 if (lsAge < MAX_AGE - parentInterface->GetTransmissionDelay ()) { 00642 updatePacket->getRouterLSAs (routerLSACount).getHeader ().setLsAge (lsAge + parentInterface->GetTransmissionDelay ()); 00643 } else { 00644 updatePacket->getRouterLSAs (routerLSACount).getHeader ().setLsAge (MAX_AGE); 00645 } 00646 } 00647 break; 00648 case NetworkLSAType: 00649 if (networkLSA != NULL) { 00650 unsigned int networkLSACount = updatePacket->getNetworkLSAsArraySize (); 00651 00652 updatePacket->setNetworkLSAsArraySize (networkLSACount + 1); 00653 updatePacket->setNetworkLSAs (networkLSACount, *networkLSA); 00654 00655 unsigned short lsAge = updatePacket->getNetworkLSAs (networkLSACount).getHeader ().getLsAge (); 00656 if (lsAge < MAX_AGE - parentInterface->GetTransmissionDelay ()) { 00657 updatePacket->getNetworkLSAs (networkLSACount).getHeader ().setLsAge (lsAge + parentInterface->GetTransmissionDelay ()); 00658 } else { 00659 updatePacket->getNetworkLSAs (networkLSACount).getHeader ().setLsAge (MAX_AGE); 00660 } 00661 } 00662 break; 00663 case SummaryLSA_NetworksType: 00664 case SummaryLSA_ASBoundaryRoutersType: 00665 if (summaryLSA != NULL) { 00666 unsigned int summaryLSACount = updatePacket->getSummaryLSAsArraySize (); 00667 00668 updatePacket->setSummaryLSAsArraySize (summaryLSACount + 1); 00669 updatePacket->setSummaryLSAs (summaryLSACount, *summaryLSA); 00670 00671 unsigned short lsAge = updatePacket->getSummaryLSAs (summaryLSACount).getHeader ().getLsAge (); 00672 if (lsAge < MAX_AGE - parentInterface->GetTransmissionDelay ()) { 00673 updatePacket->getSummaryLSAs (summaryLSACount).getHeader ().setLsAge (lsAge + parentInterface->GetTransmissionDelay ()); 00674 } else { 00675 updatePacket->getSummaryLSAs (summaryLSACount).getHeader ().setLsAge (MAX_AGE); 00676 } 00677 } 00678 break; 00679 case ASExternalLSAType: 00680 if (asExternalLSA != NULL) { 00681 unsigned int asExternalLSACount = updatePacket->getAsExternalLSAsArraySize (); 00682 00683 updatePacket->setAsExternalLSAsArraySize (asExternalLSACount + 1); 00684 updatePacket->setAsExternalLSAs (asExternalLSACount, *asExternalLSA); 00685 00686 unsigned short lsAge = updatePacket->getAsExternalLSAs (asExternalLSACount).getHeader ().getLsAge (); 00687 if (lsAge < MAX_AGE - parentInterface->GetTransmissionDelay ()) { 00688 updatePacket->getAsExternalLSAs (asExternalLSACount).getHeader ().setLsAge (lsAge + parentInterface->GetTransmissionDelay ()); 00689 } else { 00690 updatePacket->getAsExternalLSAs (asExternalLSACount).getHeader ().setLsAge (MAX_AGE); 00691 } 00692 } 00693 break; 00694 default: break; 00695 } 00696 } 00697 00698 it++; 00699 } 00700 00701 updatePacket->setPacketLength (0); // TODO: Calculate correct length 00702 updatePacket->setChecksum (0); // TODO: Calculate correct cheksum (16-bit one's complement of the entire packet) 00703 00704 OSPF::MessageHandler* messageHandler = parentInterface->GetArea ()->GetRouter ()->GetMessageHandler (); 00705 int ttl = (parentInterface->GetType () == OSPF::Interface::Virtual) ? VIRTUAL_LINK_TTL : 1; 00706 messageHandler->SendPacket (updatePacket, neighborIPAddress, parentInterface->GetIfIndex (), ttl); 00707 }
|
|
00150 { 00151 OSPFDatabaseDescriptionPacket* ddPacket = new OSPFDatabaseDescriptionPacket; 00152 00153 ddPacket->setType (DatabaseDescriptionPacket); 00154 ddPacket->setRouterID (parentInterface->GetArea ()->GetRouter ()->GetRouterID ()); 00155 ddPacket->setAreaID (parentInterface->GetArea ()->GetAreaID ()); 00156 ddPacket->setAuthenticationType (parentInterface->GetAuthenticationType ()); 00157 OSPF::AuthenticationKeyType authKey = parentInterface->GetAuthenticationKey (); 00158 for (int i = 0; i < 8; i++) { 00159 ddPacket->setAuthentication (i, authKey.bytes[i]); 00160 } 00161 00162 if (parentInterface->GetType () != OSPF::Interface::Virtual) { 00163 ddPacket->setInterfaceMTU (parentInterface->GetMTU ()); 00164 } else { 00165 ddPacket->setInterfaceMTU (0); 00166 } 00167 00168 OSPFOptions options; 00169 memset (&options, 0, sizeof (OSPFOptions)); 00170 options.E_ExternalRoutingCapability = parentInterface->GetArea ()->GetExternalRoutingCapability (); 00171 ddPacket->setOptions (options); 00172 00173 ddPacket->setDdSequenceNumber (ddSequenceNumber); 00174 00175 long maxPacketSize = ((IPV4_HEADER_LENGTH + OSPF_HEADER_LENGTH + OSPF_DD_HEADER_LENGTH + OSPF_LSA_HEADER_LENGTH) > parentInterface->GetMTU ()) ? 00176 IPV4_DATAGRAM_LENGTH : 00177 parentInterface->GetMTU (); 00178 00179 if (init || databaseSummaryList.empty ()) { 00180 ddPacket->setLsaHeadersArraySize (0); 00181 } else { 00182 // delete included LSAs from summary list 00183 // (they are still in lastTransmittedDDPacket) 00184 long packetSize = IPV4_HEADER_LENGTH + OSPF_HEADER_LENGTH + OSPF_DD_HEADER_LENGTH; 00185 while ((!databaseSummaryList.empty ()) && (packetSize <= (maxPacketSize - OSPF_LSA_HEADER_LENGTH))) { 00186 unsigned long headerCount = ddPacket->getLsaHeadersArraySize (); 00187 OSPFLSAHeader* lsaHeader = *(databaseSummaryList.begin ()); 00188 ddPacket->setLsaHeadersArraySize (headerCount + 1); 00189 ddPacket->setLsaHeaders (headerCount, *lsaHeader); 00190 delete lsaHeader; 00191 databaseSummaryList.pop_front (); 00192 packetSize += OSPF_LSA_HEADER_LENGTH; 00193 } 00194 } 00195 00196 OSPFDDOptions ddOptions; 00197 memset (&ddOptions, 0, sizeof (OSPFDDOptions)); 00198 if (init) { 00199 ddOptions.I_Init = true; 00200 ddOptions.M_More = true; 00201 ddOptions.MS_MasterSlave = true; 00202 } else { 00203 ddOptions.I_Init = false; 00204 ddOptions.M_More = (databaseSummaryList.empty ()) ? false : true; 00205 ddOptions.MS_MasterSlave = (databaseExchangeRelationship == OSPF::Neighbor::Master) ? true : false; 00206 } 00207 ddPacket->setDdOptions (ddOptions); 00208 00209 ddPacket->setPacketLength (0); // TODO: Calculate correct length 00210 ddPacket->setChecksum (0); // TODO: Calculate correct cheksum (16-bit one's complement of the entire packet) 00211 00212 OSPF::MessageHandler* messageHandler = parentInterface->GetArea ()->GetRouter ()->GetMessageHandler (); 00213 int ttl = (parentInterface->GetType () == OSPF::Interface::Virtual) ? VIRTUAL_LINK_TTL : 1; 00214 if (parentInterface->GetType () == OSPF::Interface::PointToPoint) { 00215 messageHandler->SendPacket (ddPacket, OSPF::AllSPFRouters, parentInterface->GetIfIndex (), ttl); 00216 } else { 00217 messageHandler->SendPacket (ddPacket, neighborIPAddress, parentInterface->GetIfIndex (), ttl); 00218 } 00219 00220 if (lastTransmittedDDPacket != NULL) { 00221 delete lastTransmittedDDPacket; 00222 } 00223 lastTransmittedDDPacket = new OSPFDatabaseDescriptionPacket (*ddPacket); 00224 }
|
|
00295 { 00296 OSPFLinkStateRequestPacket* requestPacket = new OSPFLinkStateRequestPacket; 00297 00298 requestPacket->setType (LinkStateRequestPacket); 00299 requestPacket->setRouterID (parentInterface->GetArea ()->GetRouter ()->GetRouterID ()); 00300 requestPacket->setAreaID (parentInterface->GetArea ()->GetAreaID ()); 00301 requestPacket->setAuthenticationType (parentInterface->GetAuthenticationType ()); 00302 OSPF::AuthenticationKeyType authKey = parentInterface->GetAuthenticationKey (); 00303 for (int i = 0; i < 8; i++) { 00304 requestPacket->setAuthentication (i, authKey.bytes[i]); 00305 } 00306 00307 long maxPacketSize = ((IPV4_HEADER_LENGTH + OSPF_HEADER_LENGTH + OSPF_REQUEST_LENGTH) > parentInterface->GetMTU ()) ? 00308 IPV4_DATAGRAM_LENGTH : 00309 parentInterface->GetMTU (); 00310 00311 if (linkStateRequestList.empty ()) { 00312 requestPacket->setRequestsArraySize (0); 00313 } else { 00314 long packetSize = IPV4_HEADER_LENGTH + OSPF_HEADER_LENGTH; 00315 std::list<OSPFLSAHeader*>::iterator it = linkStateRequestList.begin (); 00316 00317 while ((it != linkStateRequestList.end ()) && (packetSize <= (maxPacketSize - OSPF_REQUEST_LENGTH))) { 00318 unsigned long requestCount = requestPacket->getRequestsArraySize (); 00319 OSPFLSAHeader* requestHeader = (*it); 00320 LSARequest request; 00321 00322 request.lsType = requestHeader->getLsType (); 00323 request.linkStateID = requestHeader->getLinkStateID (); 00324 request.advertisingRouter = requestHeader->getAdvertisingRouter (); 00325 00326 requestPacket->setRequestsArraySize (requestCount + 1); 00327 requestPacket->setRequests (requestCount, request); 00328 00329 packetSize += OSPF_REQUEST_LENGTH; 00330 it++; 00331 } 00332 } 00333 00334 requestPacket->setPacketLength (0); // TODO: Calculate correct length 00335 requestPacket->setChecksum (0); // TODO: Calculate correct cheksum (16-bit one's complement of the entire packet) 00336 00337 OSPF::MessageHandler* messageHandler = parentInterface->GetArea ()->GetRouter ()->GetMessageHandler (); 00338 int ttl = (parentInterface->GetType () == OSPF::Interface::Virtual) ? VIRTUAL_LINK_TTL : 1; 00339 if (parentInterface->GetType () == OSPF::Interface::PointToPoint) { 00340 messageHandler->SendPacket (requestPacket, OSPF::AllSPFRouters, parentInterface->GetIfIndex (), ttl); 00341 } else { 00342 messageHandler->SendPacket (requestPacket, neighborIPAddress, parentInterface->GetIfIndex (), ttl); 00343 } 00344 }
|
|
00141 { neighborIPAddress = address; }
|
|
00145 { neighborsBackupDesignatedRouter = routerID; }
|
|
00156 { databaseExchangeRelationship = relation; }
|
|
00149 { ddSequenceNumber = sequenceNumber; }
|
|
00143 { neighborsDesignatedRouter = routerID; }
|
|
00159 { parentInterface = intf; }
|
|
00153 { lastReceivedDDPacket = packetID; }
|
|
00137 { neighborID = id; }
|
|
00151 { neighborOptions = options; }
|
|
00139 { neighborPriority = priority; }
|
|
00147 { neighborsRouterDeadInterval = interval; }
|
|
00171 { designatedRoutersSetUp = setUp; }
|
|
00520 { 00521 MessageHandler* messageHandler = parentInterface->GetArea ()->GetRouter ()->GetMessageHandler (); 00522 messageHandler->StartTimer (requestRetransmissionTimer, parentInterface->GetRetransmissionInterval ()); 00523 requestRetransmissionTimerActive = true; 00524 }
|
|
00456 { 00457 MessageHandler* messageHandler = parentInterface->GetArea ()->GetRouter ()->GetMessageHandler (); 00458 messageHandler->StartTimer (updateRetransmissionTimer, parentInterface->GetRetransmissionInterval ()); 00459 updateRetransmissionTimerActive = true; 00460 }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|