- Modify the GROUP MOD function to set WatchPort and WatchGroup as ANY
 - Process the multiple port description replies ( NOTE : Test failes due to unmodifiableList)

Change-Id: Idaca5a4218e3b920d6c4d3bf3c2611a7ddc0d166
diff --git a/src/main/java/net/floodlightcontroller/core/internal/OFChannelHandler.java b/src/main/java/net/floodlightcontroller/core/internal/OFChannelHandler.java
index 2dd458b..9a8f21b 100644
--- a/src/main/java/net/floodlightcontroller/core/internal/OFChannelHandler.java
+++ b/src/main/java/net/floodlightcontroller/core/internal/OFChannelHandler.java
@@ -145,6 +145,7 @@
         this.roleChanger = new RoleChanger(DEFAULT_ROLE_TIMEOUT_MS);
         this.state = ChannelState.INIT;
         this.pendingPortStatusMsg = new CopyOnWriteArrayList<OFPortStatus>();
+        this.portDescReplies = new ArrayList<OFPortDescStatsReply>();
         factory13 = controller.getOFMessageFactory_13();
         factory10 = controller.getOFMessageFactory_10();
         controlRequested = Boolean.FALSE;
@@ -723,8 +724,8 @@
                             h.channel.getRemoteAddress());
                     return;
                 }
-                if (h.portDescReplies == null) {
-                    h.portDescReplies = new ArrayList<OFPortDescStatsReply>();
+                if (h.portDescReplies.isEmpty()) {
+                    //h.portDescReplies = new ArrayList<OFPortDescStatsReply>();
                     h.portDescReplies.add((OFPortDescStatsReply) m);
                     if (m.getFlags().contains(OFStatsReplyFlags.REPLY_MORE)) {
                         log.warn("Stats reply indicates more stats from sw {} for "
diff --git a/src/main/java/net/floodlightcontroller/core/internal/OFSwitchImplBase.java b/src/main/java/net/floodlightcontroller/core/internal/OFSwitchImplBase.java
index 501c020..e93f378 100644
--- a/src/main/java/net/floodlightcontroller/core/internal/OFSwitchImplBase.java
+++ b/src/main/java/net/floodlightcontroller/core/internal/OFSwitchImplBase.java
@@ -474,6 +474,25 @@
             return;
         }
 
+        /*
+
+        for (OFPortDescStatsReply portDesc: portDescList) {
+            for (OFPortDesc port: portDesc.getEntries()) {
+                boolean up = false;
+                for (OFPortConfig state: port.getConfig()) {
+                    if (state != OFPortConfig.PORT_DOWN) {
+                        up = true;
+                        break;
+                    }
+                }
+
+                if (up) {
+                    portManager.updatePorts(portDesc.getEntries());
+                }
+            }
+        }
+        */
+
         for (OFPortDescStatsReply portDesc: portDescList) {
             portManager.updatePorts(portDesc.getEntries());
         }
@@ -1022,14 +1041,31 @@
                 }
 
                 if (doUpdate) {
-                    portsByName = Collections.unmodifiableMap(newPortsByName);
-                    portsByNumber =
-                            Collections.unmodifiableMap(newPortsByNumber);
-                    enabledPortList =
-                            Collections.unmodifiableList(newEnabledPortList);
-                    enabledPortNumbers =
-                            Collections.unmodifiableList(newEnabledPortNumbers);
-                    portList = Collections.unmodifiableList(newPortsList);
+                    if (enabledPortList.isEmpty() ) {
+                        //portsByName = new HashMap<String, OFPortDesc>(newPortsByName);
+                        portsByName = newPortsByName;
+                        portsByNumber = newPortsByNumber;
+                        enabledPortList = newEnabledPortList;
+                        enabledPortNumbers = newEnabledPortNumbers;
+                        portList = newPortsList;
+                        /*
+                        portsByNumber = Collections
+                                Collections.unmodifiableMap(newPortsByNumber);
+                        enabledPortList =
+                                Collections.unmodifiableList(newEnabledPortList);
+                        enabledPortNumbers =
+                                Collections.unmodifiableList(newEnabledPortNumbers);
+                        portList = Collections.unmodifiableList(newPortsList);
+                        */
+                    }
+                    else {
+                        portsByName.putAll(newPortsByName);
+                        portsByNumber.putAll(newPortsByNumber);
+                        enabledPortList.addAll(newEnabledPortList);
+                        enabledPortNumbers.addAll(newEnabledPortNumbers);
+                        portList.addAll(newPortsList);
+
+                    }
                 }
                 return events;
             } finally {
diff --git a/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplSpringOpenTTP.java b/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplSpringOpenTTP.java
index fe9d8e9..59e369a 100644
--- a/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplSpringOpenTTP.java
+++ b/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplSpringOpenTTP.java
@@ -1087,6 +1087,8 @@
             bldr.setActions(actions);
             if (ecmpInfo.groupType == OFGroupType.SELECT)
                 bldr.setWeight(1);
+            bldr.setWatchGroup(OFGroup.ANY);
+            bldr.setWatchPort(OFPort.ANY);
             OFBucket ofb = bldr.build();
             buckets.add(ofb);
         }
diff --git a/src/main/java/net/onrc/onos/core/topology/TopologyPublisher.java b/src/main/java/net/onrc/onos/core/topology/TopologyPublisher.java
index 66e1b88..e8be836 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyPublisher.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyPublisher.java
@@ -412,6 +412,7 @@
             // FIXME should be merging, with existing attrs, etc..
             // TODO define attr name as constant somewhere.
             // TODO populate appropriate attributes.
+            //portData.
             portData.createStringAttribute("name", port.getName());
             portData.createStringAttribute(TopologyElement.TYPE,
                     TopologyElement.TYPE_PACKET_LAYER);
diff --git a/src/test/java/net/floodlightcontroller/core/internal/OFChannelHandlerTest.java b/src/test/java/net/floodlightcontroller/core/internal/OFChannelHandlerTest.java
index 4d6639b..6c52f15 100644
--- a/src/test/java/net/floodlightcontroller/core/internal/OFChannelHandlerTest.java
+++ b/src/test/java/net/floodlightcontroller/core/internal/OFChannelHandlerTest.java
@@ -484,6 +484,7 @@
         swImplBase.setFeaturesReply(featuresReply);
         expectLastCall().once();
         swImplBase.setPortDescReply((OFPortDescStatsReply)null );
+        swImplBase.setPortDescReplies((List<OFPortDescStatsReply>)null );
         replay(swImplBase);
 
         // send the description stats reply