/*!
    \file  lwipopts.h
    \brief LwIP options configuration
*/

/*
    Copyright (C) 2016 GigaDevice

    2016-08-15, V1.0.0, firmware for GD32F4xx
*/

#ifndef LWIPOPTS_H
#define LWIPOPTS_H

#define ETHARP_TRUST_IP_MAC 0
#define IP_REASSEMBLY       0
#define IP_FRAG             0
#define ARP_QUEUEING        0

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

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

/*  memory options  */
#define MEM_ALIGNMENT 4 /* 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_SIZE (12 * 1024) /* 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 MEMP_NUM_PBUF 20 /* 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_UDP_PCB 6 /* the number of UDP protocol control blocks, one \
                              per active UDP "connection" */

#define MEMP_NUM_TCP_PCB 10 /* the number of simulatenously active TCP connections */

#define MEMP_NUM_TCP_PCB_LISTEN 5 /* the number of listening TCP connections */

#define MEMP_NUM_TCP_SEG 20 /* the number of simultaneously queued TCP segments */

#define MEMP_NUM_SYS_TIMEOUT 10 /* the number of simulateously active timeouts */

#define MEMP_NUM_NETBUF 8 /* the number of struct netbufs */

/* ---------- pbuf选项 ---------- */
#define MEMP_NUM_PBUF            15   /* MEMP_NUM_PBUF:memp结构的pbuf数量,如果应用从ROM或者静态存储区发送大量数据时,这个值应该设置大一点 */
#define PBUF_POOL_SIZE           15   /* PBUF_POOL_SIZE:pbuf内存池个数 */
#define PBUF_POOL_BUFSIZE        1528 /* PBUF_POOL_BUFSIZE:每个pbuf内存池大小 */
#define LWIP_SUPPORT_CUSTOM_PBUF 1

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

#define TCP_QUEUE_OOSEQ 0 /* controls if TCP should queue segments that arrive out of \
                             order, Define to 0 if your device is low on memory. */
#undef TCPIP_MBOX_SIZE
#define TCPIP_MBOX_SIZE MAX_QUEUE_ENTRIES /* the mailbox size for the tcpip thread messages */

#undef DEFAULT_TCP_RECVMBOX_SIZE
#define DEFAULT_TCP_RECVMBOX_SIZE MAX_QUEUE_ENTRIES /* the mailbox size for the incoming packets on a NETCONN_TCP */

#undef DEFAULT_ACCEPTMBOX_SIZE /* the mailbox size for the incoming connections */
#define DEFAULT_ACCEPTMBOX_SIZE MAX_QUEUE_ENTRIES

#define DEFAULT_UDP_RECVMBOX_SIZE MAX_QUEUE_ENTRIES /* The mailbox size for the incoming packets on a NETCONN_UDP */

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

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

#define TCP_SND_QUEUELEN ((4 * TCP_SND_BUF) / TCP_MSS) /* 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_WND (2 * TCP_MSS) /* TCP receive window */

/* ICMP options */
#define LWIP_ICMP 1

/* DHCP options */
#define LWIP_DHCP 0 /* define 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_IPV4 1
#define LWIP_IPV6 0

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

/* statistics options */
#define LWIP_STATS         0
#define LWIP_PROVIDE_ERRNO 1

/* checksum options */
#define CHECKSUM_BY_HARDWARE   /* computing and verifying the IP, UDP, TCP and ICMP \
                                 checksums by hardware */

/* netconn options */
#define LWIP_NETCONN 1 /* set to 1 to enable netconn API (require to use api_lib.c) */

#define MEMP_NUM_NETCONN 4 /* the number of struct netconns */

/* socket options */
#define LWIP_SOCKET 1 /* set to 1 to enable socket API (require to use sockets.c) */

#define LWIP_SO_RCVTIMEO 1 /* set to 1 to enable receive timeout for sockets/netconns and \
                              SO_RCVTIMEO processing */
#define LWIP_NETIF_LINK_CALLBACK 1
/* Lwip debug options */
#define LWIP_DEBUG 0

#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
#define CHECKSUM_GEN_ICMP  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
#define CHECKSUM_GEN_ICMP  1
#endif

/*
   ---------------------------------
   ---------- OS options ----------
   ---------------------------------
*/
#define TCPIP_THREAD_STACKSIZE   1000
#define DEFAULT_THREAD_STACKSIZE 512
#define LWIP_COMPAT_MUTEX        1
#define TCPIP_THREAD_PRIO        5
#define DEFAULT_THREAD_PRIO      2

#endif /* LWIPOPTS_H */