|
|
| 464 |
return degree; |
464 |
return degree; |
| 465 |
} |
465 |
} |
| 466 |
|
466 |
|
|
|
467 |
namespace { |
| 468 |
/// |
| 469 |
/// \brief Remove all covered 2-hop neighbors from N2 set. This is a helper function used by MprComputation algorithm. |
| 470 |
/// |
| 471 |
void |
| 472 |
CoverTwoHopNeighbors (Ipv4Address neighborMainAddr, TwoHopNeighborSet & N2) |
| 473 |
{ |
| 474 |
// first gather all 2-hop neighbors to be removed |
| 475 |
std::set<Ipv4Address> toRemove; |
| 476 |
for (TwoHopNeighborSet::iterator twoHopNeigh = N2.begin (); twoHopNeigh != N2.end (); twoHopNeigh ++) |
| 477 |
{ |
| 478 |
if (twoHopNeigh->neighborMainAddr == neighborMainAddr) |
| 479 |
{ |
| 480 |
toRemove.insert (twoHopNeigh->twoHopNeighborAddr); |
| 481 |
} |
| 482 |
} |
| 483 |
// Now remove all matching records from N2 |
| 484 |
for (TwoHopNeighborSet::iterator twoHopNeigh = N2.begin (); twoHopNeigh != N2.end (); ) |
| 485 |
{ |
| 486 |
if (toRemove.find (twoHopNeigh->twoHopNeighborAddr) != toRemove.end ()) |
| 487 |
{ |
| 488 |
twoHopNeigh = N2.erase (twoHopNeigh); |
| 489 |
} |
| 490 |
else |
| 491 |
{ |
| 492 |
twoHopNeigh ++; |
| 493 |
} |
| 494 |
} |
| 495 |
} |
| 496 |
} // anonymous namespace |
| 497 |
|
| 467 |
/// |
498 |
/// |
| 468 |
/// \brief Computates MPR set of a node following RFC 3626 hints. |
499 |
/// \brief Computates MPR set of a node following RFC 3626 hints. |
| 469 |
/// |
500 |
/// |
|
|
| 577 |
mprSet.insert (neighbor->neighborMainAddr); |
608 |
mprSet.insert (neighbor->neighborMainAddr); |
| 578 |
// (not in RFC but I think is needed: remove the 2-hop |
609 |
// (not in RFC but I think is needed: remove the 2-hop |
| 579 |
// neighbors reachable by the MPR from N2) |
610 |
// neighbors reachable by the MPR from N2) |
| 580 |
for (TwoHopNeighborSet::iterator twoHopNeigh = N2.begin (); |
611 |
CoverTwoHopNeighbors (neighbor->neighborMainAddr, N2); |
| 581 |
twoHopNeigh != N2.end (); ) |
|
|
| 582 |
{ |
| 583 |
if (twoHopNeigh->neighborMainAddr == neighbor->neighborMainAddr) |
| 584 |
{ |
| 585 |
twoHopNeigh = N2.erase (twoHopNeigh); |
| 586 |
} |
| 587 |
else |
| 588 |
{ |
| 589 |
twoHopNeigh++; |
| 590 |
} |
| 591 |
} |
| 592 |
} |
612 |
} |
| 593 |
} |
613 |
} |
| 594 |
|
614 |
|
|
|
| 637 |
{ |
657 |
{ |
| 638 |
if (coveredTwoHopNeighbors.find (twoHopNeigh->twoHopNeighborAddr) != coveredTwoHopNeighbors.end ()) |
658 |
if (coveredTwoHopNeighbors.find (twoHopNeigh->twoHopNeighborAddr) != coveredTwoHopNeighbors.end ()) |
| 639 |
{ |
659 |
{ |
|
|
660 |
// This works correctly only because it is known that twoHopNeigh is reachable by exactly one neighbor, |
| 661 |
// so only one record in N2 exists for each of them. This record is erased here. |
| 640 |
NS_LOG_LOGIC ("2-hop neigh. " << twoHopNeigh->twoHopNeighborAddr << " is already covered by an MPR."); |
662 |
NS_LOG_LOGIC ("2-hop neigh. " << twoHopNeigh->twoHopNeighborAddr << " is already covered by an MPR."); |
| 641 |
twoHopNeigh = N2.erase (twoHopNeigh); |
663 |
twoHopNeigh = N2.erase (twoHopNeigh); |
| 642 |
} |
664 |
} |
|
|
| 742 |
if (max != NULL) |
764 |
if (max != NULL) |
| 743 |
{ |
765 |
{ |
| 744 |
mprSet.insert (max->neighborMainAddr); |
766 |
mprSet.insert (max->neighborMainAddr); |
| 745 |
// Remove the nodes from N2 which are now covered by a node in the MPR set. |
767 |
CoverTwoHopNeighbors (max->neighborMainAddr, N2); |
| 746 |
for (TwoHopNeighborSet::iterator twoHopNeigh = N2.begin (); twoHopNeigh != N2.end (); ) |
768 |
NS_LOG_LOGIC (N2.size () << " 2-hop neighbors left to cover!"); |
| 747 |
{ |
|
|
| 748 |
if (coveredTwoHopNeighbors.find (twoHopNeigh->twoHopNeighborAddr) != coveredTwoHopNeighbors.end ()) |
| 749 |
{ |
| 750 |
NS_LOG_LOGIC ("2-hop neigh. " << twoHopNeigh->twoHopNeighborAddr << " is already covered by an MPR."); |
| 751 |
twoHopNeigh = N2.erase (twoHopNeigh); |
| 752 |
} |
| 753 |
else |
| 754 |
{ |
| 755 |
twoHopNeigh++; |
| 756 |
} |
| 757 |
} |
| 758 |
} |
769 |
} |
| 759 |
} |
770 |
} |
| 760 |
|
771 |
|