INET Framework for OMNeT++/OMNEST
|
#include <OSPFInterface.h>
InterfaceUp | |
HelloTimer | |
WaitTimer | |
AcknowledgementTimer | |
BackupSeen | |
NeighborChange | |
LoopIndication | |
UnloopIndication | |
InterfaceDown |
{ InterfaceUp = 0, HelloTimer = 1, WaitTimer = 2, AcknowledgementTimer = 3, BackupSeen = 4, NeighborChange = 5, LoopIndication = 6, UnloopIndication = 7, InterfaceDown = 8 };
DownState | |
LoopbackState | |
WaitingState | |
PointToPointState | |
NotDesignatedRouterState | |
BackupState | |
DesignatedRouterState |
{ DownState = 0, LoopbackState = 1, WaitingState = 2, PointToPointState = 3, NotDesignatedRouterState = 4, BackupState = 5, DesignatedRouterState = 6 };
{ UnknownType = 0, PointToPoint = 1, Broadcast = 2, NBMA = 3, PointToMultiPoint = 4, Virtual = 5 };
OSPF::Interface::Interface | ( | OSPFInterfaceType | ifType = UnknownType | ) |
: interfaceType(ifType), ifIndex(0), mtu(0), interfaceAddressRange(OSPF::NullIPv4AddressRange), areaID(OSPF::BackboneAreaID), transitAreaID(OSPF::BackboneAreaID), helloInterval(10), pollInterval(120), routerDeadInterval(40), interfaceTransmissionDelay(1), routerPriority(0), designatedRouter(OSPF::NullDesignatedRouterID), backupDesignatedRouter(OSPF::NullDesignatedRouterID), interfaceOutputCost(1), retransmissionInterval(5), acknowledgementDelay(1), authenticationType(OSPF::NullType), parentArea(NULL) { state = new OSPF::InterfaceStateDown; previousState = NULL; helloTimer = new OSPFTimer; helloTimer->setTimerKind(InterfaceHelloTimer); helloTimer->setContextPointer(this); helloTimer->setName("OSPF::Interface::InterfaceHelloTimer"); waitTimer = new OSPFTimer; waitTimer->setTimerKind(InterfaceWaitTimer); waitTimer->setContextPointer(this); waitTimer->setName("OSPF::Interface::InterfaceWaitTimer"); acknowledgementTimer = new OSPFTimer; acknowledgementTimer->setTimerKind(InterfaceAcknowledgementTimer); acknowledgementTimer->setContextPointer(this); acknowledgementTimer->setName("OSPF::Interface::InterfaceAcknowledgementTimer"); memset(authenticationKey.bytes, 0, 8 * sizeof(char)); }
OSPF::Interface::~Interface | ( | void | ) | [virtual] |
{ 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]; } }
void OSPF::Interface::AddDelayedAcknowledgement | ( | OSPFLSAHeader & | lsaHeader | ) |
Referenced by OSPF::LinkStateUpdateHandler::AcknowledgeLSA().
{ if (interfaceType == OSPF::Interface::Broadcast) { if ((GetState() == OSPF::Interface::DesignatedRouterState) || (GetState() == OSPF::Interface::BackupState) || (designatedRouter == OSPF::NullDesignatedRouterID)) { delayedAcknowledgements[OSPF::AllSPFRouters].push_back(lsaHeader); } else { delayedAcknowledgements[OSPF::AllDRouters].push_back(lsaHeader); } } else { long neighborCount = neighboringRouters.size(); for (long i = 0; i < neighborCount; i++) { if (neighboringRouters[i]->GetState() >= OSPF::Neighbor::ExchangeState) { delayedAcknowledgements[neighboringRouters[i]->GetAddress()].push_back(lsaHeader); } } } }
void OSPF::Interface::AddNeighbor | ( | OSPF::Neighbor * | neighbor | ) |
Referenced by OSPFRouting::LoadInterfaceParameters(), OSPFRouting::LoadVirtualLink(), and OSPF::HelloHandler::ProcessPacket().
{ neighboringRoutersByID[neighbor->GetNeighborID()] = neighbor; neighboringRoutersByAddress[neighbor->GetAddress()] = neighbor; neighbor->SetInterface(this); neighboringRouters.push_back(neighbor); }
void OSPF::Interface::AgeTransmittedLSALists | ( | void | ) |
{ long neighborCount = neighboringRouters.size(); for (long i = 0; i < neighborCount; i++) { neighboringRouters[i]->AgeTransmittedLSAList(); } }
void OSPF::Interface::ChangeState | ( | OSPF::InterfaceState * | newState, |
OSPF::InterfaceState * | currentState | ||
) | [private] |
Referenced by OSPF::InterfaceState::ChangeState().
{ if (previousState != NULL) { delete previousState; } state = newState; previousState = currentState; }
OSPFLinkStateUpdatePacket * OSPF::Interface::CreateUpdatePacket | ( | OSPFLSA * | lsa | ) |
Referenced by OSPF::LinkStateUpdateHandler::ProcessPacket(), and OSPF::LinkStateRequestHandler::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 OSPF::Interface::FloodLSA | ( | OSPFLSA * | lsa, |
OSPF::Interface * | intf = NULL , |
||
OSPF::Neighbor * | neighbor = NULL |
||
) |
{ bool floodedBackOut = false; if ( ( (lsa->getHeader().getLsType() == ASExternalLSAType) && (interfaceType != OSPF::Interface::Virtual) && (parentArea->GetExternalRoutingCapability()) ) || ( (lsa->getHeader().getLsType() != ASExternalLSAType) && ( ( (areaID != OSPF::BackboneAreaID) && (interfaceType != OSPF::Interface::Virtual) ) || (areaID == OSPF::BackboneAreaID) ) ) ) { long neighborCount = neighboringRouters.size(); bool lsaAddedToRetransmissionList = false; OSPF::LinkStateID linkStateID = lsa->getHeader().getLinkStateID(); OSPF::LSAKeyType lsaKey; lsaKey.linkStateID = linkStateID; lsaKey.advertisingRouter = lsa->getHeader().getAdvertisingRouter().getInt(); for (long i = 0; i < neighborCount; i++) { // (1) if (neighboringRouters[i]->GetState() < OSPF::Neighbor::ExchangeState) { // (1) (a) continue; } if (neighboringRouters[i]->GetState() < OSPF::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() != OSPF::Interface::BackupState)) { // (4) OSPFLinkStateUpdatePacket* updatePacket = CreateUpdatePacket(lsa); // (5) if (updatePacket != NULL) { int ttl = (interfaceType == OSPF::Interface::Virtual) ? VIRTUAL_LINK_TTL : 1; OSPF::MessageHandler* messageHandler = parentArea->GetRouter()->GetMessageHandler(); if (interfaceType == OSPF::Interface::Broadcast) { if ((GetState() == OSPF::Interface::DesignatedRouterState) || (GetState() == OSPF::Interface::BackupState) || (designatedRouter == OSPF::NullDesignatedRouterID)) { messageHandler->SendPacket(updatePacket, OSPF::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, OSPF::AllDRouters, ifIndex, ttl); OSPF::Neighbor* dRouter = GetNeighborByID(designatedRouter.routerID); OSPF::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 == OSPF::Interface::PointToPoint) { messageHandler->SendPacket(updatePacket, OSPF::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() >= OSPF::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 OSPF::Interface::GetAcknowledgementDelay | ( | void | ) | const [inline] |
Referenced by OSPF::InterfaceStateDown::ProcessEvent().
{ return acknowledgementDelay; }
OSPFTimer* OSPF::Interface::GetAcknowledgementTimer | ( | void | ) | [inline] |
Referenced by OSPF::InterfaceStateDown::ProcessEvent().
{ return acknowledgementTimer; }
IPv4AddressRange OSPF::Interface::GetAddressRange | ( | void | ) | const [inline] |
Area* OSPF::Interface::GetArea | ( | void | ) | [inline] |
Referenced by OSPF::LinkStateUpdateHandler::AcknowledgeLSA(), OSPF::NeighborState::ChangeState(), OSPF::InterfaceState::ChangeState(), OSPF::DatabaseDescriptionHandler::ProcessDDPacket(), OSPF::NeighborStateTwoWay::ProcessEvent(), OSPF::NeighborStateLoading::ProcessEvent(), OSPF::NeighborStateInit::ProcessEvent(), OSPF::NeighborStateFull::ProcessEvent(), OSPF::NeighborStateExchangeStart::ProcessEvent(), OSPF::NeighborStateExchange::ProcessEvent(), OSPF::NeighborStateDown::ProcessEvent(), OSPF::NeighborStateAttempt::ProcessEvent(), OSPF::InterfaceStateWaiting::ProcessEvent(), OSPF::InterfaceStatePointToPoint::ProcessEvent(), OSPF::InterfaceStateNotDesignatedRouter::ProcessEvent(), OSPF::InterfaceStateDown::ProcessEvent(), OSPF::InterfaceStateDesignatedRouter::ProcessEvent(), OSPF::InterfaceStateBackup::ProcessEvent(), OSPF::LinkStateRequestHandler::ProcessPacket(), and OSPF::HelloHandler::ProcessPacket().
{ return parentArea; }
const Area* OSPF::Interface::GetArea | ( | void | ) | const [inline] |
{ return parentArea; }
AreaID OSPF::Interface::GetAreaID | ( | void | ) | const [inline] |
Referenced by OSPFRouting::LoadVirtualLink().
{ return areaID; }
AuthenticationKeyType OSPF::Interface::GetAuthenticationKey | ( | void | ) | const [inline] |
Referenced by OSPF::LinkStateUpdateHandler::AcknowledgeLSA().
{ return authenticationKey; }
AuthenticationType OSPF::Interface::GetAuthenticationType | ( | void | ) | const [inline] |
Referenced by OSPF::LinkStateUpdateHandler::AcknowledgeLSA().
{ return authenticationType; }
DesignatedRouterID OSPF::Interface::GetBackupDesignatedRouter | ( | void | ) | const [inline] |
Referenced by OSPF::InterfaceStateNotDesignatedRouter::ProcessEvent().
{ return backupDesignatedRouter; }
DesignatedRouterID OSPF::Interface::GetDesignatedRouter | ( | void | ) | const [inline] |
short OSPF::Interface::GetHelloInterval | ( | void | ) | const [inline] |
Referenced by OSPF::InterfaceStateWaiting::ProcessEvent(), OSPF::InterfaceStatePointToPoint::ProcessEvent(), OSPF::InterfaceStateNotDesignatedRouter::ProcessEvent(), OSPF::InterfaceStateDesignatedRouter::ProcessEvent(), OSPF::InterfaceStateBackup::ProcessEvent(), and OSPF::HelloHandler::ProcessPacket().
{ return helloInterval; }
OSPFTimer* OSPF::Interface::GetHelloTimer | ( | void | ) | [inline] |
Referenced by OSPF::InterfaceStateWaiting::ProcessEvent(), OSPF::InterfaceStatePointToPoint::ProcessEvent(), OSPF::InterfaceStateNotDesignatedRouter::ProcessEvent(), OSPF::InterfaceStateDown::ProcessEvent(), OSPF::InterfaceStateDesignatedRouter::ProcessEvent(), and OSPF::InterfaceStateBackup::ProcessEvent().
{ return helloTimer; }
unsigned char OSPF::Interface::GetIfIndex | ( | void | ) | const [inline] |
unsigned short OSPF::Interface::GetMTU | ( | void | ) | const [inline] |
Referenced by OSPF::DatabaseDescriptionHandler::ProcessPacket().
{ return mtu; }
Neighbor* OSPF::Interface::GetNeighbor | ( | unsigned long | i | ) | [inline] |
Referenced by OSPF::Area::CalculateShortestPathTree(), OSPF::Area::OriginateNetworkLSA(), OSPF::Area::OriginateRouterLSA(), OSPF::InterfaceStateWaiting::ProcessEvent(), OSPF::InterfaceStatePointToPoint::ProcessEvent(), OSPF::InterfaceStateNotDesignatedRouter::ProcessEvent(), OSPF::InterfaceStateDown::ProcessEvent(), OSPF::InterfaceStateDesignatedRouter::ProcessEvent(), OSPF::InterfaceStateBackup::ProcessEvent(), and OSPF::HelloHandler::ProcessPacket().
{ return neighboringRouters[i]; }
const Neighbor* OSPF::Interface::GetNeighbor | ( | unsigned long | i | ) | const [inline] |
{ return neighboringRouters[i]; }
OSPF::Neighbor * OSPF::Interface::GetNeighborByAddress | ( | OSPF::IPv4Address | address | ) |
Referenced by OSPF::Area::OriginateRouterLSA(), OSPF::MessageHandler::ProcessPacket(), and OSPF::HelloHandler::ProcessPacket().
{ std::map<OSPF::IPv4Address, OSPF::Neighbor*, OSPF::IPv4Address_Less>::iterator neighborIt = neighboringRoutersByAddress.find(address); if (neighborIt != neighboringRoutersByAddress.end()) { return (neighborIt->second); } else { return NULL; } }
OSPF::Neighbor * OSPF::Interface::GetNeighborByID | ( | OSPF::RouterID | neighborID | ) |
Referenced by OSPF::LinkStateUpdateHandler::AcknowledgeLSA(), OSPF::MessageHandler::ProcessPacket(), and OSPF::HelloHandler::ProcessPacket().
{ std::map<OSPF::RouterID, OSPF::Neighbor*>::iterator neighborIt = neighboringRoutersByID.find(neighborID); if (neighborIt != neighboringRoutersByID.end()) { return (neighborIt->second); } else { return NULL; } }
unsigned long OSPF::Interface::GetNeighborCount | ( | void | ) | const [inline] |
Referenced by OSPF::Area::AgeDatabase(), OSPF::Area::OriginateNetworkLSA(), OSPF::Area::OriginateRouterLSA(), OSPF::InterfaceStateWaiting::ProcessEvent(), OSPF::InterfaceStatePointToPoint::ProcessEvent(), OSPF::InterfaceStateNotDesignatedRouter::ProcessEvent(), OSPF::InterfaceStateDown::ProcessEvent(), OSPF::InterfaceStateDesignatedRouter::ProcessEvent(), OSPF::InterfaceStateBackup::ProcessEvent(), and OSPF::HelloHandler::ProcessPacket().
{ return neighboringRouters.size(); }
Metric OSPF::Interface::GetOutputCost | ( | void | ) | const [inline] |
Referenced by OSPF::Area::OriginateRouterLSA().
{ return interfaceOutputCost; }
short OSPF::Interface::GetPollInterval | ( | void | ) | const [inline] |
Referenced by OSPF::NeighborStateTwoWay::ProcessEvent(), OSPF::NeighborStateLoading::ProcessEvent(), OSPF::NeighborStateInit::ProcessEvent(), OSPF::NeighborStateFull::ProcessEvent(), OSPF::NeighborStateExchangeStart::ProcessEvent(), OSPF::NeighborStateExchange::ProcessEvent(), OSPF::NeighborStateDown::ProcessEvent(), and OSPF::NeighborStateAttempt::ProcessEvent().
{ return pollInterval; }
short OSPF::Interface::GetRetransmissionInterval | ( | void | ) | const [inline] |
Referenced by OSPF::NeighborStateTwoWay::ProcessEvent(), OSPF::NeighborStateLoading::ProcessEvent(), OSPF::NeighborStateInit::ProcessEvent(), OSPF::NeighborStateFull::ProcessEvent(), OSPF::NeighborStateExchangeStart::ProcessEvent(), and OSPF::NeighborStateExchange::ProcessEvent().
{ return retransmissionInterval; }
short OSPF::Interface::GetRouterDeadInterval | ( | void | ) | const [inline] |
Referenced by OSPF::InterfaceStateDown::ProcessEvent(), and OSPF::HelloHandler::ProcessPacket().
{ return routerDeadInterval; }
unsigned char OSPF::Interface::GetRouterPriority | ( | void | ) | const [inline] |
Referenced by OSPF::InterfaceStateNotDesignatedRouter::ProcessEvent(), OSPF::InterfaceStateDown::ProcessEvent(), and OSPF::HelloHandler::ProcessPacket().
{ return routerPriority; }
OSPF::Interface::InterfaceStateType OSPF::Interface::GetState | ( | void | ) | const |
Referenced by OSPF::LinkStateUpdateHandler::AcknowledgeLSA(), OSPF::Area::AgeDatabase(), OSPF::InterfaceState::CalculateDesignatedRouter(), OSPF::Area::CalculateShortestPathTree(), OSPF::NeighborState::ChangeState(), OSPF::Area::OriginateRouterLSA(), OSPF::MessageHandler::PrintEvent(), OSPF::MessageHandler::ProcessPacket(), OSPF::LinkStateUpdateHandler::ProcessPacket(), OSPF::LinkStateRequestHandler::ProcessPacket(), and OSPF::HelloHandler::ProcessPacket().
{ return state->GetState(); }
const char * OSPF::Interface::GetStateString | ( | InterfaceStateType | stateType | ) | [static] |
Referenced by OSPF::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 OSPF::Interface::GetTransitAreaID | ( | void | ) | const [inline] |
Referenced by OSPF::Area::CalculateShortestPathTree(), and OSPF::MessageHandler::ProcessPacket().
{ return transitAreaID; }
short OSPF::Interface::GetTransmissionDelay | ( | void | ) | const [inline] |
{ return interfaceTransmissionDelay; }
OSPFInterfaceType OSPF::Interface::GetType | ( | void | ) | const [inline] |
Referenced by OSPF::LinkStateUpdateHandler::AcknowledgeLSA(), OSPF::InterfaceState::ChangeState(), OSPF::Area::OriginateRouterLSA(), OSPF::MessageHandler::PrintEvent(), OSPF::NeighborStateTwoWay::ProcessEvent(), OSPF::NeighborStateLoading::ProcessEvent(), OSPF::NeighborStateInit::ProcessEvent(), OSPF::NeighborStateFull::ProcessEvent(), OSPF::NeighborStateExchangeStart::ProcessEvent(), OSPF::NeighborStateExchange::ProcessEvent(), OSPF::NeighborStateDown::ProcessEvent(), OSPF::NeighborStateAttempt::ProcessEvent(), OSPF::InterfaceStateWaiting::ProcessEvent(), OSPF::InterfaceStatePointToPoint::ProcessEvent(), OSPF::InterfaceStateNotDesignatedRouter::ProcessEvent(), OSPF::InterfaceStateDown::ProcessEvent(), OSPF::InterfaceStateDesignatedRouter::ProcessEvent(), OSPF::InterfaceStateBackup::ProcessEvent(), OSPF::MessageHandler::ProcessPacket(), OSPF::LinkStateUpdateHandler::ProcessPacket(), OSPF::LinkStateRequestHandler::ProcessPacket(), and OSPF::HelloHandler::ProcessPacket().
{ return interfaceType; }
OSPFTimer* OSPF::Interface::GetWaitTimer | ( | void | ) | [inline] |
Referenced by OSPF::InterfaceStateDown::ProcessEvent().
{ return waitTimer; }
bool OSPF::Interface::HasAnyNeighborInStates | ( | int | states | ) | const |
Referenced by OSPF::Area::AgeDatabase(), OSPF::Area::OriginateNetworkLSA(), and OSPF::Area::OriginateRouterLSA().
{ long neighborCount = neighboringRouters.size(); for (long i = 0; i < neighborCount; i++) { OSPF::Neighbor::NeighborStateType neighborState = neighboringRouters[i]->GetState(); if (neighborState & states) { return true; } } return false; }
bool OSPF::Interface::IsOnAnyRetransmissionList | ( | OSPF::LSAKeyType | lsaKey | ) | const |
{ long neighborCount = neighboringRouters.size(); for (long i = 0; i < neighborCount; i++) { if (neighboringRouters[i]->IsLSAOnRetransmissionList(lsaKey)) { return true; } } return false; }
void OSPF::Interface::ProcessEvent | ( | InterfaceEventType | event | ) |
Referenced by OSPF::Area::CalculateShortestPathTree(), OSPF::MessageHandler::HandleTimer(), OSPFRouting::LoadInterfaceParameters(), and OSPF::HelloHandler::ProcessPacket().
{ state->ProcessEvent(this, event); }
void OSPF::Interface::RemoveFromAllRetransmissionLists | ( | OSPF::LSAKeyType | lsaKey | ) |
{ long neighborCount = neighboringRouters.size(); for (long i = 0; i < neighborCount; i++) { neighboringRouters[i]->RemoveFromRetransmissionList(lsaKey); } }
void OSPF::Interface::Reset | ( | void | ) |
Referenced by OSPF::InterfaceStateWaiting::ProcessEvent(), OSPF::InterfaceStatePointToPoint::ProcessEvent(), OSPF::InterfaceStateNotDesignatedRouter::ProcessEvent(), OSPF::InterfaceStateLoopback::ProcessEvent(), OSPF::InterfaceStateDown::ProcessEvent(), OSPF::InterfaceStateDesignatedRouter::ProcessEvent(), and OSPF::InterfaceStateBackup::ProcessEvent().
{ MessageHandler* messageHandler = parentArea->GetRouter()->GetMessageHandler(); messageHandler->ClearTimer(helloTimer); messageHandler->ClearTimer(waitTimer); messageHandler->ClearTimer(acknowledgementTimer); designatedRouter = NullDesignatedRouterID; backupDesignatedRouter = NullDesignatedRouterID; long neighborCount = neighboringRouters.size(); for (long i = 0; i < neighborCount; i++) { neighboringRouters[i]->ProcessEvent(OSPF::Neighbor::KillNeighbor); } }
void OSPF::Interface::SendDelayedAcknowledgements | ( | void | ) |
Referenced by OSPF::InterfaceStateWaiting::ProcessEvent(), OSPF::InterfaceStatePointToPoint::ProcessEvent(), OSPF::InterfaceStateNotDesignatedRouter::ProcessEvent(), OSPF::InterfaceStateDesignatedRouter::ProcessEvent(), and OSPF::InterfaceStateBackup::ProcessEvent().
{ OSPF::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>, OSPF::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 == OSPF::Interface::Virtual) ? VIRTUAL_LINK_TTL : 1; if (interfaceType == OSPF::Interface::Broadcast) { if ((GetState() == OSPF::Interface::DesignatedRouterState) || (GetState() == OSPF::Interface::BackupState) || (designatedRouter == OSPF::NullDesignatedRouterID)) { messageHandler->SendPacket(ackPacket, OSPF::AllSPFRouters, ifIndex, ttl); } else { messageHandler->SendPacket(ackPacket, OSPF::AllDRouters, ifIndex, ttl); } } else { if (interfaceType == OSPF::Interface::PointToPoint) { messageHandler->SendPacket(ackPacket, OSPF::AllSPFRouters, ifIndex, ttl); } else { messageHandler->SendPacket(ackPacket, delayIt->first, ifIndex, ttl); } } } } } messageHandler->StartTimer(acknowledgementTimer, acknowledgementDelay); }
void OSPF::Interface::SendHelloPacket | ( | OSPF::IPv4Address | destination, |
short | ttl = 1 |
||
) |
Referenced by OSPF::NeighborStateDown::ProcessEvent(), OSPF::InterfaceStateWaiting::ProcessEvent(), OSPF::InterfaceStatePointToPoint::ProcessEvent(), OSPF::InterfaceStateNotDesignatedRouter::ProcessEvent(), OSPF::InterfaceStateDesignatedRouter::ProcessEvent(), OSPF::InterfaceStateBackup::ProcessEvent(), and OSPF::HelloHandler::ProcessPacket().
{ OSPFOptions options; OSPFHelloPacket* helloPacket = new OSPFHelloPacket; std::vector<OSPF::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 == OSPF::NullIPv4Address)) || (interfaceType == Virtual)) { helloPacket->setNetworkMask(ULongFromIPv4Address(OSPF::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() >= OSPF::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 OSPF::Interface::SendLSAcknowledgement | ( | OSPFLSAHeader * | lsaHeader, |
IPv4Address | destination | ||
) |
Referenced by OSPF::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 == OSPF::Interface::Virtual) ? VIRTUAL_LINK_TTL : 1; parentArea->GetRouter()->GetMessageHandler()->SendPacket(lsAckPacket, destination, ifIndex, ttl); }
void OSPF::Interface::SetAcknowledgementDelay | ( | short | delay | ) | [inline] |
{ acknowledgementDelay = delay; }
void OSPF::Interface::SetAddressRange | ( | IPv4AddressRange | range | ) | [inline] |
Referenced by OSPF::Area::CalculateShortestPathTree().
{ interfaceAddressRange = range; }
void OSPF::Interface::SetArea | ( | Area * | area | ) | [inline] |
Referenced by OSPF::Area::AddInterface().
{ parentArea = area; }
void OSPF::Interface::SetAreaID | ( | AreaID | areaId | ) | [inline] |
Referenced by OSPFRouting::LoadInterfaceParameters().
{ areaID = areaId; }
void OSPF::Interface::SetAuthenticationKey | ( | AuthenticationKeyType | key | ) | [inline] |
Referenced by OSPFRouting::LoadInterfaceParameters(), and OSPFRouting::LoadVirtualLink().
{ authenticationKey = key; }
void OSPF::Interface::SetAuthenticationType | ( | AuthenticationType | type | ) | [inline] |
Referenced by OSPFRouting::LoadInterfaceParameters(), and OSPFRouting::LoadVirtualLink().
{ authenticationType = type; }
void OSPF::Interface::SetHelloInterval | ( | short | interval | ) | [inline] |
Referenced by OSPFRouting::LoadInterfaceParameters(), and OSPFRouting::LoadVirtualLink().
{ helloInterval = interval; }
void OSPF::Interface::SetIfIndex | ( | unsigned char | index | ) |
Referenced by OSPF::Area::CalculateShortestPathTree(), and OSPFRouting::LoadInterfaceParameters().
{ ifIndex = index; if (interfaceType == OSPF::Interface::UnknownType) { InterfaceEntry* routingInterface = InterfaceTableAccess().get()->getInterfaceById(ifIndex); interfaceAddressRange.address = IPv4AddressFromAddressString(routingInterface->ipv4Data()->getIPAddress().str().c_str()); interfaceAddressRange.mask = IPv4AddressFromAddressString(routingInterface->ipv4Data()->getNetmask().str().c_str()); mtu = routingInterface->getMTU(); } }
void OSPF::Interface::SetMTU | ( | unsigned short | ifMTU | ) | [inline] |
{ mtu = ifMTU; }
void OSPF::Interface::SetOutputCost | ( | Metric | cost | ) | [inline] |
Referenced by OSPF::Area::CalculateShortestPathTree(), and OSPFRouting::LoadInterfaceParameters().
{ interfaceOutputCost = cost; }
void OSPF::Interface::SetPollInterval | ( | short | interval | ) | [inline] |
Referenced by OSPFRouting::LoadInterfaceParameters().
{ pollInterval = interval; }
void OSPF::Interface::SetRetransmissionInterval | ( | short | interval | ) | [inline] |
Referenced by OSPFRouting::LoadInterfaceParameters(), and OSPFRouting::LoadVirtualLink().
{ retransmissionInterval = interval; }
void OSPF::Interface::SetRouterDeadInterval | ( | short | interval | ) | [inline] |
Referenced by OSPFRouting::LoadInterfaceParameters(), and OSPFRouting::LoadVirtualLink().
{ routerDeadInterval = interval; }
void OSPF::Interface::SetRouterPriority | ( | unsigned char | priority | ) | [inline] |
Referenced by OSPFRouting::LoadInterfaceParameters().
{ routerPriority = priority; }
void OSPF::Interface::SetTransitAreaID | ( | AreaID | areaId | ) | [inline] |
Referenced by OSPFRouting::LoadVirtualLink().
{ transitAreaID = areaId; }
void OSPF::Interface::SetTransmissionDelay | ( | short | delay | ) | [inline] |
Referenced by OSPFRouting::LoadInterfaceParameters(), and OSPFRouting::LoadVirtualLink().
{ interfaceTransmissionDelay = delay; }
void OSPF::Interface::SetType | ( | OSPFInterfaceType | ifType | ) | [inline] |
Referenced by OSPFRouting::LoadInterfaceParameters(), and OSPFRouting::LoadVirtualLink().
{ interfaceType = ifType; }
friend class InterfaceState [friend] |
short OSPF::Interface::acknowledgementDelay [private] |
Referenced by GetAcknowledgementDelay(), and SetAcknowledgementDelay().
OSPFTimer* OSPF::Interface::acknowledgementTimer [private] |
Referenced by GetAcknowledgementTimer(), and Interface().
AreaID OSPF::Interface::areaID [private] |
Referenced by GetAreaID(), and SetAreaID().
Referenced by GetAuthenticationKey(), Interface(), and SetAuthenticationKey().
Referenced by GetAuthenticationType(), and SetAuthenticationType().
Referenced by OSPF::InterfaceState::CalculateDesignatedRouter(), and GetBackupDesignatedRouter().
std::map<IPv4Address, std::list<OSPFLSAHeader>, IPv4Address_Less> OSPF::Interface::delayedAcknowledgements [private] |
Referenced by OSPF::InterfaceState::CalculateDesignatedRouter(), and GetDesignatedRouter().
short OSPF::Interface::helloInterval [private] |
Referenced by GetHelloInterval(), and SetHelloInterval().
OSPFTimer* OSPF::Interface::helloTimer [private] |
Referenced by GetHelloTimer(), and Interface().
unsigned char OSPF::Interface::ifIndex [private] |
Referenced by GetIfIndex().
Referenced by OSPF::InterfaceState::CalculateDesignatedRouter(), GetAddressRange(), and SetAddressRange().
Metric OSPF::Interface::interfaceOutputCost [private] |
Referenced by GetOutputCost(), and SetOutputCost().
short OSPF::Interface::interfaceTransmissionDelay [private] |
Referenced by GetTransmissionDelay(), and SetTransmissionDelay().
Referenced by OSPF::InterfaceState::CalculateDesignatedRouter(), GetType(), and SetType().
unsigned short OSPF::Interface::mtu [private] |
std::vector<Neighbor*> OSPF::Interface::neighboringRouters [private] |
Referenced by OSPF::InterfaceState::CalculateDesignatedRouter(), GetNeighbor(), and GetNeighborCount().
std::map<IPv4Address, Neighbor*, IPv4Address_Less> OSPF::Interface::neighboringRoutersByAddress [private] |
std::map<RouterID, Neighbor*> OSPF::Interface::neighboringRoutersByID [private] |
Area* OSPF::Interface::parentArea [private] |
Referenced by OSPF::InterfaceState::CalculateDesignatedRouter(), GetArea(), and SetArea().
short OSPF::Interface::pollInterval [private] |
Referenced by GetPollInterval(), and SetPollInterval().
InterfaceState* OSPF::Interface::previousState [private] |
Referenced by Interface().
short OSPF::Interface::retransmissionInterval [private] |
Referenced by GetRetransmissionInterval(), and SetRetransmissionInterval().
short OSPF::Interface::routerDeadInterval [private] |
Referenced by GetRouterDeadInterval(), and SetRouterDeadInterval().
unsigned char OSPF::Interface::routerPriority [private] |
Referenced by OSPF::InterfaceState::CalculateDesignatedRouter(), GetRouterPriority(), and SetRouterPriority().
InterfaceState* OSPF::Interface::state [private] |
Referenced by Interface().
AreaID OSPF::Interface::transitAreaID [private] |
Referenced by GetTransitAreaID(), and SetTransitAreaID().
OSPFTimer* OSPF::Interface::waitTimer [private] |
Referenced by GetWaitTimer(), and Interface().