/*
 *
 *    Copyright (c) 2015-2017 Nest Labs, Inc.
 *    All rights reserved.
 *
 *    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.
 */

/**
 *    @file
 *      This file contains constants corresponding to numbers assigned
 *      by the Internet Assigned Number Authority (IANA) that are used
 *      in the abstract programming interface of the Inet layer, and
 *      which are defined independently here from their corresponding
 *      definitions in any underlying IP stacks.
 */

#ifndef IANACONSTANTS_H
#define IANACONSTANTS_H

namespace nl {
namespace Inet {

/**
 *  @enum IPVersion
 *
 *  The version of the IP protocol being used.
 *
 */
typedef enum
{
    kIPVersion_6 = 6,          /**< IPv6 */
#if INET_CONFIG_ENABLE_IPV4
    kIPVersion_4 = 4,          /**< IPv4 */
#endif // INET_CONFIG_ENABLE_IPV4
} IPVersion;

/**
 *  @enum IPProtocol
 *
 *  The numbers of some of the protocols in the IP family.
 *
 */
typedef enum
{
    kIPProtocol_ICMPv6 = 58,   /**< ICMPv6 */
#if INET_CONFIG_ENABLE_IPV4
    kIPProtocol_ICMPv4 = 1,    /**< ICMPv4 */
#endif // INET_CONFIG_ENABLE_IPV4
} IPProtocol;

/**
 * @brief   Internet protocol multicast address scope
 *
 * @details
 *  Values of the \c IPv6MulticastScope type are used to call the
 *  <tt>IPAddress::MakeIPv6Multicast()</tt> method. They indicate the routable
 *  scope of the multicast group designated by the result. These numbers are
 *  registered by IETF with IANA.
 */
typedef enum
{
    /** Interface-local scope. */
    kIPv6MulticastScope_Interface       = 1,

    /** Link-local scope. */
    kIPv6MulticastScope_Link            = 2,

#if INET_CONFIG_ENABLE_IPV4
    /** Realm-local ("IPv4") scope. */
    kIPv6MulticastScope_IPv4            = 3,
#else // !INET_CONFIG_ENABLE_IPV4
    /** Realm-local scope. */
    kIPv6MulticastScope_Realm           = 3,
#endif // !INET_CONFIG_ENABLE_IPV4

    /** Realm-local scope. */
    kIPv6MulticastScope_Admin           = 4,

    /** Realm-local scope. */
    kIPv6MulticastScope_Site            = 5,

    /** Organization-local scope. */
    kIPv6MulticastScope_Organization    = 8,

    /** Global scope. */
    kIPv6MulticastScope_Global          = 14
} IPv6MulticastScope;

/**
 * @brief   Internet protocol multicast group identifiers
 *
 * @details
 *  Values of the \c IPV6MulticastGroup type are used to call the
 *  <tt>IPAddress::MakeIPv6Multicast()</tt> method. They indicate
 *  distinguished group identifiers registered by IETF with IANA.
 */
enum IPV6MulticastGroup
{
    kIPV6MulticastGroup_AllNodes        = 1,    /** RFC 4291 */
    kIPV6MulticastGroup_AllRouters      = 2     /** RFC 4291 */
};

} // namespace Inet
} // namespace nl

#endif // !defined(IANACONSTANTS_H)
