Thomas Vachuska
Committed by Gerrit Code Review

ONOS-367 FIxed a defect of missing links & ports

Change-Id: I4ac99fc06cf5711b0270d6e3043eb6dfb2063ec1
...@@ -33,6 +33,7 @@ import org.projectfloodlight.openflow.protocol.OFFeaturesReply; ...@@ -33,6 +33,7 @@ import org.projectfloodlight.openflow.protocol.OFFeaturesReply;
33 import org.projectfloodlight.openflow.protocol.OFMessage; 33 import org.projectfloodlight.openflow.protocol.OFMessage;
34 import org.projectfloodlight.openflow.protocol.OFPortDesc; 34 import org.projectfloodlight.openflow.protocol.OFPortDesc;
35 import org.projectfloodlight.openflow.protocol.OFPortDescStatsReply; 35 import org.projectfloodlight.openflow.protocol.OFPortDescStatsReply;
36 +import org.projectfloodlight.openflow.protocol.OFPortStatus;
36 import org.projectfloodlight.openflow.protocol.OFRoleReply; 37 import org.projectfloodlight.openflow.protocol.OFRoleReply;
37 import org.projectfloodlight.openflow.protocol.OFVersion; 38 import org.projectfloodlight.openflow.protocol.OFVersion;
38 import org.slf4j.Logger; 39 import org.slf4j.Logger;
...@@ -166,7 +167,7 @@ public abstract class AbstractOpenFlowSwitch implements OpenFlowSwitchDriver { ...@@ -166,7 +167,7 @@ public abstract class AbstractOpenFlowSwitch implements OpenFlowSwitchDriver {
166 */ 167 */
167 @Override 168 @Override
168 public final void handleMessage(OFMessage m) { 169 public final void handleMessage(OFMessage m) {
169 - if (this.role == RoleState.MASTER) { 170 + if (this.role == RoleState.MASTER || m instanceof OFPortStatus) {
170 this.agent.processMessage(dpid, m); 171 this.agent.processMessage(dpid, m);
171 } 172 }
172 } 173 }
......
...@@ -265,7 +265,7 @@ class OFChannelHandler extends IdleStateAwareChannelHandler { ...@@ -265,7 +265,7 @@ class OFChannelHandler extends IdleStateAwareChannelHandler {
265 @Override 265 @Override
266 void processOFPortStatus(OFChannelHandler h, OFPortStatus m) 266 void processOFPortStatus(OFChannelHandler h, OFPortStatus m)
267 throws IOException { 267 throws IOException {
268 - unhandledMessageReceived(h, m); 268 + h.pendingPortStatusMsg.add(m);
269 } 269 }
270 }, 270 },
271 271
...@@ -313,7 +313,7 @@ class OFChannelHandler extends IdleStateAwareChannelHandler { ...@@ -313,7 +313,7 @@ class OFChannelHandler extends IdleStateAwareChannelHandler {
313 @Override 313 @Override
314 void processOFPortStatus(OFChannelHandler h, OFPortStatus m) 314 void processOFPortStatus(OFChannelHandler h, OFPortStatus m)
315 throws IOException, SwitchStateException { 315 throws IOException, SwitchStateException {
316 - unhandledMessageReceived(h, m); 316 + h.pendingPortStatusMsg.add(m);
317 317
318 } 318 }
319 }, 319 },
...@@ -438,6 +438,7 @@ class OFChannelHandler extends IdleStateAwareChannelHandler { ...@@ -438,6 +438,7 @@ class OFChannelHandler extends IdleStateAwareChannelHandler {
438 if (!h.sw.connectSwitch()) { 438 if (!h.sw.connectSwitch()) {
439 disconnectDuplicate(h); 439 disconnectDuplicate(h);
440 } 440 }
441 + handlePendingPortStatusMessages(h);
441 h.setState(ACTIVE); 442 h.setState(ACTIVE);
442 } else { 443 } else {
443 h.setState(WAIT_SWITCH_DRIVER_SUB_HANDSHAKE); 444 h.setState(WAIT_SWITCH_DRIVER_SUB_HANDSHAKE);
...@@ -528,6 +529,7 @@ class OFChannelHandler extends IdleStateAwareChannelHandler { ...@@ -528,6 +529,7 @@ class OFChannelHandler extends IdleStateAwareChannelHandler {
528 529
529 private void moveToActive(OFChannelHandler h) { 530 private void moveToActive(OFChannelHandler h) {
530 boolean success = h.sw.connectSwitch(); 531 boolean success = h.sw.connectSwitch();
532 + handlePendingPortStatusMessages(h);
531 h.setState(ACTIVE); 533 h.setState(ACTIVE);
532 if (!success) { 534 if (!success) {
533 disconnectDuplicate(h); 535 disconnectDuplicate(h);
...@@ -602,7 +604,7 @@ class OFChannelHandler extends IdleStateAwareChannelHandler { ...@@ -602,7 +604,7 @@ class OFChannelHandler extends IdleStateAwareChannelHandler {
602 void processOFPortStatus(OFChannelHandler h, OFPortStatus m) 604 void processOFPortStatus(OFChannelHandler h, OFPortStatus m)
603 throws SwitchStateException { 605 throws SwitchStateException {
604 handlePortStatusMessage(h, m, true); 606 handlePortStatusMessage(h, m, true);
605 - h.dispatchMessage(m); 607 + //h.dispatchMessage(m);
606 } 608 }
607 609
608 @Override 610 @Override
...@@ -765,15 +767,18 @@ class OFChannelHandler extends IdleStateAwareChannelHandler { ...@@ -765,15 +767,18 @@ class OFChannelHandler extends IdleStateAwareChannelHandler {
765 "happen"; 767 "happen";
766 throw new SwitchStateException(msg); 768 throw new SwitchStateException(msg);
767 } 769 }
770 + log.info("Processing {} pending port status messages for {}",
771 + h.pendingPortStatusMsg.size(), h.sw.getStringId());
772 +
768 ArrayList<OFPortStatus> temp = new ArrayList<OFPortStatus>(); 773 ArrayList<OFPortStatus> temp = new ArrayList<OFPortStatus>();
769 for (OFPortStatus ps: h.pendingPortStatusMsg) { 774 for (OFPortStatus ps: h.pendingPortStatusMsg) {
770 temp.add(ps); 775 temp.add(ps);
771 handlePortStatusMessage(h, ps, false); 776 handlePortStatusMessage(h, ps, false);
772 } 777 }
773 - temp.clear();
774 // expensive but ok - we don't expect too many port-status messages 778 // expensive but ok - we don't expect too many port-status messages
775 // note that we cannot use clear(), because of the reasons below 779 // note that we cannot use clear(), because of the reasons below
776 h.pendingPortStatusMsg.removeAll(temp); 780 h.pendingPortStatusMsg.removeAll(temp);
781 + temp.clear();
777 // the iterator above takes a snapshot of the list - so while we were 782 // the iterator above takes a snapshot of the list - so while we were
778 // dealing with the pending port-status messages, we could have received 783 // dealing with the pending port-status messages, we could have received
779 // newer ones. Handle them recursively, but break the recursion after 784 // newer ones. Handle them recursively, but break the recursion after
......