INET Framework for OMNeT++/OMNEST
AnsaOSPF::Interface Class Reference

#include <AnsaOSPFInterface.h>

List of all members.

Public Types

enum  InterfaceEventType {
  InterfaceUp = 0, HelloTimer = 1, WaitTimer = 2, AcknowledgementTimer = 3,
  BackupSeen = 4, NeighborChange = 5, LoopIndication = 6, UnloopIndication = 7,
  InterfaceDown = 8
}
enum  OSPFInterfaceType {
  UnknownType = 0, PointToPoint = 1, Broadcast = 2, NBMA = 3,
  PointToMultiPoint = 4, Virtual = 5
}
enum  InterfaceStateType {
  DownState = 0, LoopbackState = 1, WaitingState = 2, PointToPointState = 3,
  NotDesignatedRouterState = 4, BackupState = 5, DesignatedRouterState = 6
}

Public Member Functions

 Interface (OSPFInterfaceType ifType=UnknownType)
virtual ~Interface (void)
void ProcessEvent (InterfaceEventType event)
void Reset (void)
void SendHelloPacket (IPv4Address destination, short ttl=1)
void SendLSAcknowledgement (OSPFLSAHeader *lsaHeader, IPv4Address destination)
NeighborGetNeighborByID (RouterID neighborID)
NeighborGetNeighborByAddress (IPv4Address address)
void AddNeighbor (Neighbor *neighbor)
InterfaceStateType GetState (void) const
bool HasAnyNeighborInStates (int states) const
void RemoveFromAllRetransmissionLists (LSAKeyType lsaKey)
bool IsOnAnyRetransmissionList (LSAKeyType lsaKey) const
bool FloodLSA (OSPFLSA *lsa, Interface *intf=NULL, Neighbor *neighbor=NULL)
void AddDelayedAcknowledgement (OSPFLSAHeader &lsaHeader)
void SendDelayedAcknowledgements (void)
void AgeTransmittedLSALists (void)
OSPFLinkStateUpdatePacketCreateUpdatePacket (OSPFLSA *lsa)
void SetType (OSPFInterfaceType ifType)
OSPFInterfaceType GetType (void) const
void SetIfIndex (unsigned char index)
unsigned char GetIfIndex (void) const
void SetMTU (unsigned short ifMTU)
unsigned short GetMTU (void) const
void SetAreaID (AreaID areaId)
AreaID GetAreaID (void) const
void SetTransitAreaID (AreaID areaId)
AreaID GetTransitAreaID (void) const
void SetOutputCost (Metric cost)
Metric GetOutputCost (void) const
void SetRetransmissionInterval (short interval)
short GetRetransmissionInterval (void) const
void SetTransmissionDelay (short delay)
short GetTransmissionDelay (void) const
void SetAcknowledgementDelay (short delay)
short GetAcknowledgementDelay (void) const
void SetRouterPriority (unsigned char priority)
unsigned char GetRouterPriority (void) const
void SetHelloInterval (short interval)
short GetHelloInterval (void) const
void SetPollInterval (short interval)
short GetPollInterval (void) const
void SetRouterDeadInterval (short interval)
short GetRouterDeadInterval (void) const
void SetAuthenticationType (AuthenticationType type)
AuthenticationType GetAuthenticationType (void) const
void SetAuthenticationKey (AuthenticationKeyType key)
AuthenticationKeyType GetAuthenticationKey (void) const
void SetAddressRange (IPv4AddressRange range)
IPv4AddressRange GetAddressRange (void) const
OSPFTimerGetHelloTimer (void)
OSPFTimerGetWaitTimer (void)
OSPFTimerGetAcknowledgementTimer (void)
DesignatedRouterID GetDesignatedRouter (void) const
DesignatedRouterID GetBackupDesignatedRouter (void) const
unsigned long GetNeighborCount (void) const
NeighborGetNeighbor (unsigned long i)
const NeighborGetNeighbor (unsigned long i) const
void SetArea (Area *area)
AreaGetArea (void)
const AreaGetArea (void) const
bool IsGoingDown (void)
void SetIsGoingDown (bool b)

Static Public Member Functions

static const char * GetStateString (InterfaceStateType stateType)

Private Member Functions

void ChangeState (InterfaceState *newState, InterfaceState *currentState)

Private Attributes

OSPFInterfaceType interfaceType
InterfaceStatestate
InterfaceStatepreviousState
unsigned char ifIndex
unsigned short mtu
IPv4AddressRange interfaceAddressRange
AreaID areaID
AreaID transitAreaID
short helloInterval
short pollInterval
short routerDeadInterval
short interfaceTransmissionDelay
unsigned char routerPriority
OSPFTimerhelloTimer
OSPFTimerwaitTimer
OSPFTimeracknowledgementTimer
std::map< RouterID, Neighbor * > neighboringRoutersByID
std::map< IPv4Address,
Neighbor *, IPv4Address_Less
neighboringRoutersByAddress
std::vector< Neighbor * > neighboringRouters
std::map< IPv4Address,
std::list< OSPFLSAHeader >
, IPv4Address_Less
delayedAcknowledgements
DesignatedRouterID designatedRouter
DesignatedRouterID backupDesignatedRouter
Metric interfaceOutputCost
short retransmissionInterval
short acknowledgementDelay
AuthenticationType authenticationType
AuthenticationKeyType authenticationKey
AreaparentArea
bool isGoingDown

Friends

class InterfaceState

Detailed Description

Definition at line 17 of file AnsaOSPFInterface.h.


Member Enumeration Documentation

Enumerator:
InterfaceUp 
HelloTimer 
WaitTimer 
AcknowledgementTimer 
BackupSeen 
NeighborChange 
LoopIndication 
UnloopIndication 
InterfaceDown 

Definition at line 19 of file AnsaOSPFInterface.h.

Enumerator:
DownState 
LoopbackState 
WaitingState 
PointToPointState 
NotDesignatedRouterState 
BackupState 
DesignatedRouterState 

Definition at line 40 of file AnsaOSPFInterface.h.

Enumerator:
UnknownType 
PointToPoint 
Broadcast 
NBMA 
PointToMultiPoint 
Virtual 

Definition at line 31 of file AnsaOSPFInterface.h.

                           {
        UnknownType       = 0,
        PointToPoint      = 1,
        Broadcast         = 2,
        NBMA              = 3,
        PointToMultiPoint = 4,
        Virtual           = 5
    };

Constructor & Destructor Documentation

AnsaOSPF::Interface::~Interface ( void  ) [virtual]

Definition at line 49 of file AnsaOSPFInterface.cc.

{
    MessageHandler* messageHandler = parentArea->GetRouter()->GetMessageHandler();
    messageHandler->ClearTimer(helloTimer);
    delete helloTimer;
    messageHandler->ClearTimer(waitTimer);
    delete waitTimer;
    messageHandler->ClearTimer(acknowledgementTimer);
    delete acknowledgementTimer;
    if (previousState != NULL) {
        delete previousState;
    }
    delete state;
    long neighborCount = neighboringRouters.size();
    for (long i = 0; i < neighborCount; i++) {
        delete neighboringRouters[i];
    }
}

Member Function Documentation

Definition at line 558 of file AnsaOSPFInterface.cc.

{
    long neighborCount = neighboringRouters.size();
    for (long i = 0; i < neighborCount; i++) {
        neighboringRouters[i]->AgeTransmittedLSAList();
    }
}
void AnsaOSPF::Interface::ChangeState ( AnsaOSPF::InterfaceState newState,
AnsaOSPF::InterfaceState currentState 
) [private]

Definition at line 79 of file AnsaOSPFInterface.cc.

Referenced by AnsaOSPF::InterfaceState::ChangeState().

{
    if (previousState != NULL) {
        delete previousState;
    }
    state = newState;
    previousState = currentState;
}

Definition at line 392 of file AnsaOSPFInterface.cc.

Referenced by AnsaOSPF::LinkStateRequestHandler::ProcessPacket(), and AnsaOSPF::LinkStateUpdateHandler::ProcessPacket().

{
    LSAType lsaType                  = static_cast<LSAType> (lsa->getHeader().getLsType());
    OSPFRouterLSA* routerLSA         = (lsaType == RouterLSAType) ? dynamic_cast<OSPFRouterLSA*> (lsa) : NULL;
    OSPFNetworkLSA* networkLSA       = (lsaType == NetworkLSAType) ? dynamic_cast<OSPFNetworkLSA*> (lsa) : NULL;
    OSPFSummaryLSA* summaryLSA       = ((lsaType == SummaryLSA_NetworksType) ||
                                        (lsaType == SummaryLSA_ASBoundaryRoutersType)) ? dynamic_cast<OSPFSummaryLSA*> (lsa) : NULL;
    OSPFASExternalLSA* asExternalLSA = (lsaType == ASExternalLSAType) ? dynamic_cast<OSPFASExternalLSA*> (lsa) : NULL;

    if (((lsaType == RouterLSAType) && (routerLSA != NULL)) ||
        ((lsaType == NetworkLSAType) && (networkLSA != NULL)) ||
        (((lsaType == SummaryLSA_NetworksType) || (lsaType == SummaryLSA_ASBoundaryRoutersType)) && (summaryLSA != NULL)) ||
        ((lsaType == ASExternalLSAType) && (asExternalLSA != NULL)))
    {
        OSPFLinkStateUpdatePacket* updatePacket = new OSPFLinkStateUpdatePacket;

        updatePacket->setType(LinkStateUpdatePacket);
        updatePacket->setRouterID(parentArea->GetRouter()->GetRouterID());
        updatePacket->setAreaID(areaID);
        updatePacket->setAuthenticationType(authenticationType);
        for (int j = 0; j < 8; j++) {
            updatePacket->setAuthentication(j, authenticationKey.bytes[j]);
        }

        updatePacket->setNumberOfLSAs(1);

        switch (lsaType) {
            case RouterLSAType:
                {
                    updatePacket->setRouterLSAsArraySize(1);
                    updatePacket->setRouterLSAs(0, *routerLSA);
                    unsigned short lsAge = updatePacket->getRouterLSAs(0).getHeader().getLsAge();
                    if (lsAge < MAX_AGE - interfaceTransmissionDelay) {
                        updatePacket->getRouterLSAs(0).getHeader().setLsAge(lsAge + interfaceTransmissionDelay);
                    } else {
                        updatePacket->getRouterLSAs(0).getHeader().setLsAge(MAX_AGE);
                    }
                }
                break;
            case NetworkLSAType:
                {
                    updatePacket->setNetworkLSAsArraySize(1);
                    updatePacket->setNetworkLSAs(0, *networkLSA);
                    unsigned short lsAge = updatePacket->getNetworkLSAs(0).getHeader().getLsAge();
                    if (lsAge < MAX_AGE - interfaceTransmissionDelay) {
                        updatePacket->getNetworkLSAs(0).getHeader().setLsAge(lsAge + interfaceTransmissionDelay);
                    } else {
                        updatePacket->getNetworkLSAs(0).getHeader().setLsAge(MAX_AGE);
                    }
                }
                break;
            case SummaryLSA_NetworksType:
            case SummaryLSA_ASBoundaryRoutersType:
                {
                    updatePacket->setSummaryLSAsArraySize(1);
                    updatePacket->setSummaryLSAs(0, *summaryLSA);
                    unsigned short lsAge = updatePacket->getSummaryLSAs(0).getHeader().getLsAge();
                    if (lsAge < MAX_AGE - interfaceTransmissionDelay) {
                        updatePacket->getSummaryLSAs(0).getHeader().setLsAge(lsAge + interfaceTransmissionDelay);
                    } else {
                        updatePacket->getSummaryLSAs(0).getHeader().setLsAge(MAX_AGE);
                    }
                }
                break;
            case ASExternalLSAType:
                {
                    updatePacket->setAsExternalLSAsArraySize(1);
                    updatePacket->setAsExternalLSAs(0, *asExternalLSA);
                    unsigned short lsAge = updatePacket->getAsExternalLSAs(0).getHeader().getLsAge();
                    if (lsAge < MAX_AGE - interfaceTransmissionDelay) {
                        updatePacket->getAsExternalLSAs(0).getHeader().setLsAge(lsAge + interfaceTransmissionDelay);
                    } else {
                        updatePacket->getAsExternalLSAs(0).getHeader().setLsAge(MAX_AGE);
                    }
                }
                break;
            default: break;
        }

        updatePacket->setPacketLength(0); // TODO: Calculate correct length
        updatePacket->setChecksum(0); // TODO: Calculate correct cheksum(16-bit one's complement of the entire packet)

        return updatePacket;
    }
    return NULL;
}
bool AnsaOSPF::Interface::FloodLSA ( OSPFLSA lsa,
AnsaOSPF::Interface intf = NULL,
AnsaOSPF::Neighbor neighbor = NULL 
)
See also:
RFC2328 Section 13.3.

Definition at line 262 of file AnsaOSPFInterface.cc.

{
    bool floodedBackOut = false;

    if (
        (
         (lsa->getHeader().getLsType() == ASExternalLSAType) &&
         (interfaceType != AnsaOSPF::Interface::Virtual) &&
         (parentArea->GetExternalRoutingCapability())
        ) ||
        (
         (lsa->getHeader().getLsType() != ASExternalLSAType) &&
         (
          (
           (areaID != AnsaOSPF::BackboneAreaID) &&
           (interfaceType != AnsaOSPF::Interface::Virtual)
          ) ||
          (areaID == AnsaOSPF::BackboneAreaID)
         )
        )
       )
    {
        long              neighborCount                = neighboringRouters.size();
        bool              lsaAddedToRetransmissionList = false;
        AnsaOSPF::LinkStateID linkStateID                  = lsa->getHeader().getLinkStateID();
        AnsaOSPF::LSAKeyType  lsaKey;

        lsaKey.linkStateID = linkStateID;
        lsaKey.advertisingRouter = lsa->getHeader().getAdvertisingRouter().getInt();

        for (long i = 0; i < neighborCount; i++) {  // (1)
            if (neighboringRouters[i]->GetState() < AnsaOSPF::Neighbor::ExchangeState) {   // (1) (a)
                continue;
            }
            if (neighboringRouters[i]->GetState() < AnsaOSPF::Neighbor::FullState) {   // (1) (b)
                OSPFLSAHeader* requestLSAHeader = neighboringRouters[i]->FindOnRequestList(lsaKey);
                if (requestLSAHeader != NULL) {
                    // operator< and operator== on OSPFLSAHeaders determines which one is newer(less means older)
                    if (lsa->getHeader() < (*requestLSAHeader)) {
                        continue;
                    }
                    if (operator== (lsa->getHeader(), (*requestLSAHeader))) {
                        neighboringRouters[i]->RemoveFromRequestList(lsaKey);
                        continue;
                    }
                    neighboringRouters[i]->RemoveFromRequestList(lsaKey);
                }
            }
            if (neighbor == neighboringRouters[i]) {     // (1) (c)
                continue;
            }
            neighboringRouters[i]->AddToRetransmissionList(lsa);   // (1) (d)
            lsaAddedToRetransmissionList = true;
        }
        if (lsaAddedToRetransmissionList) {     // (2)
            if ((intf != this) ||
                ((neighbor != NULL) &&
                 (neighbor->GetNeighborID() != designatedRouter.routerID) &&
                 (neighbor->GetNeighborID() != backupDesignatedRouter.routerID)))  // (3)
            {
                if ((intf != this) || (GetState() != AnsaOSPF::Interface::BackupState)) {  // (4)
                    OSPFLinkStateUpdatePacket* updatePacket = CreateUpdatePacket(lsa);    // (5)

                    if (updatePacket != NULL) {
                        int                   ttl            = (interfaceType == AnsaOSPF::Interface::Virtual) ? VIRTUAL_LINK_TTL : 1;
                        AnsaOSPF::MessageHandler* messageHandler = parentArea->GetRouter()->GetMessageHandler();

                        if (interfaceType == AnsaOSPF::Interface::Broadcast) {
                            if ((GetState() == AnsaOSPF::Interface::DesignatedRouterState) ||
                                (GetState() == AnsaOSPF::Interface::BackupState) ||
                                (designatedRouter == AnsaOSPF::NullDesignatedRouterID))
                            {
                                messageHandler->SendPacket(updatePacket, AnsaOSPF::AllSPFRouters, ifIndex, ttl);
                                for (long k = 0; k < neighborCount; k++) {
                                    neighboringRouters[k]->AddToTransmittedLSAList(lsaKey);
                                    if (!neighboringRouters[k]->IsUpdateRetransmissionTimerActive()) {
                                        neighboringRouters[k]->StartUpdateRetransmissionTimer();
                                    }
                                }
                            } else {
                                messageHandler->SendPacket(updatePacket, AnsaOSPF::AllDRouters, ifIndex, ttl);
                                AnsaOSPF::Neighbor* dRouter = GetNeighborByID(designatedRouter.routerID);
                                AnsaOSPF::Neighbor* backupDRouter = GetNeighborByID(backupDesignatedRouter.routerID);
                                if (dRouter != NULL) {
                                    dRouter->AddToTransmittedLSAList(lsaKey);
                                    if (!dRouter->IsUpdateRetransmissionTimerActive()) {
                                        dRouter->StartUpdateRetransmissionTimer();
                                    }
                                }
                                if (backupDRouter != NULL) {
                                    backupDRouter->AddToTransmittedLSAList(lsaKey);
                                    if (!backupDRouter->IsUpdateRetransmissionTimerActive()) {
                                        backupDRouter->StartUpdateRetransmissionTimer();
                                    }
                                }
                            }
                        } else {
                            if (interfaceType == AnsaOSPF::Interface::PointToPoint) {
                                messageHandler->SendPacket(updatePacket, AnsaOSPF::AllSPFRouters, ifIndex, ttl);
                                if (neighborCount > 0) {
                                    neighboringRouters[0]->AddToTransmittedLSAList(lsaKey);
                                    if (!neighboringRouters[0]->IsUpdateRetransmissionTimerActive()) {
                                        neighboringRouters[0]->StartUpdateRetransmissionTimer();
                                    }
                                }
                            } else {
                                for (long m = 0; m < neighborCount; m++) {
                                    if (neighboringRouters[m]->GetState() >= AnsaOSPF::Neighbor::ExchangeState) {
                                        messageHandler->SendPacket(updatePacket, neighboringRouters[m]->GetAddress(), ifIndex, ttl);
                                        neighboringRouters[m]->AddToTransmittedLSAList(lsaKey);
                                        if (!neighboringRouters[m]->IsUpdateRetransmissionTimerActive()) {
                                            neighboringRouters[m]->StartUpdateRetransmissionTimer();
                                        }
                                    }
                                }
                            }
                        }

                        if (intf == this) {
                            floodedBackOut = true;
                        }
                    }
                }
            }
        }
    }

    return floodedBackOut;
}
short AnsaOSPF::Interface::GetAcknowledgementDelay ( void  ) const [inline]

Definition at line 126 of file AnsaOSPFInterface.h.

Referenced by AnsaOSPF::InterfaceStateDown::ProcessEvent().

const Area* AnsaOSPF::Interface::GetArea ( void  ) const [inline]

Definition at line 153 of file AnsaOSPFInterface.h.

{ return parentArea; }
AreaID AnsaOSPF::Interface::GetAreaID ( void  ) const [inline]

Definition at line 116 of file AnsaOSPFInterface.h.

Referenced by AnsaOSPFRouting::LoadVirtualLink().

{ return areaID; }
unsigned short AnsaOSPF::Interface::GetMTU ( void  ) const [inline]

Definition at line 114 of file AnsaOSPFInterface.h.

Referenced by AnsaOSPF::DatabaseDescriptionHandler::ProcessPacket().

{ return mtu; }
const Neighbor* AnsaOSPF::Interface::GetNeighbor ( unsigned long  i) const [inline]

Definition at line 149 of file AnsaOSPFInterface.h.

{ return neighboringRouters[i]; }

Definition at line 189 of file AnsaOSPFInterface.cc.

Referenced by AnsaOSPF::Area::OriginateRouterLSA(), AnsaOSPF::HelloHandler::ProcessPacket(), and AnsaOSPF::MessageHandler::ProcessPacket().

{
    std::map<AnsaOSPF::IPv4Address, AnsaOSPF::Neighbor*, AnsaOSPF::IPv4Address_Less>::iterator neighborIt = neighboringRoutersByAddress.find(address);
    if (neighborIt != neighboringRoutersByAddress.end()) {
        return (neighborIt->second);
    }
    else {
        return NULL;
    }
}

Definition at line 178 of file AnsaOSPFInterface.cc.

Referenced by AnsaOSPF::LinkStateUpdateHandler::AcknowledgeLSA(), AnsaOSPF::HelloHandler::ProcessPacket(), and AnsaOSPF::MessageHandler::ProcessPacket().

{
    std::map<AnsaOSPF::RouterID, AnsaOSPF::Neighbor*>::iterator neighborIt = neighboringRoutersByID.find(neighborID);
    if (neighborIt != neighboringRoutersByID.end()) {
        return (neighborIt->second);
    }
    else {
        return NULL;
    }
}
Metric AnsaOSPF::Interface::GetOutputCost ( void  ) const [inline]

Definition at line 120 of file AnsaOSPFInterface.h.

Referenced by AnsaOSPF::Area::OriginateRouterLSA().

{ return interfaceOutputCost; }
const char * AnsaOSPF::Interface::GetStateString ( InterfaceStateType  stateType) [static]

Definition at line 213 of file AnsaOSPFInterface.cc.

Referenced by AnsaOSPF::MessageHandler::PrintEvent().

{
    switch (stateType) {
        case DownState:                 return "Down";
        case LoopbackState:             return "Loopback";
        case WaitingState:              return "Waiting";
        case PointToPointState:         return "PointToPoint";
        case NotDesignatedRouterState:  return "NotDesignatedRouter";
        case BackupState:               return "Backup";
        case DesignatedRouterState:     return "DesignatedRouter";
        default:                        ASSERT(false);
    }
    return "";
}
AreaID AnsaOSPF::Interface::GetTransitAreaID ( void  ) const [inline]

Definition at line 118 of file AnsaOSPFInterface.h.

Referenced by AnsaOSPF::MessageHandler::ProcessPacket().

{ return transitAreaID; }
short AnsaOSPF::Interface::GetTransmissionDelay ( void  ) const [inline]

Definition at line 124 of file AnsaOSPFInterface.h.

Definition at line 143 of file AnsaOSPFInterface.h.

Referenced by AnsaOSPF::InterfaceStateDown::ProcessEvent().

{ return waitTimer; }
bool AnsaOSPF::Interface::HasAnyNeighborInStates ( int  states) const

Definition at line 228 of file AnsaOSPFInterface.cc.

Referenced by AnsaOSPF::Area::AgeDatabase(), AnsaOSPF::Area::OriginateNetworkLSA(), and AnsaOSPF::Area::OriginateRouterLSA().

{
    long neighborCount = neighboringRouters.size();
    for (long i = 0; i < neighborCount; i++) {
        AnsaOSPF::Neighbor::NeighborStateType neighborState = neighboringRouters[i]->GetState();
        if (neighborState & states) {
            return true;
        }
    }
    return false;
}
bool AnsaOSPF::Interface::IsGoingDown ( void  ) [inline]

Definition at line 155 of file AnsaOSPFInterface.h.

Referenced by AnsaOSPF::NeighborState::ChangeState().

{ return isGoingDown; }

Definition at line 248 of file AnsaOSPFInterface.cc.

{
    long neighborCount = neighboringRouters.size();
    for (long i = 0; i < neighborCount; i++) {
        if (neighboringRouters[i]->IsLSAOnRetransmissionList(lsaKey)) {
            return true;
        }
    }
    return false;
}

Definition at line 240 of file AnsaOSPFInterface.cc.

{
    long neighborCount = neighboringRouters.size();
    for (long i = 0; i < neighborCount; i++) {
        neighboringRouters[i]->RemoveFromRetransmissionList(lsaKey);
    }
}

Definition at line 500 of file AnsaOSPFInterface.cc.

Referenced by AnsaOSPF::InterfaceStateBackup::ProcessEvent(), AnsaOSPF::InterfaceStateWaiting::ProcessEvent(), AnsaOSPF::InterfaceStatePointToPoint::ProcessEvent(), AnsaOSPF::InterfaceStateNotDesignatedRouter::ProcessEvent(), and AnsaOSPF::InterfaceStateDesignatedRouter::ProcessEvent().

{
    AnsaOSPF::MessageHandler* messageHandler = parentArea->GetRouter()->GetMessageHandler();
    long                  maxPacketSize  = ((IPV4_HEADER_LENGTH + OSPF_HEADER_LENGTH + OSPF_LSA_HEADER_LENGTH) > mtu) ? IPV4_DATAGRAM_LENGTH : mtu;

    for (std::map<IPv4Address, std::list<OSPFLSAHeader>, AnsaOSPF::IPv4Address_Less>::iterator delayIt = delayedAcknowledgements.begin();
         delayIt != delayedAcknowledgements.end();
         delayIt++)
    {
        int ackCount = delayIt->second.size();
        if (ackCount > 0) {
            while (!(delayIt->second.empty())) {
                OSPFLinkStateAcknowledgementPacket* ackPacket  = new OSPFLinkStateAcknowledgementPacket;
                long                                packetSize = IPV4_HEADER_LENGTH + OSPF_HEADER_LENGTH;

                ackPacket->setType(LinkStateAcknowledgementPacket);
                ackPacket->setRouterID(parentArea->GetRouter()->GetRouterID());
                ackPacket->setAreaID(areaID);
                ackPacket->setAuthenticationType(authenticationType);
                for (int i = 0; i < 8; i++) {
                    ackPacket->setAuthentication(i, authenticationKey.bytes[i]);
                }

                while ((!(delayIt->second.empty())) && (packetSize <= (maxPacketSize - OSPF_LSA_HEADER_LENGTH))) {
                    unsigned long   headerCount = ackPacket->getLsaHeadersArraySize();
                    ackPacket->setLsaHeadersArraySize(headerCount + 1);
                    ackPacket->setLsaHeaders(headerCount, *(delayIt->second.begin()));
                    delayIt->second.pop_front();
                    packetSize += OSPF_LSA_HEADER_LENGTH;
                }

                ackPacket->setPacketLength(0); // TODO: Calculate correct length
                ackPacket->setChecksum(0); // TODO: Calculate correct cheksum(16-bit one's complement of the entire packet)

                int ttl = (interfaceType == AnsaOSPF::Interface::Virtual) ? VIRTUAL_LINK_TTL : 1;

                if (interfaceType == AnsaOSPF::Interface::Broadcast) {
                    if ((GetState() == AnsaOSPF::Interface::DesignatedRouterState) ||
                        (GetState() == AnsaOSPF::Interface::BackupState) ||
                        (designatedRouter == AnsaOSPF::NullDesignatedRouterID))
                    {
                        messageHandler->SendPacket(ackPacket, AnsaOSPF::AllSPFRouters, ifIndex, ttl);
                    } else {
                        messageHandler->SendPacket(ackPacket, AnsaOSPF::AllDRouters, ifIndex, ttl);
                    }
                } else {
                    if (interfaceType == AnsaOSPF::Interface::PointToPoint) {
                        messageHandler->SendPacket(ackPacket, AnsaOSPF::AllSPFRouters, ifIndex, ttl);
                    } else {
                        messageHandler->SendPacket(ackPacket, delayIt->first, ifIndex, ttl);
                    }
                }
            }
        }
    }
    messageHandler->StartTimer(acknowledgementTimer, acknowledgementDelay);
}
void AnsaOSPF::Interface::SendHelloPacket ( AnsaOSPF::IPv4Address  destination,
short  ttl = 1 
)

Definition at line 107 of file AnsaOSPFInterface.cc.

Referenced by AnsaOSPF::InterfaceStateBackup::ProcessEvent(), AnsaOSPF::NeighborStateDown::ProcessEvent(), AnsaOSPF::InterfaceStateWaiting::ProcessEvent(), AnsaOSPF::InterfaceStatePointToPoint::ProcessEvent(), AnsaOSPF::InterfaceStateNotDesignatedRouter::ProcessEvent(), AnsaOSPF::InterfaceStateDesignatedRouter::ProcessEvent(), and AnsaOSPF::HelloHandler::ProcessPacket().

{
    OSPFOptions options;
    OSPFHelloPacket* helloPacket = new OSPFHelloPacket;
    std::vector<AnsaOSPF::IPv4Address> neighbors;

    helloPacket->setRouterID(parentArea->GetRouter()->GetRouterID());
    helloPacket->setAreaID(parentArea->GetAreaID());
    helloPacket->setAuthenticationType(authenticationType);
    for (int i = 0; i < 8; i++) {
        helloPacket->setAuthentication(i, authenticationKey.bytes[i]);
    }

    if (((interfaceType == PointToPoint) &&
         (interfaceAddressRange.address == AnsaOSPF::NullIPv4Address)) ||
        (interfaceType == Virtual))
    {
        helloPacket->setNetworkMask(ULongFromIPv4Address(AnsaOSPF::NullIPv4Address));
    } else {
        helloPacket->setNetworkMask(ULongFromIPv4Address(interfaceAddressRange.mask));
    }
    memset(&options, 0, sizeof(OSPFOptions));
    options.E_ExternalRoutingCapability = parentArea->GetExternalRoutingCapability();
    helloPacket->setOptions(options);
    helloPacket->setHelloInterval(helloInterval);
    helloPacket->setRouterPriority(routerPriority);
    helloPacket->setRouterDeadInterval(routerDeadInterval);
    helloPacket->setDesignatedRouter(ULongFromIPv4Address(designatedRouter.ipInterfaceAddress));
    helloPacket->setBackupDesignatedRouter(ULongFromIPv4Address(backupDesignatedRouter.ipInterfaceAddress));
    long neighborCount = neighboringRouters.size();
    for (long j = 0; j < neighborCount; j++) {
        if (neighboringRouters[j]->GetState() >= AnsaOSPF::Neighbor::InitState) {
            neighbors.push_back(neighboringRouters[j]->GetAddress());
        }
    }
    unsigned int initedNeighborCount = neighbors.size();
    helloPacket->setNeighborArraySize(initedNeighborCount);
    for (unsigned int k = 0; k < initedNeighborCount; k++) {
        helloPacket->setNeighbor(k, ULongFromIPv4Address(neighbors[k]));
    }

    helloPacket->setPacketLength(0); // TODO: Calculate correct length
    helloPacket->setChecksum(0); // TODO: Calculate correct cheksum(16-bit one's complement of the entire packet)

    parentArea->GetRouter()->GetMessageHandler()->SendPacket(helloPacket, destination, ifIndex, ttl);
}
void AnsaOSPF::Interface::SendLSAcknowledgement ( OSPFLSAHeader lsaHeader,
IPv4Address  destination 
)

Definition at line 154 of file AnsaOSPFInterface.cc.

Referenced by AnsaOSPF::LinkStateUpdateHandler::ProcessPacket().

{
    OSPFOptions                         options;
    OSPFLinkStateAcknowledgementPacket* lsAckPacket = new OSPFLinkStateAcknowledgementPacket;

    lsAckPacket->setType(LinkStateAcknowledgementPacket);
    lsAckPacket->setRouterID(parentArea->GetRouter()->GetRouterID());
    lsAckPacket->setAreaID(parentArea->GetAreaID());
    lsAckPacket->setAuthenticationType(authenticationType);
    for (int i = 0; i < 8; i++) {
        lsAckPacket->setAuthentication(i, authenticationKey.bytes[i]);
    }

    lsAckPacket->setLsaHeadersArraySize(1);
    lsAckPacket->setLsaHeaders(0, *lsaHeader);

    lsAckPacket->setPacketLength(0); // TODO: Calculate correct length
    lsAckPacket->setChecksum(0); // TODO: Calculate correct cheksum(16-bit one's complement of the entire packet)

    int ttl = (interfaceType == AnsaOSPF::Interface::Virtual) ? VIRTUAL_LINK_TTL : 1;
    parentArea->GetRouter()->GetMessageHandler()->SendPacket(lsAckPacket, destination, ifIndex, ttl);
}
void AnsaOSPF::Interface::SetAcknowledgementDelay ( short  delay) [inline]

Definition at line 125 of file AnsaOSPFInterface.h.

{ acknowledgementDelay = delay; }

Definition at line 139 of file AnsaOSPFInterface.h.

{ interfaceAddressRange = range; }
void AnsaOSPF::Interface::SetArea ( Area area) [inline]

Definition at line 151 of file AnsaOSPFInterface.h.

Referenced by AnsaOSPF::Area::AddInterface().

{ parentArea = area; }
void AnsaOSPF::Interface::SetAreaID ( AreaID  areaId) [inline]
void AnsaOSPF::Interface::SetMTU ( unsigned short  ifMTU) [inline]

Definition at line 113 of file AnsaOSPFInterface.h.

{ mtu = ifMTU; }
void AnsaOSPF::Interface::SetPollInterval ( short  interval) [inline]
void AnsaOSPF::Interface::SetRouterPriority ( unsigned char  priority) [inline]
void AnsaOSPF::Interface::SetTransitAreaID ( AreaID  areaId) [inline]

Definition at line 117 of file AnsaOSPFInterface.h.

Referenced by AnsaOSPFRouting::LoadVirtualLink().

{ transitAreaID = areaId; }

Friends And Related Function Documentation

friend class InterfaceState [friend]

Definition at line 83 of file AnsaOSPFInterface.h.


Member Data Documentation

Definition at line 57 of file AnsaOSPFInterface.h.

Referenced by GetAreaID(), and SetAreaID().

Definition at line 59 of file AnsaOSPFInterface.h.

Referenced by GetHelloInterval(), and SetHelloInterval().

Definition at line 64 of file AnsaOSPFInterface.h.

Referenced by GetHelloTimer(), and Interface().

unsigned char AnsaOSPF::Interface::ifIndex [private]

Definition at line 54 of file AnsaOSPFInterface.h.

Referenced by GetIfIndex().

Definition at line 73 of file AnsaOSPFInterface.h.

Referenced by GetOutputCost(), and SetOutputCost().

Definition at line 81 of file AnsaOSPFInterface.h.

Referenced by IsGoingDown(), and SetIsGoingDown().

unsigned short AnsaOSPF::Interface::mtu [private]

Definition at line 55 of file AnsaOSPFInterface.h.

Referenced by GetMTU(), and SetMTU().

Definition at line 67 of file AnsaOSPFInterface.h.

Definition at line 60 of file AnsaOSPFInterface.h.

Referenced by GetPollInterval(), and SetPollInterval().

Definition at line 53 of file AnsaOSPFInterface.h.

Referenced by Interface().

Definition at line 52 of file AnsaOSPFInterface.h.

Referenced by Interface().

Definition at line 58 of file AnsaOSPFInterface.h.

Referenced by GetTransitAreaID(), and SetTransitAreaID().

Definition at line 65 of file AnsaOSPFInterface.h.

Referenced by GetWaitTimer(), and Interface().


The documentation for this class was generated from the following files: