blob: 7a6dd27d8d3c14f99286afd3ea17299880c95b5c [file] [log] [blame]
package net.onrc.onos.apps.sdnip;
import java.net.InetAddress;
/**
* A {@link Path} represents paths within a network that forward traffic from
* ingress port to egress port. For every {@code next_hop} received in route
* updates from BGPd, we need to push forwarding paths from every other
* possible ingress port to the egress port connected to the {@code next_hop}.
* <p/>
* The {@link Path} object doesn't contain lists of hops along the path.
* Rather, it contains details about the egress {@link Interface} and
* {@code next_hop} IP address. Implicitly, it represents paths from every
* other ingress port to the {@code Interface}.
* <p/>
* Once flow mods are pushed to realize the path in the network, the
* {@link Path} object will contain a list of pushed flow mods. These are used
* if the path ever needs to be deleted.
* <p/>
* On startup, paths are pushed to all configured BGP peers, on the assumption
* that they're likely to advertise routes to us. These paths are permanent
* because the list of peers can't currently change at runtime. If we receive
* a route for a {@code next_hop} which is not a peer, a temporary path will
* be installed. These paths are temporary because they are removed if all
* routes that use them are removed.
* <p/>
* Finally, the {@link Path} object counts references of prefixes that make use
* of the path. If the reference count drops to zero as prefixes are deleted,
* the path is no longer useful and will be removed from the network.
*/
public class Path {
private final Interface dstInterface;
private final InetAddress dstIpAddress;
private int numUsers; // initialized to 0
// XXX PushedFlowMod has been removed
//private List<PushedFlowMod> flowMods; // initialized to null
private boolean permanent; // initialized to false
/**
* Class constructor, taking the destination {@link Interface} and
* destination IP address for the path.
*
* @param dstInterface the destination interface
* @param dstIpAddress the destination IP address
*/
public Path(Interface dstInterface, InetAddress dstIpAddress) {
this.dstInterface = dstInterface;
this.dstIpAddress = dstIpAddress;
}
/**
* Gets the destination {@link Interface} of the path.
*
* @return the destination interface
*/
public Interface getDstInterface() {
return dstInterface;
}
/**
* Gets the destination IP address.
*
* @return the destination IP address
*/
public InetAddress getDstIpAddress() {
return dstIpAddress;
}
/**
* Increments the count of prefixes that use this path.
*/
public void incrementUsers() {
numUsers++;
}
/**
* Decrements the count of prefixes that use this path.
*/
public void decrementUsers() {
numUsers--;
}
/**
* Gets the count of prefixes that use this path.
*
* @return the number of prefixes currently using the path
*/
public int getUsers() {
return numUsers;
}
/**
* Gets the list of flow mods that were installed to realize this path in
* the network.
*
* @return the list of {@link PushedFlowMod}s
*/
// XXX PushedFlowMod has been removed
/*public List<PushedFlowMod> getFlowMods() {
return Collections.unmodifiableList(flowMods);
}*/
/**
* Sets the list of flow mods that were installed to realize this path in
* the network.
*
* @param flowMods the list of {@link PushedFlowMod}s
*/
// XXX PushedFlowMod has been removed
/*public void setFlowMods(List<PushedFlowMod> flowMods) {
this.flowMods = flowMods;
}*/
/**
* Signifies whether the path is permanent and shouldn't be deleted when
* the number of users drops to zero.
*
* @return true if the path is permanent, false if not
*/
public boolean isPermanent() {
return permanent;
}
/**
* Set the permanent status of the path to true. Paths are not permanent
* by default when constructed, and this method can be used to designate
* them as permanent.
*/
public void setPermanent() {
permanent = true;
}
}