|
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().