alienwalker 2 месяцев назад
Родитель
Сommit
71eddd7d4f

+ 15 - 1
components/network/adapter_lwip2/net_lwip2.c

@@ -623,7 +623,10 @@ static void net_lwip2_task(void *param)
 {
 	// luat_network_cb_param_t cb_param;
 	OS_EVENT event = *((OS_EVENT *)param);
+#ifdef LUAT_LWIP_USE_EVENT
+#else
 	luat_heap_free(param);
+#endif
 	Buffer_Struct tx_msg_buf = {0,0,0};
 	// HANDLE cur_task = luat_get_current_task();
 	socket_data_t *p = NULL;
@@ -956,7 +959,17 @@ static void net_lwip2_task(void *param)
 	// LLOGD("End of lwip task");
 }
 
-
+#ifdef LUAT_LWIP_USE_EVENT
+extern int luat_lwip_event_send(uint32_t id, uint32_t param1, uint32_t param2, uint32_t param3);
+static void platform_send_event(void *p, uint32_t id, uint32_t param1, uint32_t param2, uint32_t param3)
+{
+	luat_lwip_event_send(id, param1, param2, param3);
+}
+void luat_lwip_event_run(void *p)
+{
+	net_lwip2_task(p);
+}
+#else
 static void platform_send_event(void *p, uint32_t id, uint32_t param1, uint32_t param2, uint32_t param3)
 {
 	OS_EVENT *event = luat_heap_zalloc(sizeof(OS_EVENT));
@@ -970,6 +983,7 @@ static void platform_send_event(void *p, uint32_t id, uint32_t param1, uint32_t
 	tcpip_callback_with_block(net_lwip2_task, event, 1);
 	#endif
 }
+#endif
 
 
 static void net_lwip2_check_network_ready(uint8_t adapter_index)

+ 297 - 0
components/network/lwip22/port/luat_rtos/luat_rtos_lwip.c

@@ -0,0 +1,297 @@
+#include "platform_def.h"
+#include "luat_base.h"
+#include "luat_mem.h"
+#include "luat_mcu.h"
+#include "luat_rtos.h"
+#include "dns_def.h"
+#include "lwip/tcpip.h"
+#include "luat_network_adapter.h"
+#include "net_lwip_port.h"
+#define LUAT_LOG_TAG "lwip"
+#include "luat_log.h"
+
+#define HANDLER(x) x
+#define LWIP_SYS_TIMER_CNT	(11)
+
+extern u32_t tcp_ticks;
+
+typedef struct
+{
+	uint32_t interval_ms;
+	lwip_cyclic_timer_handler handler;
+}lwip_timer_handler_t;
+
+typedef struct
+{
+	sys_timeout_handler handler;
+	void *args;
+	luat_rtos_timer_t timer;
+}lwip_timer_t;
+
+static const lwip_timer_handler_t prv_lwip_timer_list[LWIP_SYS_TIMER_CNT] =
+{
+#if LWIP_TCP
+  /* The TCP timer is a special case: it does not have to run always and
+     is triggered to start from TCP using tcp_timer_needed() */
+  {TCP_TMR_INTERVAL, HANDLER(tcp_tmr)},
+#endif
+#if LWIP_IPV4
+#if IP_REASSEMBLY
+  {IP_TMR_INTERVAL, HANDLER(ip_reass_tmr)},
+#endif /* IP_REASSEMBLY */
+#if LWIP_ARP
+  {ARP_TMR_INTERVAL, HANDLER(etharp_tmr)},
+#endif /* LWIP_ARP */
+#if LWIP_DHCP
+  {DHCP_COARSE_TIMER_MSECS, HANDLER(dhcp_coarse_tmr)},
+  {DHCP_FINE_TIMER_MSECS, HANDLER(dhcp_fine_tmr)},
+#endif /* LWIP_DHCP */
+#if LWIP_ACD
+  {ACD_TMR_INTERVAL, HANDLER(acd_tmr)},
+#endif /* LWIP_ACD */
+#if LWIP_IGMP
+  {IGMP_TMR_INTERVAL, HANDLER(igmp_tmr)},
+#endif /* LWIP_IGMP */
+#endif /* LWIP_IPV4 */
+#if LWIP_DNS
+  {DNS_TMR_INTERVAL, HANDLER(dns_tmr)},
+#endif /* LWIP_DNS */
+#if LWIP_IPV6
+  {ND6_TMR_INTERVAL, HANDLER(nd6_tmr)},
+#if LWIP_IPV6_REASS
+  {IP6_REASS_TMR_INTERVAL, HANDLER(ip6_reass_tmr)},
+#endif /* LWIP_IPV6_REASS */
+#if LWIP_IPV6_MLD
+  {MLD6_TMR_INTERVAL, HANDLER(mld6_tmr)},
+#endif /* LWIP_IPV6_MLD */
+#if LWIP_IPV6_DHCP6
+  {DHCP6_TIMER_MSECS, HANDLER(dhcp6_tmr)},
+#endif /* LWIP_IPV6_DHCP6 */
+#endif /* LWIP_IPV6 */
+};
+
+typedef struct
+{
+	uint64_t last_sleep_ms;
+	luat_rtos_timer_t sys_cyclic_timer[LWIP_SYS_TIMER_CNT];
+	void *task_handle;
+	uint8_t tcpip_tcp_timer_active;
+}lwip_ctrl_struct;
+static lwip_ctrl_struct prvlwip;
+
+enum
+{
+	EV_LWIP_EVENT_START = USER_EVENT_ID_START + 0x2000000,
+	EV_LWIP_SOCKET_TX,
+	EV_LWIP_NETIF_INPUT,
+	EV_LWIP_TCP_TIMER,
+	EV_LWIP_COMMON_TIMER,
+	EV_LWIP_SOCKET_RX_DONE,
+	EV_LWIP_SOCKET_CREATE,
+	EV_LWIP_SOCKET_CONNECT,
+	EV_LWIP_SOCKET_DNS,
+	EV_LWIP_SOCKET_DNS_IPV6,
+	EV_LWIP_SOCKET_LISTEN,
+	EV_LWIP_SOCKET_ACCPET,
+	EV_LWIP_SOCKET_CLOSE,
+	EV_LWIP_NETIF_LINK_STATE,
+	EV_LWIP_DHCP_TIMER,
+	EV_LWIP_FAST_TIMER,
+	EV_LWIP_NETIF_SET_IP,
+	EV_LWIP_NETIF_IPV6_BY_MAC,
+	EV_LWIP_API_RUN = USER_EVENT_ID_START + 0x3000000,
+	EV_LWIP_SYS_TIMEOUT,
+	EV_LWIP_TIMEOUT,
+};
+
+unsigned int lwip_port_rand(void)
+{
+	PV_Union uPV;
+	luat_crypto_trng(uPV.u8, 4);
+	return uPV.u32;
+}
+
+uint32_t net_lwip_rand()
+{
+	PV_Union uPV;
+	luat_crypto_trng(uPV.u8, 4);
+	return uPV.u32;
+}
+
+static LUAT_RT_RET_TYPE luat_lwip_sys_timer_cb(LUAT_RT_CB_PARAM)
+{
+	luat_send_event_to_task(prvlwip.task_handle, EV_LWIP_SYS_TIMEOUT, (uint32_t)param, 0, 0);
+	return LUAT_RT_RET;
+}
+
+static LUAT_RT_RET_TYPE luat_lwip_timer_cb(LUAT_RT_CB_PARAM)
+{
+	luat_send_event_to_task(prvlwip.task_handle, EV_LWIP_TIMEOUT, (uint32_t)param, 0, 0);
+	return LUAT_RT_RET;
+}
+
+int luat_lwip_event_send(uint32_t id, uint32_t param1, uint32_t param2, uint32_t param3)
+{
+	return luat_send_event_to_task(prvlwip.task_handle, id, param1, param2, param3);
+}
+
+int luat_lwip_api_run(uint32_t func, uint32_t param)
+{
+	return luat_send_event_to_task(prvlwip.task_handle, EV_LWIP_API_RUN, func, param, 0);
+}
+
+err_t  tcpip_try_callback(tcpip_callback_fn function, void *ctx)
+{
+	return luat_lwip_api_run(function, ctx);
+}
+
+err_t  tcpip_callback(tcpip_callback_fn function, void *ctx)
+{
+	return luat_lwip_api_run(function, ctx);
+}
+
+LUAT_WEAK void luat_lwip_event_run(void *p)
+{
+
+}
+static void luat_lwip_task(void *param)
+{
+//	luat_network_cb_param_t cb_param;
+	TaskFun_t cb;
+	lwip_timer_t *user_timer;
+	OS_EVENT event;
+	HANDLE cur_task = luat_get_current_task();
+	struct tcp_pcb *pcb, *dpcb;
+	struct netif *netif;
+//	ip_addr_t *p_ip, *local_ip;
+//	struct pbuf *out_p;
+	int error, i;
+	PV_Union uPV;
+//	uint8_t socket_id;
+//	uint8_t adapter_index;
+	while(1)
+	{
+
+		if (luat_wait_event_from_task(cur_task, 0, &event, NULL, 0) != ERROR_NONE)
+		{
+			continue;
+		}
+		if (!prvlwip.tcpip_tcp_timer_active)
+		{
+			if ((luat_mcu_tick64_ms() - prvlwip.last_sleep_ms) >= TCP_SLOW_INTERVAL)
+			{
+				tcp_ticks += (luat_mcu_tick64_ms() - prvlwip.last_sleep_ms) / TCP_SLOW_INTERVAL;
+				prvlwip.last_sleep_ms = luat_mcu_tick64_ms();
+//				LLOGD("tcp ticks add to %u", tcp_ticks);
+			}
+		}
+		else
+		{
+			prvlwip.last_sleep_ms = luat_mcu_tick64_ms();
+		}
+//		socket_id = event.Param1;
+//		adapter_index = event.Param3;
+		switch(event.ID)
+		{
+		case EV_LWIP_NETIF_INPUT:
+			netif = (struct netif *)event.Param3;
+			error = netif->input((struct pbuf *)event.Param1, netif);
+			if(error != ERR_OK)
+			{
+				LLOGD("%d", error);
+				pbuf_free((struct pbuf *)event.Param1);
+			}
+			break;
+		case EV_LWIP_API_RUN:
+			cb = (TaskFun_t)event.Param1;
+			cb((void *)event.Param2);
+			break;
+		case EV_LWIP_SYS_TIMEOUT:
+			LLOGD("sys timer%d", event.Param1);
+			prv_lwip_timer_list[event.Param1].handler();
+			break;
+		case EV_LWIP_TIMEOUT:
+			user_timer = (lwip_timer_t *)event.Param1;
+			user_timer->handler(user_timer->args);
+			luat_release_rtos_timer(user_timer->timer);
+			luat_heap_free(user_timer);
+			break;
+		default:
+			luat_lwip_event_run(&event);
+			break;
+		}
+	}
+
+}
+
+void luat_lwip_init(void)
+{
+	uint32_t i;
+	for(uint32_t i = 0; i < LWIP_SYS_TIMER_CNT; i++)
+	{
+		prvlwip.sys_cyclic_timer[i] = luat_create_rtos_timer(luat_lwip_sys_timer_cb, (void *)i, NULL);
+	}
+	tcp_ticks = luat_mcu_tick64_ms() / TCP_SLOW_INTERVAL;
+	prvlwip.last_sleep_ms = luat_mcu_tick64_ms();
+	luat_rtos_task_create(&prvlwip.task_handle, 16 * 1024, 120, "lwip", luat_lwip_task, NULL, 64);
+	lwip_init();
+	for(i = 1; i < LWIP_SYS_TIMER_CNT; i++)
+	{
+		if (prv_lwip_timer_list[i].interval_ms && prv_lwip_timer_list[i].handler)
+		{
+			luat_start_rtos_timer(prvlwip.sys_cyclic_timer[i], prv_lwip_timer_list[i].interval_ms, 1);
+		}
+	}
+}
+
+static void
+tcpip_tcp_timer(void *arg)
+{
+  /* call TCP timer handler */
+	tcp_tmr();
+	/* timer still needed? */
+	if (tcp_active_pcbs || tcp_tw_pcbs) {
+    /* restart timer */
+		if (!prvlwip.tcpip_tcp_timer_active)
+		{
+			luat_start_rtos_timer(prvlwip.sys_cyclic_timer[0], TCP_TMR_INTERVAL, 1);
+			prvlwip.tcpip_tcp_timer_active = 1;
+		}
+	} else {
+		/* disable timer */
+		prvlwip.tcpip_tcp_timer_active = 0;
+		luat_stop_rtos_timer(prvlwip.sys_cyclic_timer[0]);
+	}
+}
+
+
+void tcp_timer_needed(void)
+{
+	if (!prvlwip.tcpip_tcp_timer_active && (tcp_active_pcbs || tcp_tw_pcbs)) {
+		luat_start_rtos_timer(prvlwip.sys_cyclic_timer[0], TCP_TMR_INTERVAL, 1);
+		prvlwip.tcpip_tcp_timer_active = 1;
+		LLOGD("tcp timer start");
+	}
+}
+
+void sys_timeouts_init(void)
+{
+	;
+}
+void sys_timeout(u32_t msecs, sys_timeout_handler handler, void *arg)
+{
+	lwip_timer_t *user_timer = luat_heap_malloc(sizeof(lwip_timer_t));
+	user_timer->timer = luat_create_rtos_timer(luat_lwip_timer_cb, (void *)user_timer, NULL);
+	user_timer->handler = handler;
+	user_timer->args = arg;
+	luat_start_rtos_timer(user_timer, msecs, 0);
+}
+void sys_untimeout(sys_timeout_handler handler, void *arg)
+{
+	;
+}
+
+u32_t sys_now(void)
+{
+	return (u32_t)luat_mcu_tick64_ms();
+}

+ 320 - 0
components/network/lwip22/port/luat_rtos/lwipopts.h

@@ -0,0 +1,320 @@
+
+#ifndef LWIP_HDR_LWIPOPTS_H
+#define LWIP_HDR_LWIPOPTS_H
+#ifdef __USE_SDK_LWIP__
+#else
+#include "stdlib.h"
+#if defined(__SOC_BSP__)
+#include "bsp_common.h"
+#else
+#include "c_common.h"
+#endif
+
+#ifdef LUAT_LWIP_CONFIG_H_FILE
+#include LUAT_LWIP_CONFIG_H_FILE
+#endif
+
+#define LUAT_LWIP_USE_EVENT				1
+
+#define NO_SYS                          1	//是否不带OS,1不带
+#define NO_SYS_NO_TIMERS                1
+#define LWIP_TIMERS                     1
+#define LWIP_TIMERS_CUSTOM              1
+#define LWIP_MPU_COMPATIBLE             1
+#define LWIP_TCPIP_CORE_LOCKING         0
+#define LWIP_TCPIP_CORE_LOCKING_INPUT   0
+#define SYS_LIGHTWEIGHT_PROT            0	//平台锁,保护关键区域内缓存的分配与释放,目前lwip不允许放在中断处理,不需要额外的平台锁
+
+//mem管理
+#define MEM_ALIGNMENT                   4
+#define MEMP_MEM_MALLOC 1
+//#define MEM_LIBC_MALLOC 1
+//#define mem_clib_free luat_heap_free
+//#define mem_clib_malloc luat_heap_malloc
+//#define mem_clib_calloc luat_heap_calloc
+//#define MEM_USE_POOLS	1
+//#define MEMP_NUM_RAW_PCB                4
+//#define MEMP_NUM_UDP_PCB 				16
+//#define MEMP_NUM_TCP_PCB 				20
+//#define MEMP_NUM_TCP_PCB_LISTEN			4
+//#define MEMP_NUM_PBUF					256
+//#define MEMP_NUM_REASSDATA //IP数据包排队数量
+//
+//#define MEMP_NUM_ARP_QUEUE //arp队列数
+//
+//#define MEMP_NUM_IGMP_GROUP //组播网络接口数
+//
+//#define MEMP_NUM_SYS_TIMEOUT //系统超时设置
+//
+//#define MEMP_NUM_NETBUF //netbuf结构数
+//
+//#define MEMP_NUM_NETCONN //netconn结构数
+//
+//#define MEMP_NUM_TCPIP_MSG_API //tcpip消息数
+//
+//#define MEMP_NUM_TCPIP_MSG_INPKT //tcpip数据包相关设置
+
+#define LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT 0
+#define LWIP_SINGLE_NETIF				0
+
+#define LWIP_ARP                        1
+#define ARP_TABLE_SIZE                  10	//ip地址缓冲对数量
+#define ARP_MAXAGE                      300
+#define ARP_QUEUEING                    0	//arp队列
+#define ARP_QUEUE_LEN                   3
+#define ETHARP_SUPPORT_VLAN             0
+#define LWIP_ETHERNET                   LWIP_ARP
+#define ETH_PAD_SIZE                    0
+#define ETHARP_SUPPORT_STATIC_ENTRIES   0
+#define ETHARP_TABLE_MATCH_NETIF        !LWIP_SINGLE_NETIF
+#define LWIP_IPV4                       1
+#define IP_FORWARD                      1	 //ip包转发
+#define IP_REASSEMBLY                   1	//IP断点续传
+#define IP_FRAG                         1	//IP断点发送
+#define IP_OPTIONS_ALLOWED              1	//ip选项允许
+#define IP_REASS_MAXAGE                 15	//分段数据包最大时间
+#define IP_REASS_MAX_PBUFS              10	//分段组装条数
+#define IP_DEFAULT_TTL                  255	//IP最大ttl时间
+#define IP_SOF_BROADCAST                0
+#define IP_SOF_BROADCAST_RECV           0
+#define IP_FORWARD_ALLOW_TX_ON_RX_NETIF 0
+#define LWIP_ICMP                       1	//ICMP使能
+#define ICMP_TTL                        (IP_DEFAULT_TTL)
+#define LWIP_BROADCAST_PING             0
+#define LWIP_MULTICAST_PING             0
+#define LWIP_RAW                        1
+#define RAW_TTL                         (IP_DEFAULT_TTL)
+#define LWIP_DHCP                       LWIP_UDP	//DHCP使能
+#define DHCP_DOES_ARP_CHECK				1		//arp地址检查
+#define LWIP_DHCP_CHECK_LINK_UP         0
+#define LWIP_DHCP_BOOTP_FILE            0
+#define LWIP_DHCP_GET_NTP_SRV           0
+#define LWIP_DHCP_MAX_NTP_SERVERS       0
+#define LWIP_DHCP_MAX_DNS_SERVERS       DNS_MAX_SERVERS
+#define LWIP_AUTOIP                     0
+#define LWIP_DHCP_AUTOIP_COOP           0
+#define LWIP_DHCP_AUTOIP_COOP_TRIES     9
+#define LWIP_MIB2_CALLBACKS             0
+#define LWIP_MULTICAST_TX_OPTIONS       ((LWIP_IGMP || LWIP_IPV6_MLD) && (LWIP_UDP || LWIP_RAW))
+#define LWIP_IGMP                       0
+#define LWIP_DNS                        0
+#define DNS_TABLE_SIZE                  16	// dns最大记录数
+#define DNS_MAX_NAME_LENGTH             256
+#define DNS_MAX_SERVERS                 4	//最大dns服务数
+#define DNS_MAX_RETRIES                 4
+#define DNS_DOES_NAME_CHECK             1
+#define LWIP_DNS_SECURE (LWIP_DNS_SECURE_RAND_XID | LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING | LWIP_DNS_SECURE_RAND_SRC_PORT)
+#define DNS_LOCAL_HOSTLIST              0
+#define DNS_LOCAL_HOSTLIST_IS_DYNAMIC   0
+#define LWIP_DNS_SUPPORT_MDNS_QUERIES   0
+#define LWIP_UDP                        1
+#define LWIP_UDPLITE                    0
+#define UDP_TTL                         (IP_DEFAULT_TTL)
+#define LWIP_NETBUF_RECVINFO            0
+#define LWIP_TCP                        1
+#define TCP_TTL                         (IP_DEFAULT_TTL)
+
+#define TCP_QUEUE_OOSEQ                 (LWIP_TCP)
+#define LWIP_TCP_SACK_OUT               0
+#define LWIP_TCP_MAX_SACK_NUM           4
+#ifndef TCP_MSS
+#define TCP_MSS                         1340
+#endif
+#define TCP_CALCULATE_EFF_SEND_MSS      1
+#define TCP_SND_QUEUELEN                ((4 * (TCP_SND_BUF) + (TCP_MSS - 1))/(TCP_MSS))
+#define TCP_SNDLOWAT                    LWIP_MIN(LWIP_MAX(((TCP_SND_BUF)/2), (2 * TCP_MSS) + 1), (TCP_SND_BUF) - 1)
+#define TCP_SNDQUEUELOWAT               LWIP_MAX(((TCP_SND_QUEUELEN)/2), 5)
+#define TCP_OOSEQ_MAX_BYTES             0
+#define TCP_OOSEQ_BYTES_LIMIT(pcb)      TCP_OOSEQ_MAX_BYTES
+#define TCP_OOSEQ_MAX_PBUFS             0
+#define TCP_OOSEQ_PBUFS_LIMIT(pcb)      TCP_OOSEQ_MAX_PBUFS
+#define TCP_LISTEN_BACKLOG              0
+#define TCP_DEFAULT_LISTEN_BACKLOG      0xff
+#define TCP_OVERSIZE                    TCP_MSS
+#define LWIP_TCP_TIMESTAMPS             0
+#define TCP_WND_UPDATE_THRESHOLD        LWIP_MIN((TCP_WND / 4), (TCP_MSS * 4))
+#define LWIP_EVENT_API                  0
+#define LWIP_CALLBACK_API               1
+#define LWIP_WND_SCALE                  1
+#define TCP_RCV_SCALE                   0
+#define LWIP_TCP_PCB_NUM_EXT_ARGS       0
+#define LWIP_ALTCP                      0
+#define LWIP_ALTCP_TLS                  0
+#define PBUF_LINK_HLEN                  (14 + ETH_PAD_SIZE)
+#define PBUF_LINK_ENCAPSULATION_HLEN    0
+#define PBUF_POOL_BUFSIZE               LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_ENCAPSULATION_HLEN+PBUF_LINK_HLEN)
+#define LWIP_PBUF_REF_T                 u8_t
+#define LWIP_SINGLE_NETIF               0
+#define LWIP_NETIF_HOSTNAME             0
+#define LWIP_NETIF_API                  0
+#define LWIP_NETIF_STATUS_CALLBACK      0
+#define LWIP_NETIF_EXT_STATUS_CALLBACK  1
+#define LWIP_NETIF_LINK_CALLBACK        1
+#define LWIP_NETIF_REMOVE_CALLBACK      0
+#define LWIP_NETIF_HWADDRHINT           0
+#define LWIP_NETIF_TX_SINGLE_PBUF       0
+#define LWIP_NUM_NETIF_CLIENT_DATA      0
+#define LWIP_HAVE_LOOPIF                0
+#define LWIP_LOOPIF_MULTICAST           0
+#define LWIP_NETIF_LOOPBACK             0
+#define LWIP_LOOPBACK_MAX_PBUFS         0
+#define LWIP_NETIF_LOOPBACK_MULTITHREADING    (!NO_SYS)
+/*#define TCPIP_THREAD_NAME               "tcpip_thread"
+#define TCPIP_THREAD_STACKSIZE          0
+#define TCPIP_THREAD_PRIO               1
+#define TCPIP_MBOX_SIZE                 0
+#define LWIP_TCPIP_THREAD_ALIVE()
+#define SLIPIF_THREAD_NAME              "slipif_loop"
+#define SLIPIF_THREAD_STACKSIZE         0
+#define SLIPIF_THREAD_PRIO              1
+#define DEFAULT_THREAD_NAME             "lwIP"
+#define DEFAULT_THREAD_STACKSIZE        0
+#define DEFAULT_THREAD_PRIO             1
+#define DEFAULT_RAW_RECVMBOX_SIZE       0
+#define DEFAULT_UDP_RECVMBOX_SIZE       0
+#define DEFAULT_TCP_RECVMBOX_SIZE       0
+#define DEFAULT_ACCEPTMBOX_SIZE         0*/
+#define LWIP_NETCONN                    0
+#define LWIP_TCPIP_TIMEOUT              1
+#define LWIP_NETCONN_SEM_PER_THREAD     0
+#define LWIP_NETCONN_FULLDUPLEX         0
+#define LWIP_SOCKET                     0
+#define LWIP_COMPAT_SOCKETS             1 /* 0..2 */
+#define LWIP_POSIX_SOCKETS_IO_NAMES     1
+#define LWIP_SOCKET_OFFSET              0
+#define LWIP_TCP_KEEPALIVE              1
+#define TCP_KEEPIDLE_DEFAULT			540000	//cmnet require 10min, so use 9min
+#define TCP_KEEPINTVL_DEFAULT			5000
+#define LWIP_SO_SNDTIMEO                0
+#define LWIP_SO_RCVTIMEO                0
+#define LWIP_SO_SNDRCVTIMEO_NONSTANDARD 1
+#define LWIP_SO_RCVBUF                  0
+#define LWIP_SO_LINGER                  0
+#define RECV_BUFSIZE_DEFAULT            INT_MAX
+#define LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT 20000
+#define SO_REUSE                        1
+#define SO_REUSE_RXTOALL                1
+#define LWIP_FIONREAD_LINUXMODE         0
+#define LWIP_SOCKET_SELECT              1
+#define LWIP_SOCKET_POLL                1
+#define LWIP_STATS                      1
+#define LWIP_STATS_DISPLAY              0
+#define LINK_STATS                      1
+#define ETHARP_STATS                    (LWIP_ARP)
+#define IP_STATS                        1
+#define IPFRAG_STATS                    (IP_REASSEMBLY || IP_FRAG)
+#define ICMP_STATS                      1
+#define IGMP_STATS                      (LWIP_IGMP)
+#define UDP_STATS                       (LWIP_UDP)
+#define TCP_STATS                       (LWIP_TCP)
+#define MEM_STATS                       ((MEM_LIBC_MALLOC == 0) && (MEM_USE_POOLS == 0))
+#define MEMP_STATS                      (MEMP_MEM_MALLOC == 0)
+#define SYS_STATS                       (NO_SYS == 0)
+#define IP6_STATS                       (LWIP_IPV6)
+#define ICMP6_STATS                     (LWIP_IPV6 && LWIP_ICMP6)
+#define IP6_FRAG_STATS                  (LWIP_IPV6 && (LWIP_IPV6_FRAG || LWIP_IPV6_REASS))
+#define MLD6_STATS                      (LWIP_IPV6 && LWIP_IPV6_MLD)
+#define ND6_STATS                       (LWIP_IPV6)
+#define MIB2_STATS                      0
+//#define LWIP_CHECKSUM_CTRL_PER_NETIF    1
+//#define CHECKSUM_GEN_IP                 1
+//#define CHECKSUM_GEN_UDP                1
+//#define CHECKSUM_GEN_TCP                1
+//#define CHECKSUM_GEN_ICMP               1
+//#define CHECKSUM_GEN_ICMP6              1
+//#define CHECKSUM_CHECK_IP               1
+//#define CHECKSUM_CHECK_UDP              1
+//#define CHECKSUM_CHECK_TCP              1
+//#define CHECKSUM_CHECK_ICMP             1
+//#define CHECKSUM_CHECK_ICMP6            1
+//#define LWIP_CHECKSUM_ON_COPY           1
+#define LWIP_IPV6                       1
+#define IPV6_REASS_MAXAGE               60
+#define LWIP_IPV6_SCOPES                (LWIP_IPV6 && !LWIP_SINGLE_NETIF)
+#define LWIP_IPV6_SCOPES_DEBUG          0
+#define LWIP_IPV6_NUM_ADDRESSES         3
+#define LWIP_IPV6_FORWARD               0
+#define LWIP_IPV6_FRAG                  1
+#define LWIP_IPV6_REASS                 (LWIP_IPV6)
+#define LWIP_IPV6_SEND_ROUTER_SOLICIT   1
+#define LWIP_IPV6_AUTOCONFIG            (LWIP_IPV6)
+#define LWIP_IPV6_ADDRESS_LIFETIMES     (LWIP_IPV6_AUTOCONFIG)
+#define LWIP_IPV6_DUP_DETECT_ATTEMPTS   1
+#define LWIP_ICMP6                      (LWIP_IPV6)
+#define LWIP_ICMP6_DATASIZE             8
+#define LWIP_ICMP6_HL                   255
+#define LWIP_IPV6_MLD                   (LWIP_IPV6)
+#define MEMP_NUM_MLD6_GROUP             4
+#define LWIP_ND6_QUEUEING               (LWIP_IPV6)
+#define MEMP_NUM_ND6_QUEUE              20
+#define LWIP_ND6_NUM_NEIGHBORS          10
+#define LWIP_ND6_NUM_DESTINATIONS       10
+#define LWIP_ND6_NUM_PREFIXES           5
+#define LWIP_ND6_NUM_ROUTERS            3
+#define LWIP_ND6_MAX_MULTICAST_SOLICIT  3
+#define LWIP_ND6_MAX_UNICAST_SOLICIT    3
+#define LWIP_ND6_MAX_ANYCAST_DELAY_TIME 1000
+#define LWIP_ND6_MAX_NEIGHBOR_ADVERTISEMENT  3
+#define LWIP_ND6_REACHABLE_TIME         30000
+#define LWIP_ND6_RETRANS_TIMER          1000
+#define LWIP_ND6_DELAY_FIRST_PROBE_TIME 5000
+#define LWIP_ND6_ALLOW_RA_UPDATES       1
+#define LWIP_ND6_TCP_REACHABILITY_HINTS 1
+#define LWIP_ND6_RDNSS_MAX_DNS_SERVERS  0
+#define LWIP_IPV6_DHCP6                 0
+#define LWIP_IPV6_DHCP6_STATEFUL        0
+#define LWIP_IPV6_DHCP6_STATELESS       LWIP_IPV6_DHCP6
+#define LWIP_DHCP6_GET_NTP_SRV          0
+#define LWIP_DHCP6_MAX_NTP_SERVERS      0
+#define LWIP_DHCP6_MAX_DNS_SERVERS      DNS_MAX_SERVERS
+//#define LWIP_USING_NAT
+/* TODO: check hooks */
+
+#define LWIP_DBG_MIN_LEVEL              LWIP_DBG_LEVEL_ALL
+#define LWIP_DBG_TYPES_ON               LWIP_DBG_ON
+
+#define LWIP_TESTMODE                   0
+
+#define LWIP_PERF                       0
+
+
+#define LWIP_PROVIDE_ERRNO
+
+
+//#define SYS_ARCH_INC(var, val)
+//#define SYS_ARCH_DEC(var, val)
+//#define SYS_ARCH_GET(var, val)
+//#define SYS_ARCH_SET(var, val)
+#define SYS_ARCH_LOCKED(code)
+#define SYS_ARCH_DECL_PROTECT(x)
+#define SYS_ARCH_PROTECT(x)
+#define SYS_ARCH_UNPROTECT(x)
+//typedef uint32_t sys_prot_t;
+
+
+
+#ifndef LWIP_NUM_SOCKETS
+#define LWIP_NUM_SOCKETS	64
+#endif
+
+
+#define TCP_MAXRTX                      12
+#define TCP_SYNMAXRTX                   6
+#ifndef TCP_SND_BUF
+#define TCP_SND_BUF                     (32 * TCP_MSS)
+#endif
+#ifndef TCP_WND
+#define TCP_WND                         (32 * TCP_MSS)
+#endif
+#define MEM_SIZE 						8192 * 3
+
+#define TCP_MORE_DELAY					0
+
+typedef void (*tcpip_callback_fn)(void *ctx);
+int8_t  tcpip_try_callback(tcpip_callback_fn function, void *ctx);
+int8_t  tcpip_callback(tcpip_callback_fn function, void *ctx);
+#define tcpip_callback_with_block(function, ctx, block) ((block != 0)? tcpip_callback(function, ctx) : tcpip_try_callback(function, ctx))
+
+#endif
+
+#endif /* LWIP_HDR_LWIPOPTS_H */