diff -r eadb84419eb8 src/routing/olsr/olsr-routing-protocol.cc --- a/src/routing/olsr/olsr-routing-protocol.cc Wed Nov 11 15:35:03 2009 +0300 +++ b/src/routing/olsr/olsr-routing-protocol.cc Thu Nov 12 18:34:53 2009 +0300 @@ -716,6 +718,10 @@ if (max == NULL || nb_tuple->willingness > max->willingness) { max = nb_tuple; + for (TwoHopNeighborSet::iterator newCovered = N2.begin (); newCovered != N2.end (); newCovered++) + { + coveredTwoHopNeighbors.insert (newCovered->twoHopNeighborAddr); + } max_r = r; } else if (nb_tuple->willingness == max->willingness) @@ -740,11 +746,12 @@ if (max != NULL) { mprSet.insert (max->neighborMainAddr); - for (TwoHopNeighborSet::iterator twoHopNeigh = N2.begin (); - twoHopNeigh != N2.end (); ) + // Remove the nodes from N2 which are now covered by a node in the MPR set. + for (TwoHopNeighborSet::iterator twoHopNeigh = N2.begin (); twoHopNeigh != N2.end (); ) { - if (twoHopNeigh->neighborMainAddr == max->neighborMainAddr) + if (coveredTwoHopNeighbors.find (twoHopNeigh->twoHopNeighborAddr) != coveredTwoHopNeighbors.end ()) { + NS_LOG_LOGIC ("2-hop neigh. " << twoHopNeigh->twoHopNeighborAddr << " is already covered by an MPR."); twoHopNeigh = N2.erase (twoHopNeigh); } else