Implemented multi-instance packet out.

We've defined a PacketStore abstraction through which outbound packets are
sent. The packet store has a simple implementation (basically a no-op) and a
distributed implementation on top of the cluster messaging service.

Change-Id: Ib32753314fe518ef1fd67c858db744b004539938
diff --git a/core/api/src/main/java/org/onlab/onos/net/packet/PacketEvent.java b/core/api/src/main/java/org/onlab/onos/net/packet/PacketEvent.java
new file mode 100644
index 0000000..e604e53
--- /dev/null
+++ b/core/api/src/main/java/org/onlab/onos/net/packet/PacketEvent.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2014 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.onlab.onos.net.packet;
+
+import org.onlab.onos.event.AbstractEvent;
+
+/**
+ * Describes a packet event.
+ */
+public class PacketEvent extends AbstractEvent<PacketEvent.Type, OutboundPacket> {
+
+    /**
+     * Type of packet events.
+     */
+    public enum Type {
+        /**
+         * Signifies that the packet should be emitted out a local port.
+         */
+        EMIT
+    }
+
+    /**
+     * Creates an event of the given type for the specified packet.
+     *
+     * @param type the type of the event
+     * @param packet the packet the event is about
+     */
+    public PacketEvent(Type type, OutboundPacket packet) {
+        super(type, packet);
+    }
+
+    /**
+     * Creates an event of the given type for the specified packet at the given
+     * time.
+     *
+     * @param type the type of the event
+     * @param packet the packet the event is about
+     * @param time the time of the event
+     */
+    public PacketEvent(Type type, OutboundPacket packet, long time) {
+        super(type, packet, time);
+    }
+}
diff --git a/core/api/src/main/java/org/onlab/onos/net/packet/PacketStore.java b/core/api/src/main/java/org/onlab/onos/net/packet/PacketStore.java
new file mode 100644
index 0000000..6d00d65
--- /dev/null
+++ b/core/api/src/main/java/org/onlab/onos/net/packet/PacketStore.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2014 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.onlab.onos.net.packet;
+
+import org.onlab.onos.store.Store;
+
+/**
+ * Manages routing of outbound packets.
+ */
+public interface PacketStore extends Store<PacketEvent, PacketStoreDelegate> {
+
+    /**
+     * Decides which instance should emit the packet and forwards the packet to
+     * that instance. The relevant PacketManager is notified via the
+     * PacketStoreDelegate that it should emit the packet.
+     *
+     * @param packet the packet to emit
+     */
+    void emit(OutboundPacket packet);
+
+}
diff --git a/core/api/src/main/java/org/onlab/onos/net/packet/PacketStoreDelegate.java b/core/api/src/main/java/org/onlab/onos/net/packet/PacketStoreDelegate.java
new file mode 100644
index 0000000..6e19ad2
--- /dev/null
+++ b/core/api/src/main/java/org/onlab/onos/net/packet/PacketStoreDelegate.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2014 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.onlab.onos.net.packet;
+
+import org.onlab.onos.store.StoreDelegate;
+
+/**
+ * Packet store delegate abstraction.
+ */
+public interface PacketStoreDelegate extends StoreDelegate<PacketEvent> {
+}