/* * Copyright (c) 2011,2013 Big Switch Networks, Inc. * * Licensed under the Eclipse Public License, Version 1.0 (the * "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.eclipse.org/legal/epl-v10.html * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or * implied. See the License for the specific language governing * permissions and limitations under the License. * * This file incorporates work covered by the following copyright and * permission notice: * * Originally created by David Erickson, Stanford University * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an "AS * IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language * governing permissions and limitations under the License. */ package org.sdnplatform.routing; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.map.annotate.JsonSerialize; import org.openflow.util.HexString; import org.sdnplatform.core.web.serializers.DPIDSerializer; import org.sdnplatform.core.web.serializers.UShortSerializer; public class Link implements Comparable<Link> { private long src; private short srcPort; private long dst; private short dstPort; public Link(long srcId, short srcPort, long dstId, short dstPort) { this.src = srcId; this.srcPort = srcPort; this.dst = dstId; this.dstPort = dstPort; } // Convenience method public Link(long srcId, int srcPort, long dstId, int dstPort) { this.src = srcId; this.srcPort = (short) srcPort; this.dst = dstId; this.dstPort = (short) dstPort; } @JsonProperty("src-switch") @JsonSerialize(using=DPIDSerializer.class) public long getSrc() { return src; } @JsonProperty("src-port") @JsonSerialize(using=UShortSerializer.class) public short getSrcPort() { return srcPort; } @JsonProperty("dst-switch") @JsonSerialize(using=DPIDSerializer.class) public long getDst() { return dst; } @JsonProperty("dst-port") @JsonSerialize(using=UShortSerializer.class) public short getDstPort() { return dstPort; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + (int) (dst ^ (dst >>> 32)); result = prime * result + dstPort; result = prime * result + (int) (src ^ (src >>> 32)); result = prime * result + srcPort; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Link other = (Link) obj; if (dst != other.dst) return false; if (dstPort != other.dstPort) return false; if (src != other.src) return false; if (srcPort != other.srcPort) return false; return true; } @Override public String toString() { return "Link [src=" + HexString.toHexString(this.src) + " outPort=" + (srcPort & 0xffff) + ", dst=" + HexString.toHexString(this.dst) + ", inPort=" + (dstPort & 0xffff) + "]"; } public String toKeyString() { return (HexString.toHexString(this.src) + "|" + (this.srcPort & 0xffff) + "|" + 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()); } }