ONOS-1440: Implements port statistics feature, which polls port statistics of all devices every 10 seconds. Also, implemented a simple portstats ONOS CLI command to show the statistics.

Change-Id: I57e046ae2c2463a58b478d3a5b523422cde71ba2
diff --git a/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OpenFlowControllerImpl.java b/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OpenFlowControllerImpl.java
index 762a8f5..8fcf789 100644
--- a/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OpenFlowControllerImpl.java
+++ b/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OpenFlowControllerImpl.java
@@ -47,6 +47,8 @@
 import org.projectfloodlight.openflow.protocol.OFMessage;
 import org.projectfloodlight.openflow.protocol.OFPacketIn;
 import org.projectfloodlight.openflow.protocol.OFPortDesc;
+import org.projectfloodlight.openflow.protocol.OFPortStatsEntry;
+import org.projectfloodlight.openflow.protocol.OFPortStatsReply;
 import org.projectfloodlight.openflow.protocol.OFPortStatus;
 import org.projectfloodlight.openflow.protocol.OFStatsReply;
 import org.projectfloodlight.openflow.protocol.OFStatsReplyFlags;
@@ -104,6 +106,9 @@
     protected Multimap<Dpid, OFGroupDescStatsEntry> fullGroupDescStats =
             ArrayListMultimap.create();
 
+    protected Multimap<Dpid, OFPortStatsEntry> fullPortStats =
+            ArrayListMultimap.create();
+
     private final Controller ctrl = new Controller();
 
     @Activate
@@ -216,6 +221,7 @@
         Collection<OFFlowStatsEntry> flowStats;
         Collection<OFGroupStatsEntry> groupStats;
         Collection<OFGroupDescStatsEntry> groupDescStats;
+        Collection<OFPortStatsEntry> portStats;
 
         switch (msg.getType()) {
         case PORT_STATUS:
@@ -280,6 +286,9 @@
                         executorMsgs.submit(new OFMessageHandler(dpid, rep.build()));
                     }
                     break;
+                case PORT:
+                    executorMsgs.submit(new OFMessageHandler(dpid, reply));
+                    break;
                 default:
                     log.warn("Unsupported stats type : {}", reply.getStatsType());
             }
@@ -343,6 +352,15 @@
         return null;
     }
 
+    private synchronized Collection<OFPortStatsEntry> publishPortStats(Dpid dpid,
+                                                                 OFPortStatsReply reply) {
+        fullPortStats.putAll(dpid, reply.getEntries());
+        if (!reply.getFlags().contains(OFStatsReplyFlags.REPLY_MORE)) {
+            return fullPortStats.removeAll(dpid);
+        }
+        return null;
+    }
+
     @Override
     public void setRole(Dpid dpid, RoleState role) {
         final OpenFlowSwitch sw = getSwitch(dpid);