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);
                 }