diff --git a/src/main/java/net/floodlightcontroller/routing/IRoutingService.java b/src/main/java/net/floodlightcontroller/routing/IRoutingService.java index fcd70ad8b132c2d3e899532862c5d65b2162f2b9..8fededaf783bbe34bb448b5aec3892ad080f430a 100644 --- a/src/main/java/net/floodlightcontroller/routing/IRoutingService.java +++ b/src/main/java/net/floodlightcontroller/routing/IRoutingService.java @@ -17,6 +17,8 @@ package net.floodlightcontroller.routing; +import java.util.ArrayList; + import net.floodlightcontroller.core.module.IFloodlightService; import net.floodlightcontroller.routing.Route; @@ -37,6 +39,9 @@ public interface IRoutingService extends IFloodlightService { long dstId, short dstPort, boolean tunnelEnabled); + /** return all routes, if available */ + public ArrayList<Route> getRoutes(long longSrcDpid, long longDstDpid, boolean tunnelEnabled); + /** Check if a route exists between src and dst, including tunnel links * in the path. */ @@ -46,4 +51,5 @@ public interface IRoutingService extends IFloodlightService { * or not have tunnels as part of the path. */ public boolean routeExists(long src, long dst, boolean tunnelEnabled); + } \ No newline at end of file diff --git a/src/main/java/net/floodlightcontroller/routing/Link.java b/src/main/java/net/floodlightcontroller/routing/Link.java index 79585969aadaebd238f268943f4d3f50367eef43..b79b9a9bc942aeb425a046f42aa790b0d29f011d 100755 --- a/src/main/java/net/floodlightcontroller/routing/Link.java +++ b/src/main/java/net/floodlightcontroller/routing/Link.java @@ -24,7 +24,7 @@ import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.map.annotate.JsonSerialize; import org.openflow.util.HexString; -public class Link { +public class Link implements Comparable<Link> { private long src; private short srcPort; private long dst; @@ -118,5 +118,20 @@ public class Link { HexString.toHexString(this.dst) + "|" + (this.dstPort & 0xffff) ); } + + @Override + public int compareTo(Link a) { + // compare link based on natural ordering - src id, src port, dst id, dst port + if (this.getSrc() != a.getSrc()) + return (int) (this.getSrc() - a.getSrc()); + + if (this.getSrcPort() != a.getSrcPort()) + return (int) (this.getSrc() - a.getSrc()); + + if (this.getDst() != a.getDst()) + return (int) (this.getDst() - a.getDst()); + + return (int) (this.getDstPort() - a.getDstPort()); + } } diff --git a/src/main/java/net/floodlightcontroller/routing/Route.java b/src/main/java/net/floodlightcontroller/routing/Route.java index 211a924f7d5e912753882e88d5d54ae70009bca0..da00d50b7b82a3d3498b1523543a8558abbd579a 100755 --- a/src/main/java/net/floodlightcontroller/routing/Route.java +++ b/src/main/java/net/floodlightcontroller/routing/Route.java @@ -30,17 +30,20 @@ import net.floodlightcontroller.topology.NodePortTuple; public class Route implements Comparable<Route> { protected RouteId id; protected List<NodePortTuple> switchPorts; + protected int routeCount; public Route(RouteId id, List<NodePortTuple> switchPorts) { super(); this.id = id; this.switchPorts = switchPorts; + this.routeCount = 0; // useful if multipath routing available } public Route(Long src, Long dst) { super(); this.id = new RouteId(src, dst); this.switchPorts = new ArrayList<NodePortTuple>(); + this.routeCount = 0; } /** @@ -71,6 +74,20 @@ public class Route implements Comparable<Route> { this.switchPorts = switchPorts; } + /** + * @param routeCount routeCount set by (ECMP) buildRoute method + */ + public void setRouteCount(int routeCount) { + this.routeCount = routeCount; + } + + /** + * @return routeCount return routeCount set by (ECMP) buildRoute method + */ + public int getRouteCount() { + return routeCount; + } + @Override public int hashCode() { final int prime = 5791; diff --git a/src/main/java/net/floodlightcontroller/routing/RouteId.java b/src/main/java/net/floodlightcontroller/routing/RouteId.java index a55096163d3dfd11e89a80a9ef935e9f624d8e93..511db735969aa849d619783cdd88229d1922b27a 100755 --- a/src/main/java/net/floodlightcontroller/routing/RouteId.java +++ b/src/main/java/net/floodlightcontroller/routing/RouteId.java @@ -27,11 +27,20 @@ import org.openflow.util.HexString; public class RouteId implements Cloneable, Comparable<RouteId> { protected Long src; protected Long dst; + protected long cookie; public RouteId(Long src, Long dst) { super(); this.src = src; this.dst = dst; + this.cookie = 0; + } + + public RouteId(Long src, Long dst, long cookie) { + super(); + this.src = src; + this.dst = dst; + this.cookie = cookie; } public Long getSrc() { @@ -50,13 +59,24 @@ public class RouteId implements Cloneable, Comparable<RouteId> { this.dst = dst; } + public long getCookie() { + return cookie; + } + + public void setCookie(int cookie) { + this.cookie = cookie; + } + @Override public int hashCode() { final int prime = 2417; - int result = 1; + Long result = new Long(1); result = prime * result + ((dst == null) ? 0 : dst.hashCode()); result = prime * result + ((src == null) ? 0 : src.hashCode()); - return result; + result = prime * result + cookie; + // To cope with long cookie, use Long to compute hash then use Long's + // built-in hash to produce int hash code + return result.hashCode(); } @Override diff --git a/src/main/java/net/floodlightcontroller/topology/TopologyInstance.java b/src/main/java/net/floodlightcontroller/topology/TopologyInstance.java index 7fea75b348d6362c3968c71f78bb1ba0abd8d3c9..6204d3e448beb61b5a12c99c3ec26e8d9b108bec 100644 --- a/src/main/java/net/floodlightcontroller/topology/TopologyInstance.java +++ b/src/main/java/net/floodlightcontroller/topology/TopologyInstance.java @@ -421,7 +421,7 @@ public class TopologyInstance { return broadcastDomainPorts.contains(npt); } - class NodeDist implements Comparable<NodeDist> { + protected class NodeDist implements Comparable<NodeDist> { private Long node; public Long getNode() { return node; diff --git a/src/main/java/net/floodlightcontroller/topology/TopologyManager.java b/src/main/java/net/floodlightcontroller/topology/TopologyManager.java index 0d2e974428b619c092fd6b81739dc827da0e6ae6..cf936198eada7fcc97ca66db6024a3079291cc51 100644 --- a/src/main/java/net/floodlightcontroller/topology/TopologyManager.java +++ b/src/main/java/net/floodlightcontroller/topology/TopologyManager.java @@ -529,7 +529,7 @@ public class TopologyManager implements TopologyInstance ti = getCurrentInstance(tunnelEnabled); return ti.getRoute(src, srcPort, dst, dstPort); } - + @Override public boolean routeExists(long src, long dst) { return routeExists(src, dst, true); @@ -1263,4 +1263,15 @@ public class TopologyManager implements ports.addAll(ofpList); return ports; } + + @Override + public ArrayList<Route> getRoutes(long srcDpid, long dstDpid, + boolean tunnelEnabled) { + // Floodlight supports single path routing now + + // return single path now + ArrayList<Route> result=new ArrayList<Route>(); + result.add(getRoute(srcDpid, dstDpid, tunnelEnabled)); + return result; + } }