INET Framework for OMNeT++/OMNEST
ansaOspfNeighbor6.cc
Go to the documentation of this file.
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 }