diff --git a/src/main/java/net/floodlightcontroller/core/IOFSwitch.java b/src/main/java/net/floodlightcontroller/core/IOFSwitch.java index 770ae5a63ad96d181945a6331ee45c7f63c3cc4f..e24973754c39c7d7db9849dc52b92885302c2cf1 100644 --- a/src/main/java/net/floodlightcontroller/core/IOFSwitch.java +++ b/src/main/java/net/floodlightcontroller/core/IOFSwitch.java @@ -82,7 +82,7 @@ public interface IOFSwitch { } public enum PortChangeType { - ADD, UPDATE, DELETE + ADD, OTHER_UPDATE, DELETE, UP, DOWN, } /** @@ -269,11 +269,11 @@ public interface IOFSwitch { public Collection<OFPhysicalPort> getPorts(); /** - * @param portName + * @param portNumber * @return Whether a port is enabled per latest port status message * (not configured down nor link down nor in spanning tree blocking state) */ - public boolean portEnabled(short portName); + public boolean portEnabled(short portNumber); /** * @param portNumber diff --git a/src/main/java/net/floodlightcontroller/core/internal/OFChannelHandler.java b/src/main/java/net/floodlightcontroller/core/internal/OFChannelHandler.java index 6e479775464ed758a5f6f5a6145b7bf811c4e43f..744c964fc1390f97f7d8246ed72cd539a24d3bad 100644 --- a/src/main/java/net/floodlightcontroller/core/internal/OFChannelHandler.java +++ b/src/main/java/net/floodlightcontroller/core/internal/OFChannelHandler.java @@ -969,17 +969,31 @@ class OFChannelHandler short portNumber = m.getDesc().getPortNumber(); OFPhysicalPort port = m.getDesc(); OFPortReason reason = OFPortReason.fromReasonCode(m.getReason()); - PortChangeType changeType = null; + switch(reason) { case OFPPR_MODIFY: + boolean oldEnabled = + h.sw.portEnabled(port.getPortNumber()); + h.sw.setPort(port); - changeType = PortChangeType.UPDATE; + boolean newEnabled = + h.sw.portEnabled(port.getPortNumber()); + + if (!oldEnabled && newEnabled) + changeType = PortChangeType.UP; + else if (oldEnabled && !newEnabled) + changeType = PortChangeType.DOWN; + else changeType = PortChangeType.OTHER_UPDATE; + log.debug("Port #{} modified for {}", portNumber, h.sw); break; case OFPPR_ADD: h.sw.setPort(port); - changeType = PortChangeType.ADD; + if (h.sw.portEnabled(port.getPortNumber())) + changeType = PortChangeType.UP; + else + changeType = PortChangeType.ADD; log.debug("Port #{} added for {}", portNumber, h.sw); break; case OFPPR_DELETE: diff --git a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java index 783760a91828b67a078bc6173122296a9958c400..ef93ec08fb34d1fbc0433af9b845a54063d8f9df 100644 --- a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java +++ b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java @@ -503,8 +503,6 @@ public class LinkDiscoveryManager implements IOFMessageListener, debugCounters.updateCounter("linkdiscovery-incoming"); return this.handlePacketIn(sw.getId(), (OFPacketIn) msg, cntx); -// case PORT_STATUS: -// return this.handlePortStatus(sw.getId(), (OFPortStatus) msg); default: break; } @@ -1602,13 +1600,13 @@ public class LinkDiscoveryManager implements IOFMessageListener, IOFSwitch.PortChangeType type) { switch (type) { - case ADD: + case UP: processNewPort(switchId, port.getPortNumber()); break; - case DELETE: + case DELETE: case DOWN: handlePortDown(switchId, port.getPortNumber()); break; - case UPDATE: + case OTHER_UPDATE: case ADD: // This is something other than port add or delete. // Topology does not worry about this. // If for some reason the port features change, which diff --git a/src/test/java/net/floodlightcontroller/core/internal/ControllerTest.java b/src/test/java/net/floodlightcontroller/core/internal/ControllerTest.java index ff87897abd2594719185711d6d598de2d82f5994..a8be0c5222d01b1f65e6990ee9633c1a6b3d86c3 100644 --- a/src/test/java/net/floodlightcontroller/core/internal/ControllerTest.java +++ b/src/test/java/net/floodlightcontroller/core/internal/ControllerTest.java @@ -1971,11 +1971,11 @@ public class ControllerTest extends FloodlightTestCase { controller.addOFSwitchListener(listener); // setup switch with the new, second features reply (and thus ports) setupSwitchForAddSwitch(sw, dpid, desc, fr2); - listener.switchPortChanged(dpid, p2, PortChangeType.UPDATE); + listener.switchPortChanged(dpid, p2, PortChangeType.OTHER_UPDATE); expectLastCall().once(); replay(listener); replay(sw); - controller.notifyPortChanged(sw, p2, PortChangeType.UPDATE); + controller.notifyPortChanged(sw, p2, PortChangeType.OTHER_UPDATE); controller.processUpdateQueueForTesting(); verify(listener); verify(sw); diff --git a/src/test/java/net/floodlightcontroller/core/internal/OFChannelHandlerTest.java b/src/test/java/net/floodlightcontroller/core/internal/OFChannelHandlerTest.java index 62c27ac2598150580e4682d6ce4665f2eea2a4bc..5d15c008c8f579239c654d29d7d8db0ff4d7a1dc 100644 --- a/src/test/java/net/floodlightcontroller/core/internal/OFChannelHandlerTest.java +++ b/src/test/java/net/floodlightcontroller/core/internal/OFChannelHandlerTest.java @@ -1193,10 +1193,11 @@ public class OFChannelHandlerTest { expect(sw.getId()).andReturn(dpid).anyTimes(); sw.setPort(p); expectLastCall().once(); + expect(sw.portEnabled((short)1)).andReturn(true).anyTimes(); replay(sw); reset(controller); - controller.notifyPortChanged(sw, p, PortChangeType.ADD); + controller.notifyPortChanged(sw, p, PortChangeType.UP); expectLastCall().once(); sendMessageToHandlerNoControllerReset( Collections.<OFMessage>singletonList(ps)); @@ -1211,10 +1212,11 @@ public class OFChannelHandlerTest { expect(sw.getId()).andReturn(dpid).anyTimes(); sw.setPort(p); expectLastCall().once(); + expect(sw.portEnabled((short)1)).andReturn(true).anyTimes(); replay(sw); reset(controller); - controller.notifyPortChanged(sw, p, PortChangeType.UPDATE); + controller.notifyPortChanged(sw, p, PortChangeType.OTHER_UPDATE); expectLastCall().once(); sendMessageToHandlerNoControllerReset( Collections.<OFMessage>singletonList(ps));