diff --git a/src/main/java/net/floodlightcontroller/routing/Link.java b/src/main/java/net/floodlightcontroller/routing/Link.java index edba4639bd338a457b0c853452798c89a124afb2..f944acf28c8ef3bb9387172b32286d41fa506515 100755 --- a/src/main/java/net/floodlightcontroller/routing/Link.java +++ b/src/main/java/net/floodlightcontroller/routing/Link.java @@ -17,6 +17,10 @@ package net.floodlightcontroller.routing; +import net.floodlightcontroller.core.web.serializers.DPIDSerializer; + +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonSerialize; import org.openflow.util.HexString; public class Link { @@ -32,17 +36,24 @@ public class Link { this.dstPort = dstPort; } + + @JsonProperty("src-switch") + @JsonSerialize(using=DPIDSerializer.class) public long getSrc() { return src; } + @JsonProperty("src-port") public short getSrcPort() { return srcPort; } + @JsonProperty("dst-switch") + @JsonSerialize(using=DPIDSerializer.class) public long getDst() { return dst; } + @JsonProperty("dst-port") public short getDstPort() { return dstPort; } diff --git a/src/main/java/net/floodlightcontroller/topology/TopologyInstance.java b/src/main/java/net/floodlightcontroller/topology/TopologyInstance.java index a106bdccb1a45e6927f80b5282aaa5c9b27a9434..90e520c6c69573f1fe4fa36fdf09e1b98a18acda 100644 --- a/src/main/java/net/floodlightcontroller/topology/TopologyInstance.java +++ b/src/main/java/net/floodlightcontroller/topology/TopologyInstance.java @@ -63,7 +63,22 @@ public class TopologyInstance { this.blockedPorts = new HashSet<NodePortTuple>(); this.blockedLinks = new HashSet<Link>(); } - + + public TopologyInstance(Map<Long, Set<Short>> switchPorts, + Map<NodePortTuple, Set<Link>> switchPortLinks) + { + this.switches = new HashSet<Long>(switchPorts.keySet()); + this.switchPorts = new HashMap<Long, Set<Short>>(switchPorts); + this.switchPortLinks = new HashMap<NodePortTuple, + Set<Link>>(switchPortLinks); + this.broadcastDomainPorts = new HashSet<NodePortTuple>(); + this.tunnelPorts = new HashSet<NodePortTuple>(); + this.blockedPorts = new HashSet<NodePortTuple>(); + this.blockedLinks = new HashSet<Link>(); + + clusters = new HashSet<Cluster>(); + switchClusterMap = new HashMap<Long, Cluster>(); + } public TopologyInstance(Map<Long, Set<Short>> switchPorts, Set<NodePortTuple> blockedPorts, Map<NodePortTuple, Set<Link>> switchPortLinks, @@ -409,7 +424,9 @@ public class TopologyInstance { } } - protected BroadcastTree dijkstra(Cluster c, Long dst, Map<Link, Integer> linkCost) { + protected BroadcastTree dijkstra(Cluster c, Long root, + Map<Link, Integer> linkCost, + boolean isDstRooted) { HashMap<Long, Link> nexthoplinks = new HashMap<Long, Link>(); //HashMap<Long, Long> nexthopnodes = new HashMap<Long, Long>(); HashMap<Long, Integer> cost = new HashMap<Long, Integer>(); @@ -423,8 +440,8 @@ public class TopologyInstance { HashMap<Long, Boolean> seen = new HashMap<Long, Boolean>(); PriorityQueue<NodeDist> nodeq = new PriorityQueue<NodeDist>(); - nodeq.add(new NodeDist(dst, 0)); - cost.put(dst, 0); + nodeq.add(new NodeDist(root, 0)); + cost.put(root, 0); while (nodeq.peek() != null) { NodeDist n = nodeq.poll(); Long cnode = n.getNode(); @@ -434,7 +451,14 @@ public class TopologyInstance { seen.put(cnode, true); for (Link link: c.links.get(cnode)) { - Long neighbor = link.getSrc(); + Long neighbor; + + if (isDstRooted == true) neighbor = link.getSrc(); + else neighbor = link.getDst(); + + // links directed toward cnode will result in this condition + // if (neighbor == cnode) continue; + if (linkCost == null || linkCost.get(link)==null) w = 1; else w = linkCost.get(link); @@ -469,7 +493,7 @@ public class TopologyInstance { for(Cluster c: clusters) { for (Long node : c.links.keySet()) { - BroadcastTree tree = dijkstra(c, node, linkCost); + BroadcastTree tree = dijkstra(c, node, linkCost, true); destinationRootedTrees.put(node, tree); } }