ONOS-2145  Added ability to withdraw packet intercepts via PacketService::cancelPackets.

Change-Id: Ie41271fa02740560bd67b0faf49f633ee749773c
diff --git a/providers/lldp/src/main/java/org/onosproject/provider/lldp/impl/LLDPLinkProvider.java b/providers/lldp/src/main/java/org/onosproject/provider/lldp/impl/LLDPLinkProvider.java
index 6a69af8..ec4a3ff 100644
--- a/providers/lldp/src/main/java/org/onosproject/provider/lldp/impl/LLDPLinkProvider.java
+++ b/providers/lldp/src/main/java/org/onosproject/provider/lldp/impl/LLDPLinkProvider.java
@@ -178,18 +178,20 @@
         executor = newSingleThreadScheduledExecutor(groupedThreads("onos/device", "sync-%d"));
         executor.scheduleAtFixedRate(new SyncDeviceInfoTask(), INIT_DELAY, DELAY, SECONDS);
 
-        requestPackets();
+        requestIntercepts();
 
         log.info("Started");
     }
 
     @Deactivate
     public void deactivate() {
-        // TODO revoke all packet requests when deactivate
         cfgService.unregisterProperties(getClass(), false);
         if (disableLinkDiscovery) {
             return;
         }
+
+        withdrawIntercepts();
+
         providerRegistry.unregister(this);
         deviceService.removeListener(listener);
         packetService.removeProcessor(listener);
@@ -205,7 +207,6 @@
 
     @Modified
     public void modified(ComponentContext context) {
-        // TODO revoke unnecessary packet requests when config being modified
         if (context == null) {
             loadSuppressionRules();
             return;
@@ -225,7 +226,7 @@
         if (!Strings.isNullOrEmpty(s)) {
             lldpSuppression = s;
         }
-
+        requestIntercepts();
         loadSuppressionRules();
     }
 
@@ -246,22 +247,33 @@
     }
 
     /**
-     * Request packet in via PacketService.
+     * Request packet intercepts.
      */
-    private void requestPackets() {
-        TrafficSelector.Builder lldpSelector = DefaultTrafficSelector.builder();
-        lldpSelector.matchEthType(Ethernet.TYPE_LLDP);
-        packetService.requestPackets(lldpSelector.build(),
-                                     PacketPriority.CONTROL, appId);
+    private void requestIntercepts() {
+        TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
+        selector.matchEthType(Ethernet.TYPE_LLDP);
+        packetService.requestPackets(selector.build(), PacketPriority.CONTROL, appId);
 
+        selector.matchEthType(Ethernet.TYPE_BSN);
         if (useBDDP) {
-            TrafficSelector.Builder bddpSelector = DefaultTrafficSelector.builder();
-            bddpSelector.matchEthType(Ethernet.TYPE_BSN);
-            packetService.requestPackets(bddpSelector.build(),
-                                         PacketPriority.CONTROL, appId);
+            packetService.requestPackets(selector.build(), PacketPriority.CONTROL, appId);
+        } else {
+            packetService.cancelPackets(selector.build(), PacketPriority.CONTROL, appId);
         }
     }
 
+    /**
+     * Withdraw packet intercepts.
+     */
+    private void withdrawIntercepts() {
+        TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
+        selector.matchEthType(Ethernet.TYPE_LLDP);
+        packetService.cancelPackets(selector.build(), PacketPriority.CONTROL, appId);
+        selector.matchEthType(Ethernet.TYPE_BSN);
+        packetService.cancelPackets(selector.build(), PacketPriority.CONTROL, appId);
+    }
+
+
     private class InternalRoleListener implements MastershipListener {
 
         @Override
diff --git a/providers/lldp/src/test/java/org/onosproject/provider/lldp/impl/LLDPLinkProviderTest.java b/providers/lldp/src/test/java/org/onosproject/provider/lldp/impl/LLDPLinkProviderTest.java
index f6627af..1d63a15 100644
--- a/providers/lldp/src/test/java/org/onosproject/provider/lldp/impl/LLDPLinkProviderTest.java
+++ b/providers/lldp/src/test/java/org/onosproject/provider/lldp/impl/LLDPLinkProviderTest.java
@@ -15,23 +15,9 @@
  */
 package org.onosproject.provider.lldp.impl;
 
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import java.nio.ByteBuffer;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.CompletableFuture;
-
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -57,8 +43,6 @@
 import org.onosproject.net.device.DeviceEvent;
 import org.onosproject.net.device.DeviceListener;
 import org.onosproject.net.device.DeviceServiceAdapter;
-import org.onosproject.net.flow.FlowRule;
-import org.onosproject.net.flow.TrafficSelector;
 import org.onosproject.net.flow.TrafficTreatment;
 import org.onosproject.net.link.LinkDescription;
 import org.onosproject.net.link.LinkProvider;
@@ -68,15 +52,21 @@
 import org.onosproject.net.packet.InboundPacket;
 import org.onosproject.net.packet.OutboundPacket;
 import org.onosproject.net.packet.PacketContext;
-import org.onosproject.net.packet.PacketPriority;
 import org.onosproject.net.packet.PacketProcessor;
-import org.onosproject.net.packet.PacketService;
+import org.onosproject.net.packet.PacketServiceAdapter;
 import org.onosproject.net.provider.AbstractProviderService;
 import org.onosproject.net.provider.ProviderId;
 
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
+import java.nio.ByteBuffer;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.CompletableFuture;
+
+import static org.easymock.EasyMock.*;
+import static org.junit.Assert.*;
 
 public class LLDPLinkProviderTest {
 
@@ -383,33 +373,11 @@
 
     }
 
-    private class TestPacketService implements PacketService {
-
+    private class TestPacketService extends PacketServiceAdapter {
         @Override
         public void addProcessor(PacketProcessor processor, int priority) {
             testProcessor = processor;
         }
-
-        @Override
-        public void removeProcessor(PacketProcessor processor) {
-
-        }
-
-        @Override
-        public void emit(OutboundPacket packet) {
-
-        }
-
-        @Override
-        public void requestPackets(TrafficSelector selector,
-                                   PacketPriority priority, ApplicationId appId) {
-        }
-
-        @Override
-        public void requestPackets(TrafficSelector selector,
-                                   PacketPriority priority, ApplicationId appId,
-                                   FlowRule.Type tableType) {
-        }
     }
 
     private class TestDeviceService extends DeviceServiceAdapter {
@@ -433,8 +401,6 @@
 
             ports.putAll(DID1, Lists.newArrayList(pd1, pd2));
             ports.putAll(DID2, Lists.newArrayList(pd3, pd4));
-
-
         }
 
         @Override