
/**
 *  \file MS_limits.h
 *
 *  This file lists all the Tunable constants used in
 *  EtherMind Mesh Stack modules.
 */

/*
 *  Copyright (C) 2016. Mindtree Ltd.
 *  All rights reserved.
 */

#ifndef _H_MS_LIMITS_
#define _H_MS_LIMITS_


/* ----------------------------------------------------------------------- */
/* =============================  Bearer  ================================ */
/* ----------------------------------------------------------------------- */
#define MS_NUM_NETWORK_INTERFACES                       2
#define MS_NUM_PROVISIONING_INTERFACES                  2


/* ----------------------------------------------------------------------- */
/* =============================  Network  =============================== */
/* ----------------------------------------------------------------------- */
/*
 *  In a 'flooding' mesh implementation, one of the methods used to restrict
 *  unlimited flooding, is using message cache.
 *  This parameter specifies the size of the Network message cache.
 *
 *  Minimum Value: 2
 *  Maximum Value: can be anything.
 */
#define MS_NET_CACHE_SIZE                              30       //10->30 by ZQ

/*
 *  Maximum number of subnets the device can store information about.
 *
 *  Minimum Value: 1
 *  Maximum Value: can be anything.
 */
#define MS_MAX_SUBNETS                                 3

/*
 *  Maximum number of device keys the device can store information about.
 *  As a configuration client, there should be one additional space to
 *  contain device key of configuration server.
 *
 *  Minimum Value: 1
 *  Maximum Value: can be anything.
 */
#define MS_MAX_DEV_KEYS                                256

/*
 *  Maximum number of addresses present in each proxy filter list.
 *
 *  Minimum Value: 1
 *  Maximum Value: can be anything.
 */
#define MS_PROXY_FILTER_LIST_SIZE                      5

/*
 *  The distance between the network sequence numbers, for every persistent
 *  storage write. If the device is powered cycled, it will resume transmission
 *  using the sequence number from start of next block.
 *
 *  Minimum Value: can be anything. A smaller value will reduce the flash lifetime.
 *  Maximum Value: can be anything.
 */
#define MS_NET_SEQ_NUMBER_BLOCK_SIZE                    512//   2048

/*
 *  The timeout in millisecond for proxy advertisement with Network ID for
 *  each subnet
 *
 *  Minimum Value: can be anything. Larger value will have lesser timeout load.
 *  Maximum Value: can be anything.
 */
#define PROXY_SUBNET_NETID_ADV_TIMEOUT               (300 | EM_TIMEOUT_MILLISEC)  //100

/*
 *  The timeout in millisecond for proxy advertisement with Node Identity for
 *  each subnet
 *
 *  Minimum Value: can be anything. Larger value will have lesser timeout load.
 *  Maximum Value: can be anything.
 */
#define PROXY_SUBNET_NODEID_ADV_TIMEOUT              (300 | EM_TIMEOUT_MILLISEC) //100

/*
 * The time period for proxy advertisement with Node Identity
 *
 *  Minimum Value: Default 60 seconds as in specification
 *  Maximum Value: can be anything.
 */
#define PROXY_NODEID_ADV_TIMEOUT                     (60000 | EM_TIMEOUT_MILLISEC)


/* ----------------------------------------------------------------------- */
/* =============================  Transport  ============================= */
/* ----------------------------------------------------------------------- */
/*
 *  This parameter specifies the maximum number of Low Power Nodes (LPNs)
 *  to which friendship can be established as a Friend.
 *
 *  Minimum Value: 1
 *  Maximum Value: can be anything.
 */
#define MS_MAX_LPNS                                 	5

/*
 *  Replay Protection cache is required to protect against relay attacks.
 *  This parameter specifies the size of the Replay Protection cache.
 *
 *  Minimum Value: 2
 *  Maximum Value: can be anything.
 */
#define MS_REPLAY_CACHE_SIZE                           30

/*
 *  Reassembled SAR Rx cache is to avoid handling of segmented frames
 *  which are already received and acked by the local implementation.
 *  Saves the unnecessary effort of reassmbly and complex handling by
 *  the upper layers to handle reception of same payload again from
 *  the same source device.
 *
 *  Minimum Value: 2
 *  Maximum Value: can be anything.
 */
#define MS_REASSEMBLED_CACHE_SIZE                     30

/*
 *  The number of times to retry the FriendPoll message when
 *  the FriendUpdate message is not received for the first attempt
 *  of FriendPoll in the current sequence. When this count expires,
 *  the friendship will be terminated with the Friend node.
 *
 *  Minimum Value: 1
 *  Maximum Value: can be anything.
 */
#define MS_FRND_POLL_RETRY_COUNT                      10

/*
 *  Number of Segmentation and Reassembly contexts.
 *  Used during both reception and transmission and also for associated
 *  LPNs.
 *
 *  Minimum Value: 2
 *  Maximum Value: can be anything.
 */
#define LTRN_SAR_CTX_MAX                              16

/*
 *  Segment Transmission Timeout.
 *
 *  Minimum Value: 200 MS
 *  Maximum Value: can be anything.
 */
#define LTRN_RTX_TIMEOUT                200 /* Millisecond */

/*
 *  Segment Transmission Count.
 *
 *  Minimum Value: 2
 *  Maximum Value: can be anything.
 */
#define LTRN_RTX_COUNT_UNICASS              5
#define LTRN_RTX_COUNT_GROUP                3


/*
 *  Ack Timeout.
 *
 *  Minimum Value: 200 MS
 *  Maximum Value: can be anything.
 */
/* TODO: Use ack timeout configured based on the TTL in the received frame */
#define LTRN_ACK_TIMEOUT             50 /* Millisecond */


/*
 *  Incomplete Timeout.
 *
 *  Minimum Value: 10 Seconds (10000 MS)
 *  Maximum Value: can be anything.
 */
/* TODO: Use ack timeout configured based on the TTL in the received frame */
#define LTRN_INCOMPLETE_TIMEOUT     (20*1000) /* Millisecond */


/*
 *  Receive window is the time in ms for which the Friend will be transmitting the
 *  response to any request from the LPN after the Receive delay time of
 *  getting any request
 *
 *  Minimum Value: 100
 *  Maximum Value: As required
 */
#define MS_FRND_RECEIVE_WINDOW                         100

/*
 *  This parameter defines the maximum number of messages that the friend
 *  is capabale to queue for a single Low Power Node
 *
 *  Minimum Value: 2
 *  Maximum Value: As required
 */
#define MS_FRIEND_MESSAGEQUEUE_SIZE                    15

/*
 *  This parameter defines the maximum number of subscription addresses
 *  that the friend is capabale to store for a single Low Power Node
 *
 *  Minimum Value: 1
 *  Maximum Value: As required
 */
#define MS_FRIEND_SUBSCRIPTION_LIST_SIZE               8

/*
 *  This parameter defines the initial timeout in milliseconds
 *  to be used to track the Friend clear Confirmation after
 *  sending of a Friend Clear message
 *
 *  Minimum Value: 1000
 *  Maximum Value: As required
 */
#define LPN_CLEAR_RETRY_TIMEOUT_INITIAL                1000

/*
 *  This parameter defines the timeout in milliseconds
 *  to be used to retry friend request attempts in case an
 *  offer is not received.
 *
 *  Minimum Value: 1100
 *  Maximum Value: As required
 */
#define MS_TRN_FRNDREQ_RETRY_TIMEOUT                   1200

/* ----------------------------------------------------------------------- */
/* =============================  Access ================================= */
/* ----------------------------------------------------------------------- */
/*
 *  This parameter specifies the maximum number of elements.
 *
 *  Minimum Value: 1
 *  Maximum Value: can be anything.
 */
#define MS_ACCESS_ELEMENT_COUNT                        5

/*
 *  This parameter specifies the maximum number of models.
 *
 *  Minimum Value: 1
 *  Maximum Value: can be anything.
 */
#define MS_ACCESS_MODEL_COUNT                          10//   5

/*
 *  Maximum number of Applications (keys) the device can store information about.
 *
 *  Minimum Value: 1
 *  Maximum Value: can be anything.
 */
#define MS_MAX_APPS                                    5

/*
 *  Maximum number of Virtual Addresses the device can store information about.
 *
 *  Minimum Value: 1
 *  Maximum Value: can be anything.
 */
#define MS_MAX_VIRTUAL_ADDRS                           5

/*
 *  Maximum number of Non-Virtual Addresses the device can store information about.
 *
 *  Minimum Value: 1
 *  Maximum Value: can be anything.
 */
#define MS_MAX_NON_VIRTUAL_ADDRS                       5

/*
 *  Maximum number of Addresses the device can store information about.
 *  This includes both the Virtual and non-virtual addresses.
 *
 *  Note: This depends on the other configurations.
 *  Defined here for easy reference. Do not change manually.
 */
#define MS_MAX_ADDRS                                (MS_MAX_VIRTUAL_ADDRS + MS_MAX_NON_VIRTUAL_ADDRS)

#if (MS_MAX_ADDRS  != (MS_MAX_VIRTUAL_ADDRS + MS_MAX_NON_VIRTUAL_ADDRS))
#error "MS_MAX_ADDRS  != (MS_MAX_VIRTUAL_ADDRS + MS_MAX_NON_VIRTUAL_ADDRS)"
#endif /* (MS_MAX_ADDRS  != (MS_MAX_VIRTUAL_ADDRS + MS_MAX_NON_VIRTUAL_ADDRS)) */

/*
 *  Maximum number of Transition Timers.
 *
 *  Minimum Value: 1
 *  Maximum Value: can be anything.
 */
#define MS_MAX_NUM_TRANSITION_TIMERS                    5

/*
 *  Maximum number of Periodic Step Timers.
 *
 *  Minimum Value: 1
 *  Maximum Value: can be anything.
 */
#define MS_MAX_NUM_PERIODIC_STEP_TIMERS                 5


/* ----------------------------------------------------------------------- */
/* ==========================  Health Model ============================== */
/* ----------------------------------------------------------------------- */
/*
 *  This parameter specifies the maximum number of Health Servers
 *  to be supported.
 *
 *  Minimum Value: 1
 *  Maximum Value: can be anything.
 */
#define MS_HEALTH_SERVER_MAX                           2

/* ----------------------------------------------------------------------- */
/* =============================  Misc. ================================== */
/* ----------------------------------------------------------------------- */
/*
 *  This parameter specifies Default Company ID.
 *
 *  Phyplus Inc - Company ID
 *  Ref: https://www.bluetooth.com/specifications/assigned-numbers/company-identifiers
 */
#define MS_DEFAULT_COMPANY_ID                          0x0504

/*
 *  This parameter specifies a 16-bit vendor-assigned product identifier.
 */
#define MS_DEFAULT_PID                                 0x6212

/*
 *  This parameter specifies a 16-bit vendor-assigned product version identifier.
 */
#define MS_DEFAULT_VID                                 0x0000

#endif /* _H_MS_LIMITS_ */

