From: Richard Whitehouse Date: Sat, 16 Apr 2011 16:53:05 +0000 (+0100) Subject: STP doesn't do a minimum spanning tree, so nor should we. X-Git-Url: https://git.richardwhiuk.com/?a=commitdiff_plain;h=28e5b51afebbbe9207c8e66574813f47be57e058;p=ns-moose.git STP doesn't do a minimum spanning tree, so nor should we. --- diff --git a/src/helper/link-layer-helper.cc b/src/helper/link-layer-helper.cc index c0b6385..a75dcb3 100644 --- a/src/helper/link-layer-helper.cc +++ b/src/helper/link-layer-helper.cc @@ -19,13 +19,13 @@ */ #include -#include #include "link-layer-helper.h" #include "ns3/moose-prefix-address.h" #include "ns3/log.h" #include #include +#include NS_LOG_COMPONENT_DEFINE ("LinkLayerHelper"); @@ -215,29 +215,65 @@ LinkLayerHelper::Network LinkLayerHelper::Create(Topology& t){ } else { if(routing){ - // Kruskall's - Give all links the same weight for now. + // STP doesn't do a Minimum Spanning Tree, it does a minimum tree based on the root node. - const long num_nodes = t.bridges; - - std::vector tree; + // Since all links are 1, we can do this in a very simple manner - std::vector weights(t.bridgeLinks.size(), 1); + // We assume a connected network - possibly incorrectly. - graph_t g(t.bridgeLinks.begin(), t.bridgeLinks.end(), weights.begin(), num_nodes); + Topology::BridgeLinks links(t.bridgeLinks); + std::map > spanning; - kruskal_minimum_spanning_tree(g,std::back_inserter(tree)); + std::queue toCheck; // Nodes to check + std::map inTree; // In the tree? - std::map > spanning; - - for(long i = 0; i < t.bridges; ++i){ - for(long j = 0; i < t.bridges; ++i){ + for(unsigned long i = 0; i < t.bridges; ++i){ + inTree[i] = false; + for(unsigned long j = 0; j < t.bridges; ++j){ spanning[i][j] = false; } } - for(std::vector::iterator it = tree.begin(); it != tree.end(); ++it){ - spanning[source(*it,g)][target(*it,g)] = true; - spanning[target(*it,g)][source(*it,g)] = true; + bool finished = false; + + unsigned long node = 1; + unsigned long number = 1; + + while(!finished){ + Topology::BridgeLinks::iterator it = links.begin(); + while(it != t.bridgeLinks.end()){ + if(it->first == node){ + if(!inTree[it->second]){ + spanning[node][it->second] = true; + spanning[it->second][node] = true; + toCheck.push(it->second); + number++; + } + Topology::BridgeLinks::iterator er = it; + ++it; + links.erase(it); + } else if(it->second == node){ + if(!inTree[it->first]){ + spanning[node][it->first] = true; + spanning[it->first][node] = true; + toCheck.push(it->first); + number ++; + } + Topology::BridgeLinks::iterator er = it; + ++it; + links.erase(it); + } else { + ++it; + } + } + if(number == t.bridges){ + finished = true; + } else if(toCheck.size() == 0){ + finished = true; + } else { + node = toCheck.front(); + toCheck.pop(); + } } // Disable the other ports not included.