/*
 * Copyright (c) 2017 Apple Inc. All rights reserved.
 *
 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
 *
 * This file contains Original Code and/or Modifications of Original Code
 * as defined in and that are subject to the Apple Public Source License
 * Version 2.0 (the 'License'). You may not use this file except in
 * compliance with the License. The rights granted to you under the License
 * may not be used to create, or enable the creation or redistribution of,
 * unlawful or unlicensed copies of an Apple operating system, or to
 * circumvent, violate, or enable the circumvention or violation of, any
 * terms of an Apple operating system software license agreement.
 *
 * Please obtain a copy of the License at
 * http://www.opensource.apple.com/apsl/ and read it before using this file.
 *
 * The Original Code and all software distributed under the License are
 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 * Please see the License for the specific language governing rights and
 * limitations under the License.
 *
 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
 */
/*
 * Copyright (c) 2012, Thingsquare, http://www.thingsquare.com/.
 * 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.
 *
 */

#ifndef CONTIKI_DEFAULT_CONF_H
#define CONTIKI_DEFAULT_CONF_H

/*---------------------------------------------------------------------------*/
/* Netstack configuration
 *
 * The netstack configuration is typically overridden by the platform
 * configuration, as defined in contiki-conf.h
 */

/* NETSTACK_CONF_RADIO specifies the radio driver. The radio driver
 *  typically depends on the radio used on the target hardware. */
#ifndef NETSTACK_CONF_RADIO
#define NETSTACK_CONF_RADIO nullradio_driver
/* #define NETSTACK_CONF_RADIO cc2420_driver */
#endif /* NETSTACK_CONF_RADIO */

/* NETSTACK_CONF_FRAMER specifies the over-the-air frame format used
 *  by Contiki radio packets. For IEEE 802.15.4 radios, use the
 *  framer_802154 driver. */
#ifndef NETSTACK_CONF_FRAMER
#define NETSTACK_CONF_FRAMER framer_nullmac
/* #define NETSTACK_CONF_FRAMER framer_802154 */
#endif /* NETSTACK_CONF_FRAMER */

/* NETSTACK_CONF_RDC specifies the Radio Duty Cycling (RDC) layer. The
 *  nullrdc_driver never turns the radio off and is compatible with all
 *  radios, but consumes a lot of power. The contikimac_driver is
 *  highly power-efficent and allows sleepy routers, but is not
 *  compatible with all radios. */
#ifndef NETSTACK_CONF_RDC
#define NETSTACK_CONF_RDC   nullrdc_driver
/* #define NETSTACK_CONF_RDC   contikimac_driver */
#endif /* NETSTACK_CONF_RDC */

/* NETSTACK_CONF_MAC specifies the Medium Access Control (MAC)
 *  layer. The nullmac_driver does not provide any MAC
 *  functionality. The csma_driver is the default CSMA MAC layer, but
 *  is not compatible with all radios. */
#ifndef NETSTACK_CONF_MAC
#define NETSTACK_CONF_MAC   nullmac_driver
/* #define NETSTACK_CONF_MAC   csma_driver */
#endif /* NETSTACK_CONF_MAC */

/* NETSTACK_CONF_LLSEC specifies the link layer security driver. */
#ifndef NETSTACK_CONF_LLSEC
#define NETSTACK_CONF_LLSEC nullsec_driver
#endif /* NETSTACK_CONF_LLSEC */

/* To avoid unnecessary complexity, we assume the common case of
 *   a constant LoWPAN-wide IEEE 802.15.4 security level, which
 *   can be specified by defining LLSEC802154_CONF_SECURITY_LEVEL. */
#ifndef LLSEC802154_CONF_SECURITY_LEVEL
#define LLSEC802154_CONF_SECURITY_LEVEL 0
#endif /* LLSEC802154_CONF_SECURITY_LEVEL */

/* NETSTACK_CONF_NETWORK specifies the network layer and can be either
 *  sicslowpan_driver, for IPv6 networking, or rime_driver, for the
 *  custom Rime network stack. */
#ifndef NETSTACK_CONF_NETWORK
#define NETSTACK_CONF_NETWORK rime_driver
/* #define NETSTACK_CONF_NETWORK sicslowpan_driver */
#endif /* NETSTACK_CONF_NETWORK */

/* NETSTACK_CONF_RDC_CHANNEL_CHECK_RATE specifies the channel check
 *  rate of the RDC layer. This defines how often the RDC will wake up
 *  and check for radio channel activity. A higher check rate results
 *  in higher communication performance at the cost of a higher power
 *  consumption. */
#ifndef NETSTACK_CONF_RDC_CHANNEL_CHECK_RATE
#define NETSTACK_CONF_RDC_CHANNEL_CHECK_RATE 8
#endif /* NETSTACK_CONF_RDC_CHANNEL_CHECK_RATE */

/*---------------------------------------------------------------------------*/
/* Packet buffer size options.
 *
 * The packet buffer size options can be tweaked on a per-project
 * basis to reduce memory consumption.
 */

/* QUEUEBUF_CONF_NUM specifies the number of queue buffers. Queue
 *  buffers are used throughout the Contiki netstack but the
 *  configuration option can be tweaked to save memory. Performance can
 *  suffer with a too low number of queue buffers though. */
#ifndef QUEUEBUF_CONF_NUM
#define QUEUEBUF_CONF_NUM 8
#endif /* QUEUEBUF_CONF_NUM */
/*---------------------------------------------------------------------------*/
/* uIPv6 configuration options.
 *
 * Many of the uIPv6 configuration options can be overriden by a
 * project-specific configuration to save memory.
 */

/* NETSTACK_CONF_WITH_IPV6 specifies whether or not IPv6 should be used. If IPv6
 *  is not used, IPv4 is used instead. */
#ifndef NETSTACK_CONF_WITH_IPV6
#define NETSTACK_CONF_WITH_IPV6 0
#endif /* NETSTACK_CONF_WITH_IPV6 */

/* UIP_CONF_BUFFER_SIZE specifies how much memory should be reserved
 *  for the uIP packet buffer. This sets an upper bound on the largest
 *  IP packet that can be received by the system. */
#ifndef UIP_CONF_BUFFER_SIZE
#define UIP_CONF_BUFFER_SIZE 128
#endif /* UIP_CONF_BUFFER_SIZE */

/* UIP_CONF_ROUTER specifies if the IPv6 node should be a router or
 *  not. By default, all Contiki nodes are routers. */
#ifndef UIP_CONF_ROUTER
#define UIP_CONF_ROUTER 1
#endif /* UIP_CONF_ROUTER */

/* UIP_CONF_IPV6_RPL specifies if RPL is to be used for IPv6
 *  routing. */
#ifndef UIP_CONF_IPV6_RPL
#define UIP_CONF_IPV6_RPL 1
#endif /* UIP_CONF_IPV6_RPL */

/* UIP_CONF_MAX_ROUTES specifies the maximum number of routes that each
 *  node will be able to handle. */
#ifndef UIP_CONF_MAX_ROUTES
#define UIP_CONF_MAX_ROUTES 20
#endif /* UIP_CONF_MAX_ROUTES */

/* UIP_CONF_UDP specifies if UDP support should be included or
 *  not. Disabling UDP saves memory but breaks a lot of stuff. */
#ifndef UIP_CONF_UDP
#define UIP_CONF_UDP 1
#endif /* UIP_CONF_UDP */

/* UIP_CONF_MAX_CONNECTIONS specifies the maximum number of
 *  simultaneous TCP connections. */
#ifndef UIP_CONF_MAX_CONNECTIONS
#define UIP_CONF_MAX_CONNECTIONS 8
#endif /* UIP_CONF_MAX_CONNECTIONS */

/* UIP_CONF_TCP specifies if TCP support should be included or
 *  not. Disabling TCP saves memory. */
#ifndef UIP_CONF_TCP
#define UIP_CONF_TCP 1
#endif /* UIP_CONF_TCP */

/* UIP_CONF_MAX_CONNECTIONS specifies the maximum number of
 *  simultaneous TCP connections. */
#ifndef UIP_CONF_MAX_CONNECTIONS
#define UIP_CONF_MAX_CONNECTIONS 8
#endif /* UIP_CONF_MAX_CONNECTIONS */


/* UIP_CONF_TCP_SPLIT enables a performance optimization hack, where
 *  each maximum-sized TCP segment is split into two, to avoid the
 *  performance degradation that is caused by delayed ACKs. */
#ifndef UIP_CONF_TCP_SPLIT
#define UIP_CONF_TCP_SPLIT 0
#endif /* UIP_CONF_TCP_SPLIT */

/* NBR_TABLE_CONF_MAX_NEIGHBORS specifies the maximum number of neighbors
 *  that each node will be able to handle. */
#ifndef NBR_TABLE_CONF_MAX_NEIGHBORS
#define NBR_TABLE_CONF_MAX_NEIGHBORS 8
#endif /* NBR_TABLE_CONF_MAX_NEIGHBORS */

/* UIP_CONF_ND6_SEND_NA enables standard IPv6 Neighbor Discovery Protocol.
 *  This is unneeded when RPL is used. Disable to save ROM and a little RAM. */
#ifndef UIP_CONF_ND6_SEND_NA
#define UIP_CONF_ND6_SEND_NA 1
#endif /* UIP_CONF_ND6_SEND_NA */

/*---------------------------------------------------------------------------*/
/* 6lowpan configuration options.
 *
 * These options change the behavior of the 6lowpan header compression
 * code (sicslowpan). They typically depend on the type of radio used
 * on the target platform, and are therefore platform-specific.
 */

/* SICSLOWPAN_CONF_MAX_MAC_TRANSMISSIONS specifies how many times the
 *  MAC layer should resend packets if no link-layer ACK was
 *  received. This only makes sense with the csma_driver
 *  NETSTACK_CONF_MAC. */
#ifndef SICSLOWPAN_CONF_MAX_MAC_TRANSMISSIONS
#define SICSLOWPAN_CONF_MAX_MAC_TRANSMISSIONS 4
#endif /* SICSLOWPAN_CONF_MAX_MAC_TRANSMISSIONS */

/* SICSLOWPAN_CONF_FRAG specifies if 6lowpan fragmentation should be
 *  used or not. Fragmentation is on by default. */
#ifndef SICSLOWPAN_CONF_FRAG
#define SICSLOWPAN_CONF_FRAG 1
#endif /* SICSLOWPAN_CONF_FRAG */

/* SICSLOWPAN_CONF_MAC_MAX_PAYLOAD is the maximum available size for
 *  frame headers, link layer security-related overhead,  as well as
 *  6LoWPAN payload. By default, SICSLOWPAN_CONF_MAC_MAX_PAYLOAD is
 *  127 bytes (MTU of 802.15.4) - 2 bytes (Footer of 802.15.4). */
#ifndef SICSLOWPAN_CONF_MAC_MAX_PAYLOAD
#define SICSLOWPAN_CONF_MAC_MAX_PAYLOAD (127 - 2)
#endif /* SICSLOWPAN_CONF_MAC_MAX_PAYLOAD */

/* SICSLOWPAN_CONF_COMPRESSION_THRESHOLD sets a lower threshold for
 *  when packets should not be compressed. This is used by ContikiMAC,
 *  which requires packets to be larger than a given minimum size. */
#ifndef SICSLOWPAN_CONF_COMPRESSION_THRESHOLD
#define SICSLOWPAN_CONF_COMPRESSION_THRESHOLD 0
/* #define SICSLOWPAN_CONF_COMPRESSION_THRESHOLD 63 */
#endif /* SICSLOWPAN_CONF_COMPRESSION_THRESHOLD */

/* SICSLOWPAN_CONF_COMPRESSION specifies what 6lowpan compression
 *  mechanism to be used. 6lowpan hc06 is the default in Contiki. */
#ifndef SICSLOWPAN_CONF_COMPRESSION
#define SICSLOWPAN_CONF_COMPRESSION SICSLOWPAN_COMPRESSION_HC06
#endif /* SICSLOWPAN_CONF_COMPRESSION */

/*---------------------------------------------------------------------------*/
/* ContikiMAC configuration options.
 *
 * These are typically configured on a per-platform basis.
 */

/* CONTIKIMAC_CONF_WITH_PHASE_OPTIMIZATION specifies if ContikiMAC
 *  should optimize for the phase of neighbors. The phase optimization
 *  may reduce power consumption but is not compatible with all timer
 *  settings and is therefore off by default. */
#ifndef CONTIKIMAC_CONF_WITH_PHASE_OPTIMIZATION
#define CONTIKIMAC_CONF_WITH_PHASE_OPTIMIZATION 0
#endif /* CONTIKIMAC_CONF_WITH_PHASE_OPTIMIZATION */


#endif /* CONTIKI_DEFAULT_CONF_H */
