[FALCON] adding api to enable packet requests to a single device.

Change-Id: Id870c13ece658fe61f46194c1e795fb1d209a6a8
diff --git a/core/api/src/main/java/org/onosproject/net/packet/DefaultPacketRequest.java b/core/api/src/main/java/org/onosproject/net/packet/DefaultPacketRequest.java
index 605ab4b..3bddee4 100644
--- a/core/api/src/main/java/org/onosproject/net/packet/DefaultPacketRequest.java
+++ b/core/api/src/main/java/org/onosproject/net/packet/DefaultPacketRequest.java
@@ -19,9 +19,11 @@
 
 import org.onosproject.cluster.NodeId;
 import org.onosproject.core.ApplicationId;
+import org.onosproject.net.DeviceId;
 import org.onosproject.net.flow.TrafficSelector;
 
 import java.util.Objects;
+import java.util.Optional;
 
 /**
  * Default implementation of a packet request.
@@ -31,22 +33,24 @@
     private final PacketPriority priority;
     private final ApplicationId appId;
     private final NodeId nodeId;
+    private final Optional<DeviceId> deviceId;
+
 
     /**
      * Creates a new packet request.
-     *
-     * @param selector  traffic selector
+     *  @param selector  traffic selector
      * @param priority  intercept priority
      * @param appId     application id
      * @param nodeId    identifier of node where request originated
+     * @param deviceId  device id
      */
     public DefaultPacketRequest(TrafficSelector selector, PacketPriority priority,
-                                ApplicationId appId,
-                                NodeId nodeId) {
+                                ApplicationId appId, NodeId nodeId, Optional<DeviceId> deviceId) {
         this.selector = selector;
         this.priority = priority;
         this.appId = appId;
         this.nodeId = nodeId;
+        this.deviceId = deviceId;
     }
 
     @Override
@@ -64,6 +68,10 @@
         return appId;
     }
 
+    public Optional<DeviceId> deviceId() {
+        return deviceId;
+    }
+
     @Override
     public NodeId nodeId() {
         return nodeId;
@@ -71,7 +79,7 @@
 
     @Override
     public int hashCode() {
-        return Objects.hash(selector, priority, appId, nodeId);
+        return Objects.hash(selector, priority, appId, nodeId, deviceId);
     }
 
     @Override
@@ -86,7 +94,8 @@
         return Objects.equals(this.selector, other.selector)
                 && Objects.equals(this.priority, other.priority)
                 && Objects.equals(this.appId, other.appId)
-                && Objects.equals(this.nodeId, other.nodeId);
+                && Objects.equals(this.nodeId, other.nodeId)
+                && Objects.equals(this.deviceId, other.deviceId);
     }
 
     @Override
@@ -95,6 +104,8 @@
                 .add("selector", selector)
                 .add("priority", priority)
                 .add("appId", appId)
-                .add("nodeId", nodeId).toString();
+                .add("nodeId", nodeId)
+                .add("applies to", deviceId.isPresent() ? deviceId.get() : "all")
+                .toString();
     }
 }
\ No newline at end of file
diff --git a/core/api/src/main/java/org/onosproject/net/packet/PacketRequest.java b/core/api/src/main/java/org/onosproject/net/packet/PacketRequest.java
index 32f7cd5..78fe501 100644
--- a/core/api/src/main/java/org/onosproject/net/packet/PacketRequest.java
+++ b/core/api/src/main/java/org/onosproject/net/packet/PacketRequest.java
@@ -17,8 +17,11 @@
 
 import org.onosproject.cluster.NodeId;
 import org.onosproject.core.ApplicationId;
+import org.onosproject.net.DeviceId;
 import org.onosproject.net.flow.TrafficSelector;
 
+import java.util.Optional;
+
 /**
  * Represents a packet request made to devices.
  */
@@ -51,4 +54,12 @@
      * @return an node id
      */
     NodeId nodeId();
+
+    /**
+     * Obtains the optional device id.
+     *
+     * @return an optional containing a device id
+     */
+    Optional<DeviceId> deviceId();
+
 }
diff --git a/core/api/src/main/java/org/onosproject/net/packet/PacketService.java b/core/api/src/main/java/org/onosproject/net/packet/PacketService.java
index 2e7a1b9..d26956e 100644
--- a/core/api/src/main/java/org/onosproject/net/packet/PacketService.java
+++ b/core/api/src/main/java/org/onosproject/net/packet/PacketService.java
@@ -17,9 +17,11 @@
 
 import com.google.common.annotations.Beta;
 import org.onosproject.core.ApplicationId;
+import org.onosproject.net.DeviceId;
 import org.onosproject.net.flow.TrafficSelector;
 
 import java.util.List;
+import java.util.Optional;
 
 /**
  * Service for intercepting data plane packets and for emitting synthetic
@@ -66,9 +68,25 @@
      * @param priority the priority of the rule
      * @param appId    the application ID of the requester
      */
+    @Deprecated
     void requestPackets(TrafficSelector selector, PacketPriority priority,
                         ApplicationId appId);
 
+
+    /**
+     * Requests that packets matching the given selector are punted from the
+     * dataplane to the controller. If a deviceId is specified then the
+     * packet request is only installed at the device represented by that
+     * deviceId.
+     *
+     * @param selector the traffic selector used to match packets
+     * @param priority the priority of the rule
+     * @param appId    the application ID of the requester
+     * @param deviceId an optional deviceId
+     */
+    void requestPackets(TrafficSelector selector, PacketPriority priority,
+                        ApplicationId appId, Optional<DeviceId> deviceId);
+
     /**
      * Cancels previous packet requests for packets matching the given
      * selector to be punted from the dataplane to the controller.
@@ -77,10 +95,26 @@
      * @param priority the priority of the rule
      * @param appId    the application ID of the requester
      */
+    @Deprecated
     void cancelPackets(TrafficSelector selector, PacketPriority priority,
                        ApplicationId appId);
 
     /**
+     * Cancels previous packet requests for packets matching the given
+     * selector to be punted from the dataplane to the controller. If a
+     * deviceId is specified then the packet request is only withdrawn from
+     * the device represented by that deviceId.
+     *
+     * @param selector the traffic selector used to match packets
+     * @param priority the priority of the rule
+     * @param appId    the application ID of the requester
+     * @param deviceId an optional deviceId
+     */
+    void cancelPackets(TrafficSelector selector, PacketPriority priority,
+                       ApplicationId appId, Optional<DeviceId> deviceId);
+
+
+    /**
      * Returns list of all existing requests ordered by priority.
      *
      * @return list of existing packet requests
diff --git a/core/api/src/test/java/org/onosproject/net/packet/DefaultPacketRequestTest.java b/core/api/src/test/java/org/onosproject/net/packet/DefaultPacketRequestTest.java
index a7d07e8..9b4df54 100644
--- a/core/api/src/test/java/org/onosproject/net/packet/DefaultPacketRequestTest.java
+++ b/core/api/src/test/java/org/onosproject/net/packet/DefaultPacketRequestTest.java
@@ -24,6 +24,8 @@
 
 import com.google.common.testing.EqualsTester;
 
+import java.util.Optional;
+
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
 import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
@@ -42,27 +44,27 @@
             new DefaultPacketRequest(DefaultTrafficSelector.emptySelector(),
                                      PacketPriority.CONTROL,
                                      NetTestTools.APP_ID,
-                                     NetTestTools.NODE_ID);
+                                     NetTestTools.NODE_ID, Optional.empty());
     private final DefaultPacketRequest sameAsacketRequest1 =
             new DefaultPacketRequest(DefaultTrafficSelector.emptySelector(),
                                      PacketPriority.CONTROL,
                                      NetTestTools.APP_ID,
-                                     NetTestTools.NODE_ID);
+                                     NetTestTools.NODE_ID, Optional.empty());
     private final DefaultPacketRequest packetRequest2 =
             new DefaultPacketRequest(selector,
                                      PacketPriority.CONTROL,
                                      NetTestTools.APP_ID,
-                                     NetTestTools.NODE_ID);
+                                     NetTestTools.NODE_ID, Optional.empty());
     private final DefaultPacketRequest packetRequest3 =
             new DefaultPacketRequest(DefaultTrafficSelector.emptySelector(),
                                      PacketPriority.REACTIVE,
                                      NetTestTools.APP_ID,
-                                     NetTestTools.NODE_ID);
+                                     NetTestTools.NODE_ID, Optional.empty());
     private final DefaultPacketRequest packetRequest4 =
             new DefaultPacketRequest(DefaultTrafficSelector.emptySelector(),
                                      PacketPriority.CONTROL,
                                      new DefaultApplicationId(1, "foo"),
-                                     new NodeId("node1"));
+                                     new NodeId("node1"), Optional.empty());
 
     /**
      * Tests the operation of the equals(), toAstring() and hashCode() methods.
diff --git a/core/api/src/test/java/org/onosproject/net/packet/PacketServiceAdapter.java b/core/api/src/test/java/org/onosproject/net/packet/PacketServiceAdapter.java
index 2993ce6..c01dcc0 100644
--- a/core/api/src/test/java/org/onosproject/net/packet/PacketServiceAdapter.java
+++ b/core/api/src/test/java/org/onosproject/net/packet/PacketServiceAdapter.java
@@ -16,9 +16,11 @@
 package org.onosproject.net.packet;
 
 import org.onosproject.core.ApplicationId;
+import org.onosproject.net.DeviceId;
 import org.onosproject.net.flow.TrafficSelector;
 
 import java.util.List;
+import java.util.Optional;
 
 /**
  * Test adapter for packet service.
@@ -43,11 +45,25 @@
     }
 
     @Override
-    public void requestPackets(TrafficSelector selector, PacketPriority priority, ApplicationId appId) {
+    public void requestPackets(TrafficSelector selector, PacketPriority priority,
+                               ApplicationId appId) {
     }
 
     @Override
-    public void cancelPackets(TrafficSelector selector, PacketPriority priority, ApplicationId appId) {
+    public void requestPackets(TrafficSelector selector, PacketPriority priority,
+                               ApplicationId appId, Optional<DeviceId> deviceId) {
+
+    }
+
+    @Override
+    public void cancelPackets(TrafficSelector selector, PacketPriority priority,
+                              ApplicationId appId) {
+    }
+
+    @Override
+    public void cancelPackets(TrafficSelector selector, PacketPriority priority,
+                              ApplicationId appId, Optional<DeviceId> deviceId) {
+
     }
 
     @Override