204 Ipv4Address routerID = intf->getArea()->getInstance()->getProcess()->getRouterID();
205 Ipv4Address currentDesignatedRouter = intf->getDesignatedID();
206 Ipv4Address currentBackupRouter = intf->getBackupID();
207 EV_DEBUG <<
"Calculating the designated router, currentDesignated:" << currentDesignatedRouter <<
", current backup: " << currentBackupRouter <<
"\n";
209 unsigned int neighborCount = intf->getNeighborCount();
210 unsigned char repeatCount = 0;
213 Ipv6Address declaredBackupIP;
214 int declaredBackupPriority;
215 Ipv4Address declaredBackupID;
218 Ipv6Address declaredDesignatedRouterIP;
219 int declaredDesignatedRouterPriority;
220 Ipv4Address declaredDesignatedRouterID;
221 bool designatedRouterDeclared;
226 declaredBackupPriority = 0;
228 backupDeclared =
false;
232 int highestPriority = 0;
234 for (i = 0; i < neighborCount; i++) {
235 Ospfv3Neighbor *neighbor = intf->getNeighbor(i);
236 int neighborPriority = neighbor->getNeighborPriority();
241 if (neighborPriority == 0) {
245 Ipv4Address neighborID = neighbor->getNeighborID();
246 Ipv4Address neighborsDesignatedRouterID = neighbor->getNeighborsDR();
247 Ipv4Address neighborsBackupDesignatedRouterID = neighbor->getNeighborsBackup();
250 if (neighborsDesignatedRouterID != neighborID) {
252 if (neighborsBackupDesignatedRouterID == neighborID) {
253 if ((neighborPriority > declaredBackupPriority) ||
254 ((neighborPriority == declaredBackupPriority) &&
255 (neighborID > declaredBackupID)))
257 declaredBackupID = neighborsBackupDesignatedRouterID;
258 declaredBackupPriority = neighborPriority;
259 declaredBackupIP = neighbor->getNeighborIP();
260 backupDeclared =
true;
263 if (!backupDeclared) {
264 if ((neighborPriority > highestPriority) ||
265 ((neighborPriority == highestPriority) &&
266 (neighborID > highestRouter)))
268 highestRouter = neighborID;
269 highestRouterIP = neighbor->getNeighborIP();
270 highestPriority = neighborPriority;
278 if (intf->routerPriority > 0) {
279 if (currentDesignatedRouter != routerID) {
280 if (currentBackupRouter == routerID) {
281 if ((intf->routerPriority > declaredBackupPriority) ||
282 ((intf->routerPriority == declaredBackupPriority) &&
283 (routerID > declaredBackupID)))
285 declaredBackupID = routerID;
286 declaredBackupIP = intf->getInterfaceLLIP();
287 declaredBackupPriority = intf->getRouterPriority();
288 backupDeclared =
true;
291 if (!backupDeclared) {
292 if ((intf->routerPriority > highestPriority) ||
293 ((intf->routerPriority == highestPriority) &&
294 (routerID > highestRouter)))
296 declaredBackupID = routerID;
297 declaredBackupIP = intf->getInterfaceLLIP();
298 declaredBackupPriority = intf->getRouterPriority();
299 backupDeclared =
true;
302 declaredBackupID = highestRouter;
303 declaredBackupPriority = highestPriority;
304 backupDeclared =
true;
312 declaredDesignatedRouterPriority = 0;
313 designatedRouterDeclared =
false;
315 for (i = 0; i < neighborCount; i++) {
316 Ospfv3Neighbor *neighbor = intf->getNeighbor(i);
317 unsigned short neighborPriority = neighbor->getNeighborPriority();
322 if (neighborPriority == 0) {
326 Ipv4Address neighborID = neighbor->getNeighborID();
327 Ipv4Address neighborsDesignatedRouterID = neighbor->getNeighborsDR();
328 Ipv4Address neighborsBackupDesignatedRouterID = neighbor->getNeighborsBackup();
330 if (neighborsDesignatedRouterID == neighborID) {
331 if ((neighborPriority > declaredDesignatedRouterPriority) ||
332 ((neighborPriority == declaredDesignatedRouterPriority) &&
333 (neighborID > declaredDesignatedRouterID)))
336 declaredDesignatedRouterPriority = neighborPriority;
337 declaredDesignatedRouterID = neighborID;
338 designatedRouterDeclared =
true;
344 if (intf->routerPriority > 0) {
345 if (currentDesignatedRouter == routerID) {
346 if ((intf->routerPriority > declaredDesignatedRouterPriority) ||
347 ((intf->routerPriority == declaredDesignatedRouterPriority) &&
348 (routerID > declaredDesignatedRouterID)))
350 declaredDesignatedRouterID = routerID;
351 declaredDesignatedRouterIP = intf->getInterfaceLLIP();
352 declaredDesignatedRouterPriority = intf->getRouterPriority();
353 designatedRouterDeclared =
true;
357 if (!designatedRouterDeclared) {
358 declaredDesignatedRouterID = declaredBackupID;
359 declaredDesignatedRouterPriority = declaredBackupPriority;
360 designatedRouterDeclared =
true;
368 (currentDesignatedRouter == routerID) &&
369 (declaredDesignatedRouterID != routerID)
372 (currentDesignatedRouter != routerID) &&
373 (declaredDesignatedRouterID == routerID)
379 (currentBackupRouter == routerID) &&
380 (declaredBackupID != routerID)
383 (currentBackupRouter != routerID) &&
384 (declaredBackupID == routerID)
389 currentDesignatedRouter = declaredDesignatedRouterID;
390 currentBackupRouter = declaredBackupID;
396 }
while (repeatCount < 2);
398 Ipv4Address routersOldDesignatedRouterID = intf->getDesignatedID();
399 Ipv4Address routersOldBackupID = intf->getBackupID();
401 intf->setDesignatedID(declaredDesignatedRouterID);
402 EV_DEBUG <<
"declaredDesignatedRouterID = " << declaredDesignatedRouterID <<
"\n";
403 EV_DEBUG <<
"declaredBackupID = " << declaredBackupID <<
"\n";
404 for (
int g = 0;
g < intf->getNeighborCount();
g++) {
405 EV_DEBUG <<
"@" <<
g <<
" - " << intf->getNeighbor(
g)->getNeighborID() <<
" / " << intf->getNeighbor(
g)->getNeighborInterfaceID() <<
"\n";
408 Ospfv3Neighbor *DRneighbor = intf->getNeighborById(declaredDesignatedRouterID);
409 if (DRneighbor ==
nullptr) {
410 EV_DEBUG <<
"DRneighbor == nullptr\n";
411 intf->setDesignatedIntID(intf->getInterfaceId());
415 intf->setDesignatedIntID(DRneighbor->getNeighborInterfaceID());
417 intf->setBackupID(declaredBackupID);
419 bool wasBackupDesignatedRouter = (routersOldBackupID == routerID);
420 bool wasDesignatedRouter = (routersOldDesignatedRouterID == routerID);
422 bool wasWaiting = (!wasBackupDesignatedRouter && !wasDesignatedRouter && !wasOther);
423 bool isBackupDesignatedRouter = (declaredBackupID == routerID);
424 bool isDesignatedRouter = (declaredDesignatedRouterID == routerID);
425 bool isOther = (!isBackupDesignatedRouter && !isDesignatedRouter);
427 if (wasBackupDesignatedRouter) {
428 if (isDesignatedRouter) {
429 changeState(intf,
new Ospfv3InterfaceStateDr,
this);
432 changeState(intf,
new Ospfv3InterfaceStateDrOther,
this);
435 if (wasDesignatedRouter) {
436 if (isBackupDesignatedRouter) {
437 changeState(intf,
new Ospfv3InterfaceStateBackup,
this);
440 changeState(intf,
new Ospfv3InterfaceStateDrOther,
this);
442 if (isDesignatedRouter) {
443 changeState(intf,
new Ospfv3InterfaceStateDr,
this);
447 if (isDesignatedRouter) {
448 changeState(intf,
new Ospfv3InterfaceStateDr,
this);
450 if (isBackupDesignatedRouter) {
451 changeState(intf,
new Ospfv3InterfaceStateBackup,
this);
455 if (isDesignatedRouter) {
456 changeState(intf,
new Ospfv3InterfaceStateDr,
this);
458 if (isBackupDesignatedRouter) {
459 changeState(intf,
new Ospfv3InterfaceStateBackup,
this);
462 changeState(intf,
new Ospfv3InterfaceStateDrOther,
this);
466 for (i = 0; i < neighborCount; i++) {
468 ((!wasBackupDesignatedRouter && isBackupDesignatedRouter) ||
469 (!wasDesignatedRouter && isDesignatedRouter)))
471 if (intf->getNeighbor(i)->getNeighborPriority() == 0) {
475 if ((declaredDesignatedRouterID != routersOldDesignatedRouterID) ||
476 (declaredBackupID != routersOldBackupID))
484 if (intf->getDesignatedID() != intf->getArea()->getInstance()->getProcess()->getRouterID()) {
485 Ospfv3Neighbor *designated = intf->getNeighborById(intf->getDesignatedID());
486 if (designated !=
nullptr)
487 intf->setDesignatedIP(designated->getNeighborIP());
490 intf->setDesignatedIP(intf->getInterfaceLLIP());
492 if (intf->getBackupID() != intf->getArea()->getInstance()->getProcess()->getRouterID()) {
493 Ospfv3Neighbor *backup = intf->getNeighborById(intf->getBackupID());
494 if (backup !=
nullptr)
495 intf->setBackupIP(backup->getNeighborIP());
498 intf->setBackupIP(intf->getInterfaceLLIP());