NeighbourMessageService: Don't push ARP flows when there are no handlers registered.

Fixes ONOS-5277

Change-Id: Ie7ff6ed10d14f4ec8f96327d323ace50c85c8a19
diff --git a/incubator/net/src/main/java/org/onosproject/incubator/net/neighbour/impl/NeighbourResolutionManager.java b/incubator/net/src/main/java/org/onosproject/incubator/net/neighbour/impl/NeighbourResolutionManager.java
index 1bf3e13..fe1a800 100644
--- a/incubator/net/src/main/java/org/onosproject/incubator/net/neighbour/impl/NeighbourResolutionManager.java
+++ b/incubator/net/src/main/java/org/onosproject/incubator/net/neighbour/impl/NeighbourResolutionManager.java
@@ -111,7 +111,7 @@
     private static final String APP_NAME = "org.onosproject.neighbour";
     private ApplicationId appId;
 
-    private SetMultimap<ConnectPoint, NeighbourHandlerRegistration> packetHandlers =
+    private final SetMultimap<ConnectPoint, NeighbourHandlerRegistration> packetHandlers =
             Multimaps.synchronizedSetMultimap(HashMultimap.create());
 
     private final InternalPacketProcessor processor = new InternalPacketProcessor();
@@ -146,7 +146,11 @@
                     ndpEnabled ? "enabled" : "disabled");
         }
 
-        requestPackets();
+        synchronized (packetHandlers) {
+            if (!packetHandlers.isEmpty()) {
+                requestPackets();
+            }
+        }
     }
 
     private void requestPackets() {
@@ -199,30 +203,47 @@
     public void registerNeighbourHandler(ConnectPoint connectPoint,
                                          NeighbourMessageHandler handler,
                                          ApplicationId appId) {
-        packetHandlers.put(connectPoint, new HandlerRegistration(handler, appId));
+        register(connectPoint, new HandlerRegistration(handler, appId));
     }
 
     @Override
     public void registerNeighbourHandler(Interface intf,
                                          NeighbourMessageHandler handler,
                                          ApplicationId appId) {
-        packetHandlers.put(intf.connectPoint(),
-                new HandlerRegistration(handler, intf, appId));
+        register(intf.connectPoint(), new HandlerRegistration(handler, intf, appId));
+    }
+
+    private void register(ConnectPoint connectPoint, HandlerRegistration registration) {
+        synchronized (packetHandlers) {
+            if (packetHandlers.isEmpty()) {
+                requestPackets();
+            }
+            packetHandlers.put(connectPoint, registration);
+        }
     }
 
     @Override
     public void unregisterNeighbourHandler(ConnectPoint connectPoint,
                                            NeighbourMessageHandler handler,
                                            ApplicationId appId) {
-        packetHandlers.remove(connectPoint, new HandlerRegistration(handler, appId));
+        unregister(connectPoint, new HandlerRegistration(handler, appId));
     }
 
     @Override
     public void unregisterNeighbourHandler(Interface intf,
                                            NeighbourMessageHandler handler,
                                            ApplicationId appId) {
-        packetHandlers.remove(intf.connectPoint(),
-                new HandlerRegistration(handler, intf, appId));
+        unregister(intf.connectPoint(), new HandlerRegistration(handler, intf, appId));
+    }
+
+    private void unregister(ConnectPoint connectPoint, HandlerRegistration registration) {
+        synchronized (packetHandlers) {
+            packetHandlers.remove(connectPoint, registration);
+
+            if (packetHandlers.isEmpty()) {
+                cancelPackets();
+            }
+        }
     }
 
     @Override
@@ -236,6 +257,10 @@
                     it.remove();
                 }
             }
+
+            if (packetHandlers.isEmpty()) {
+                cancelPackets();
+            }
         }
     }
 
@@ -317,7 +342,6 @@
                 .anyMatch(intfAddress -> intfAddress.ipAddress().equals(ip));
     }
 
-
     private void reply(NeighbourMessageContext context, MacAddress targetMac) {
         switch (context.protocol()) {
         case ARP: