ONOS-367 FIxed a defect of missing links & ports

Change-Id: I4ac99fc06cf5711b0270d6e3043eb6dfb2063ec1
diff --git a/openflow/api/src/main/java/org/onlab/onos/openflow/controller/driver/AbstractOpenFlowSwitch.java b/openflow/api/src/main/java/org/onlab/onos/openflow/controller/driver/AbstractOpenFlowSwitch.java
index 61359cd..3a19d14 100644
--- a/openflow/api/src/main/java/org/onlab/onos/openflow/controller/driver/AbstractOpenFlowSwitch.java
+++ b/openflow/api/src/main/java/org/onlab/onos/openflow/controller/driver/AbstractOpenFlowSwitch.java
@@ -33,6 +33,7 @@
 import org.projectfloodlight.openflow.protocol.OFMessage;
 import org.projectfloodlight.openflow.protocol.OFPortDesc;
 import org.projectfloodlight.openflow.protocol.OFPortDescStatsReply;
+import org.projectfloodlight.openflow.protocol.OFPortStatus;
 import org.projectfloodlight.openflow.protocol.OFRoleReply;
 import org.projectfloodlight.openflow.protocol.OFVersion;
 import org.slf4j.Logger;
@@ -166,7 +167,7 @@
      */
     @Override
     public final void handleMessage(OFMessage m) {
-        if (this.role == RoleState.MASTER) {
+        if (this.role == RoleState.MASTER || m instanceof OFPortStatus) {
             this.agent.processMessage(dpid, m);
         }
     }
diff --git a/openflow/ctl/src/main/java/org/onlab/onos/openflow/controller/impl/OFChannelHandler.java b/openflow/ctl/src/main/java/org/onlab/onos/openflow/controller/impl/OFChannelHandler.java
index ca5f4f5..a9c1969 100644
--- a/openflow/ctl/src/main/java/org/onlab/onos/openflow/controller/impl/OFChannelHandler.java
+++ b/openflow/ctl/src/main/java/org/onlab/onos/openflow/controller/impl/OFChannelHandler.java
@@ -265,7 +265,7 @@
             @Override
             void processOFPortStatus(OFChannelHandler h, OFPortStatus m)
                     throws IOException {
-                unhandledMessageReceived(h, m);
+                h.pendingPortStatusMsg.add(m);
             }
         },
 
@@ -313,7 +313,7 @@
             @Override
             void processOFPortStatus(OFChannelHandler h, OFPortStatus m)
                     throws IOException, SwitchStateException {
-                unhandledMessageReceived(h, m);
+                h.pendingPortStatusMsg.add(m);
 
             }
         },
@@ -438,6 +438,7 @@
                     if (!h.sw.connectSwitch()) {
                         disconnectDuplicate(h);
                     }
+                    handlePendingPortStatusMessages(h);
                     h.setState(ACTIVE);
                 } else {
                     h.setState(WAIT_SWITCH_DRIVER_SUB_HANDSHAKE);
@@ -528,6 +529,7 @@
 
             private void moveToActive(OFChannelHandler h) {
                 boolean success = h.sw.connectSwitch();
+                handlePendingPortStatusMessages(h);
                 h.setState(ACTIVE);
                 if (!success) {
                     disconnectDuplicate(h);
@@ -602,7 +604,7 @@
             void processOFPortStatus(OFChannelHandler h, OFPortStatus m)
                     throws SwitchStateException {
                 handlePortStatusMessage(h, m, true);
-                h.dispatchMessage(m);
+                //h.dispatchMessage(m);
             }
 
             @Override
@@ -765,15 +767,18 @@
                         "happen";
                 throw new SwitchStateException(msg);
             }
+            log.info("Processing {} pending port status messages for {}",
+                     h.pendingPortStatusMsg.size(), h.sw.getStringId());
+
             ArrayList<OFPortStatus> temp  = new ArrayList<OFPortStatus>();
             for (OFPortStatus ps: h.pendingPortStatusMsg) {
                 temp.add(ps);
                 handlePortStatusMessage(h, ps, false);
             }
-            temp.clear();
             // expensive but ok - we don't expect too many port-status messages
             // note that we cannot use clear(), because of the reasons below
             h.pendingPortStatusMsg.removeAll(temp);
+            temp.clear();
             // the iterator above takes a snapshot of the list - so while we were
             // dealing with the pending port-status messages, we could have received
             // newer ones. Handle them recursively, but break the recursion after