Details
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/BDINetRApp.java b/network-resilience/src/br/ufrgs/inf/bdinetr/BDINetRApp.java
index d9e3677..97aac4d 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/BDINetRApp.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/BDINetRApp.java
@@ -22,6 +22,7 @@
package br.ufrgs.inf.bdinetr;
import jade.BootProfileImpl;
+import jade.core.Agent;
import jade.core.ProfileImpl;
import jade.wrapper.AgentContainer;
import jade.wrapper.AgentController;
@@ -31,21 +32,13 @@ 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.agent.RouterAgent;
import br.ufrgs.inf.bdinetr.domain.IpAddress;
-import br.ufrgs.inf.bdinetr.domain.Link;
-import br.ufrgs.inf.bdinetr.domain.LinkMonitor;
-import br.ufrgs.inf.bdinetr.domain.Network;
-import br.ufrgs.inf.bdinetr.domain.PReSETRole;
import br.ufrgs.inf.bdinetr.domain.PReSETRouter;
/**
@@ -53,71 +46,29 @@ import br.ufrgs.inf.bdinetr.domain.PReSETRouter;
*/
public class BDINetRApp {
- class LinkUsageUpdater extends TimerTask {
- private static final double OVER_USAGE_PROBABILITY = 0.3;
-
- @Override
- public void run() {
- Map<Link, Boolean> overUsage = new HashMap<>();
- Random random = new Random(System.currentTimeMillis());
- for (Link link : NETWORK.getLinks()) {
- double d = random.nextDouble();
- overUsage.put(link, d < OVER_USAGE_PROBABILITY);
- }
- log.info("Updating link usage");
- for (PReSETRouter router : NETWORK.getRouters()) {
- if (router.hasRole(PReSETRole.LINK_MONITOR)) {
- LinkMonitor lm = (LinkMonitor) router
- .getRole(PReSETRole.LINK_MONITOR);
- for (Link link : overUsage.keySet()) {
- lm.setOverUsage(link, overUsage.get(link));
- }
- }
- }
- log.info("Restarting agents");
- for (AbstractBDIAgent agent : AGENTS.values()) {
- agent.restart();
- }
- }
- }
-
- private static final Map<IpAddress, AbstractBDIAgent> AGENTS;
-
- private static final Network NETWORK;
+ private static final Map<IpAddress, Agent> AGENTS;
static {
PropertyConfigurator.configure(BDINetRApp.class
.getResource("log4j.properties"));
- NETWORK = new Network();
- PReSETRouter firewall = new PReSETRouter(new IpAddress("Firewall 1"),
- PReSETRole.RATE_LIMITER.getId());
- NETWORK.addRouter(firewall);
- PReSETRouter linkMonitor = new PReSETRouter(new IpAddress(
- "Rate Limiter 1"), PReSETRole.LINK_MONITOR.getId());
- NETWORK.addRouter(linkMonitor);
-
- NETWORK.addLink(new Link("F1_RL1"));
-
AGENTS = new HashMap<>();
- AGENTS.put(firewall.getIp(), new BDINetRAgent(firewall));
- AGENTS.put(linkMonitor.getIp(), new BDINetRAgent(linkMonitor));
-
+ for (PReSETRouter router : Network.NETWORK.getRouters()) {
+ AGENTS.put(router.getIp(), new RouterAgent(router));
+ }
}
public static void main(String[] args) {
- new BDINetRApp().run();
+ new BDINetRApp();
+ Network.NETWORK.run();
}
private ProfileImpl bootProfile;
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");
@@ -143,13 +94,4 @@ public class BDINetRApp {
}
}
- /**
- * Creates and shows a GUI whose content pane is an
- * {@link BDI4JADEExamplesPanel}.
- */
- public void run() {
- int interval = 10 * 1000;
- this.timer.schedule(new LinkUsageUpdater(), interval, interval);
- }
-
}
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/AnomalyDetection.java b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/AnomalyDetection.java
index b5f5fcc..0fe161a 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/AnomalyDetection.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/AnomalyDetection.java
@@ -21,6 +21,9 @@
//----------------------------------------------------------------------------
package br.ufrgs.inf.bdinetr.domain;
+import java.util.HashSet;
+import java.util.Set;
+
/**
* ids
*
@@ -32,10 +35,15 @@ package br.ufrgs.inf.bdinetr.domain;
*
* @author Ingrid Nunes
*/
-public class AnomalyDetection extends AbstractPReSETRole {
+public class AnomalyDetection extends PReSETRole {
public AnomalyDetection(PReSETRouter router) {
super(router);
}
+ public Set<IpAddress> detectIntrusion(Link link) {
+ // FIXME
+ return new HashSet<>();
+ }
+
}
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Classifier.java b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Classifier.java
index 8a864ed..dfcd40b 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Classifier.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Classifier.java
@@ -21,7 +21,12 @@
//----------------------------------------------------------------------------
package br.ufrgs.inf.bdinetr.domain;
+import java.util.HashSet;
+import java.util.Set;
+
/**
+ * flowexporter addOperation: "victim:flow:idle:" remoteName: "setthreshold".
+ *
* event at:
*
* "classification" put: (factory/event create: #( "value_name" "value_source"
@@ -29,10 +34,19 @@ package br.ufrgs.inf.bdinetr.domain;
*
* @author Ingrid Nunes
*/
-public class Classifier extends AbstractPReSETRole {
+public class Classifier extends PReSETRole {
public Classifier(PReSETRouter router) {
super(router);
}
+ public Set<Flow> classifyFlows(IpAddress ip) {
+ // FIXME
+ return new HashSet<>();
+ }
+
+ public void turnFlowExporterOn() {
+
+ }
+
}
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Flow.java b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Flow.java
index ed7dcd0..f1fa114 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Flow.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Flow.java
@@ -26,27 +26,14 @@ package br.ufrgs.inf.bdinetr.domain;
*/
public class Flow {
- private static long id_counter = 0;
-
private IpAddress dstIp;
private int dstPort;
- private final Long id;
private String protocol;
private IpAddress srcIp;
private int srcPort;
public Flow(IpAddress srcIp, int srcPort, IpAddress dstIp, int dstPort,
String protocol) {
- this(++id_counter);
- }
-
- public Flow(Long id) {
- this.id = id;
- }
-
- public Flow(Long id, IpAddress srcIp, int srcPort, IpAddress dstIp,
- int dstPort, String protocol) {
- this.id = id;
this.srcIp = srcIp;
this.srcPort = srcPort;
this.dstIp = dstIp;
@@ -56,11 +43,33 @@ public class Flow {
@Override
public boolean equals(Object obj) {
- if (obj instanceof Flow) {
- Flow f = (Flow) obj;
- return this.id.equals(f.id);
- }
- return false;
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (!(obj instanceof Flow))
+ return false;
+ Flow other = (Flow) obj;
+ if (dstIp == null) {
+ if (other.dstIp != null)
+ return false;
+ } else if (!dstIp.equals(other.dstIp))
+ return false;
+ if (dstPort != other.dstPort)
+ return false;
+ if (protocol == null) {
+ if (other.protocol != null)
+ return false;
+ } else if (!protocol.equals(other.protocol))
+ return false;
+ if (srcIp == null) {
+ if (other.srcIp != null)
+ return false;
+ } else if (!srcIp.equals(other.srcIp))
+ return false;
+ if (srcPort != other.srcPort)
+ return false;
+ return true;
}
public IpAddress getDstIp() {
@@ -71,10 +80,6 @@ public class Flow {
return dstPort;
}
- public Long getId() {
- return id;
- }
-
public String getProtocol() {
return protocol;
}
@@ -89,7 +94,15 @@ public class Flow {
@Override
public int hashCode() {
- return id == null ? 0 : id.hashCode();
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((dstIp == null) ? 0 : dstIp.hashCode());
+ result = prime * result + dstPort;
+ result = prime * result
+ + ((protocol == null) ? 0 : protocol.hashCode());
+ result = prime * result + ((srcIp == null) ? 0 : srcIp.hashCode());
+ result = prime * result + srcPort;
+ return result;
}
public void setDstIp(IpAddress dstIp) {
@@ -114,7 +127,11 @@ public class Flow {
@Override
public String toString() {
- return id.toString();
+ StringBuffer sb = new StringBuffer();
+ sb.append("<src=").append(srcIp).append(":").append(srcPort);
+ sb.append(", dst=").append(dstIp).append(":").append(dstPort);
+ sb.append(", protocol=").append(protocol).append(">");
+ return sb.toString();
}
}
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/LinkMonitor.java b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/LinkMonitor.java
index ff2d55b..8332e45 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/LinkMonitor.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/LinkMonitor.java
@@ -22,25 +22,36 @@
package br.ufrgs.inf.bdinetr.domain;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Map;
+import java.util.Set;
/**
* event at:
*
* "load" put: (factory/event create: #( "value_name" "value_index" ));
*
- * --> value_name: ???
- * --> value_index: id do link
+ * --> value_name: ??? --> value_index: id do link
*
* @author Ingrid Nunes
*/
-public class LinkMonitor extends AbstractPReSETRole {
+public class LinkMonitor extends PReSETRole {
+ private final Set<Observer> observers;
private final Map<Link, Boolean> overUsageLinks;
public LinkMonitor(PReSETRouter router) {
super(router);
this.overUsageLinks = new HashMap<>();
+ this.observers = new HashSet<>();
+ }
+
+ public void attachObserver(Observer observer) {
+ this.observers.add(observer);
+ }
+
+ public Set<Link> getLinks() {
+ return overUsageLinks.keySet();
}
public boolean isOverUsage(Link link) {
@@ -50,8 +61,15 @@ public class LinkMonitor extends AbstractPReSETRole {
return overUsage;
}
+ private void notifyObservers(Object arg) {
+ for (Observer observer : observers) {
+ observer.update(this, arg);
+ }
+ }
+
public void setOverUsage(Link link, boolean overUsage) {
this.overUsageLinks.put(link, overUsage);
+ notifyObservers(link);
}
}
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Observer.java b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Observer.java
new file mode 100644
index 0000000..80b87a4
--- /dev/null
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Observer.java
@@ -0,0 +1,7 @@
+package br.ufrgs.inf.bdinetr.domain;
+
+public interface Observer {
+
+ public void update(Object o, Object arg);
+
+}
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/PReSETRole.java b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/PReSETRole.java
index 38674b2..6839503 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/PReSETRole.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/PReSETRole.java
@@ -24,23 +24,32 @@ package br.ufrgs.inf.bdinetr.domain;
/**
* @author Ingrid Nunes
*/
-public enum PReSETRole {
+public abstract class PReSETRole {
- ANOMALY_DETECTION(1), CLASSIFIER(2), FLOW_EXPORTER(4), LINK_MONITOR(8), RATE_LIMITER(
- 16);
+ public enum RoleType {
- private final int id;
+ ANOMALY_DETECTION(1), CLASSIFIER(2), LINK_MONITOR(4), RATE_LIMITER(8);
- private PReSETRole(int id) {
- this.id = id;
- }
+ private final int id;
+
+ private RoleType(int id) {
+ this.id = id;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public boolean isPresent(int roles) {
+ return (roles & id) != 0;
+ }
- public int getId() {
- return id;
}
- public boolean isPresent(int roles) {
- return (roles & id) != 0;
+ protected final PReSETRouter router;
+
+ public PReSETRole(PReSETRouter router) {
+ this.router = router;
}
}
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/PReSETRouter.java b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/PReSETRouter.java
index e1364cc..0ee6a16 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/PReSETRouter.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/PReSETRouter.java
@@ -24,28 +24,28 @@ package br.ufrgs.inf.bdinetr.domain;
import java.util.HashMap;
import java.util.Map;
+import br.ufrgs.inf.bdinetr.domain.PReSETRole.RoleType;
+
/**
* @author Ingrid Nunes
*/
public class PReSETRouter {
private final IpAddress ip;
- private final Map<PReSETRole, AbstractPReSETRole> roles;
+ private final Map<RoleType, PReSETRole> roles;
public PReSETRouter(final IpAddress id, int roles) {
this.ip = id;
this.roles = new HashMap<>();
- if (PReSETRole.LINK_MONITOR.isPresent(roles)) {
- this.roles.put(PReSETRole.LINK_MONITOR, new LinkMonitor(this));
- } else if (PReSETRole.ANOMALY_DETECTION.isPresent(roles)) {
- this.roles.put(PReSETRole.ANOMALY_DETECTION, new AnomalyDetection(
+ if (RoleType.LINK_MONITOR.isPresent(roles)) {
+ this.roles.put(RoleType.LINK_MONITOR, new LinkMonitor(this));
+ } else if (RoleType.ANOMALY_DETECTION.isPresent(roles)) {
+ this.roles.put(RoleType.ANOMALY_DETECTION, new AnomalyDetection(
this));
- } else if (PReSETRole.RATE_LIMITER.isPresent(roles)) {
- this.roles.put(PReSETRole.RATE_LIMITER, new RateLimiter(this));
- } else if (PReSETRole.FLOW_EXPORTER.isPresent(roles)) {
- this.roles.put(PReSETRole.FLOW_EXPORTER, new FlowExporter(this));
- } else if (PReSETRole.CLASSIFIER.isPresent(roles)) {
- this.roles.put(PReSETRole.CLASSIFIER, new Classifier(this));
+ } else if (RoleType.RATE_LIMITER.isPresent(roles)) {
+ this.roles.put(RoleType.RATE_LIMITER, new RateLimiter(this));
+ } else if (RoleType.CLASSIFIER.isPresent(roles)) {
+ this.roles.put(RoleType.CLASSIFIER, new Classifier(this));
}
}
@@ -62,7 +62,7 @@ public class PReSETRouter {
return ip;
}
- public AbstractPReSETRole getRole(PReSETRole role) {
+ public PReSETRole getRole(RoleType role) {
return roles.get(role);
}
@@ -71,7 +71,7 @@ public class PReSETRouter {
return ip == null ? 0 : ip.hashCode();
}
- public boolean hasRole(PReSETRole role) {
+ public boolean hasRole(RoleType role) {
return roles.containsKey(role);
}
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/RateLimiter.java b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/RateLimiter.java
index f3b60d4..3a989f6 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/RateLimiter.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/RateLimiter.java
@@ -36,7 +36,7 @@ import java.util.Map;
*
* @author Ingrid Nunes
*/
-public class RateLimiter extends AbstractPReSETRole {
+public class RateLimiter extends PReSETRole {
private final Map<Flow, Double> rateLimitedflows;
private final Map<IpAddress, Double> rateLimitedIps;