Moved default flows logic into the PacketManager.

This prevents us duplicating code in each of the apps and allows us to manage
packet requests better in the future.

Change-Id: I5656b2f0f3cecd3e42fe7b4a0a5ab7cb6582bb25
diff --git a/core/api/src/main/java/org/onosproject/net/packet/PacketPriority.java b/core/api/src/main/java/org/onosproject/net/packet/PacketPriority.java
new file mode 100644
index 0000000..de9fe31
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/packet/PacketPriority.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.net.packet;
+
+/**
+ * Priorities available to applications for requests for packets from the data
+ * plane.
+ */
+public enum PacketPriority {
+    /**
+     * High priority for control traffic. This will result in all traffic
+     * matching the selector being sent to the controller.
+     */
+    CONTROL(40000),
+
+    /**
+     * Low priority for reactive applications. Packets are only sent to the
+     * controller if they fail to match any of the rules installed in the switch.
+     */
+    REACTIVE(5);
+
+    private final int priorityValue;
+
+    private PacketPriority(int priorityValue) {
+        this.priorityValue = priorityValue;
+    }
+
+    /**
+     * Returns the integer value of the priority level.
+     *
+     * @return priority value
+     */
+    public int priorityValue() {
+        return priorityValue;
+    }
+}
\ No newline at end of file
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 d4780e1..c6d6837 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
@@ -15,6 +15,9 @@
  */
 package org.onosproject.net.packet;
 
+import org.onosproject.core.ApplicationId;
+import org.onosproject.net.flow.TrafficSelector;
+
 /**
  * Service for intercepting data plane packets and for emitting synthetic
  * outbound packets.
@@ -35,6 +38,8 @@
      */
     void addProcessor(PacketProcessor processor, int priority);
 
+    // TODO allow processors to register for particular types of packets
+
     /**
      * Removes the specified processor from the processing pipeline.
      *
@@ -43,6 +48,19 @@
     void removeProcessor(PacketProcessor processor);
 
     /**
+     * Requests that packets matching the given selector are punted from the
+     * dataplane to the controller.
+     *
+     * @param selector the traffic selector used to match packets
+     * @param priority the priority of the rule
+     * @param appId the application ID of the requester
+     */
+    void requestPackets(TrafficSelector selector, PacketPriority priority,
+                        ApplicationId appId);
+
+    // TODO add API to allow applications to revoke requests when they deactivate
+
+    /**
      * Emits the specified outbound packet onto the network.
      *
      * @param packet outbound packet