blob: bc11c915497986cbf3001d6af3f8643910c664eb [file] [log] [blame]
/**
* Copyright 2011, Big Switch Networks, Inc.
* 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 net.onrc.onos.core.linkdiscovery;
import java.util.Set;
import net.onrc.onos.core.linkdiscovery.ILinkDiscoveryService.LinkType;
import org.projectfloodlight.openflow.protocol.OFPortState;
import com.google.common.primitives.Longs;
/**
* Records information about a link.
*/
public final class LinkInfo {
/**
* The port states stored here are topology's last knowledge of the state of
* the port. This mostly mirrors the state maintained in the port list in
* IOFSwitch (i.e. the one returned from getPort), except that during a port
* status message the IOFSwitch port state will already have been updated
* with the new port state, so topology needs to keep its own copy so that
* it can determine if the port state has changed and therefore requires the
* new state to be written to storage. Note the port state values are
* defined in the OF 1.0 spec. These will change in some way once we move to
* OF 1.3.
*/
private final Set<OFPortState> srcPortState;
private final Set<OFPortState> dstPortState;
private final long firstSeenTime;
private final long lastLldpReceivedTime;
/**
* Constructs a LinkInfo object.
*
* @param firstSeenTime the timestamp when the link was first seen
* @param lastLldpReceivedTime the timestamp when the link was last seen
* @param srcPortState the port state of the source port
* @param dstPortState the port state of the destination port
*/
public LinkInfo(long firstSeenTime,
long lastLldpReceivedTime,
Set<OFPortState> srcPortState,
Set<OFPortState> dstPortState) {
this.srcPortState = srcPortState;
this.dstPortState = dstPortState;
this.firstSeenTime = firstSeenTime;
this.lastLldpReceivedTime = lastLldpReceivedTime;
}
/**
* Gets the timestamp when the link was first seen.
*
* @return the first seen timestamp
*/
public long getFirstSeenTime() {
return firstSeenTime;
}
/**
* Gets the timestamp when the link was last seen.
*
* @return the last seen timestamp
*/
public long getLastProbeReceivedTime() {
return lastLldpReceivedTime;
}
/**
* Gets the state of the source port.
*
* @return the source port state, as defined in the OF1.0 spec
*/
public Set<OFPortState> getSrcPortState() {
return srcPortState;
}
public int getSrcPortStateInteger() {
return convertPortState(srcPortState);
}
/**
* Gets the state of the destination port.
*
* @return the destination port state, as defined in the OF1.0 spec
*/
public Set<OFPortState> getDstPortState() {
return dstPortState;
}
/**
* Gets the state of the destination port.
*
* @return the destination port state, as defined in the OF1.0 spec
*/
public int getDstPortStateInteger() {
return convertPortState(dstPortState);
}
private int convertPortState(Set<OFPortState> ps) {
int ret = 0;
if (ps.contains(OFPortState.LINK_DOWN)) {
ret = 1 << 0;
}
if (ps.contains(OFPortState.BLOCKED)) {
ret = ret | 1 << 1;
}
if (ps.contains(OFPortState.LIVE)) {
ret = ret | 1 << 2;
}
return ret;
}
/**
* Gets the link type.
*
* @return the link type
* @see LinkType
*/
public LinkType getLinkType() {
return LinkType.DIRECT_LINK;
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 5557;
int result = 1;
result = prime * result + Longs.hashCode(firstSeenTime);
result = prime * result + Longs.hashCode(lastLldpReceivedTime);
result = prime * result + convertPortState(srcPortState);
result = prime * result + convertPortState(dstPortState);
return result;
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof LinkInfo)) {
return false;
}
LinkInfo other = (LinkInfo) obj;
return firstSeenTime == other.firstSeenTime &&
lastLldpReceivedTime == other.lastLldpReceivedTime &&
srcPortState == other.srcPortState &&
dstPortState == other.dstPortState;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "LinkInfo [unicastValidTime=" + lastLldpReceivedTime
+ ", srcPortState=" + srcPortState
+ ", dstPortState=" + dstPortState
+ "]";
}
}