#include <OSPFInterfaceState.h>
List of all members.
Constructor & Destructor Documentation
virtual OSPF::InterfaceState::~InterfaceState |
( |
| ) |
[inline, virtual] |
Member Function Documentation
void OSPF::InterfaceState::CalculateDesignatedRouter |
( |
OSPF::Interface * |
intf | ) |
[protected] |
Referenced by OSPF::InterfaceStateWaiting::ProcessEvent(), OSPF::InterfaceStateNotDesignatedRouter::ProcessEvent(), OSPF::InterfaceStateDesignatedRouter::ProcessEvent(), and OSPF::InterfaceStateBackup::ProcessEvent().
{
OSPF::RouterID routerID = intf->parentArea->GetRouter()->GetRouterID();
OSPF::DesignatedRouterID currentDesignatedRouter = intf->designatedRouter;
OSPF::DesignatedRouterID currentBackupRouter = intf->backupDesignatedRouter;
unsigned int neighborCount = intf->neighboringRouters.size();
unsigned char repeatCount = 0;
unsigned int i;
OSPF::DesignatedRouterID declaredBackup;
unsigned char declaredBackupPriority;
OSPF::RouterID declaredBackupID;
bool backupDeclared;
OSPF::DesignatedRouterID declaredDesignatedRouter;
unsigned char declaredDesignatedRouterPriority;
OSPF::RouterID declaredDesignatedRouterID;
bool designatedRouterDeclared;
do {
declaredBackup = OSPF::NullDesignatedRouterID;
declaredBackupPriority = 0;
declaredBackupID = OSPF::NullRouterID;
backupDeclared = false;
OSPF::DesignatedRouterID highestRouter = OSPF::NullDesignatedRouterID;
unsigned char highestPriority = 0;
OSPF::RouterID highestID = OSPF::NullRouterID;
for (i = 0; i < neighborCount; i++) {
OSPF::Neighbor* neighbor = intf->neighboringRouters[i];
unsigned char neighborPriority = neighbor->GetPriority();
if (neighbor->GetState() < OSPF::Neighbor::TwoWayState) {
continue;
}
if (neighborPriority == 0) {
continue;
}
OSPF::RouterID neighborID = neighbor->GetNeighborID();
OSPF::DesignatedRouterID neighborsDesignatedRouter = neighbor->GetDesignatedRouter();
OSPF::DesignatedRouterID neighborsBackupDesignatedRouter = neighbor->GetBackupDesignatedRouter();
if (neighborsDesignatedRouter.routerID != neighborID) {
if (neighborsBackupDesignatedRouter.routerID == neighborID) {
if ((neighborPriority > declaredBackupPriority) ||
((neighborPriority == declaredBackupPriority) &&
(neighborID > declaredBackupID)))
{
declaredBackup = neighborsBackupDesignatedRouter;
declaredBackupPriority = neighborPriority;
declaredBackupID = neighborID;
backupDeclared = true;
}
}
if (!backupDeclared) {
if ((neighborPriority > highestPriority) ||
((neighborPriority == highestPriority) &&
(neighborID > highestID)))
{
highestRouter.routerID = neighborID;
highestRouter.ipInterfaceAddress = neighbor->GetAddress();
highestPriority = neighborPriority;
highestID = neighborID;
}
}
}
}
if (intf->routerPriority > 0) {
if (currentDesignatedRouter.routerID != routerID) {
if (currentBackupRouter.routerID == routerID) {
if ((intf->routerPriority > declaredBackupPriority) ||
((intf->routerPriority == declaredBackupPriority) &&
(routerID > declaredBackupID)))
{
declaredBackup.routerID = routerID;
declaredBackup.ipInterfaceAddress = intf->interfaceAddressRange.address;
declaredBackupPriority = intf->routerPriority;
declaredBackupID = routerID;
backupDeclared = true;
}
}
if (!backupDeclared) {
if ((intf->routerPriority > highestPriority) ||
((intf->routerPriority == highestPriority) &&
(routerID > highestID)))
{
declaredBackup.routerID = routerID;
declaredBackup.ipInterfaceAddress = intf->interfaceAddressRange.address;
declaredBackupPriority = intf->routerPriority;
declaredBackupID = routerID;
backupDeclared = true;
} else {
declaredBackup = highestRouter;
declaredBackupPriority = highestPriority;
declaredBackupID = highestID;
backupDeclared = true;
}
}
}
}
declaredDesignatedRouter = OSPF::NullDesignatedRouterID;
declaredDesignatedRouterPriority = 0;
declaredDesignatedRouterID = OSPF::NullRouterID;
designatedRouterDeclared = false;
for (i = 0; i < neighborCount; i++) {
OSPF::Neighbor* neighbor = intf->neighboringRouters[i];
unsigned char neighborPriority = neighbor->GetPriority();
if (neighbor->GetState() < OSPF::Neighbor::TwoWayState) {
continue;
}
if (neighborPriority == 0) {
continue;
}
OSPF::RouterID neighborID = neighbor->GetNeighborID();
OSPF::DesignatedRouterID neighborsDesignatedRouter = neighbor->GetDesignatedRouter();
OSPF::DesignatedRouterID neighborsBackupDesignatedRouter = neighbor->GetBackupDesignatedRouter();
if (neighborsDesignatedRouter.routerID == neighborID) {
if ((neighborPriority > declaredDesignatedRouterPriority) ||
((neighborPriority == declaredDesignatedRouterPriority) &&
(neighborID > declaredDesignatedRouterID)))
{
declaredDesignatedRouter = neighborsDesignatedRouter;
declaredDesignatedRouterPriority = neighborPriority;
declaredDesignatedRouterID = neighborID;
designatedRouterDeclared = true;
}
}
}
if (intf->routerPriority > 0) {
if (currentDesignatedRouter.routerID == routerID) {
if ((intf->routerPriority > declaredDesignatedRouterPriority) ||
((intf->routerPriority == declaredDesignatedRouterPriority) &&
(routerID > declaredDesignatedRouterID)))
{
declaredDesignatedRouter.routerID = routerID;
declaredDesignatedRouter.ipInterfaceAddress = intf->interfaceAddressRange.address;
declaredDesignatedRouterPriority = intf->routerPriority;
declaredDesignatedRouterID = routerID;
designatedRouterDeclared = true;
}
}
}
if (!designatedRouterDeclared) {
declaredDesignatedRouter = declaredBackup;
declaredDesignatedRouterPriority = declaredBackupPriority;
declaredDesignatedRouterID = declaredBackupID;
designatedRouterDeclared = true;
}
if (
(
(declaredDesignatedRouter.routerID != OSPF::NullRouterID) &&
(
(currentDesignatedRouter.routerID == routerID) &&
(declaredDesignatedRouter.routerID != routerID)
) ||
(
(currentDesignatedRouter.routerID != routerID) &&
(declaredDesignatedRouter.routerID == routerID)
)
) ||
(
(declaredBackup.routerID != OSPF::NullRouterID) &&
(
(currentBackupRouter.routerID == routerID) &&
(declaredBackup.routerID != routerID)
) ||
(
(currentBackupRouter.routerID != routerID) &&
(declaredBackup.routerID == routerID)
)
)
)
{
currentDesignatedRouter = declaredDesignatedRouter;
currentBackupRouter = declaredBackup;
repeatCount++;
} else {
repeatCount += 2;
}
} while (repeatCount < 2);
OSPF::RouterID routersOldDesignatedRouterID = intf->designatedRouter.routerID;
OSPF::RouterID routersOldBackupID = intf->backupDesignatedRouter.routerID;
intf->designatedRouter = declaredDesignatedRouter;
intf->backupDesignatedRouter = declaredBackup;
bool wasBackupDesignatedRouter = (routersOldBackupID == routerID);
bool wasDesignatedRouter = (routersOldDesignatedRouterID == routerID);
bool wasOther = (intf->GetState() == OSPF::Interface::NotDesignatedRouterState);
bool wasWaiting = (!wasBackupDesignatedRouter && !wasDesignatedRouter && !wasOther);
bool isBackupDesignatedRouter = (declaredBackup.routerID == routerID);
bool isDesignatedRouter = (declaredDesignatedRouter.routerID == routerID);
bool isOther = (!isBackupDesignatedRouter && !isDesignatedRouter);
if (wasBackupDesignatedRouter) {
if (isDesignatedRouter) {
ChangeState(intf, new OSPF::InterfaceStateDesignatedRouter, this);
}
if (isOther) {
ChangeState(intf, new OSPF::InterfaceStateNotDesignatedRouter, this);
}
}
if (wasDesignatedRouter) {
if (isBackupDesignatedRouter) {
ChangeState(intf, new OSPF::InterfaceStateBackup, this);
}
if (isOther) {
ChangeState(intf, new OSPF::InterfaceStateNotDesignatedRouter, this);
}
}
if (wasOther) {
if (isDesignatedRouter) {
ChangeState(intf, new OSPF::InterfaceStateDesignatedRouter, this);
}
if (isBackupDesignatedRouter) {
ChangeState(intf, new OSPF::InterfaceStateBackup, this);
}
}
if (wasWaiting) {
if (isDesignatedRouter) {
ChangeState(intf, new OSPF::InterfaceStateDesignatedRouter, this);
}
if (isBackupDesignatedRouter) {
ChangeState(intf, new OSPF::InterfaceStateBackup, this);
}
if (isOther) {
ChangeState(intf, new OSPF::InterfaceStateNotDesignatedRouter, this);
}
}
for (i = 0; i < neighborCount; i++) {
if ((intf->interfaceType == OSPF::Interface::NBMA) &&
((!wasBackupDesignatedRouter && isBackupDesignatedRouter) ||
(!wasDesignatedRouter && isDesignatedRouter)))
{
if (intf->neighboringRouters[i]->GetPriority() == 0) {
intf->neighboringRouters[i]->ProcessEvent(OSPF::Neighbor::Start);
}
}
if ((declaredDesignatedRouter.routerID != routersOldDesignatedRouterID) ||
(declaredBackup.routerID != routersOldBackupID))
{
if (intf->neighboringRouters[i]->GetState() >= OSPF::Neighbor::TwoWayState) {
intf->neighboringRouters[i]->ProcessEvent(OSPF::Neighbor::IsAdjacencyOK);
}
}
}
}
The documentation for this class was generated from the following files: