Small refactoring to support new packet-out API

Change-Id: I33094045b074fc00352ec1ba62e18e690dc3f3ad
diff --git a/src/main/java/net/onrc/onos/core/packetservice/BroadcastPacketOutNotification.java b/src/main/java/net/onrc/onos/core/packetservice/BroadcastPacketOutNotification.java
new file mode 100644
index 0000000..cea27ae
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/packetservice/BroadcastPacketOutNotification.java
@@ -0,0 +1,73 @@
+package net.onrc.onos.core.packetservice;
+
+
+// TODO This class is too generic to be handled by ProxyArpService.
+// TODO The generic broadcast packet shouldn't contain an IP address which is
+// only for ARP packets.
+
+/**
+ * Notification to all ONOS instances to broadcast this packet out the edge of
+ * the network. The edge is defined as any port that doesn't have a link to
+ * another switch. The one exception is the port that the packet was received
+ * on.
+ */
+public class BroadcastPacketOutNotification extends PacketOutNotification {
+
+    private static final long serialVersionUID = 1L;
+
+    private final int address;
+    private final long inSwitch;
+    private final short inPort;
+
+    protected BroadcastPacketOutNotification() {
+        super();
+        this.address = -1;
+        this.inSwitch = -1;
+        this.inPort = -1;
+    }
+
+    /**
+     * Class constructor.
+     *
+     * @param packet   packet data to send in the packet-out
+     * @param address  target IP address if the packet is an ARP packet
+     * @param inSwitch dpid of the switch the packet was received on
+     * @param inPort   port number of the receiving port
+     */
+    public BroadcastPacketOutNotification(byte[] packet, int address,
+                                          long inSwitch, short inPort) {
+        super(packet);
+
+        this.address = address;
+        this.inSwitch = inSwitch;
+        this.inPort = inPort;
+    }
+
+    /**
+     * Get the dpid of the switch the packet was received on.
+     *
+     * @return receiving switch dpid
+     */
+    public long getInSwitch() {
+        return inSwitch;
+    }
+
+    /**
+     * Get the port number of the port the packet was received on.
+     *
+     * @return receiving port number
+     */
+    public short getInPort() {
+        return inPort;
+    }
+
+    /**
+     * Get the target IP address if the packet is an ARP packet.
+     *
+     * @return the target IP address for ARP packets, or null if the packet is
+     * not an ARP packet
+     */
+    public int getTargetAddress() {
+        return address;
+    }
+}
diff --git a/src/main/java/net/onrc/onos/core/packetservice/PacketOutNotification.java b/src/main/java/net/onrc/onos/core/packetservice/PacketOutNotification.java
new file mode 100644
index 0000000..30e3986
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/packetservice/PacketOutNotification.java
@@ -0,0 +1,34 @@
+package net.onrc.onos.core.packetservice;
+
+import java.io.Serializable;
+import java.util.Arrays;
+
+/**
+ * A PacketOutNotification contains data sent between ONOS instances that
+ * directs other instances to send a packet out a set of ports. This is an
+ * abstract base class that will be subclassed by specific types of
+ * notifications.
+ */
+public abstract class PacketOutNotification implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private final byte[] packet;
+
+    /**
+     * Class constructor.
+     *
+     * @param packet the packet data to send in the packet-out
+     */
+    public PacketOutNotification() {
+        packet = null;
+    }
+
+    public PacketOutNotification(byte[] packet) {
+        this.packet = Arrays.copyOf(packet, packet.length);
+    }
+
+    public byte[] getPacketData() {
+        return Arrays.copyOf(packet, packet.length);
+    }
+}
diff --git a/src/main/java/net/onrc/onos/core/packetservice/SinglePacketOutNotification.java b/src/main/java/net/onrc/onos/core/packetservice/SinglePacketOutNotification.java
new file mode 100644
index 0000000..4e9f47d
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/packetservice/SinglePacketOutNotification.java
@@ -0,0 +1,61 @@
+package net.onrc.onos.core.packetservice;
+
+
+// TODO This class is too generic to be handled by ProxyArpService.
+
+/**
+ * Notification to another ONOS instance to send a packet out a single port.
+ */
+public class SinglePacketOutNotification extends PacketOutNotification {
+
+    private static final long serialVersionUID = 1L;
+
+    private final int address;
+    private final long outSwitch;
+    private final short outPort;
+
+    /**
+     * Class constructor.
+     *
+     * @param packet    the packet data to send in the packet-out
+     * @param address   target IP address if the packet is an ARP packet
+     * @param outSwitch the dpid of the switch to send the packet on
+     * @param outPort   the port number of the port to send the packet out
+     */
+    public SinglePacketOutNotification(byte[] packet, int address,
+                                       long outSwitch, short outPort) {
+        super(packet);
+
+        this.address = address;
+        this.outSwitch = outSwitch;
+        this.outPort = outPort;
+    }
+
+    /**
+     * Get the dpid of the switch the packet will be sent out.
+     *
+     * @return the switch's dpid
+     */
+    public long getOutSwitch() {
+        return outSwitch;
+    }
+
+    /**
+     * Get the port number of the port the packet will be sent out.
+     *
+     * @return the port number
+     */
+    public short getOutPort() {
+        return outPort;
+    }
+
+    /**
+     * Get the target IP address if the packet is an ARP packet.
+     *
+     * @return the target IP address for ARP packets, or null if the packet is
+     * not an ARP packet
+     */
+    public int getTargetAddress() {
+        return address;
+    }
+}
diff --git a/src/main/java/net/onrc/onos/core/util/serializers/KryoFactory.java b/src/main/java/net/onrc/onos/core/util/serializers/KryoFactory.java
index 8c77fc8..e229d30 100644
--- a/src/main/java/net/onrc/onos/core/util/serializers/KryoFactory.java
+++ b/src/main/java/net/onrc/onos/core/util/serializers/KryoFactory.java
@@ -8,8 +8,6 @@
 
 import net.floodlightcontroller.util.MACAddress;
 import net.onrc.onos.apps.proxyarp.ArpReplyNotification;
-import net.onrc.onos.apps.proxyarp.BroadcastPacketOutNotification;
-import net.onrc.onos.apps.proxyarp.SinglePacketOutNotification;
 import net.onrc.onos.core.devicemanager.OnosDevice;
 import net.onrc.onos.core.intent.ConstrainedShortestPathIntent;
 import net.onrc.onos.core.intent.ErrorIntent;
@@ -19,6 +17,8 @@
 import net.onrc.onos.core.intent.PathIntent;
 import net.onrc.onos.core.intent.ShortestPathIntent;
 import net.onrc.onos.core.intent.runtime.IntentStateList;
+import net.onrc.onos.core.packetservice.BroadcastPacketOutNotification;
+import net.onrc.onos.core.packetservice.SinglePacketOutNotification;
 import net.onrc.onos.core.topology.DeviceEvent;
 import net.onrc.onos.core.topology.LinkEvent;
 import net.onrc.onos.core.topology.Path;
@@ -50,6 +50,7 @@
 import net.onrc.onos.core.util.Switch;
 // import net.onrc.onos.core.util.SwitchPort;
 
+
 import com.esotericsoftware.kryo.Kryo;
 
 /**