From 8432cc3566be26587dc6daec81b43b16343d924a Mon Sep 17 00:00:00 2001
From: Sovietaced <Sovietaced@gmail.com>
Date: Wed, 26 Jun 2013 14:02:10 -0700
Subject: [PATCH] Patch for issue #406

---
 .../core/internal/Controller.java                  |  1 -
 .../perfmon/PerfMonDataResource.java               |  6 ++++++
 .../perfmon/PktInProcessingTime.java               | 14 ++++++++++----
 3 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/src/main/java/net/floodlightcontroller/core/internal/Controller.java b/src/main/java/net/floodlightcontroller/core/internal/Controller.java
index 39565832f..221fe34fa 100644
--- a/src/main/java/net/floodlightcontroller/core/internal/Controller.java
+++ b/src/main/java/net/floodlightcontroller/core/internal/Controller.java
@@ -1804,7 +1804,6 @@ public class Controller implements IFloodlightProviderService,
                     // Get the starting time (overall and per-component) of
                     // the processing chain for this packet if performance
                     // monitoring is turned on
-                    pktinProcTime.bootstrap(listeners);
                     pktinProcTime.recordStartTimePktIn();
                     Command cmd;
                     for (IOFMessageListener listener : listeners) {
diff --git a/src/main/java/net/floodlightcontroller/perfmon/PerfMonDataResource.java b/src/main/java/net/floodlightcontroller/perfmon/PerfMonDataResource.java
index 2d0aad0c1..72180c4bd 100644
--- a/src/main/java/net/floodlightcontroller/perfmon/PerfMonDataResource.java
+++ b/src/main/java/net/floodlightcontroller/perfmon/PerfMonDataResource.java
@@ -37,6 +37,12 @@ public class PerfMonDataResource extends ServerResource {
                 get(IPktInProcessingTimeService.class.getCanonicalName());
         
         setStatus(Status.SUCCESS_OK, "OK");
+        // If the user is requesting this they must think that it is enabled, 
+        // so lets enable it to prevent from erroring out
+        if (!pktinProcTime.isEnabled()){
+        	pktinProcTime.setEnabled(true);
+        	logger.warn("Requesting performance monitor data when performance monitor is disabled. Turning it on");
+        }
         // Allocate output object
         if (pktinProcTime.isEnabled()) {
             CumulativeTimeBucket ctb = pktinProcTime.getCtb();
diff --git a/src/main/java/net/floodlightcontroller/perfmon/PktInProcessingTime.java b/src/main/java/net/floodlightcontroller/perfmon/PktInProcessingTime.java
index c27f16217..366721120 100644
--- a/src/main/java/net/floodlightcontroller/perfmon/PktInProcessingTime.java
+++ b/src/main/java/net/floodlightcontroller/perfmon/PktInProcessingTime.java
@@ -26,6 +26,7 @@ import java.util.List;
 import java.util.Map;
 
 import net.floodlightcontroller.core.FloodlightContext;
+import net.floodlightcontroller.core.IFloodlightProviderService;
 import net.floodlightcontroller.core.IOFMessageListener;
 import net.floodlightcontroller.core.IOFSwitch;
 import net.floodlightcontroller.core.annotations.LogMessageCategory;
@@ -37,6 +38,7 @@ import net.floodlightcontroller.core.module.IFloodlightService;
 import net.floodlightcontroller.restserver.IRestApiService;
 
 import org.openflow.protocol.OFMessage;
+import org.openflow.protocol.OFType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -69,6 +71,7 @@ public class PktInProcessingTime
     implements IFloodlightModule, IPktInProcessingTimeService {
 
     
+	protected IFloodlightProviderService floodlightProvider;
     // Our dependencies
     private IRestApiService restApi;
     
@@ -99,19 +102,19 @@ public class PktInProcessingTime
     
     @Override
     public void bootstrap(List<IOFMessageListener> listeners) {
-        if (!isInited) {
             ctb = new CumulativeTimeBucket(listeners);
-            isInited = true;
-        }
     }
     
     @Override
     public boolean isEnabled() {
-        return isEnabled && isInited;
+        return isEnabled;
     }
     
     @Override
     public void setEnabled(boolean enabled) {
+    	if(enabled){
+    		bootstrap(floodlightProvider.getListeners().get(OFType.PACKET_IN));
+    	}
         this.isEnabled = enabled;
         logger.debug("Setting module to " + isEnabled);
     }
@@ -191,12 +194,15 @@ public class PktInProcessingTime
         Collection<Class<? extends IFloodlightService>> l = 
                 new ArrayList<Class<? extends IFloodlightService>>();
         l.add(IRestApiService.class);
+        l.add(IFloodlightProviderService.class);
         return l;
     }
     
     @Override
     public void init(FloodlightModuleContext context)
                                              throws FloodlightModuleException {
+    	floodlightProvider = context
+                .getServiceImpl(IFloodlightProviderService.class);
         restApi = context.getServiceImpl(IRestApiService.class);
     }
     
-- 
GitLab