From: Richard Whitehouse Date: Sun, 20 Feb 2011 07:06:57 +0000 (+0000) Subject: Add static spanning tree algorithm to eliminate loops X-Git-Url: https://git.richardwhiuk.com/?a=commitdiff_plain;h=031206385acc5e53abb05740a795dc45c3794167;p=ns-moose.git Add static spanning tree algorithm to eliminate loops --- diff --git a/code/src/helper/moose-helper.cc b/code/src/helper/moose-helper.cc index f7efa8d..499da03 100644 --- a/code/src/helper/moose-helper.cc +++ b/code/src/helper/moose-helper.cc @@ -19,10 +19,14 @@ */ #include +#include #include "moose-helper.h" #include "ns3/moose-prefix-address.h" #include "ns3/log.h" +#include +#include + NS_LOG_COMPONENT_DEFINE ("MooseHelper"); namespace ns3 { @@ -191,7 +195,7 @@ void MooseHelper::Create(MooseHelper::Network& n){ } } else { - + // Realtime routing for(long i = 0; i < n.t.bridges; i ++){ @@ -200,9 +204,62 @@ void MooseHelper::Create(MooseHelper::Network& n){ } } } else { - for(long i = 0; i < n.t.bridges; i ++){ - Ptr bridgeNode = n.bridges.Get(i); - ethernetHelper.Install(bridgeNode, n.bridgeDevices[i]); + if(routing){ + + // Kruskall's - Give all links the same weight for now. + + const long num_nodes = n.t.bridges; + + std::vector tree; + + std::vector weights(n.t.bridgeLinks.size(), 1); + + graph_t g(n.t.bridgeLinks.begin(), n.t.bridgeLinks.end(), weights.begin(), num_nodes); + boost::property_map::type weightmap = get(boost::edge_weight, g); + + kruskal_minimum_spanning_tree(g,std::back_inserter(tree)); + + std::map > spanning; + + for(long i = 0; i < n.t.bridges; ++i){ + for(long j = 0; i < n.t.bridges; ++i){ + 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; + } + + // Disable the other ports not included. + + // bridge[0] has link to bridge[1] on port x => portMap[0][1] = x + + // Question: is bridge[0][1] in spanning tree? -> i.e. is there some x, for which tree[x] = <0,1> + + for(long i = 0; i < n.t.bridges; i ++){ + + std::map, bool> portsEnabled; + + for(std::map >::iterator it = portMap[i].begin(); it != portMap[i].end(); it ++){ + portsEnabled[it->second] = spanning[i][it->first]; + } + + + Ptr bridgeNode = n.bridges.Get(i); + ethernetHelper.Install(bridgeNode, n.bridgeDevices[i], portsEnabled); + } + + + } else { + // Requires STP implementation + + for(long i = 0; i < n.t.bridges; i ++){ + + Ptr bridgeNode = n.bridges.Get(i); + ethernetHelper.Install(bridgeNode, n.bridgeDevices[i]); + } } }