Changing PacketManager topology event processing logic to avoid
processing irrelevant events.
Change-Id: I82fdd5d492dfd1e04cd05564053c3ab05f0d10fb
diff --git a/core/net/src/main/java/org/onosproject/net/packet/impl/PacketManager.java b/core/net/src/main/java/org/onosproject/net/packet/impl/PacketManager.java
index 490e0d5..407d33d 100644
--- a/core/net/src/main/java/org/onosproject/net/packet/impl/PacketManager.java
+++ b/core/net/src/main/java/org/onosproject/net/packet/impl/PacketManager.java
@@ -33,6 +33,8 @@
import org.onosproject.net.device.DeviceEvent;
import org.onosproject.net.device.DeviceListener;
import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.driver.Driver;
+import org.onosproject.net.driver.DriverService;
import org.onosproject.net.flow.DefaultTrafficTreatment;
import org.onosproject.net.flow.TrafficSelector;
import org.onosproject.net.flow.TrafficTreatment;
@@ -89,6 +91,7 @@
private static final String ERROR_NULL_SELECTOR = "Selector cannot be null";
private static final String ERROR_NULL_APP_ID = "Application ID cannot be null";
private static final String ERROR_NULL_DEVICE_ID = "Device ID cannot be null";
+ private static final String SUPPORT_PACKET_REQUEST_PROPERTY = "supportPacketRequest";
private final PacketStoreDelegate delegate = new InternalStoreDelegate();
@@ -102,6 +105,9 @@
protected DeviceService deviceService;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+ protected DriverService driverService;
+
+ @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected PacketStore store;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
@@ -113,7 +119,7 @@
private final List<ProcessorEntry> processors = Lists.newCopyOnWriteArrayList();
- private final PacketDriverProvider defaultProvider = new PacketDriverProvider();
+ private final PacketDriverProvider defaultProvider = new PacketDriverProvider();
private ApplicationId appId;
private NodeId localNodeId;
@@ -441,21 +447,29 @@
* Internal listener for device service events.
*/
private class InternalDeviceListener implements DeviceListener {
+
+ @Override
+ public boolean isRelevant(DeviceEvent event) {
+ return event.type() == DeviceEvent.Type.DEVICE_ADDED ||
+ event.type() == DeviceEvent.Type.DEVICE_AVAILABILITY_CHANGED;
+ }
+
@Override
public void event(DeviceEvent event) {
eventHandlingExecutor.execute(() -> {
try {
Device device = event.subject();
- switch (event.type()) {
- case DEVICE_ADDED:
- case DEVICE_AVAILABILITY_CHANGED:
- if (deviceService.isAvailable(event.subject().id())) {
- pushRulesToDevice(device);
- }
- break;
- default:
- break;
+ Driver driver = driverService.getDriver(device.id());
+ if (driver == null) {
+ return;
}
+ if (!Boolean.parseBoolean(driver.getProperty(SUPPORT_PACKET_REQUEST_PROPERTY))) {
+ return;
+ }
+ if (!deviceService.isAvailable(event.subject().id())) {
+ return;
+ }
+ pushRulesToDevice(device);
} catch (Exception e) {
log.warn("Failed to process {}", event, e);
}