/* ------------------------------------------------------------------------------------------------ */
/* FILE :		lwipopts.h																			*/
/*																									*/
/* CONTENTS :																						*/
/*				Application specific defintions for lwIP											*/
/*																									*/
/* Copyright (c) 2013-2014, Code-Time Technologies Inc. All rights reserved.						*/
/*																									*/
/* Code-Time Technologies retains all right, title, and interest in and to this work				*/
/*																									*/
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS							*/
/* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF										*/
/* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL							*/
/* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR								*/
/* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,							*/
/* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR							*/
/* OTHER DEALINGS IN THE SOFTWARE.																	*/
/*																									*/
/*																									*/
/*	$Revision: 1.8 $																				*/
/*	$Date: 2013/10/03 15:55:16 $																	*/
/*																									*/
/* ------------------------------------------------------------------------------------------------ */

#ifndef __LWIPOPTS_H__
#define __LWIPOPTS_H__

#ifndef OS_CMSIS_RTOS
  #include "Abassi.h"
#else
  #include "cmsis_os.h"
#endif

#ifdef __cplusplus
 extern "C" {
#endif
										/* In BMP, if all lwIP task are to run on the same core		*/
#ifdef OS_MP_TYPE						/* Comment out if not needed in BMP							*/
  #if ((((OS_MP_TYPE) & 4) != 0) && ((OS_N_CORE) > 1))
	#ifndef LWIP_ABASSI_BMP_CORE_2_USE
		#define LWIP_ABASSI_BMP_CORE_2_USE	1
	#endif
  #endif
#endif

/**
 * SYS_LIGHTWEIGHT_PROT==1: if you want inter-task protection for certain
 * critical regions during buffer allocation, deallocation and memory
 * allocation and deallocation.
 */
#define SYS_LIGHTWEIGHT_PROT	1

#define CHECKSUM_GEN_ICMP		0
#define ETHARP_TRUST_IP_MAC		0
#define IP_REASSEMBLY			1
#define IP_FRAG					1
#define ARP_QUEUEING			1
#define LWIP_SO_RCVTIMEO		1   
#define ETH_PAD_SIZE			0


/**
 * NO_SYS==1: Provides VERY minimal functionality. Otherwise,
 * use lwIP facilities.
 */
#define NO_SYS					0

/* ---------- Memory options ---------- */
/* MEM_ALIGNMENT: should be set to the alignment of the CPU for which
   lwIP is compiled. 4 byte alignment -> define MEM_ALIGNMENT to 4, 2
   byte alignment -> define MEM_ALIGNMENT to 2. */
#define MEM_ALIGNMENT			8

/* MEM_SIZE: the size of the heap memory. If the application will send
a lot of data that needs to be copied, this should be set high. */
#define MEM_SIZE				(5*1024)

/* MEMP_NUM_PBUF: the number of memp struct pbufs. If the application
   sends a lot of data out of ROM (or other static memory), this
   should be set high. */
#define MEMP_NUM_PBUF			8//16
/* MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One
   per active UDP "connection". */
#define MEMP_NUM_UDP_PCB		4//6
/* MEMP_NUM_TCP_PCB: the number of simulatenously active TCP
   connections. */
#define MEMP_NUM_TCP_PCB		6//10
/* MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP
   connections. */
#define MEMP_NUM_TCP_PCB_LISTEN 3//5
/* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP
   segments. */
#define MEMP_NUM_TCP_SEG		8//16
/* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active
   timeouts. */
#define MEMP_NUM_SYS_TIMEOUT	10


/* ---------- Pbuf options ---------- */
/* PBUF_POOL_SIZE: the number of buffers in the pbuf pool. */
#define PBUF_POOL_SIZE          10//20

/* PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. */
#define PBUF_POOL_BUFSIZE       (TCP_MSS+44)


/* ---------- TCP options ---------- */
#define LWIP_TCP				1
#define TCP_TTL					255

/* Controls if TCP should queue segments that arrive out of
   order. Define to 0 if your device is low on memory. */
#define TCP_QUEUE_OOSEQ			0

/* TCP Maximum segment size. */
#define TCP_MSS					(1500-40)
/* TCP_MSS = (Ethernet MTU - IP header size - TCP header size) */

/* TCP sender buffer space (bytes). */
#define TCP_SND_BUF             (2*TCP_MSS)

/*  TCP_SND_QUEUELEN: TCP sender buffer space (pbufs). This must be at least
  as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work. */

#define TCP_SND_QUEUELEN        (4* TCP_SND_BUF/TCP_MSS)

/* TCP receive window. */
#define TCP_WND					(2*TCP_MSS)


/* ---------- ICMP options ---------- */
#define LWIP_ICMP				1


/* ---------- DHCP options ---------- */
/* Define LWIP_DHCP to 1 if you want DHCP configuration of
   interfaces. DHCP is not implemented in lwIP 0.5.1, however, so
   turning this on does currently not work. */
#define LWIP_DHCP				1


/* ---------- UDP options ---------- */
#define LWIP_UDP				1
#define UDP_TTL					255


/* ---------- Statistics options ---------- */
#define LWIP_STATS				0
#define LWIP_PROVIDE_ERRNO		1

/*
   --------------------------------------
   ---------- Checksum options ----------
   --------------------------------------
*/

/* 
The STM32F2x7 allows computing and verifying the IP, UDP, TCP and ICMP checksums by hardware:
 - To use this feature let the following define uncommented.
 - To disable it and process by CPU comment the checksum.
*/
#define CHECKSUM_BY_HARDWARE 


#ifdef CHECKSUM_BY_HARDWARE
  /* CHECKSUM_GEN_IP==0: Generate checksums by hardware for outgoing IP packets.*/
  #define CHECKSUM_GEN_IP		0
  /* CHECKSUM_GEN_UDP==0: Generate checksums by hardware for outgoing UDP packets.*/
  #define CHECKSUM_GEN_UDP		0
  /* CHECKSUM_GEN_TCP==0: Generate checksums by hardware for outgoing TCP packets.*/
  #define CHECKSUM_GEN_TCP		0 
  /* CHECKSUM_CHECK_IP==0: Check checksums by hardware for incoming IP packets.*/
  #define CHECKSUM_CHECK_IP		0
  /* CHECKSUM_CHECK_UDP==0: Check checksums by hardware for incoming UDP packets.*/
  #define CHECKSUM_CHECK_UDP	0
  /* CHECKSUM_CHECK_TCP==0: Check checksums by hardware for incoming TCP packets.*/
  #define CHECKSUM_CHECK_TCP	0
#else
  /* CHECKSUM_GEN_IP==1: Generate checksums in software for outgoing IP packets.*/
  #define CHECKSUM_GEN_IP		1
  /* CHECKSUM_GEN_UDP==1: Generate checksums in software for outgoing UDP packets.*/
  #define CHECKSUM_GEN_UDP		1
  /* CHECKSUM_GEN_TCP==1: Generate checksums in software for outgoing TCP packets.*/
  #define CHECKSUM_GEN_TCP		1
  /* CHECKSUM_CHECK_IP==1: Check checksums in software for incoming IP packets.*/
  #define CHECKSUM_CHECK_IP		1
  /* CHECKSUM_CHECK_UDP==1: Check checksums in software for incoming UDP packets.*/
  #define CHECKSUM_CHECK_UDP	1
  /* CHECKSUM_CHECK_TCP==1: Check checksums in software for incoming TCP packets.*/
  #define CHECKSUM_CHECK_TCP	1
#endif


/*
   ----------------------------------------------
   ---------- Sequential layer options ----------
   ----------------------------------------------
*/
/**
 * LWIP_NETCONN==1: Enable Netconn API (require to use api_lib.c)
 */
#ifndef LWIP_NETCONN
  #define LWIP_NETCONN			1
#endif

/*
   ------------------------------------
   ---------- Socket options ----------
   ------------------------------------
*/
/**
 * LWIP_SOCKET==1: Enable Socket API (require to use sockets.c)
 */
#ifndef LWIP_SOCKET
  #define LWIP_SOCKET			0
#endif
/*
   -----------------------------------
   ---------- DEBUG options ----------
   -----------------------------------
*/

#define LWIP_DEBUG				0

#if ((LWIP_DEBUG) == 0)
  #define LWIP_PLATFORM_DIAG(message)
  #define LWIP_ERROR(message, cond, ret)
#else
  #define LWIP_PLATFORM_DIAG(message) 				do { MTXlock(G_OSmutex, -1);				\
													     printf message;						\
													     MTXunlock(G_OSmutex); } while(0)
  #define LWIP_ERROR(message, expression, handler)	do { if (!(expression)) {					\
															MTXlock(G_OSmutex, -1);				\
															puts(message); 						\
															MTXunlock(G_OSmutex);				\
															handler; }} while(0)
  #define LWIP_DEBUGF(debug, message) do { \
                               if ( \
                                   ((debug) & LWIP_DBG_ON) && \
                                   ((debug) & LWIP_DBG_TYPES_ON) && \
                                   ((s16_t)((debug) & LWIP_DBG_MASK_LEVEL) >= LWIP_DBG_MIN_LEVEL)) { \
                                 LWIP_PLATFORM_DIAG(message); \
                                 if ((debug) & LWIP_DBG_HALT) { \
                                   while(1); \
                                 } \
                               } \
                             } while(0)

#endif

#ifndef SYS_STATS
  #define SYS_STAT	1
#endif

/*
   ---------------------------------
   ---------- OS options ----------
   ---------------------------------
*/

#ifndef _MBOX_SIZE
  #define _MBOX_SIZE					32
#endif
#ifndef TCPIP_THREAD_STACKSIZE
  #define TCPIP_THREAD_STACKSIZE		2048
#endif
#ifndef TCPIP_THREAD_PRIO
 #ifndef osCMSIS
  #if ((OS_N_CORE) == 1)
   #define TCPIP_THREAD_PRIO			2
  #else
   #if (((OS_MP_TYPE) & 2) == 0)
     #define TCPIP_THREAD_PRIO			0
   #else
     #define TCPIP_THREAD_PRIO			1
   #endif
  #endif
 #else
  #if ((OS_N_CORE) == 1)
   #define TCPIP_THREAD_PRIO			osPriorityAboveNormal
  #else
   #if (((OS_MP_TYPE) & 2) == 0)
     #define TCPIP_THREAD_PRIO			osPriorityRealtime
   #else
     #define TCPIP_THREAD_PRIO			osPriorityHigh
   #endif
  #endif
 #endif
#endif
#ifndef TCPIP_MBOX_SIZE
  #define TCPIP_MBOX_SIZE				32
#endif
#ifndef NETIF_TASK_STACK_SIZE
  #define NETIF_TASK_STACK_SIZE			2048
#endif
#ifndef DEFAULT_UDP_RECVMBOX_SIZE
  #define DEFAULT_UDP_RECVMBOX_SIZE		32
#endif
#ifndef DEFAULT_TCP_RECVMBOX_SIZE
  #define DEFAULT_TCP_RECVMBOX_SIZE		32
#endif
#ifndef DEFAULT_ACCEPTMBOX_SIZE
  #define DEFAULT_ACCEPTMBOX_SIZE		32
#endif
#ifndef DEFAULT_THREAD_STACKSIZE
  #define DEFAULT_THREAD_STACKSIZE		2048
#endif

#ifdef __cplusplus
}
#endif

#endif
/* EOF */
