/*
 * Copyright 2016-present Open Networking Foundation
 *
 * 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.openstacknetworking.api;

import com.google.common.collect.ImmutableMap;
import org.onlab.packet.MacAddress;

import java.util.Map;

/**
 * Provides constants used in OpenStackSwitching.
 */
public final class Constants {

    private Constants() {
    }

    /**
     * List of valid openstack port types.
     */
    public enum VnicType {
        NORMAL,
        DIRECT,
        UNSUPPORTED
    }
    public static final String PORT_NAME_PREFIX_VM = "tap";
    public static final String PORT_NAME_VHOST_USER_PREFIX_VM = "vhu";

    public static final String OPENSTACK_NETWORKING_APP_ID = "org.onosproject.openstacknetworking";

    public static final String ARP_BROADCAST_MODE = "broadcast";
    public static final String ARP_PROXY_MODE = "proxy";

    public static final String DEFAULT_GATEWAY_MAC_STR = "fe:00:00:00:00:02";
    public static final String DEFAULT_ARP_MODE_STR = ARP_PROXY_MODE;
    public static final MacAddress DEFAULT_GATEWAY_MAC = MacAddress.valueOf(DEFAULT_GATEWAY_MAC_STR);
    public static final MacAddress DEFAULT_EXTERNAL_ROUTER_MAC = MacAddress.valueOf("fe:00:00:00:00:01");

    public static final String PCI_VENDOR_INFO = "pci_vendor_info";
    public static final String DIRECT = "direct";
    public static final String PCISLOT = "pci_slot";

    public static final String ANNOTATION_NETWORK_ID = "networkId";
    public static final String ANNOTATION_PORT_ID = "portId";
    public static final String ANNOTATION_CREATE_TIME = "createTime";
    public static final String ANNOTATION_SEGMENT_ID = "segId";
    public static final String UNSUPPORTED_VENDOR = "unsupported_vendor";

    public static final int PRIORITY_TUNNEL_TAG_RULE = 30000;
    public static final int PRIORITY_FLOATING_INTERNAL = 42000;
    public static final int PRIORITY_FLOATING_EXTERNAL = 41000;
    public static final int PRIORITY_STATEFUL_SNAT_RULE = 40500;
    public static final int PRIORITY_ICMP_RULE = 43000;
    public static final int PRIORITY_INTERNAL_ROUTING_RULE = 28000;
    public static final int PRIORITY_EXTERNAL_ROUTING_RULE = 25000;
    public static final int PRIORITY_EXTERNAL_FLOATING_ROUTING_RULE = 27000;
    public static final int PRIORITY_SNAT_RULE = 26000;
    public static final int PRIORITY_SWITCHING_RULE = 30000;
    public static final int PRIORITY_FLAT_JUMP_UPSTREAM_RULE = 41000;
    public static final int PRIORITY_FLAT_JUMP_DOWNSTREAM_RULE = 41000;
    public static final int PRIORITY_FLAT_UPSTREAM_RULE = 41000;
    public static final int PRIORITY_FLAT_DOWNSTREAM_RULE = 42000;
    public static final int PRIORITY_DHCP_RULE = 42000;
    public static final int PRIORITY_ADMIN_RULE = 32000;
    public static final int PRIORITY_ACL_RULE = 31000;
    public static final int PRIORITY_CT_HOOK_RULE = 30500;
    public static final int PRIORITY_CT_RULE = 32000;
    public static final int PRIORITY_CT_DROP_RULE = 32500;
    public static final int PRIORITY_ARP_GATEWAY_RULE = 41000;
    public static final int PRIORITY_ARP_SUBNET_RULE = 40000;
    public static final int PRIORITY_ARP_CONTROL_RULE = 40000;
    public static final int PRIORITY_ARP_REPLY_RULE = 40000;
    public static final int PRIORITY_ARP_REQUEST_RULE = 40000;
    public static final int PRIORITY_FORCED_ACL_RULE = 50000;
    public static final int PRIORITY_ICMP_PROBE_RULE = 50000;

    // flow table index
    public static final int STAT_INBOUND_TABLE = 0;
    public static final int VTAP_INBOUND_TABLE = 1;
    public static final int VTAP_INBOUND_MIRROR_TABLE = 2;
    public static final int STAT_FLAT_OUTBOUND_TABLE = 10;
    public static final int VTAP_FLAT_OUTBOUND_TABLE = 11;
    public static final int VTAP_FLAT_OUTBOUND_MIRROR_TABLE = 12;
    public static final int DHCP_ARP_TABLE = 5;
    public static final int FLAT_TABLE = 20;
    public static final int VTAG_TABLE = 30;
    public static final int ACL_TABLE = 40;
    public static final int CT_TABLE = 41;
    public static final int JUMP_TABLE = 50;
    public static final int ROUTING_TABLE = 60;
    public static final int STAT_OUTBOUND_TABLE = 70;
    public static final int VTAP_OUTBOUND_TABLE = 71;
    public static final int VTAP_OUTBOUND_MIRROR_TABLE = 72;
    public static final int FORWARDING_TABLE = 80;
    public static final int GW_COMMON_TABLE = 0;
    public static final int ERROR_TABLE = 100;

    // group table index
    public static final int VTAP_INBOUND_GROUP_TABLE = 1;
    public static final int VTAP_FLAT_OUTBOUND_GROUP_TABLE = 2;
    public static final int VTAP_OUTBOUND_GROUP_TABLE = 3;

    public static Map<String, String> portNamePrefixMap() {
        return PORT_NAME_PREFIX_MAP;
    }

    private static final String CAVIUM_PCI_VENDOR_INFO = "177d:9712";
    private static final String PORT_NAME_PREFIX_CAVIUM = "enp";

    private static final Map<String, String> PORT_NAME_PREFIX_MAP = createPortNamePrefixMap();
    private static Map<String, String> createPortNamePrefixMap() {
        //Additional pci vendor information will be added
        return ImmutableMap.of(CAVIUM_PCI_VENDOR_INFO, PORT_NAME_PREFIX_CAVIUM);
    }
}