package net.onrc.onos.core.packetservice;

import java.io.Serializable;
import java.util.Arrays;

import net.onrc.onos.core.topology.Topology;

import com.google.common.collect.Multimap;

/**
 * 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;

    /**
     * Default constructor, used for deserialization.
     */
    protected PacketOutNotification() {
        packet = null;
    }

    /**
     * Class constructor.
     *
     * @param packet the packet data to send in the packet-out
     */
    public PacketOutNotification(byte[] packet) {
        this.packet = Arrays.copyOf(packet, packet.length);
    }

    /**
     * Gets the packet that needs to be sent into the network.
     *
     * @return the packet data as a serialized byte array
     */
    public byte[] getPacketData() {
        return Arrays.copyOf(packet, packet.length);
    }

    /**
     * Calculate a list of local ports that the packet should be sent out.
     * <p/>
     * A {@link PacketOutNotification} contains a high-level description of the
     * where to send the packet. The receiver of the notification needs to know
     * an explicit list of ports to send the packet out. This function will
     * calculate that list, given the list of edge ports controlled by this
     * instance.
     *
     * @param localPorts the map of locally-controlled ports
     * @param topology an instance of the global topology
     * @return a multimap of ports that the packet should be sent out,
     * in the form
     * {@code {dpid1 => {portnum1, portnum2, ...}, dpid2 => {portnum1}, ...}}
     */
    public abstract Multimap<Long, Short> calculateOutPorts(
            Multimap<Long, Short> localPorts, Topology topology);
}
