/** * 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 + "]"; } }