[ONOS-5911] Port removal after receiving OFPR_DELETE port status reason.
Change-Id: I1f3f6c752da5f989a2d727f378e9f04fbbb71341
diff --git a/core/store/dist/src/main/java/org/onosproject/store/device/impl/GossipDeviceStore.java b/core/store/dist/src/main/java/org/onosproject/store/device/impl/GossipDeviceStore.java
index 4e6c05d..95db702 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/device/impl/GossipDeviceStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/device/impl/GossipDeviceStore.java
@@ -736,6 +736,7 @@
private DeviceEvent updatePort(Device device, Port oldPort,
Port newPort,
Map<PortNumber, Port> ports) {
+
if (oldPort.isEnabled() != newPort.isEnabled() ||
oldPort.type() != newPort.type() ||
oldPort.portSpeed() != newPort.portSpeed() ||
@@ -746,6 +747,14 @@
return null;
}
+ private DeviceEvent removePort(DeviceId deviceId, PortNumber portNumber) {
+
+ log.info("Deleted port: " + deviceId.toString() + "/" + portNumber.toString());
+ Port deletedPort = devicePorts.get(deviceId).remove(portNumber);
+
+ return new DeviceEvent(PORT_REMOVED, getDevice(deviceId), deletedPort);
+ }
+
// Prunes the specified list of ports based on which ports are in the
// processed list and returns list of corresponding events.
// Guarded by deviceDescs value (=Device lock)
@@ -857,14 +866,16 @@
final PortNumber number = deltaDesc.value().portNumber();
final Port oldPort = ports.get(number);
final Port newPort;
-
final Timestamped<PortDescription> existingPortDesc = descs.getPortDesc(number);
+ boolean toDelete = false;
+
if (existingPortDesc == null ||
deltaDesc.isNewer(existingPortDesc)) {
// on new port or valid update
// update description
descs.putPortDesc(deltaDesc);
newPort = composePort(device, number, descsMap);
+ toDelete = deltaDesc.value().isRemoved();
} else {
// same or outdated event, ignored.
log.trace("ignore same or outdated {} >= {}", existingPortDesc, deltaDesc);
@@ -874,7 +885,7 @@
if (oldPort == null) {
return createPort(device, newPort, ports);
} else {
- return updatePort(device, oldPort, newPort, ports);
+ return toDelete ? removePort(deviceId, number) : updatePort(device, oldPort, newPort, ports);
}
}
}