/*
 *  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_

#include "openthread-core-config.h"

namespace ot {
namespace Mle {

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

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

/**
 * MLE Protocol Constants
 *
 */
enum
{
    kThreadVersion                  = OPENTHREAD_THREAD_VERSION, ///< Thread Version
    kUdpPort                        = 19788,                     ///< MLE UDP Port
    kParentRequestRouterTimeout     = 750,                       ///< Router Parent Request timeout
    kParentRequestDuplicateMargin   = 50,                        ///< Margin for duplicate parent request
    kParentRequestReedTimeout       = 1250,                      ///< Router and REEDs Parent Request timeout
    kAttachStartJitter              = 50,                        ///< Maximum jitter time added to start of attach.
    kAnnounceProcessTimeout         = 250,  ///< Timeout after receiving Announcement before channel/pan-id change
    kAnnounceTimeout                = 1400, ///< Total timeout used for sending Announcement messages
    kMinAnnounceDelay               = 80,   ///< Minimum delay between Announcement messages
    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.
    kChildUpdateRequestPendingDelay = 100,  ///< Delay (in ms) for aggregating Child Update Request.
    kMaxTransmissionCount           = 3,    ///< Maximum number of times an MLE message may be transmitted.
    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
    kMaxLinkRequestTimeout          = 2000, ///< Maximum delay for receiving a Link Accept
    kMinTimeoutKeepAlive            = (((kMaxChildKeepAliveAttempts + 1) * kUnicastRetransmissionDelay) /
                            1000), ///< Minimum timeout(s) for keep alive
    kMinTimeoutDataPoll             = (OPENTHREAD_CONFIG_MAC_MINIMUM_POLL_PERIOD +
                           OPENTHREAD_CONFIG_FAILED_CHILD_TRANSMISSIONS * OPENTHREAD_CONFIG_MAC_RETX_POLL_PERIOD) /
                          1000, ///< Minimum timeout(s) for data poll
    kMinTimeout = (kMinTimeoutKeepAlive >= kMinTimeoutDataPoll ? kMinTimeoutKeepAlive
                                                               : kMinTimeoutDataPoll), ///< 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 (sec)
#if OPENTHREAD_CONFIG_MLE_LONG_ROUTES_ENABLE
    kAdvertiseIntervalMax = 5, ///< ADVERTISEMENT_I_MAX (sec) proposal
#else
    kAdvertiseIntervalMax = 32, ///< ADVERTISEMENT_I_MAX (sec)
#endif
    kFailedRouterTransmissions = 4,   ///< FAILED_ROUTER_TRANSMISSIONS
    kRouterIdReuseDelay        = 100, ///< ID_REUSE_DELAY (sec)
    kRouterIdSequencePeriod    = 10,  ///< ID_SEQUENCE_PERIOD (sec)
    kMaxNeighborAge            = 100, ///< MAX_NEIGHBOR_AGE (sec)
#if OPENTHREAD_CONFIG_MLE_LONG_ROUTES_ENABLE
    kMaxRouteCost = 127, ///< MAX_ROUTE_COST proposal
#else
    kMaxRouteCost         = 16, ///< MAX_ROUTE_COST
#endif
    kMaxRouterId                = 62,                                          ///< MAX_ROUTER_ID
    kInvalidRouterId            = kMaxRouterId + 1,                            ///< Value indicating incorrect Router Id
    kMaxRouters                 = OPENTHREAD_CONFIG_MLE_MAX_ROUTERS,           ///< MAX_ROUTERS
    kMinDowngradeNeighbors      = 7,                                           ///< MIN_DOWNGRADE_NEIGHBORS
    kNetworkIdTimeout           = 120,                                         ///< NETWORK_ID_TIMEOUT (sec)
    kParentRouteToLeaderTimeout = 20,                                          ///< PARENT_ROUTE_TO_LEADER_TIMEOUT (sec)
    kRouterSelectionJitter      = 120,                                         ///< ROUTER_SELECTION_JITTER (sec)
    kRouterDowngradeThreshold   = 23,                                          ///< ROUTER_DOWNGRADE_THRESHOLD (routers)
    kRouterUpgradeThreshold     = 16,                                          ///< ROUTER_UPGRADE_THRESHOLD (routers)
    kMaxLeaderToRouterTimeout   = 90,                                          ///< INFINITE_COST_TIMEOUT (sec)
    kReedAdvertiseInterval      = 570,                                         ///< REED_ADVERTISEMENT_INTERVAL (sec)
    kReedAdvertiseJitter        = 60,                                          ///< REED_ADVERTISEMENT_JITTER (sec)
    kLeaderWeight               = 64,                                          ///< Default leader weight
    kMleEndDeviceTimeout        = OPENTHREAD_CONFIG_MLE_CHILD_TIMEOUT_DEFAULT, ///< MLE_END_DEVICE_TIMEOUT (sec)
    kMeshLocalPrefixContextId   = 0,                                           ///< 0 is reserved for Mesh Local Prefix
};

/**
 * 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 = kMaxRouteCost, ///< Link Cost for Link Quality 0
};

/**
 * 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_
