Commit c0e2cc2b authored by Björn Richerzhagen's avatar Björn Richerzhagen
Browse files

TopologyView: Drop and Latency

Added support for dynamic links (property updates on range changes based
on the topology view)
First step towards integrating measurement maps into the simulator
parent 8e408fbf
......@@ -20,15 +20,17 @@
package de.tud.kom.p2psim.api.topology.views;
import de.tud.kom.p2psim.api.linklayer.mac.Link;
import de.tud.kom.p2psim.api.linklayer.mac.MacAddress;
import de.tud.kom.p2psim.api.linklayer.mac.MacLayer;
/**
* Determines the probability of a packet drop on a link.
*
* @author Bjoern Richerzhagen
* @version 1.0, 24.07.2012
*/
public interface DropRateDeterminator {
public interface DropProbabilityDeterminator {
/**
* Called for each host that is added to the TopologyView
......@@ -38,7 +40,7 @@ public interface DropRateDeterminator {
public void onMacAdded(MacLayer mac, TopologyView viewParent);
/**
* Return the drop-rate between 0.0 and 1.0
* Return the drop-probability between 0.0 and 1.0
*
* @param view
* This object can be used to access advanced information such as
......@@ -46,9 +48,12 @@ public interface DropRateDeterminator {
* implementing a cache to speed up the calculations.
* @param source
* @param destination
* @param link
* in case a link object already exists (and should be updated),
* it is passed. Otherwise: null.
* @return
*/
public double getDropRate(TopologyView view, MacAddress source,
MacAddress destination);
public double getDropProbability(TopologyView view, MacAddress source,
MacAddress destination, Link link);
}
......@@ -20,6 +20,7 @@
package de.tud.kom.p2psim.api.topology.views;
import de.tud.kom.p2psim.api.linklayer.mac.Link;
import de.tud.kom.p2psim.api.linklayer.mac.MacAddress;
import de.tud.kom.p2psim.api.linklayer.mac.MacLayer;
......@@ -51,9 +52,12 @@ public interface LatencyDeterminator {
* implementing a cache to speed up the calculations.
* @param source
* @param destination
* @param link
* in case a link object already exists (and should be updated),
* it is passed. Otherwise: null.
* @return
*/
public long getLatency(TopologyView view, MacAddress source,
MacAddress destination);
MacAddress destination, Link link);
}
......@@ -29,6 +29,7 @@ import java.util.Map.Entry;
import de.tud.kom.p2psim.api.common.Position;
import de.tud.kom.p2psim.api.linklayer.LinkLayer;
import de.tud.kom.p2psim.api.linklayer.mac.Link;
import de.tud.kom.p2psim.api.linklayer.mac.MacAddress;
import de.tud.kom.p2psim.api.linklayer.mac.MacLayer;
import de.tud.kom.p2psim.api.linklayer.mac.PhyType;
......@@ -36,7 +37,7 @@ import de.tud.kom.p2psim.api.network.BandwidthImpl;
import de.tud.kom.p2psim.api.scenario.ConfigurationException;
import de.tud.kom.p2psim.api.topology.TopologyComponent;
import de.tud.kom.p2psim.api.topology.movement.MovementSupported;
import de.tud.kom.p2psim.api.topology.views.DropRateDeterminator;
import de.tud.kom.p2psim.api.topology.views.DropProbabilityDeterminator;
import de.tud.kom.p2psim.api.topology.views.LatencyDeterminator;
import de.tud.kom.p2psim.api.topology.views.TopologyView;
import de.tud.kom.p2psim.impl.topology.PositionVector;
......@@ -65,7 +66,7 @@ public abstract class AbstractTopologyView<L extends DefaultLink> implements
/**
* An object that provides the drop rates for a link.
*/
private DropRateDeterminator dropRateDeterminator;
private DropProbabilityDeterminator dropProbabilityDeterminator;
/**
* All registered MACs
......@@ -169,8 +170,8 @@ public abstract class AbstractTopologyView<L extends DefaultLink> implements
*
* @param dropRateDeterminator
*/
public void setDropRate(DropRateDeterminator dropRateDeterminator) {
this.dropRateDeterminator = dropRateDeterminator;
public void setDropRate(DropProbabilityDeterminator dropRateDeterminator) {
this.dropProbabilityDeterminator = dropRateDeterminator;
}
/**
......@@ -191,7 +192,7 @@ public abstract class AbstractTopologyView<L extends DefaultLink> implements
@Override
public long getLatency(TopologyView view, MacAddress source,
MacAddress destination) {
MacAddress destination, Link link) {
return getPhyType().getDefaultLatency();
}
};
......@@ -199,6 +200,32 @@ public abstract class AbstractTopologyView<L extends DefaultLink> implements
return latencyDeterminator;
}
/**
* Access the {@link LatencyDeterminator} of this View. If no
* {@link LatencyDeterminator} is configured, this will return the latency
* of the PHY.
*
* @return
*/
protected DropProbabilityDeterminator getDropProbabilityDeterminator() {
if (dropProbabilityDeterminator == null) {
dropProbabilityDeterminator = new DropProbabilityDeterminator() {
@Override
public void onMacAdded(MacLayer mac, TopologyView viewParent) {
//
}
@Override
public double getDropProbability(TopologyView view,
MacAddress source, MacAddress destination, Link link) {
return getPhyType().getDefaultDropProbability();
}
};
}
return dropProbabilityDeterminator;
}
/**
* Default Bandwidth determination for a link: the minimum of the sources
* uplink and the destinations downlink.
......@@ -225,7 +252,8 @@ public abstract class AbstractTopologyView<L extends DefaultLink> implements
*/
protected long determineLinkLatency(MacAddress source,
MacAddress destination) {
return getLatencyDeterminator().getLatency(this, source, destination);
return getLatencyDeterminator().getLatency(this, source, destination,
null);
}
/**
......@@ -237,7 +265,8 @@ public abstract class AbstractTopologyView<L extends DefaultLink> implements
*/
protected double determineLinkDropProbability(MacAddress source,
MacAddress destination) {
return dropRateDeterminator.getDropRate(this, source, destination);
return dropProbabilityDeterminator.getDropProbability(this, source,
destination, null);
}
@Override
......@@ -267,39 +296,8 @@ public abstract class AbstractTopologyView<L extends DefaultLink> implements
}
positions.put(mac.getMacAddress(), comp.getHost()
.getTopologyComponent().getRealPosition());
if (latencyDeterminator == null) {
latencyDeterminator = new LatencyDeterminator() {
@Override
public void onMacAdded(MacLayer mac, TopologyView viewParent) {
// nothing to do here
}
@Override
public long getLatency(TopologyView view,
MacAddress source, MacAddress destination) {
return getPhyType().getDefaultLatency();
}
};
}
latencyDeterminator.onMacAdded(mac, this);
if (dropRateDeterminator == null) {
dropRateDeterminator = new DropRateDeterminator() {
@Override
public void onMacAdded(MacLayer mac, TopologyView viewParent) {
//
}
@Override
public double getDropRate(TopologyView view,
MacAddress source, MacAddress destination) {
return view.getPhyType().getDefaultDropProbability();
}
};
}
dropRateDeterminator.onMacAdded(mac, this);
getLatencyDeterminator().onMacAdded(mac, this);
getDropProbabilityDeterminator().onMacAdded(mac, this);
}
}
......
......@@ -38,13 +38,13 @@ public class DefaultLink implements Link {
private MacAddress destination;
private double dropProb;
protected double dropProb;
private long bandwidth;
protected long bandwidth;
private long latency;
protected long latency;
private int mtu;
protected int mtu;
private boolean isConnected = true;
......@@ -152,4 +152,23 @@ public class DefaultLink implements Link {
isOutdated = outdated;
}
/**
* Enables a topology view to update the link latency, e.g., based on the
* node distance
*
* @param latency
*/
public void updateLatency(long latency) {
this.latency = latency;
}
/**
* Update the probability of a packet drop on this link
*
* @param dropProb
*/
public void updateDropProbability(double dropProb) {
this.dropProb = dropProb;
}
}
......@@ -74,6 +74,12 @@ public class RangedLink extends DefaultLink {
return currentDistance;
}
/**
* Update the distance between source and destination after movement
* occurred.
*
* @param distance
*/
public void updateNodeDistance(double distance) {
this.currentDistance = distance;
setConnected(distance < maxDistance);
......
......@@ -218,11 +218,13 @@ public class RangedTopologyView extends AbstractTopologyView<RangedLink> {
/*
* mark all links as outdated
*/
for (RangedLink link : linkList) {
link.setOutdated(true);
}
for (Dijkstra dijkstra : dijkstras.values()) {
dijkstra.afterComponentsMoved();
synchronized (linkList) {
for (RangedLink link : linkList) {
link.setOutdated(true);
}
for (Dijkstra dijkstra : dijkstras.values()) {
dijkstra.afterComponentsMoved();
}
}
}
......@@ -230,6 +232,20 @@ public class RangedTopologyView extends AbstractTopologyView<RangedLink> {
protected void updateOutdatedLink(RangedLink link) {
link.updateNodeDistance(getCachedPosition(link.getSource())
.getDistance(getCachedPosition(link.getDestination())));
/*
* Update latency and drop rate - note: it depends on the actual
* implementation of the determinators, whether the value is actually
* changed.
*/
if (link.isConnected()) {
link.updateLatency(getLatencyDeterminator().getLatency(this,
link.getSource(), link.getDestination(), link));
link.updateDropProbability(
getDropProbabilityDeterminator().getDropProbability(this,
link.getSource(), link.getDestination(), link));
}
/*
* The distance has already been updated, we just have to check for
* obstacles. More advanced Views might update the properties based on
......
......@@ -66,6 +66,7 @@ import de.tud.kom.p2psim.api.topology.obstacles.ObstacleModel;
import de.tud.kom.p2psim.api.topology.views.TopologyView;
import de.tud.kom.p2psim.api.topology.waypoints.WaypointModel;
import de.tud.kom.p2psim.impl.topology.PositionVector;
import de.tud.kom.p2psim.impl.topology.Topology;
import de.tud.kom.p2psim.impl.topology.views.visualization.ComponentVisManager;
import de.tud.kom.p2psim.impl.topology.views.visualization.ComponentVisManager.VisInfo;
import de.tud.kom.p2psim.impl.topology.views.visualization.ui.ComponentToggler;
......@@ -78,7 +79,6 @@ import de.tud.kom.p2psim.impl.topology.views.visualization.world.TopologyCompone
import de.tud.kom.p2psim.impl.topology.views.visualization.world.WeakWaypointComponentVis;
import de.tud.kom.p2psim.impl.util.NotSupportedException;
import de.tudarmstadt.maki.simonstrator.api.common.graph.INodeID;
import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
/**
* A very basic visualization of a Topology (ie. positioning and movement), just
......@@ -125,10 +125,9 @@ public class VisualizationTopologyView extends JFrame implements TopologyView,
/**
*
*/
@XMLConfigurableConstructor({ "worldX", "worldY" })
public VisualizationTopologyView(int worldX, int worldY) {
WORLD_X = worldX;
WORLD_Y = worldY;
public VisualizationTopologyView() {
WORLD_X = (int) Topology.getWorldDimension().getX();
WORLD_Y = (int) Topology.getWorldDimension().getY();
worldPanel = new WorldPanel();
visManager = new ComponentVisManager(worldPanel);
......
......@@ -23,9 +23,10 @@ package de.tud.kom.p2psim.impl.topology.views.droprate;
import java.util.LinkedHashMap;
import java.util.Map;
import de.tud.kom.p2psim.api.linklayer.mac.Link;
import de.tud.kom.p2psim.api.linklayer.mac.MacAddress;
import de.tud.kom.p2psim.api.linklayer.mac.MacLayer;
import de.tud.kom.p2psim.api.topology.views.DropRateDeterminator;
import de.tud.kom.p2psim.api.topology.views.DropProbabilityDeterminator;
import de.tud.kom.p2psim.api.topology.views.TopologyView;
import de.tud.kom.p2psim.impl.network.modular.db.NetMeasurementDB;
import de.tud.kom.p2psim.impl.network.modular.db.NetMeasurementDB.SummaryRelation;
......@@ -38,7 +39,7 @@ import de.tud.kom.p2psim.impl.topology.TopologyFactory;
* @author Bjoern Richerzhagen
* @version 1.0, 24.07.2012
*/
public class PingERDropRate implements DropRateDeterminator {
public class PingERDropRate implements DropProbabilityDeterminator {
private final Map<MacAddress, NetMeasurementDB.Host> hostMetas = new LinkedHashMap<MacAddress, NetMeasurementDB.Host>();
......@@ -52,8 +53,13 @@ public class PingERDropRate implements DropRateDeterminator {
}
@Override
public double getDropRate(TopologyView view, MacAddress source,
MacAddress destination) {
public double getDropProbability(TopologyView view, MacAddress source,
MacAddress destination, Link link) {
if (link != null) {
// No dynamic updates.
return link.getDropProbability();
}
SummaryRelation sumRel = TopologyFactory.getMeasurementDB()
.getMostAccurateSummaryRelation(hostMetas.get(source),
......
......@@ -20,9 +20,10 @@
package de.tud.kom.p2psim.impl.topology.views.droprate;
import de.tud.kom.p2psim.api.linklayer.mac.Link;
import de.tud.kom.p2psim.api.linklayer.mac.MacAddress;
import de.tud.kom.p2psim.api.linklayer.mac.MacLayer;
import de.tud.kom.p2psim.api.topology.views.DropRateDeterminator;
import de.tud.kom.p2psim.api.topology.views.DropProbabilityDeterminator;
import de.tud.kom.p2psim.api.topology.views.TopologyView;
import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
......@@ -32,7 +33,7 @@ import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
* @author Bjoern Richerzhagen
* @version 1.0, 24.07.2012
*/
public class StaticDropRate implements DropRateDeterminator {
public class StaticDropRate implements DropProbabilityDeterminator {
private double dropRate;
......@@ -47,8 +48,8 @@ public class StaticDropRate implements DropRateDeterminator {
}
@Override
public double getDropRate(TopologyView view, MacAddress source,
MacAddress destination) {
public double getDropProbability(TopologyView view, MacAddress source,
MacAddress destination, Link link) {
return dropRate;
}
......
......@@ -20,11 +20,13 @@
package de.tud.kom.p2psim.impl.topology.views.latency;
import de.tud.kom.p2psim.api.linklayer.mac.Link;
import de.tud.kom.p2psim.api.linklayer.mac.MacAddress;
import de.tud.kom.p2psim.api.linklayer.mac.MacLayer;
import de.tud.kom.p2psim.api.topology.views.LatencyDeterminator;
import de.tud.kom.p2psim.api.topology.views.TopologyView;
import de.tud.kom.p2psim.impl.topology.views.AbstractTopologyView;
import de.tud.kom.p2psim.impl.topology.views.RangedLink;
import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
/**
......@@ -66,10 +68,16 @@ public class ConstantSpeedPropagationLatency implements LatencyDeterminator {
@Override
public long getLatency(TopologyView view, MacAddress source,
MacAddress destination) {
AbstractTopologyView<?> abstractView = (AbstractTopologyView<?>) view;
double distance = abstractView.getPosition(source).getDistance(
abstractView.getPosition(destination));
MacAddress destination, Link link) {
double distance = -1;
if (link != null && link instanceof RangedLink) {
distance = ((RangedLink) link).getNodeDistance();
}
if (distance == -1) {
AbstractTopologyView<?> abstractView = (AbstractTopologyView<?>) view;
distance = abstractView.getPosition(source)
.distanceTo(abstractView.getPosition(destination));
}
double time = distance / speed;
return Math.round(time);
}
......
......@@ -20,11 +20,13 @@
package de.tud.kom.p2psim.impl.topology.views.latency;
import de.tud.kom.p2psim.api.linklayer.mac.Link;
import de.tud.kom.p2psim.api.linklayer.mac.MacAddress;
import de.tud.kom.p2psim.api.linklayer.mac.MacLayer;
import de.tud.kom.p2psim.api.topology.views.LatencyDeterminator;
import de.tud.kom.p2psim.api.topology.views.TopologyView;
import de.tud.kom.p2psim.impl.topology.views.AbstractTopologyView;
import de.tud.kom.p2psim.impl.topology.views.RangedLink;
import de.tudarmstadt.maki.simonstrator.api.Time;
/**
......@@ -54,10 +56,16 @@ public class DistanceBasedLatency implements LatencyDeterminator {
@Override
public long getLatency(TopologyView view, MacAddress source,
MacAddress destination) {
AbstractTopologyView<?> abstractView = (AbstractTopologyView<?>) view;
double distance = abstractView.getPosition(source).getDistance(
abstractView.getPosition(destination));
MacAddress destination, Link link) {
double distance = -1;
if (link != null && link instanceof RangedLink) {
distance = ((RangedLink) link).getNodeDistance();
}
if (distance == -1) {
AbstractTopologyView<?> abstractView = (AbstractTopologyView<?>) view;
distance = abstractView.getPosition(source)
.distanceTo(abstractView.getPosition(destination));
}
return baseLatency + (long) ((distance / 1000) * latencyPerKilometer);
}
......
......@@ -24,6 +24,7 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import de.tud.kom.p2psim.api.linklayer.mac.Link;
import de.tud.kom.p2psim.api.linklayer.mac.MacAddress;
import de.tud.kom.p2psim.api.linklayer.mac.MacLayer;
import de.tud.kom.p2psim.api.topology.views.LatencyDeterminator;
......@@ -51,7 +52,11 @@ public class GNPLatency implements LatencyDeterminator {
@Override
public long getLatency(TopologyView view, MacAddress source,
MacAddress destination) {
MacAddress destination, Link link) {
if (link != null) {
return link.getLatency();
}
List<Double> sndCoords = hostMetas.get(source).getCoordinates();
List<Double> rcvCoords = hostMetas.get(destination).getCoordinates();
......
......@@ -23,6 +23,7 @@ package de.tud.kom.p2psim.impl.topology.views.latency;
import java.util.LinkedHashMap;
import java.util.Map;
import de.tud.kom.p2psim.api.linklayer.mac.Link;
import de.tud.kom.p2psim.api.linklayer.mac.MacAddress;
import de.tud.kom.p2psim.api.linklayer.mac.MacLayer;
import de.tud.kom.p2psim.api.topology.views.LatencyDeterminator;
......@@ -53,7 +54,11 @@ public class PingERLatency implements LatencyDeterminator {
@Override
public long getLatency(TopologyView view, MacAddress source,
MacAddress destination) {
MacAddress destination, Link link) {
if (link != null) {
return link.getLatency();
}
SummaryRelation rel = TopologyFactory.getMeasurementDB()
.getMostAccurateSummaryRelation(hostMetas.get(source),
......
......@@ -22,6 +22,7 @@ package de.tud.kom.p2psim.impl.topology.views.latency;
import java.util.Random;
import de.tud.kom.p2psim.api.linklayer.mac.Link;
import de.tud.kom.p2psim.api.linklayer.mac.MacAddress;
import de.tud.kom.p2psim.api.linklayer.mac.MacLayer;
import de.tud.kom.p2psim.api.topology.views.LatencyDeterminator;
......@@ -65,7 +66,10 @@ public class StaticLatency implements LatencyDeterminator {
@Override
public long getLatency(TopologyView view, MacAddress source,
MacAddress destination) {
MacAddress destination, Link link) {
if (link != null) {
return link.getLatency();
}
if (doubleVariance == 0) {
return staticLatency;
} else {
......
......@@ -20,6 +20,7 @@
package de.tud.kom.p2psim.impl.topology.views.latency;
import de.tud.kom.p2psim.api.linklayer.mac.Link;
import de.tud.kom.p2psim.api.linklayer.mac.MacAddress;
import de.tud.kom.p2psim.api.linklayer.mac.MacLayer;
import de.tud.kom.p2psim.api.topology.views.LatencyDeterminator;
......@@ -35,7 +36,7 @@ public class ZeroLatency implements LatencyDeterminator {
@Override
public long getLatency(TopologyView view, MacAddress source,
MacAddress destination) {
MacAddress destination, Link link) {
return 0;
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment