/*
 * Copyright 2016-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.lisp.msg.types;

/**
 * Address Family Identifier (AFI) Enumeration class.
 *
 * An enumeration of AFIs defined by iana.
 * Now, we only declare 10 enums, more enums will be declared later on.
 *
 * http://www.iana.org/assignments/address-family-numbers/address-family-numbers.xhtml
 */
public enum AddressFamilyIdentifierEnum {

    NO_ADDRESS(0),              // Reserved
    IP(1),                      // IP (IP version 4)
    IP6(2),                     // IP6 (IP version 6)
    DNS(16),                    // Domain Name System
    DISTINGUISHED_NAME(17),     // Distinguished Name
    AS(18),                     // AS Number
    LCAF(16387),                // LISP Canonical Address Format (LCAF)
    MAC(16389),                 // 48-bit MAC
    OUI(16391),                 // 24-bit Organizationally Unique Identifier
    UNKNOWN(-1);                // Other Enums for internal use

    private final short ianaCode;

    AddressFamilyIdentifierEnum(int ianaCode) {
        this.ianaCode = (short) ianaCode;
    }

    /**
     * Obtains iana code value.
     *
     * @return iana code value
     */
    public short getIanaCode() {
        return ianaCode;
    }

    /**
     * Obtains AFI enum by providing iana code value.
     *
     * @param ianaCode iana code value
     * @return AFI enum
     */
    public static AddressFamilyIdentifierEnum valueOf(short ianaCode) {
        for (AddressFamilyIdentifierEnum val : values()) {
            if (val.getIanaCode() == ianaCode) {
                return val;
            }
        }
        return UNKNOWN;
    }
}
