bdi-network-resilience

Added flow exporter.

9/12/2014 12:25:58 PM

Details

diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/agent/AnomalyDetectionCapability.java b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/AnomalyDetectionCapability.java
index 3c6066d..61384ba 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/agent/AnomalyDetectionCapability.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/AnomalyDetectionCapability.java
@@ -112,7 +112,7 @@ public class AnomalyDetectionCapability extends RouterAgentCapability implements
 
 	@Override
 	public void generateGoals(GoalUpdateSet goalUpdateSet) {
-		// Anomalous(ip) AND not Restricted(ip) --> goal(Restricted(ip)) AND goal(belief(Anomalous(ip))
+		// Anomalous(ip) AND not Restricted(ip) --> goal(Restricted(ip)) AND goal(?belief(Anomalous(ip))
 		Set<Belief<?, ?>> anomalousIpBeliefs = getBeliefBase()
 				.getBeliefsByType(Anomalous.class);
 		for (Belief<?, ?> belief : anomalousIpBeliefs) {
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/agent/ClassifierCapability.java b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/ClassifierCapability.java
index 501f153..31b1d95 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/agent/ClassifierCapability.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/ClassifierCapability.java
@@ -29,12 +29,16 @@ import bdi4jade.belief.Belief;
 import bdi4jade.belief.PropositionalBelief;
 import bdi4jade.core.Capability;
 import bdi4jade.core.GoalUpdateSet;
+import bdi4jade.event.GoalEvent;
 import bdi4jade.goal.BeliefPresentGoal;
+import bdi4jade.goal.GoalStatus;
 import bdi4jade.goal.GoalTemplateFactory;
 import bdi4jade.plan.DefaultPlan;
 import bdi4jade.plan.Plan;
+import bdi4jade.plan.Plan.EndState;
 import bdi4jade.plan.planbody.BeliefGoalPlanBody;
 import bdi4jade.reasoning.OptionGenerationFunction;
+import br.ufrgs.inf.bdinetr.agent.RouterAgent.RootCapability.ExportFlows;
 import br.ufrgs.inf.bdinetr.domain.Classifier;
 import br.ufrgs.inf.bdinetr.domain.Flow;
 import br.ufrgs.inf.bdinetr.domain.Ip;
@@ -54,31 +58,53 @@ public class ClassifierCapability extends RouterAgentCapability implements
 		private static final long serialVersionUID = -3493377510830902961L;
 
 		private Ip ip;
+		private boolean flowsExported;
 
 		@Override
 		public void execute() {
-			role.turnFlowExporterOn();
-			Set<Flow> malicious = role.classifyFlows(ip);
-
-			for (Flow flow : malicious) {
-				belief(new Threat(flow), true);
-			}
-
-			// Exists flow.(threat(flow) AND ip = dst(flow)) --> not Benign(ip) 
-			// nExists flow.(threat(flow) AND ip = dst(flow)) --> Benign(ip)
-			boolean exists = false;
-			Set<Belief<?, ?>> threatBeliefs = getBeliefBase().getBeliefsByType(
-					Threat.class);
-			for (Belief<?, ?> belief : threatBeliefs) {
-				PropositionalBelief<Threat> threat = (PropositionalBelief<Threat>) belief;
-				assert threat.getValue();
-
-				if (ip.equals(threat.getName().getFlow().getDstIp())) {
-					exists = true;
-					break;
+			if (!flowsExported) {
+				dispatchSubgoalAndListen(new ExportFlows(ip));
+				this.flowsExported = true;
+			} else {
+				GoalEvent event = getGoalEvent();
+				if (event != null) {
+					if (GoalStatus.ACHIEVED.equals(event.getStatus())) {
+						Set<Flow> malicious = role.classifyFlows(ip);
+
+						for (Flow flow : malicious) {
+							belief(new Threat(flow), true);
+						}
+
+						// Exists flow.(threat(flow) AND ip = dst(flow)) --> not
+						// Benign(ip)
+						// nExists flow.(threat(flow) AND ip = dst(flow)) -->
+						// Benign(ip)
+						boolean exists = false;
+						Set<Belief<?, ?>> threatBeliefs = getBeliefBase()
+								.getBeliefsByType(Threat.class);
+						for (Belief<?, ?> belief : threatBeliefs) {
+							PropositionalBelief<Threat> threat = (PropositionalBelief<Threat>) belief;
+							assert threat.getValue();
+
+							if (ip.equals(threat.getName().getFlow().getDstIp())) {
+								exists = true;
+								break;
+							}
+						}
+						belief(new Benign(ip), !exists);
+					} else {
+						setEndState(EndState.FAILED);
+					}
+				} else {
+					block();
 				}
 			}
-			belief(new Benign(ip), !exists);
+		}
+
+		@Override
+		public void onStart() {
+			super.onStart();
+			this.flowsExported = false;
 		}
 
 		@Parameter(direction = Direction.IN)
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/agent/FlowExporterCapability.java b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/FlowExporterCapability.java
new file mode 100644
index 0000000..5641666
--- /dev/null
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/FlowExporterCapability.java
@@ -0,0 +1,53 @@
+package br.ufrgs.inf.bdinetr.agent;
+
+import bdi4jade.annotation.Parameter;
+import bdi4jade.annotation.Parameter.Direction;
+import bdi4jade.goal.GoalTemplateFactory;
+import bdi4jade.plan.DefaultPlan;
+import bdi4jade.plan.Plan;
+import bdi4jade.plan.Plan.EndState;
+import bdi4jade.plan.planbody.AbstractPlanBody;
+import br.ufrgs.inf.bdinetr.agent.RouterAgent.RootCapability.ExportFlows;
+import br.ufrgs.inf.bdinetr.domain.FlowExporter;
+import br.ufrgs.inf.bdinetr.domain.Ip;
+import br.ufrgs.inf.bdinetr.domain.PReSETRole.RoleType;
+
+public class FlowExporterCapability extends RouterAgentCapability {
+
+	public class ExportFlowsPlanBody extends AbstractPlanBody {
+		private static final long serialVersionUID = -3493377510830902961L;
+
+		private Ip ip;
+
+		@Override
+		public void action() {
+			role.turnFlowExporterOn();
+			setEndState(EndState.SUCCESSFUL);
+		}
+
+		@Parameter(direction = Direction.IN)
+		public void setIp(Ip ip) {
+			this.ip = ip;
+		}
+	}
+
+	private static final long serialVersionUID = -1705728861020677126L;
+
+	@bdi4jade.annotation.Plan
+	private Plan exportFlows;
+	@bdi4jade.annotation.TransientBelief
+	private final FlowExporter role;
+
+	public FlowExporterCapability(FlowExporter flowExporter) {
+		this.role = flowExporter;
+
+		exportFlows = new DefaultPlan(
+				GoalTemplateFactory.goalOfType(ExportFlows.class),
+				ExportFlowsPlanBody.class);
+	}
+
+	@Override
+	public RoleType getRole() {
+		return RoleType.FLOW_EXPORTER;
+	}
+}
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/agent/LinkMonitorCapability.java b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/LinkMonitorCapability.java
index b69dbbc..7bfb469 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/agent/LinkMonitorCapability.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/LinkMonitorCapability.java
@@ -70,7 +70,7 @@ public class LinkMonitorCapability extends RouterAgentCapability implements
 
 	@Override
 	public void generateGoals(GoalUpdateSet goalUpdateSet) {
-		// OverUsage(link) AND not AttackPrevented(link) --> goal(AttackPrevent(link)) AND goal(belief(RegularUsage(link)))
+		// OverUsage(link) AND not AttackPrevented(link) --> goal(AttackPrevented(link)) AND goal(belief(?RegularUsage(link)))
 		Set<Belief<?, ?>> overUsageBeliefs = getBeliefBase().getBeliefsByType(
 				OverUsage.class);
 		for (Belief<?, ?> belief : overUsageBeliefs) {
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RequestBeliefGoalPlanBody.java b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RequestBeliefGoalPlanBody.java
index 5c2dd27..bc2d6fe 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RequestBeliefGoalPlanBody.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RequestBeliefGoalPlanBody.java
@@ -39,8 +39,8 @@ import br.ufrgs.inf.bdinetr.domain.PReSETRole.RoleType;
  */
 public class RequestBeliefGoalPlanBody extends BeliefGoalPlanBody {
 
-	public static final int MSG_TIME_OUT = 10;
-	public static final int ANSWER_TIME_OUT = 100;
+	public static final int MSG_TIME_OUT = 100;
+	public static final int ANSWER_TIME_OUT = 1000;
 
 	private enum State {
 		Resquesting, ReceivingResponses, Selecting, AchievingGoal, Ended;
@@ -154,6 +154,7 @@ public class RequestBeliefGoalPlanBody extends BeliefGoalPlanBody {
 			}
 		} catch (Exception exc) {
 			log.error(exc);
+			exc.printStackTrace();
 			setEndState(EndState.FAILED);
 		}
 	}
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RespondBeliefGoalPlanBody.java b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RespondBeliefGoalPlanBody.java
index 72ea425..5af8f6e 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RespondBeliefGoalPlanBody.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RespondBeliefGoalPlanBody.java
@@ -82,7 +82,7 @@ public class RespondBeliefGoalPlanBody extends AbstractPlanBody {
 						dispatchSubgoalAndListen(beliefGoal);
 						this.state = State.AchievingBeliefGoal;
 					} else {
-						setEndState(EndState.SUCCESSFULL);
+						setEndState(EndState.SUCCESSFUL);
 						log.info("Proposal rejected.");
 						this.state = State.Ended;
 						return;
@@ -113,6 +113,7 @@ public class RespondBeliefGoalPlanBody extends AbstractPlanBody {
 			}
 		} catch (Exception exc) {
 			log.error(exc);
+			exc.printStackTrace();
 			setEndState(EndState.FAILED);
 		}
 	}
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RouterAgent.java b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RouterAgent.java
index df54a2e..747d09f 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RouterAgent.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/agent/RouterAgent.java
@@ -31,6 +31,8 @@ import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 
+import bdi4jade.annotation.Parameter;
+import bdi4jade.annotation.Parameter.Direction;
 import bdi4jade.belief.Belief;
 import bdi4jade.belief.TransientBelief;
 import bdi4jade.core.BDIAgent;
@@ -43,6 +45,8 @@ import bdi4jade.plan.Plan;
 import bdi4jade.reasoning.AgentPlanSelectionStrategy;
 import br.ufrgs.inf.bdinetr.domain.AnomalyDetection;
 import br.ufrgs.inf.bdinetr.domain.Classifier;
+import br.ufrgs.inf.bdinetr.domain.FlowExporter;
+import br.ufrgs.inf.bdinetr.domain.Ip;
 import br.ufrgs.inf.bdinetr.domain.LinkMonitor;
 import br.ufrgs.inf.bdinetr.domain.PReSETRole.RoleType;
 import br.ufrgs.inf.bdinetr.domain.PReSETRouter;
@@ -56,6 +60,23 @@ public class RouterAgent extends SingleCapabilityAgent implements
 
 	public static class RootCapability extends Capability {
 
+		public static class ExportFlows implements Goal {
+
+			private static final long serialVersionUID = -7114413010093171144L;
+
+			private Ip ip;
+
+			public ExportFlows(Ip ip) {
+				this.ip = ip;
+			}
+
+			@Parameter(direction = Direction.IN)
+			public Ip getIp() {
+				return ip;
+			}
+
+		}
+
 		public static final String ROUTER_BELIEF = "router";
 
 		private static final long serialVersionUID = -2156730094556459899L;
@@ -114,6 +135,11 @@ public class RouterAgent extends SingleCapabilityAgent implements
 					new ClassifierCapability((Classifier) router
 							.getRole(RoleType.CLASSIFIER)));
 		}
+		if (router.hasRole(RoleType.FLOW_EXPORTER)) {
+			this.getCapability().addPartCapability(
+					new FlowExporterCapability((FlowExporter) router
+							.getRole(RoleType.FLOW_EXPORTER)));
+		}
 		setPlanSelectionStrategy(this);
 	}
 
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/BDINetRApp.java b/network-resilience/src/br/ufrgs/inf/bdinetr/BDINetRApp.java
index a802cd0..28e0704 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/BDINetRApp.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/BDINetRApp.java
@@ -75,7 +75,8 @@ public class BDINetRApp {
 		routers.add(new PReSETRouter(new Ip("RouterLM"), RoleType.LINK_MONITOR
 				.getId()));
 		routers.add(new PReSETRouter(new Ip("RouterRLCA"),
-				RoleType.RATE_LIMITER.getId() | RoleType.CLASSIFIER.getId()
+				RoleType.RATE_LIMITER.getId() | RoleType.FLOW_EXPORTER.getId()
+						| RoleType.CLASSIFIER.getId()
 						| RoleType.ANOMALY_DETECTION.getId()));
 
 		Link affectedLink = new Link("AFFECTED_LINK");
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 ca7b727..095f129 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Classifier.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Classifier.java
@@ -25,8 +25,6 @@ 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"
@@ -54,8 +52,4 @@ public class Classifier extends PReSETRole {
 		return flows;
 	}
 
-	public void turnFlowExporterOn() {
-
-	}
-
 }
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/FlowExporter.java b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/FlowExporter.java
new file mode 100644
index 0000000..bce88dc
--- /dev/null
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/FlowExporter.java
@@ -0,0 +1,39 @@
+//----------------------------------------------------------------------------
+// Copyright (C) 2011  Ingrid Nunes
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+// 
+// To contact the authors:
+// http://inf.ufrgs.br/prosoft/bdi4jade/
+//
+//----------------------------------------------------------------------------
+package br.ufrgs.inf.bdinetr.domain;
+
+/**
+ * flowexporter addOperation: "victim:flow:idle:" remoteName: "setthreshold".
+ * 
+ * @author Ingrid Nunes
+ */
+public class FlowExporter extends PReSETRole {
+
+	public FlowExporter(PReSETRouter router) {
+		super(router);
+	}
+
+	public void turnFlowExporterOn() {
+
+	}
+
+}
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 2ce637d..663b5a5 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/PReSETRole.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/PReSETRole.java
@@ -31,7 +31,8 @@ public abstract class PReSETRole {
 
 	public enum RoleType {
 
-		ANOMALY_DETECTION(1), CLASSIFIER(2), LINK_MONITOR(4), RATE_LIMITER(8);
+		ANOMALY_DETECTION(1), CLASSIFIER(2), FLOW_EXPORTER(4), LINK_MONITOR(8), RATE_LIMITER(
+				16);
 
 		private final int id;
 
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 8e989af..8a94996 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/PReSETRouter.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/PReSETRouter.java
@@ -50,6 +50,9 @@ public class PReSETRouter {
 		if (RoleType.CLASSIFIER.isPresent(roles)) {
 			this.roles.put(RoleType.CLASSIFIER, new Classifier(this));
 		}
+		if (RoleType.FLOW_EXPORTER.isPresent(roles)) {
+			this.roles.put(RoleType.FLOW_EXPORTER, new FlowExporter(this));
+		}
 	}
 
 	@Override