package net.floodlightcontroller.util;

import org.codehaus.jackson.annotate.JsonProperty;

/**
 * The class representing a network port of a switch.
 */

public class Port {
    /**
     * Special port values.
     *
     * Those values are taken as-is from the OpenFlow-v1.0.0 specification
     * (pp 18-19).
     */
    public enum PortValues {
	/* Maximum number of physical switch ports. */
	PORT_MAX		((short)0xff00),

	/* Fake output "ports". */

	/* Send the packet out the input port. This
	   virtual port must be explicitly used
	   in order to send back out of the input
	   port. */
	PORT_IN_PORT		((short)0xfff8),

	/* Perform actions in flow table.
	   NB: This can only be the destination
	   port for packet-out messages. */
	PORT_TABLE		((short)0xfff9),

	/* Process with normal L2/L3 switching. */
	PORT_NORMAL		((short)0xfffa),

	/* All physical ports except input port and
	   those disabled by STP. */
	PORT_FLOOD		((short)0xfffb),

	/* All physical ports except input port. */
	PORT_ALL		((short)0xfffc),

	/* Send to controller. */
	PORT_CONTROLLER		((short)0xfffd),

	/* Local openflow "port". */
	PORT_LOCAL		((short)0xfffe),

	/* Not associated with a physical port. */
	PORT_NONE		((short)0xffff);

	private final short value;	// The value

	/**
	 * Constructor for a given value.
	 *
	 * @param value the value to use for the initialization.
	 */
	private PortValues(short value) {
	    this.value = value;
	}

	/**
	 * Get the value as a short integer.
	 *
	 * @return the value as a short integer.
	 */
	private short value() { return this.value; }
    }

    private short value;

    /**
     * Default constructor.
     */
    public Port() {
	this.value = 0;
    }

    /**
     * Constructor from another entry.
     *
     * @param other the other entry to use.
     */
    public Port(Port other) {
	this.value = other.value();
    }

    /**
     * Constructor from a short integer value.
     *
     * @param value the value to use.
     */
    public Port(short value) {
	this.value = value;
    }

    /**
     * Constructor from a PortValues enum value.
     *
     * @param value the value to use.
     */
    public Port(PortValues value) {
	this.value = value.value();
    }

    /**
     * Get the value of the port.
     *
     * @return the value of the port.
     */
    @JsonProperty("value")
    public short value() { return value; }

    /**
     * Set the value of the port.
     *
     * @param value the value to set.
     */
    @JsonProperty("value")
    public void setValue(short value) {
	this.value = value;
    }

    /**
     * Convert the port value to a string.
     *
     * @return the port value as a string.
     */
    @Override
    public String toString() {
	return Short.toString(this.value);
    }
}
