Details
diff --git a/network-resiliense/src/br/ufrgs/inf/bdinetr/BDINetRApp.java b/network-resiliense/src/br/ufrgs/inf/bdinetr/BDINetRApp.java
index 606a1b2..ca08a1b 100644
--- a/network-resiliense/src/br/ufrgs/inf/bdinetr/BDINetRApp.java
+++ b/network-resiliense/src/br/ufrgs/inf/bdinetr/BDINetRApp.java
@@ -31,12 +31,16 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Random;
+import java.util.Timer;
+import java.util.TimerTask;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.PropertyConfigurator;
import bdi4jade.core.AbstractBDIAgent;
+import bdi4jade.examples.BDI4JADEExamplesPanel;
import br.ufrgs.inf.bdinetr.capability.LinkMonitorCapability;
import br.ufrgs.inf.bdinetr.capability.RateLimiterCapability;
import br.ufrgs.inf.bdinetr.domain.Device;
@@ -48,7 +52,23 @@ import br.ufrgs.inf.bdinetr.domain.Network;
*/
public class BDINetRApp {
+ class LinkUsageUpdater extends TimerTask {
+ @Override
+ public void run() {
+ Random random = new Random(System.currentTimeMillis());
+ log.info("Updating link usage");
+ for (Link link : NETWORK.getLinks()) {
+ link.setUsedBandwidth(random.nextDouble() * link.getBandwidth());
+ }
+ log.info("Restarting agents");
+ for (AbstractBDIAgent agent : AGENTS.values()) {
+ agent.restart();
+ }
+ }
+ }
+
private static final Map<String, AbstractBDIAgent> AGENTS;
+
private static final Network NETWORK;
static {
@@ -96,8 +116,11 @@ public class BDINetRApp {
private final Log log;
private jade.core.Runtime runtime;
+ private Timer timer;
+
public BDINetRApp() {
this.log = LogFactory.getLog(this.getClass());
+ this.timer = new Timer();
List<String> params = new ArrayList<String>();
params.add("-gui");
@@ -127,7 +150,8 @@ public class BDINetRApp {
* {@link BDI4JADEExamplesPanel}.
*/
public void run() {
-
+ int interval = 10 * 1000;
+ this.timer.schedule(new LinkUsageUpdater(), interval, interval);
}
}
diff --git a/network-resiliense/src/br/ufrgs/inf/bdinetr/capability/AnomalyDetectionCapability.java b/network-resiliense/src/br/ufrgs/inf/bdinetr/capability/AnomalyDetectionCapability.java
index e03f228..ac3d5c3 100644
--- a/network-resiliense/src/br/ufrgs/inf/bdinetr/capability/AnomalyDetectionCapability.java
+++ b/network-resiliense/src/br/ufrgs/inf/bdinetr/capability/AnomalyDetectionCapability.java
@@ -21,13 +21,79 @@
//----------------------------------------------------------------------------
package br.ufrgs.inf.bdinetr.capability;
+import java.util.Set;
+
+import bdi4jade.belief.Belief;
+import bdi4jade.belief.PropositionalBelief;
import bdi4jade.core.Capability;
+import bdi4jade.core.GoalUpdateSet;
+import bdi4jade.goal.BeliefGoal;
+import bdi4jade.goal.PropositionalBeliefValueGoal;
+import bdi4jade.reasoning.AbstractReasoningStrategy;
+import bdi4jade.reasoning.OptionGenerationFunction;
+import br.ufrgs.inf.bdinetr.domain.IpPreposition.Anomalous;
+import br.ufrgs.inf.bdinetr.domain.IpPreposition.Benign;
+import br.ufrgs.inf.bdinetr.domain.IpPreposition.Restricted;
/**
* @author Ingrid Nunes
*/
public class AnomalyDetectionCapability extends Capability {
+ private class ReasoningStrategy extends AbstractReasoningStrategy implements
+ OptionGenerationFunction {
+ @Override
+ public void generateGoals(GoalUpdateSet goalUpdateSet) {
+ Set<Belief<?, ?>> anomalousIpBeliefs = getBeliefBase()
+ .getBeliefsByType(Anomalous.class);
+ for (Belief<?, ?> belief : anomalousIpBeliefs) {
+ PropositionalBelief<Anomalous> anomalous = (PropositionalBelief<Anomalous>) belief;
+ if (anomalous.getValue()) {
+ getMyAgent()
+ .addGoal(
+ AnomalyDetectionCapability.this,
+ new PropositionalBeliefValueGoal<Restricted>(
+ new Restricted(anomalous.getName()
+ .getIp()), Boolean.TRUE));
+ log.debug("goal(restricted(" + anomalous.getName().getIp()
+ + "))");
+ getMyAgent().addGoal(
+ AnomalyDetectionCapability.this,
+ new BeliefGoal<Benign>(new Benign(anomalous
+ .getName().getIp())));
+ log.debug("goal(?benign(" + anomalous.getName().getIp()
+ + "))");
+ }
+ }
+
+ Set<Belief<?, ?>> restrictedBeliefs = getBeliefBase()
+ .getBeliefsByType(Restricted.class);
+ for (Belief<?, ?> belief : restrictedBeliefs) {
+ PropositionalBelief<Restricted> restricted = (PropositionalBelief<Restricted>) belief;
+ if (restricted.getValue()) {
+ PropositionalBelief<Anomalous> anomalous = (PropositionalBelief<Anomalous>) getBeliefBase()
+ .getBelief(
+ new Anomalous(restricted.getName().getIp()));
+ if (anomalous != null && !anomalous.getValue()) {
+ getMyAgent().addGoal(
+ AnomalyDetectionCapability.this,
+ new PropositionalBeliefValueGoal<Restricted>(
+ new Restricted(restricted.getName()
+ .getIp()), Boolean.FALSE));
+ log.debug("goal(not restricted("
+ + restricted.getName().getIp() + "))");
+ }
+
+ }
+ }
+ }
+ }
+
private static final long serialVersionUID = -1705728861020677126L;
+ public AnomalyDetectionCapability() {
+ ReasoningStrategy strategy = new ReasoningStrategy();
+ setOptionGenerationFunction(strategy);
+ }
+
}
diff --git a/network-resiliense/src/br/ufrgs/inf/bdinetr/capability/ClassifierCapability.java b/network-resiliense/src/br/ufrgs/inf/bdinetr/capability/ClassifierCapability.java
index 2e36300..150bef6 100644
--- a/network-resiliense/src/br/ufrgs/inf/bdinetr/capability/ClassifierCapability.java
+++ b/network-resiliense/src/br/ufrgs/inf/bdinetr/capability/ClassifierCapability.java
@@ -21,13 +21,49 @@
//----------------------------------------------------------------------------
package br.ufrgs.inf.bdinetr.capability;
+import java.util.Set;
+
+import bdi4jade.belief.Belief;
+import bdi4jade.belief.PropositionalBelief;
import bdi4jade.core.Capability;
+import bdi4jade.core.GoalUpdateSet;
+import bdi4jade.goal.PropositionalBeliefValueGoal;
+import bdi4jade.reasoning.AbstractReasoningStrategy;
+import bdi4jade.reasoning.OptionGenerationFunction;
+import br.ufrgs.inf.bdinetr.domain.FlowPreposition.Threat;
+import br.ufrgs.inf.bdinetr.domain.FlowPreposition.ThreatResponded;
/**
* @author Ingrid Nunes
*/
public class ClassifierCapability extends Capability {
+ private class ReasoningStrategy extends AbstractReasoningStrategy implements
+ OptionGenerationFunction {
+ @Override
+ public void generateGoals(GoalUpdateSet goalUpdateSet) {
+ Set<Belief<?, ?>> threatBeliefs = getBeliefBase().getBeliefsByType(
+ Threat.class);
+ for (Belief<?, ?> belief : threatBeliefs) {
+ PropositionalBelief<Threat> threat = (PropositionalBelief<Threat>) belief;
+ if (threat.getValue()) {
+ getMyAgent().addGoal(
+ ClassifierCapability.this,
+ new PropositionalBeliefValueGoal<ThreatResponded>(
+ new ThreatResponded(threat.getName()
+ .getFlow()), Boolean.TRUE));
+ log.debug("goal(threatResponded("
+ + threat.getName().getFlow() + "))");
+ }
+ }
+ }
+ }
+
private static final long serialVersionUID = -1705728861020677126L;
+ public ClassifierCapability() {
+ ReasoningStrategy strategy = new ReasoningStrategy();
+ setOptionGenerationFunction(strategy);
+ }
+
}
diff --git a/network-resiliense/src/br/ufrgs/inf/bdinetr/capability/LinkMonitorCapability.java b/network-resiliense/src/br/ufrgs/inf/bdinetr/capability/LinkMonitorCapability.java
index b7fb6a0..7370a56 100644
--- a/network-resiliense/src/br/ufrgs/inf/bdinetr/capability/LinkMonitorCapability.java
+++ b/network-resiliense/src/br/ufrgs/inf/bdinetr/capability/LinkMonitorCapability.java
@@ -38,6 +38,7 @@ import br.ufrgs.inf.bdinetr.BDINetRAgent.RootCapability;
import br.ufrgs.inf.bdinetr.domain.Device;
import br.ufrgs.inf.bdinetr.domain.Link;
import br.ufrgs.inf.bdinetr.domain.LinkProposition.AttackPrevented;
+import br.ufrgs.inf.bdinetr.domain.LinkProposition.FullyOperational;
import br.ufrgs.inf.bdinetr.domain.LinkProposition.OverUsage;
import br.ufrgs.inf.bdinetr.domain.LinkProposition.RegularUsage;
import br.ufrgs.inf.bdinetr.domain.LinkProposition.Usage;
@@ -67,10 +68,36 @@ public class LinkMonitorCapability extends Capability {
LinkMonitorCapability.this,
new BeliefGoal<RegularUsage>(new RegularUsage(
overUsage.getName().getLink())));
- log.debug("goal(regularUsage("
+ log.debug("goal(?regularUsage("
+ overUsage.getName().getLink() + "))");
}
}
+
+ Set<Belief<?, ?>> fullyOperationalBeliefs = getBeliefBase()
+ .getBeliefsByType(FullyOperational.class);
+ for (Belief<?, ?> belief : fullyOperationalBeliefs) {
+ PropositionalBelief<FullyOperational> fullyOperational = (PropositionalBelief<FullyOperational>) belief;
+ if (!fullyOperational.getValue()) {
+ PropositionalBelief<RegularUsage> regularUsage = (PropositionalBelief<RegularUsage>) getBeliefBase()
+ .getBelief(
+ new RegularUsage(fullyOperational.getName()
+ .getLink()));
+ if (regularUsage != null && regularUsage.getValue()) {
+ getMyAgent()
+ .addGoal(
+ LinkMonitorCapability.this,
+ new PropositionalBeliefValueGoal<FullyOperational>(
+ new FullyOperational(
+ fullyOperational
+ .getName()
+ .getLink()),
+ Boolean.TRUE));
+ log.debug("goal(fullyOperational("
+ + fullyOperational.getName().getLink() + "))");
+ }
+
+ }
+ }
}
@Override
@@ -79,8 +106,9 @@ public class LinkMonitorCapability extends Capability {
.getBeliefsByType(Usage.class);
for (Belief<?, ?> belief : linkUsageBeliefs) {
Belief<Usage, Double> linkUsage = (Belief<Usage, Double>) belief;
- double percentageUsed = linkUsage.getValue()
- / linkUsage.getName().getLink().getCapacity();
+ double percentageUsed = linkUsage.getName().getLink()
+ .getUsedBandwidthPercentage();
+ linkUsage.setValue(percentageUsed);
if (percentageUsed > overUsageThreshold.getValue()) {
getBeliefBase()
.addOrUpdateBelief(
@@ -126,7 +154,8 @@ public class LinkMonitorCapability extends Capability {
.getBelief(RootCapability.DEVICE_BELIEF);
for (Link link : device.getValue().getConnectedLinks()) {
getBeliefBase().addBelief(
- new TransientBelief<Usage, Double>(new Usage(link), 0.0));
+ new TransientBelief<Usage, Double>(new Usage(link), link
+ .getUsedBandwidthPercentage()));
}
}
diff --git a/network-resiliense/src/br/ufrgs/inf/bdinetr/domain/Link.java b/network-resiliense/src/br/ufrgs/inf/bdinetr/domain/Link.java
index 191fd13..b1807f6 100644
--- a/network-resiliense/src/br/ufrgs/inf/bdinetr/domain/Link.java
+++ b/network-resiliense/src/br/ufrgs/inf/bdinetr/domain/Link.java
@@ -26,18 +26,20 @@ package br.ufrgs.inf.bdinetr.domain;
*/
public class Link {
- private Double capacity;
+ private Double bandwidth;
private final String id;
private Device source;
private Device target;
+ private Double usedBandwidth;
public Link(String id) {
this.id = id;
}
- public Link(String id, Double capacity, Device source, Device target) {
+ public Link(String id, Double bandwidth, Device source, Device target) {
this(id);
- this.capacity = capacity;
+ this.bandwidth = bandwidth;
+ this.usedBandwidth = 0.0;
setSource(source);
setTarget(target);
}
@@ -51,8 +53,8 @@ public class Link {
return false;
}
- public Double getCapacity() {
- return capacity;
+ public Double getBandwidth() {
+ return bandwidth;
}
public Device getSource() {
@@ -63,13 +65,21 @@ public class Link {
return target;
}
+ public Double getUsedBandwidth() {
+ return usedBandwidth;
+ }
+
+ public Double getUsedBandwidthPercentage() {
+ return usedBandwidth / bandwidth;
+ }
+
@Override
public int hashCode() {
return id == null ? 0 : id.hashCode();
}
- public void setCapacity(Double capacity) {
- this.capacity = capacity;
+ public void setBandwidth(Double bandwidth) {
+ this.bandwidth = bandwidth;
}
public void setSource(Device source) {
@@ -88,6 +98,10 @@ public class Link {
this.target.connectLink(this);
}
+ public void setUsedBandwidth(Double usedBandwidth) {
+ this.usedBandwidth = usedBandwidth;
+ }
+
@Override
public String toString() {
return id;
diff --git a/network-resiliense/src/br/ufrgs/inf/bdinetr/domain/LinkProposition.java b/network-resiliense/src/br/ufrgs/inf/bdinetr/domain/LinkProposition.java
index e0bea91..ce4bc3f 100644
--- a/network-resiliense/src/br/ufrgs/inf/bdinetr/domain/LinkProposition.java
+++ b/network-resiliense/src/br/ufrgs/inf/bdinetr/domain/LinkProposition.java
@@ -32,6 +32,12 @@ public class LinkProposition {
}
}
+ public static class FullyOperational extends LinkProposition {
+ public FullyOperational(Link link) {
+ super(link);
+ }
+ }
+
public static class OverUsage extends LinkProposition {
public OverUsage(Link link) {
super(link);