/*
 * Copyright 2014-present 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.flow.criteria;


/**
 * Representation of a single header field selection.
 */
public interface Criterion {

    static final String SEPARATOR = ":";

    /**
     * Types of fields to which the selection criterion may apply.
     */
    // From page 75 of OpenFlow 1.5.0 spec
    enum Type {
        /** Switch input port. */
        IN_PORT,

        /** Switch physical input port. */
        IN_PHY_PORT,

        /** Metadata passed between tables. */
        METADATA,

        /** Ethernet destination address. */
        ETH_DST,

        /** Ethernet destination address with masking. */
        ETH_DST_MASKED,

        /** Ethernet source address. */
        ETH_SRC,

        /** Ethernet source address with masking. */
        ETH_SRC_MASKED,

        /** Ethernet frame type. */
        ETH_TYPE,

        /** VLAN id. */
        VLAN_VID,

        /** VLAN priority. */
        VLAN_PCP,

        /**
         * Inner VLAN id.
         *
         * Note: Some drivers may not support this.
         */
        INNER_VLAN_VID,

        /**
         * Inner VLAN pcp.
         *
         * Note: Some drivers may not support this.
         */
        INNER_VLAN_PCP,

        /** IP DSCP (6 bits in ToS field). */
        IP_DSCP,

        /** IP ECN (2 bits in ToS field). */
        IP_ECN,

        /** IP protocol. */
        IP_PROTO,

        /** IPv4 source address. */
        IPV4_SRC,

        /** IPv4 destination address. */
        IPV4_DST,

        /** TCP source port. */
        TCP_SRC,

        /** TCP source port with masking. */
        TCP_SRC_MASKED,

        /** TCP destination port. */
        TCP_DST,

        /** TCP destination port with masking. */
        TCP_DST_MASKED,

        /** UDP source port. */
        UDP_SRC,

        /** UDP source port with masking. */
        UDP_SRC_MASKED,

        /** UDP destination port. */
        UDP_DST,

        /** UDP destination port with masking. */
        UDP_DST_MASKED,

        /** SCTP source port. */
        SCTP_SRC,

        /** SCTP source port with masking. */
        SCTP_SRC_MASKED,

        /** SCTP destination port. */
        SCTP_DST,

        /** SCTP destination port with masking. */
        SCTP_DST_MASKED,

        /** ICMP type. */
        ICMPV4_TYPE,

        /** ICMP code. */
        ICMPV4_CODE,

        /** ARP opcode. */
        ARP_OP,

        /** ARP source IPv4 address. */
        ARP_SPA,

        /** ARP target IPv4 address. */
        ARP_TPA,

        /** ARP source hardware address. */
        ARP_SHA,

        /** ARP target hardware address. */
        ARP_THA,

        /** IPv6 source address. */
        IPV6_SRC,

        /** IPv6 destination address. */
        IPV6_DST,

        /** IPv6 Flow Label. */
        IPV6_FLABEL,

        /** ICMPv6 type. */
        ICMPV6_TYPE,

        /** ICMPv6 code. */
        ICMPV6_CODE,

        /** Target address for ND. */
        IPV6_ND_TARGET,

        /** Source link-layer for ND. */
        IPV6_ND_SLL,

        /** Target link-layer for ND. */
        IPV6_ND_TLL,

        /** MPLS label. */
        MPLS_LABEL,

        /** MPLS TC. */
        MPLS_TC,

        /**  MPLS BoS bit. */
        MPLS_BOS,

        /** PBB I-SID. */
        PBB_ISID,

        /** Logical Port Metadata. */
        TUNNEL_ID,

        /** IPv6 Extension Header pseudo-field. */
        IPV6_EXTHDR,

        /** Unassigned value: 40. */
        UNASSIGNED_40,

        /** PBB UCA header field. */
        PBB_UCA,

        /** TCP flags. */
        TCP_FLAGS,

        /** Output port from action set metadata. */
        ACTSET_OUTPUT,

        /** Packet type value. */
        PACKET_TYPE,

        //
        // NOTE: Everything below is defined elsewhere: ONOS-specific,
        // extensions, etc.
        //
        /** Optical channel signal ID (lambda). */
        OCH_SIGID,

        /** Optical channel signal type (fixed or flexible). */
        OCH_SIGTYPE,

        /** ODU (Optical channel Data Unit) signal ID. */
        ODU_SIGID,

        /** ODU (Optical channel Data Unit) signal type. */
        ODU_SIGTYPE,

        /** Extension criterion. */
        EXTENSION,

        /** An empty criterion. */
        DUMMY
    }

    /**
     * Returns the type of criterion.
     *
     * @return type of criterion
     */
    Type type();

    /**
     * Bit definitions for IPv6 Extension Header pseudo-field.
     * From page 79 of OpenFlow 1.5.0 spec.
     */
    enum IPv6ExthdrFlags {
        /** "No next header" encountered. */
        NONEXT((short) (1 << 0)),
        /** Encrypted Sec Payload header present. */
        ESP((short) (1 << 1)),
        /** Authentication header present. */
        AUTH((short) (1 << 2)),
        /** 1 or 2 dest headers present. */
        DEST((short) (1 << 3)),
        /** Fragment header present. */
        FRAG((short) (1 << 4)),
        /** Router header present. */
        ROUTER((short) (1 << 5)),
        /** Hop-by-hop header present. */
        HOP((short) (1 << 6)),
        /** Unexpected repeats encountered. */
        UNREP((short) (1 << 7)),
        /** Unexpected sequencing encountered. */
        UNSEQ((short) (1 << 8));

        private short value;

        IPv6ExthdrFlags(short value) {
            this.value = value;
        }

        /**
         * Gets the value as an integer.
         *
         * @return the value as an integer
         */
        public short getValue() {
            return this.value;
        }
    }

    enum TcpFlags {

        /** ECN-nonce concealment protection. */
        NS((short) (1 << 0)),
        /** Congestion Window Reduced. */
        CWR((short) (1 << 1)),
        /** ECN-Echo. **/
        ECE((short) (1 << 2)),
        /** Urgent pointer field is significant. */
        URG((short) (1 << 3)),
        /** Acknowledgment field is significant. */
        ACK((short) (1 << 4)),
        /** Push the buffered data to the receiving application. */
        PSH((short) (1 << 5)),
        /** Reset the connection. */
        RST((short) (1 << 6)),
        /** Synchronize sequence numbers. */
        SYN((short) (1 << 7)),
        /** No more data from sender. */
        FIN((short) (1 << 8));

        private short value;

        TcpFlags(short value) {
            this.value = value;
        }

        /**
         * Gets the value as an integer.
         *
         * @return the value as an integer
         */
        public short getValue() {
            return this.value;
        }
    }
}
