diff --git a/src/main/java/net/floodlightcontroller/linkdiscovery/ILinkDiscovery.java b/src/main/java/net/floodlightcontroller/linkdiscovery/ILinkDiscovery.java index 1e24d804e612e416e11111bc42de9ef34518a88b..a7d996d022a0cbbd94f3ddfad3def876a2122568 100644 --- a/src/main/java/net/floodlightcontroller/linkdiscovery/ILinkDiscovery.java +++ b/src/main/java/net/floodlightcontroller/linkdiscovery/ILinkDiscovery.java @@ -177,4 +177,19 @@ public interface ILinkDiscovery { } } }; + + public enum LinkDirection { + UNIDIRECTIONAL { + @Override + public String toString() { + return "unidirectional"; + } + }, + BIDIRECTIONAL { + @Override + public String toString() { + return "bidirectional"; + } + } + } } diff --git a/src/main/java/net/floodlightcontroller/linkdiscovery/web/ExternalLinksResource.java b/src/main/java/net/floodlightcontroller/linkdiscovery/web/ExternalLinksResource.java index 1553a8cc393ee4d7996d4641c2e2d2f84ceaee43..69b39eeabe00ece4b95aff56abfaf1d500d8482f 100644 --- a/src/main/java/net/floodlightcontroller/linkdiscovery/web/ExternalLinksResource.java +++ b/src/main/java/net/floodlightcontroller/linkdiscovery/web/ExternalLinksResource.java @@ -21,6 +21,7 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; +import net.floodlightcontroller.linkdiscovery.ILinkDiscovery.LinkDirection; import net.floodlightcontroller.linkdiscovery.ILinkDiscovery.LinkType; import net.floodlightcontroller.linkdiscovery.ILinkDiscoveryService; import net.floodlightcontroller.linkdiscovery.LinkInfo; @@ -44,12 +45,38 @@ public class ExternalLinksResource extends ServerResource { LinkInfo info = links.get(link); LinkType type = ld.getLinkType(link, info); if (type == LinkType.MULTIHOP_LINK) { - LinkWithType lwt = new LinkWithType(link, - info.getSrcPortState(), - info.getDstPortState(), - type); + LinkWithType lwt; - returnLinkSet.add(lwt); + long src = link.getSrc(); + long dst = link.getDst(); + short srcPort = link.getSrcPort(); + short dstPort = link.getDstPort(); + Link otherLink = new Link(dst, dstPort, src, srcPort); + LinkInfo otherInfo = links.get(otherLink); + LinkType otherType = null; + if (otherInfo != null) + otherType = ld.getLinkType(otherLink, otherInfo); + if (otherType == LinkType.MULTIHOP_LINK) { + // This is a bi-direcitonal link. + // It is sufficient to add only one side of it. + if ((src < dst) || (src == dst && srcPort < dstPort)) { + lwt = new LinkWithType(link, + info.getSrcPortState(), + info.getDstPortState(), + type, + LinkDirection.BIDIRECTIONAL); + returnLinkSet.add(lwt); + } + } else { + // This is a unidirectional link. + lwt = new LinkWithType(link, + info.getSrcPortState(), + info.getDstPortState(), + type, + LinkDirection.UNIDIRECTIONAL); + returnLinkSet.add(lwt); + + } } } } diff --git a/src/main/java/net/floodlightcontroller/linkdiscovery/web/LinkWithType.java b/src/main/java/net/floodlightcontroller/linkdiscovery/web/LinkWithType.java index dc859d338371fc990794c424720e8a89c541495e..a09cc12ab01a8941d72fbfd8a86cbe0957cf2af8 100644 --- a/src/main/java/net/floodlightcontroller/linkdiscovery/web/LinkWithType.java +++ b/src/main/java/net/floodlightcontroller/linkdiscovery/web/LinkWithType.java @@ -25,6 +25,7 @@ import org.codehaus.jackson.map.SerializerProvider; import org.codehaus.jackson.map.annotate.JsonSerialize; import org.openflow.util.HexString; +import net.floodlightcontroller.linkdiscovery.ILinkDiscovery.LinkDirection; import net.floodlightcontroller.linkdiscovery.ILinkDiscovery.LinkType; import net.floodlightcontroller.routing.Link; @@ -42,14 +43,16 @@ public class LinkWithType extends JsonSerializer<LinkWithType> { public short dstPort; public int dstPortState; public LinkType type; + public LinkDirection direction; // Do NOT delete this, it's required for the serializer public LinkWithType() {} - + public LinkWithType(Link link, - int srcPortState, - int dstPortState, - LinkType type) { + int srcPortState, + int dstPortState, + LinkType type, + LinkDirection direction) { this.srcSwDpid = link.getSrc(); this.srcPort = link.getSrcPort(); this.srcPortState = srcPortState; @@ -57,25 +60,27 @@ public class LinkWithType extends JsonSerializer<LinkWithType> { this.dstPort = link.getDstPort(); this.dstPortState = dstPortState; this.type = type; + this.direction = direction; + } + + @Override + public void serialize(LinkWithType lwt, JsonGenerator jgen, SerializerProvider arg2) + throws IOException, JsonProcessingException { + // You ****MUST*** use lwt for the fields as it's actually a different object. + jgen.writeStartObject(); + jgen.writeStringField("src-switch", HexString.toHexString(lwt.srcSwDpid)); + jgen.writeNumberField("src-port", lwt.srcPort); + jgen.writeNumberField("src-port-state", lwt.srcPortState); + jgen.writeStringField("dst-switch", HexString.toHexString(lwt.dstSwDpid)); + jgen.writeNumberField("dst-port", lwt.dstPort); + jgen.writeNumberField("dst-port-state", lwt.dstPortState); + jgen.writeStringField("type", lwt.type.toString()); + jgen.writeStringField("direction", lwt.direction.toString()); + jgen.writeEndObject(); } - @Override - public void serialize(LinkWithType lwt, JsonGenerator jgen, SerializerProvider arg2) - throws IOException, JsonProcessingException { - // You ****MUST*** use lwt for the fields as it's actually a different object. - jgen.writeStartObject(); - jgen.writeStringField("src-switch", HexString.toHexString(lwt.srcSwDpid)); - jgen.writeNumberField("src-port", lwt.srcPort); - jgen.writeNumberField("src-port-state", lwt.srcPortState); - jgen.writeStringField("dst-switch", HexString.toHexString(lwt.dstSwDpid)); - jgen.writeNumberField("dst-port", lwt.dstPort); - jgen.writeNumberField("dst-port-state", lwt.dstPortState); - jgen.writeStringField("type", lwt.type.toString()); - jgen.writeEndObject(); - } - - @Override - public Class<LinkWithType> handledType() { - return LinkWithType.class; - } + @Override + public Class<LinkWithType> handledType() { + return LinkWithType.class; + } } \ No newline at end of file diff --git a/src/main/java/net/floodlightcontroller/linkdiscovery/web/LinksResource.java b/src/main/java/net/floodlightcontroller/linkdiscovery/web/LinksResource.java index 6f3f98d8a7b0b07aa53c1455cecc6d394e906d54..c8edf433321642b6e9ce7f654ee71e0fc223adaf 100644 --- a/src/main/java/net/floodlightcontroller/linkdiscovery/web/LinksResource.java +++ b/src/main/java/net/floodlightcontroller/linkdiscovery/web/LinksResource.java @@ -21,6 +21,7 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; +import net.floodlightcontroller.linkdiscovery.ILinkDiscovery.LinkDirection; import net.floodlightcontroller.linkdiscovery.ILinkDiscovery.LinkType; import net.floodlightcontroller.linkdiscovery.ILinkDiscoveryService; import net.floodlightcontroller.linkdiscovery.LinkInfo; @@ -43,13 +44,41 @@ public class LinksResource extends ServerResource { for (Link link: links.keySet()) { LinkInfo info = links.get(link); LinkType type = ld.getLinkType(link, info); - LinkWithType lwt = new LinkWithType(link, - info.getSrcPortState(), - info.getDstPortState(), - type); + if (type == LinkType.DIRECT_LINK || type == LinkType.TUNNEL) { + LinkWithType lwt; - if (type == LinkType.DIRECT_LINK || type == LinkType.TUNNEL) - returnLinkSet.add(lwt); + long src = link.getSrc(); + long dst = link.getDst(); + short srcPort = link.getSrcPort(); + short dstPort = link.getDstPort(); + Link otherLink = new Link(dst, dstPort, src, srcPort); + LinkInfo otherInfo = links.get(otherLink); + LinkType otherType = null; + if (otherInfo != null) + otherType = ld.getLinkType(otherLink, otherInfo); + if (otherType == LinkType.DIRECT_LINK || + otherType == LinkType.TUNNEL) { + // This is a bi-direcitonal link. + // It is sufficient to add only one side of it. + if ((src < dst) || (src == dst && srcPort < dstPort)) { + lwt = new LinkWithType(link, + info.getSrcPortState(), + info.getDstPortState(), + type, + LinkDirection.BIDIRECTIONAL); + returnLinkSet.add(lwt); + } + } else { + // This is a unidirectional link. + lwt = new LinkWithType(link, + info.getSrcPortState(), + info.getDstPortState(), + type, + LinkDirection.UNIDIRECTIONAL); + returnLinkSet.add(lwt); + + } + } } } return returnLinkSet;