/*
 *  Copyright (c) 2016, The OpenThread Authors.
 *  All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *  1. Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *  2. Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *  3. Neither the name of the copyright holder nor the
 *     names of its contributors may be used to endorse or promote products
 *     derived from this software without specific prior written permission.
 *
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 *  POSSIBILITY OF SUCH DAMAGE.
 */

/**
 * @file
 *   This file includes definitions for MLE functionality required by the Thread Child, Router, and Leader roles.
 */

#ifndef MLE_CONSTANTS_HPP_
#define MLE_CONSTANTS_HPP_

namespace ot {
namespace Mle {

/**
 * @addtogroup core-mle-core
 *
 */

enum
{
    kMaxChildren                = OPENTHREAD_CONFIG_MAX_CHILDREN,
    kMaxChildKeepAliveAttempts  = 4,    ///< Maximum keep alive attempts before attempting to reattach to a new Parent
    kFailedChildTransmissions   = 4,    ///< FAILED_CHILD_TRANSMISSIONS
};

/**
 * MLE Protocol Constants
 *
 */
enum
{
    kVersion                       = 2,     ///< MLE Version
    kUdpPort                       = 19788, ///< MLE UDP Port
    kParentRequestRouterTimeout    = 750,   ///< Router Request timeout
    kParentRequestChildTimeout     = 1250,  ///< End Device Request timeout
    kParentResponseMaxDelayRouters = 500,   ///< Maximum delay for response for Parent Request sent to routers only
    kParentResponseMaxDelayAll     = 1000,  ///< Maximum delay for response for Parent Request sent to all devices
    kUnicastRetransmissionDelay    = 1000,  ///< Base delay before retransmitting an MLE unicast.
    kMaxResponseDelay              = 1000,  ///< Maximum delay before responding to a multicast request
    kMaxChildIdRequestTimeout      = 5000,  ///< Maximum delay for receiving a Child ID Request
    kMaxChildUpdateResponseTimeout = 2000,  ///< Maximum delay for receiving a Child Update Response
    kMinTimeout                    = (((kMaxChildKeepAliveAttempts + 1) * kUnicastRetransmissionDelay) / 1000),  ///< Minimum timeout(s)
};

enum
{
    kMinChildId                 = 1,     ///< Minimum Child ID
    kMaxChildId                 = 511,   ///< Maximum Child ID
    kRouterIdOffset             = 10,    ///< Bit offset of Router ID in RLOC16
    kRlocPrefixLength           = 14,    ///< Prefix length of RLOC in bytes
};

/**
 * Routing Protocol Constants
 *
 */
enum
{
    kAdvertiseIntervalMin       = 1,                ///< ADVERTISEMENT_I_MIN (seconds)
    kAdvertiseIntervalMax       = 32,               ///< ADVERTISEMENT_I_MAX (seconds)
    kFailedRouterTransmissions  = 4,                ///< FAILED_ROUTER_TRANSMISSIONS
    kRouterIdReuseDelay         = 100,              ///< ID_REUSE_DELAY (seconds)
    kRouterIdSequencePeriod     = 10,               ///< ID_SEQUENCE_PERIOD (seconds)
    kMaxNeighborAge             = 100,              ///< MAX_NEIGHBOR_AGE (seconds)
    kMaxRouteCost               = 16,               ///< MAX_ROUTE_COST
    kMaxRouterId                = 62,               ///< MAX_ROUTER_ID
    kInvalidRouterId            = kMaxRouterId + 1, ///< Value indicating incorrect Router Id
    kMaxRouters                 = 32,               ///< MAX_ROUTERS
    kMinDowngradeNeighbors      = 7,                ///< MIN_DOWNGRADE_NEIGHBORS
    kNetworkIdTimeout           = 120,              ///< NETWORK_ID_TIMEOUT (seconds)
    kParentRouteToLeaderTimeout = 20,               ///< PARENT_ROUTE_TO_LEADER_TIMEOUT (seconds)
    kRouterSelectionJitter      = 120,              ///< ROUTER_SELECTION_JITTER (seconds)
    kRouterDowngradeThreshold   = 23,               ///< ROUTER_DOWNGRADE_THRESHOLD (routers)
    kRouterUpgradeThreshold     = 16,               ///< ROUTER_UPGRADE_THRESHOLD (routers)
    kMaxLeaderToRouterTimeout   = 90,               ///< INFINITE_COST_TIMEOUT (seconds)
    kReedAdvertiseInterval      = 570,              ///< REED_ADVERTISEMENT_INTERVAL (seconds)
    kReedAdvertiseJitter        = 60,               ///< REED_ADVERTISEMENT_JITTER (seconds)
    kLeaderWeight               = 64,               ///< Default leader weight for the Thread Network Partition
    kMleEndDeviceTimeout        = OPENTHREAD_CONFIG_DEFAULT_CHILD_TIMEOUT,  ///< MLE_END_DEVICE_TIMEOUT (seconds)
};

/**
 * Parent Priority values
 *
 */
enum
{
    kParentPriorityHigh        = 1,    // Parent Priority High
    kParentPriorityMedium      = 0,    // Parent Priority Medium (default)
    kParentPriorityLow         = -1,   // Parent Priority Low
    kParentPriorityUnspecified = -2,   // Parent Priority Unspecified
};

enum
{
    kLinkQuality3LinkCost       = 1,    ///< Link Cost for Link Quality 3
    kLinkQuality2LinkCost       = 2,    ///< Link Cost for Link Quality 2
    kLinkQuality1LinkCost       = 4,    ///< Link Cost for Link Quality 1
    kLinkQuality0LinkCost       = 16,   ///< Link Cost for Link Quality 0
};

// add for certification testing
enum
{
    kMinAssignedLinkMargin3     = 0x15, ///< minimal link margin for Link Quality 3 (21 - 255)
    kMinAssignedLinkMargin2     = 0x0b, ///< minimal link margin for Link Quality 2 (11 - 20)
    kMinAssignedLinkMargin1     = 0x03, ///< minimal link margin for Link Quality 1 (3 - 9)
    kMinAssignedLinkMargin0     = 0x00, ///< minimal link margin for Link Quality 0 (0 - 2)
};

/**
 * Multicast Forwarding Constants
 *
 */
enum
{
    kMplChildDataMessageTimerExpirations  = 0, ///< Number of MPL retransmissions for Children.
    kMplRouterDataMessageTimerExpirations = 2, ///< Number of MPL retransmissions for Routers.
};

}  // namespace Mle

/**
 * @}
 *
 */

}  // namespace ot

#endif  // MLE_CONSTANTS_HPP_
