00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "OSPFInterface.h"
00019 #include "OSPFInterfaceStateDown.h"
00020 #include "InterfaceTableAccess.h"
00021 #include "IPv4InterfaceData.h"
00022 #include "MessageHandler.h"
00023 #include "OSPFArea.h"
00024 #include "OSPFRouter.h"
00025 #include <vector>
00026 #include <memory.h>
00027
00028 OSPF::Interface::Interface(OSPF::Interface::OSPFInterfaceType ifType) :
00029 interfaceType(ifType),
00030 ifIndex(0),
00031 mtu(0),
00032 interfaceAddressRange(OSPF::NullIPv4AddressRange),
00033 areaID(OSPF::BackboneAreaID),
00034 transitAreaID(OSPF::BackboneAreaID),
00035 helloInterval(10),
00036 pollInterval(120),
00037 routerDeadInterval(40),
00038 interfaceTransmissionDelay(1),
00039 routerPriority(0),
00040 designatedRouter(OSPF::NullDesignatedRouterID),
00041 backupDesignatedRouter(OSPF::NullDesignatedRouterID),
00042 interfaceOutputCost(1),
00043 retransmissionInterval(5),
00044 acknowledgementDelay(1),
00045 authenticationType(OSPF::NullType),
00046 parentArea(NULL)
00047 {
00048 state = new OSPF::InterfaceStateDown;
00049 previousState = NULL;
00050 helloTimer = new OSPFTimer;
00051 helloTimer->setTimerKind(InterfaceHelloTimer);
00052 helloTimer->setContextPointer(this);
00053 helloTimer->setName("OSPF::Interface::InterfaceHelloTimer");
00054 waitTimer = new OSPFTimer;
00055 waitTimer->setTimerKind(InterfaceWaitTimer);
00056 waitTimer->setContextPointer(this);
00057 waitTimer->setName("OSPF::Interface::InterfaceWaitTimer");
00058 acknowledgementTimer = new OSPFTimer;
00059 acknowledgementTimer->setTimerKind(InterfaceAcknowledgementTimer);
00060 acknowledgementTimer->setContextPointer(this);
00061 acknowledgementTimer->setName("OSPF::Interface::InterfaceAcknowledgementTimer");
00062 memset(authenticationKey.bytes, 0, 8 * sizeof(char));
00063 }
00064
00065 OSPF::Interface::~Interface(void)
00066 {
00067 MessageHandler* messageHandler = parentArea->GetRouter()->GetMessageHandler();
00068 messageHandler->ClearTimer(helloTimer);
00069 delete helloTimer;
00070 messageHandler->ClearTimer(waitTimer);
00071 delete waitTimer;
00072 messageHandler->ClearTimer(acknowledgementTimer);
00073 delete acknowledgementTimer;
00074 if (previousState != NULL) {
00075 delete previousState;
00076 }
00077 delete state;
00078 long neighborCount = neighboringRouters.size();
00079 for (long i = 0; i < neighborCount; i++) {
00080 delete neighboringRouters[i];
00081 }
00082 }
00083
00084 void OSPF::Interface::SetIfIndex(unsigned char index)
00085 {
00086 ifIndex = index;
00087 if (interfaceType == OSPF::Interface::UnknownType) {
00088 InterfaceEntry* routingInterface = InterfaceTableAccess().get()->getInterfaceById(ifIndex);
00089 interfaceAddressRange.address = IPv4AddressFromAddressString(routingInterface->ipv4Data()->getIPAddress().str().c_str());
00090 interfaceAddressRange.mask = IPv4AddressFromAddressString(routingInterface->ipv4Data()->getNetmask().str().c_str());
00091 mtu = routingInterface->getMTU();
00092 }
00093 }
00094
00095 void OSPF::Interface::ChangeState(OSPF::InterfaceState* newState, OSPF::InterfaceState* currentState)
00096 {
00097 if (previousState != NULL) {
00098 delete previousState;
00099 }
00100 state = newState;
00101 previousState = currentState;
00102 }
00103
00104 void OSPF::Interface::ProcessEvent(OSPF::Interface::InterfaceEventType event)
00105 {
00106 state->ProcessEvent(this, event);
00107 }
00108
00109 void OSPF::Interface::Reset(void)
00110 {
00111 MessageHandler* messageHandler = parentArea->GetRouter()->GetMessageHandler();
00112 messageHandler->ClearTimer(helloTimer);
00113 messageHandler->ClearTimer(waitTimer);
00114 messageHandler->ClearTimer(acknowledgementTimer);
00115 designatedRouter = NullDesignatedRouterID;
00116 backupDesignatedRouter = NullDesignatedRouterID;
00117 long neighborCount = neighboringRouters.size();
00118 for (long i = 0; i < neighborCount; i++) {
00119 neighboringRouters[i]->ProcessEvent(OSPF::Neighbor::KillNeighbor);
00120 }
00121 }
00122
00123 void OSPF::Interface::SendHelloPacket(OSPF::IPv4Address destination, short ttl)
00124 {
00125 OSPFOptions options;
00126 OSPFHelloPacket* helloPacket = new OSPFHelloPacket;
00127 std::vector<OSPF::IPv4Address> neighbors;
00128
00129 helloPacket->setRouterID(parentArea->GetRouter()->GetRouterID());
00130 helloPacket->setAreaID(parentArea->GetAreaID());
00131 helloPacket->setAuthenticationType(authenticationType);
00132 for (int i = 0; i < 8; i++) {
00133 helloPacket->setAuthentication(i, authenticationKey.bytes[i]);
00134 }
00135
00136 if (((interfaceType == PointToPoint) &&
00137 (interfaceAddressRange.address == OSPF::NullIPv4Address)) ||
00138 (interfaceType == Virtual))
00139 {
00140 helloPacket->setNetworkMask(ULongFromIPv4Address(OSPF::NullIPv4Address));
00141 } else {
00142 helloPacket->setNetworkMask(ULongFromIPv4Address(interfaceAddressRange.mask));
00143 }
00144 memset(&options, 0, sizeof(OSPFOptions));
00145 options.E_ExternalRoutingCapability = parentArea->GetExternalRoutingCapability();
00146 helloPacket->setOptions(options);
00147 helloPacket->setHelloInterval(helloInterval);
00148 helloPacket->setRouterPriority(routerPriority);
00149 helloPacket->setRouterDeadInterval(routerDeadInterval);
00150 helloPacket->setDesignatedRouter(ULongFromIPv4Address(designatedRouter.ipInterfaceAddress));
00151 helloPacket->setBackupDesignatedRouter(ULongFromIPv4Address(backupDesignatedRouter.ipInterfaceAddress));
00152 long neighborCount = neighboringRouters.size();
00153 for (long j = 0; j < neighborCount; j++) {
00154 if (neighboringRouters[j]->GetState() >= OSPF::Neighbor::InitState) {
00155 neighbors.push_back(neighboringRouters[j]->GetAddress());
00156 }
00157 }
00158 unsigned int initedNeighborCount = neighbors.size();
00159 helloPacket->setNeighborArraySize(initedNeighborCount);
00160 for (unsigned int k = 0; k < initedNeighborCount; k++) {
00161 helloPacket->setNeighbor(k, ULongFromIPv4Address(neighbors[k]));
00162 }
00163
00164 helloPacket->setPacketLength(0);
00165 helloPacket->setChecksum(0);
00166
00167 parentArea->GetRouter()->GetMessageHandler()->SendPacket(helloPacket, destination, ifIndex, ttl);
00168 }
00169
00170 void OSPF::Interface::SendLSAcknowledgement(OSPFLSAHeader* lsaHeader, IPv4Address destination)
00171 {
00172 OSPFOptions options;
00173 OSPFLinkStateAcknowledgementPacket* lsAckPacket = new OSPFLinkStateAcknowledgementPacket;
00174
00175 lsAckPacket->setType(LinkStateAcknowledgementPacket);
00176 lsAckPacket->setRouterID(parentArea->GetRouter()->GetRouterID());
00177 lsAckPacket->setAreaID(parentArea->GetAreaID());
00178 lsAckPacket->setAuthenticationType(authenticationType);
00179 for (int i = 0; i < 8; i++) {
00180 lsAckPacket->setAuthentication(i, authenticationKey.bytes[i]);
00181 }
00182
00183 lsAckPacket->setLsaHeadersArraySize(1);
00184 lsAckPacket->setLsaHeaders(0, *lsaHeader);
00185
00186 lsAckPacket->setPacketLength(0);
00187 lsAckPacket->setChecksum(0);
00188
00189 int ttl = (interfaceType == OSPF::Interface::Virtual) ? VIRTUAL_LINK_TTL : 1;
00190 parentArea->GetRouter()->GetMessageHandler()->SendPacket(lsAckPacket, destination, ifIndex, ttl);
00191 }
00192
00193
00194 OSPF::Neighbor* OSPF::Interface::GetNeighborByID(OSPF::RouterID neighborID)
00195 {
00196 std::map<OSPF::RouterID, OSPF::Neighbor*>::iterator neighborIt = neighboringRoutersByID.find(neighborID);
00197 if (neighborIt != neighboringRoutersByID.end()) {
00198 return (neighborIt->second);
00199 }
00200 else {
00201 return NULL;
00202 }
00203 }
00204
00205 OSPF::Neighbor* OSPF::Interface::GetNeighborByAddress(OSPF::IPv4Address address)
00206 {
00207 std::map<OSPF::IPv4Address, OSPF::Neighbor*, OSPF::IPv4Address_Less>::iterator neighborIt = neighboringRoutersByAddress.find(address);
00208 if (neighborIt != neighboringRoutersByAddress.end()) {
00209 return (neighborIt->second);
00210 }
00211 else {
00212 return NULL;
00213 }
00214 }
00215
00216 void OSPF::Interface::AddNeighbor(OSPF::Neighbor* neighbor)
00217 {
00218 neighboringRoutersByID[neighbor->GetNeighborID()] = neighbor;
00219 neighboringRoutersByAddress[neighbor->GetAddress()] = neighbor;
00220 neighbor->SetInterface(this);
00221 neighboringRouters.push_back(neighbor);
00222 }
00223
00224 OSPF::Interface::InterfaceStateType OSPF::Interface::GetState(void) const
00225 {
00226 return state->GetState();
00227 }
00228
00229 const char* OSPF::Interface::GetStateString(OSPF::Interface::InterfaceStateType stateType)
00230 {
00231 switch (stateType) {
00232 case DownState: return "Down";
00233 case LoopbackState: return "Loopback";
00234 case WaitingState: return "Waiting";
00235 case PointToPointState: return "PointToPoint";
00236 case NotDesignatedRouterState: return "NotDesignatedRouter";
00237 case BackupState: return "Backup";
00238 case DesignatedRouterState: return "DesignatedRouter";
00239 default: ASSERT(false);
00240 }
00241 return "";
00242 }
00243
00244 bool OSPF::Interface::HasAnyNeighborInStates(int states) const
00245 {
00246 long neighborCount = neighboringRouters.size();
00247 for (long i = 0; i < neighborCount; i++) {
00248 OSPF::Neighbor::NeighborStateType neighborState = neighboringRouters[i]->GetState();
00249 if (neighborState & states) {
00250 return true;
00251 }
00252 }
00253 return false;
00254 }
00255
00256 void OSPF::Interface::RemoveFromAllRetransmissionLists(OSPF::LSAKeyType lsaKey)
00257 {
00258 long neighborCount = neighboringRouters.size();
00259 for (long i = 0; i < neighborCount; i++) {
00260 neighboringRouters[i]->RemoveFromRetransmissionList(lsaKey);
00261 }
00262 }
00263
00264 bool OSPF::Interface::IsOnAnyRetransmissionList(OSPF::LSAKeyType lsaKey) const
00265 {
00266 long neighborCount = neighboringRouters.size();
00267 for (long i = 0; i < neighborCount; i++) {
00268 if (neighboringRouters[i]->IsLSAOnRetransmissionList(lsaKey)) {
00269 return true;
00270 }
00271 }
00272 return false;
00273 }
00274
00278 bool OSPF::Interface::FloodLSA(OSPFLSA* lsa, OSPF::Interface* intf, OSPF::Neighbor* neighbor)
00279 {
00280 bool floodedBackOut = false;
00281
00282 if (
00283 (
00284 (lsa->getHeader().getLsType() == ASExternalLSAType) &&
00285 (interfaceType != OSPF::Interface::Virtual) &&
00286 (parentArea->GetExternalRoutingCapability())
00287 ) ||
00288 (
00289 (lsa->getHeader().getLsType() != ASExternalLSAType) &&
00290 (
00291 (
00292 (areaID != OSPF::BackboneAreaID) &&
00293 (interfaceType != OSPF::Interface::Virtual)
00294 ) ||
00295 (areaID == OSPF::BackboneAreaID)
00296 )
00297 )
00298 )
00299 {
00300 long neighborCount = neighboringRouters.size();
00301 bool lsaAddedToRetransmissionList = false;
00302 OSPF::LinkStateID linkStateID = lsa->getHeader().getLinkStateID();
00303 OSPF::LSAKeyType lsaKey;
00304
00305 lsaKey.linkStateID = linkStateID;
00306 lsaKey.advertisingRouter = lsa->getHeader().getAdvertisingRouter().getInt();
00307
00308 for (long i = 0; i < neighborCount; i++) {
00309 if (neighboringRouters[i]->GetState() < OSPF::Neighbor::ExchangeState) {
00310 continue;
00311 }
00312 if (neighboringRouters[i]->GetState() < OSPF::Neighbor::FullState) {
00313 OSPFLSAHeader* requestLSAHeader = neighboringRouters[i]->FindOnRequestList(lsaKey);
00314 if (requestLSAHeader != NULL) {
00315
00316 if (lsa->getHeader() < (*requestLSAHeader)) {
00317 continue;
00318 }
00319 if (operator== (lsa->getHeader(), (*requestLSAHeader))) {
00320 neighboringRouters[i]->RemoveFromRequestList(lsaKey);
00321 continue;
00322 }
00323 neighboringRouters[i]->RemoveFromRequestList(lsaKey);
00324 }
00325 }
00326 if (neighbor == neighboringRouters[i]) {
00327 continue;
00328 }
00329 neighboringRouters[i]->AddToRetransmissionList(lsa);
00330 lsaAddedToRetransmissionList = true;
00331 }
00332 if (lsaAddedToRetransmissionList) {
00333 if ((intf != this) ||
00334 ((neighbor != NULL) &&
00335 (neighbor->GetNeighborID() != designatedRouter.routerID) &&
00336 (neighbor->GetNeighborID() != backupDesignatedRouter.routerID)))
00337 {
00338 if ((intf != this) || (GetState() != OSPF::Interface::BackupState)) {
00339 OSPFLinkStateUpdatePacket* updatePacket = CreateUpdatePacket(lsa);
00340
00341 if (updatePacket != NULL) {
00342 int ttl = (interfaceType == OSPF::Interface::Virtual) ? VIRTUAL_LINK_TTL : 1;
00343 OSPF::MessageHandler* messageHandler = parentArea->GetRouter()->GetMessageHandler();
00344
00345 if (interfaceType == OSPF::Interface::Broadcast) {
00346 if ((GetState() == OSPF::Interface::DesignatedRouterState) ||
00347 (GetState() == OSPF::Interface::BackupState) ||
00348 (designatedRouter == OSPF::NullDesignatedRouterID))
00349 {
00350 messageHandler->SendPacket(updatePacket, OSPF::AllSPFRouters, ifIndex, ttl);
00351 for (long k = 0; k < neighborCount; k++) {
00352 neighboringRouters[k]->AddToTransmittedLSAList(lsaKey);
00353 if (!neighboringRouters[k]->IsUpdateRetransmissionTimerActive()) {
00354 neighboringRouters[k]->StartUpdateRetransmissionTimer();
00355 }
00356 }
00357 } else {
00358 messageHandler->SendPacket(updatePacket, OSPF::AllDRouters, ifIndex, ttl);
00359 OSPF::Neighbor* dRouter = GetNeighborByID(designatedRouter.routerID);
00360 OSPF::Neighbor* backupDRouter = GetNeighborByID(backupDesignatedRouter.routerID);
00361 if (dRouter != NULL) {
00362 dRouter->AddToTransmittedLSAList(lsaKey);
00363 if (!dRouter->IsUpdateRetransmissionTimerActive()) {
00364 dRouter->StartUpdateRetransmissionTimer();
00365 }
00366 }
00367 if (backupDRouter != NULL) {
00368 backupDRouter->AddToTransmittedLSAList(lsaKey);
00369 if (!backupDRouter->IsUpdateRetransmissionTimerActive()) {
00370 backupDRouter->StartUpdateRetransmissionTimer();
00371 }
00372 }
00373 }
00374 } else {
00375 if (interfaceType == OSPF::Interface::PointToPoint) {
00376 messageHandler->SendPacket(updatePacket, OSPF::AllSPFRouters, ifIndex, ttl);
00377 if (neighborCount > 0) {
00378 neighboringRouters[0]->AddToTransmittedLSAList(lsaKey);
00379 if (!neighboringRouters[0]->IsUpdateRetransmissionTimerActive()) {
00380 neighboringRouters[0]->StartUpdateRetransmissionTimer();
00381 }
00382 }
00383 } else {
00384 for (long m = 0; m < neighborCount; m++) {
00385 if (neighboringRouters[m]->GetState() >= OSPF::Neighbor::ExchangeState) {
00386 messageHandler->SendPacket(updatePacket, neighboringRouters[m]->GetAddress(), ifIndex, ttl);
00387 neighboringRouters[m]->AddToTransmittedLSAList(lsaKey);
00388 if (!neighboringRouters[m]->IsUpdateRetransmissionTimerActive()) {
00389 neighboringRouters[m]->StartUpdateRetransmissionTimer();
00390 }
00391 }
00392 }
00393 }
00394 }
00395
00396 if (intf == this) {
00397 floodedBackOut = true;
00398 }
00399 }
00400 }
00401 }
00402 }
00403 }
00404
00405 return floodedBackOut;
00406 }
00407
00408 OSPFLinkStateUpdatePacket* OSPF::Interface::CreateUpdatePacket(OSPFLSA* lsa)
00409 {
00410 LSAType lsaType = static_cast<LSAType> (lsa->getHeader().getLsType());
00411 OSPFRouterLSA* routerLSA = (lsaType == RouterLSAType) ? dynamic_cast<OSPFRouterLSA*> (lsa) : NULL;
00412 OSPFNetworkLSA* networkLSA = (lsaType == NetworkLSAType) ? dynamic_cast<OSPFNetworkLSA*> (lsa) : NULL;
00413 OSPFSummaryLSA* summaryLSA = ((lsaType == SummaryLSA_NetworksType) ||
00414 (lsaType == SummaryLSA_ASBoundaryRoutersType)) ? dynamic_cast<OSPFSummaryLSA*> (lsa) : NULL;
00415 OSPFASExternalLSA* asExternalLSA = (lsaType == ASExternalLSAType) ? dynamic_cast<OSPFASExternalLSA*> (lsa) : NULL;
00416
00417 if (((lsaType == RouterLSAType) && (routerLSA != NULL)) ||
00418 ((lsaType == NetworkLSAType) && (networkLSA != NULL)) ||
00419 (((lsaType == SummaryLSA_NetworksType) || (lsaType == SummaryLSA_ASBoundaryRoutersType)) && (summaryLSA != NULL)) ||
00420 ((lsaType == ASExternalLSAType) && (asExternalLSA != NULL)))
00421 {
00422 OSPFLinkStateUpdatePacket* updatePacket = new OSPFLinkStateUpdatePacket;
00423
00424 updatePacket->setType(LinkStateUpdatePacket);
00425 updatePacket->setRouterID(parentArea->GetRouter()->GetRouterID());
00426 updatePacket->setAreaID(areaID);
00427 updatePacket->setAuthenticationType(authenticationType);
00428 for (int j = 0; j < 8; j++) {
00429 updatePacket->setAuthentication(j, authenticationKey.bytes[j]);
00430 }
00431
00432 updatePacket->setNumberOfLSAs(1);
00433
00434 switch (lsaType) {
00435 case RouterLSAType:
00436 {
00437 updatePacket->setRouterLSAsArraySize(1);
00438 updatePacket->setRouterLSAs(0, *routerLSA);
00439 unsigned short lsAge = updatePacket->getRouterLSAs(0).getHeader().getLsAge();
00440 if (lsAge < MAX_AGE - interfaceTransmissionDelay) {
00441 updatePacket->getRouterLSAs(0).getHeader().setLsAge(lsAge + interfaceTransmissionDelay);
00442 } else {
00443 updatePacket->getRouterLSAs(0).getHeader().setLsAge(MAX_AGE);
00444 }
00445 }
00446 break;
00447 case NetworkLSAType:
00448 {
00449 updatePacket->setNetworkLSAsArraySize(1);
00450 updatePacket->setNetworkLSAs(0, *networkLSA);
00451 unsigned short lsAge = updatePacket->getNetworkLSAs(0).getHeader().getLsAge();
00452 if (lsAge < MAX_AGE - interfaceTransmissionDelay) {
00453 updatePacket->getNetworkLSAs(0).getHeader().setLsAge(lsAge + interfaceTransmissionDelay);
00454 } else {
00455 updatePacket->getNetworkLSAs(0).getHeader().setLsAge(MAX_AGE);
00456 }
00457 }
00458 break;
00459 case SummaryLSA_NetworksType:
00460 case SummaryLSA_ASBoundaryRoutersType:
00461 {
00462 updatePacket->setSummaryLSAsArraySize(1);
00463 updatePacket->setSummaryLSAs(0, *summaryLSA);
00464 unsigned short lsAge = updatePacket->getSummaryLSAs(0).getHeader().getLsAge();
00465 if (lsAge < MAX_AGE - interfaceTransmissionDelay) {
00466 updatePacket->getSummaryLSAs(0).getHeader().setLsAge(lsAge + interfaceTransmissionDelay);
00467 } else {
00468 updatePacket->getSummaryLSAs(0).getHeader().setLsAge(MAX_AGE);
00469 }
00470 }
00471 break;
00472 case ASExternalLSAType:
00473 {
00474 updatePacket->setAsExternalLSAsArraySize(1);
00475 updatePacket->setAsExternalLSAs(0, *asExternalLSA);
00476 unsigned short lsAge = updatePacket->getAsExternalLSAs(0).getHeader().getLsAge();
00477 if (lsAge < MAX_AGE - interfaceTransmissionDelay) {
00478 updatePacket->getAsExternalLSAs(0).getHeader().setLsAge(lsAge + interfaceTransmissionDelay);
00479 } else {
00480 updatePacket->getAsExternalLSAs(0).getHeader().setLsAge(MAX_AGE);
00481 }
00482 }
00483 break;
00484 default: break;
00485 }
00486
00487 updatePacket->setPacketLength(0);
00488 updatePacket->setChecksum(0);
00489
00490 return updatePacket;
00491 }
00492 return NULL;
00493 }
00494
00495 void OSPF::Interface::AddDelayedAcknowledgement(OSPFLSAHeader& lsaHeader)
00496 {
00497 if (interfaceType == OSPF::Interface::Broadcast) {
00498 if ((GetState() == OSPF::Interface::DesignatedRouterState) ||
00499 (GetState() == OSPF::Interface::BackupState) ||
00500 (designatedRouter == OSPF::NullDesignatedRouterID))
00501 {
00502 delayedAcknowledgements[OSPF::AllSPFRouters].push_back(lsaHeader);
00503 } else {
00504 delayedAcknowledgements[OSPF::AllDRouters].push_back(lsaHeader);
00505 }
00506 } else {
00507 long neighborCount = neighboringRouters.size();
00508 for (long i = 0; i < neighborCount; i++) {
00509 if (neighboringRouters[i]->GetState() >= OSPF::Neighbor::ExchangeState) {
00510 delayedAcknowledgements[neighboringRouters[i]->GetAddress()].push_back(lsaHeader);
00511 }
00512 }
00513 }
00514 }
00515
00516 void OSPF::Interface::SendDelayedAcknowledgements(void)
00517 {
00518 OSPF::MessageHandler* messageHandler = parentArea->GetRouter()->GetMessageHandler();
00519 long maxPacketSize = ((IPV4_HEADER_LENGTH + OSPF_HEADER_LENGTH + OSPF_LSA_HEADER_LENGTH) > mtu) ? IPV4_DATAGRAM_LENGTH : mtu;
00520
00521 for (std::map<IPv4Address, std::list<OSPFLSAHeader>, OSPF::IPv4Address_Less>::iterator delayIt = delayedAcknowledgements.begin();
00522 delayIt != delayedAcknowledgements.end();
00523 delayIt++)
00524 {
00525 int ackCount = delayIt->second.size();
00526 if (ackCount > 0) {
00527 while (!(delayIt->second.empty())) {
00528 OSPFLinkStateAcknowledgementPacket* ackPacket = new OSPFLinkStateAcknowledgementPacket;
00529 long packetSize = IPV4_HEADER_LENGTH + OSPF_HEADER_LENGTH;
00530
00531 ackPacket->setType(LinkStateAcknowledgementPacket);
00532 ackPacket->setRouterID(parentArea->GetRouter()->GetRouterID());
00533 ackPacket->setAreaID(areaID);
00534 ackPacket->setAuthenticationType(authenticationType);
00535 for (int i = 0; i < 8; i++) {
00536 ackPacket->setAuthentication(i, authenticationKey.bytes[i]);
00537 }
00538
00539 while ((!(delayIt->second.empty())) && (packetSize <= (maxPacketSize - OSPF_LSA_HEADER_LENGTH))) {
00540 unsigned long headerCount = ackPacket->getLsaHeadersArraySize();
00541 ackPacket->setLsaHeadersArraySize(headerCount + 1);
00542 ackPacket->setLsaHeaders(headerCount, *(delayIt->second.begin()));
00543 delayIt->second.pop_front();
00544 packetSize += OSPF_LSA_HEADER_LENGTH;
00545 }
00546
00547 ackPacket->setPacketLength(0);
00548 ackPacket->setChecksum(0);
00549
00550 int ttl = (interfaceType == OSPF::Interface::Virtual) ? VIRTUAL_LINK_TTL : 1;
00551
00552 if (interfaceType == OSPF::Interface::Broadcast) {
00553 if ((GetState() == OSPF::Interface::DesignatedRouterState) ||
00554 (GetState() == OSPF::Interface::BackupState) ||
00555 (designatedRouter == OSPF::NullDesignatedRouterID))
00556 {
00557 messageHandler->SendPacket(ackPacket, OSPF::AllSPFRouters, ifIndex, ttl);
00558 } else {
00559 messageHandler->SendPacket(ackPacket, OSPF::AllDRouters, ifIndex, ttl);
00560 }
00561 } else {
00562 if (interfaceType == OSPF::Interface::PointToPoint) {
00563 messageHandler->SendPacket(ackPacket, OSPF::AllSPFRouters, ifIndex, ttl);
00564 } else {
00565 messageHandler->SendPacket(ackPacket, delayIt->first, ifIndex, ttl);
00566 }
00567 }
00568 }
00569 }
00570 }
00571 messageHandler->StartTimer(acknowledgementTimer, acknowledgementDelay);
00572 }
00573
00574 void OSPF::Interface::AgeTransmittedLSALists(void)
00575 {
00576 long neighborCount = neighboringRouters.size();
00577 for (long i = 0; i < neighborCount; i++) {
00578 neighboringRouters[i]->AgeTransmittedLSAList();
00579 }
00580 }