目錄
1. 簡介
在lwIP 協議棧簡介可知,lwIP 協議棧可以根據需要來裁剪配置,具體裁剪配置就體現在其選項配置文件上,即 opt.h。
爲了保持lwIP TCP/IP協議棧中源碼的獨立性,一般不會直接更改 opt.h ,而是會單獨添加一個用戶自定義的文件來表明用戶自己的配置,即 lwipopts.h 。上述這種,不破壞源文件,而根據用戶單獨定義文件的方式在lwIP應用中也多次用到。
在lwIP 的 例程中,或應用中,都可以發現lwipopts.h文件,此文件已經約定俗成,故此用戶自定義配置就在此處。
lwipopts.h 的參考文件可以去官方例程中獲取參考裁剪,當然獲取途徑不拘泥於此。
2. 配置 opt.h 說明
2.1 基礎配置(Infrastructure)
-
NO_SYS
/*
NO_SYS == 1: 無操作系統,無法使用線程安全相關API,只能使用callback-style raw API
須要注意不能一次從多個上下文訪問lwIP函數/結構
NO_SYS == 0: 有操作系統
*/
#define NO_SYS 0
-
Timers
/*
LWIP_TIMEERS == 0: 刪除對sys_timeout和lwip內部循環定時器的支持。
(仍提供lwip內部循環定時器數組)
(檢查NO_SYS_NO_TIMERS是否與舊版本兼容)
*/
#define LWIP_TIMERS 1
/*
LWIP_TIMERS_CUSTOM == 1: 提供自定義的定時器實現,timeouts.h中函數原型等及以下
sys_timeouts_init(), sys_timeout(),
sys_untimeout(), sys_timeouts_mbox_fetch()
*/
#define LWIP_TIMERS_CUSTOM 0
/**
* @defgroup lwip_opts_memcpy memcpy
* @ingroup lwip_opts_infrastructure
* @{
*/
/* 若實施速度比C庫中包含的更快,則覆蓋此項 */
#define MEMCPY(dst, src, len) memcpy(dst,src,len)
/* 謹慎覆蓋! 如果長度在編譯時已知且很小,則某些編譯器(例如gcc)可以內聯對memcpy()的調用 */
#define SMEMCPY(dst, src, len) memcpy(dst,src,len)
/* 若實施速度比C庫中包含的更快,則覆蓋此項。 lwIP僅在啓用IPv6分段支持時才使用MEMMOVE。 */
#define MEMMOVE(dst, src, len) memmove(dst,src,len)
/* 採用默認配置 */
/*
----------- Core locking -----------
*/
/*
MPU(內存保護單元) 兼容:
啓用特殊的內存管理機制,通過不將堆棧指針傳遞給其他線程,使lwip能夠在MPU系統上工作
(這會降低性能,因爲內存是從池中分配而不是將其保留在堆棧中)
*/
#define LWIP_MPU_COMPATIBLE 0
/*
創建在TCPIP線程操作期間保留的全局互斥鎖。
可以通過客戶端代碼鎖定以執行lwIP操作,而無需使用回調更改爲TCPIP線程。
請參閱LOCK_TCPIP_CORE()和UNLOCK_TCPIP_CORE()。
您的系統應提供支持優先級倒置的互斥鎖以使用它
*/
#define LWIP_TCPIP_CORE_LOCKING 1
/*
LWIP_TCPIP_CORE_LOCKING == 1
使得tcpip_input()也可以獲取輸入數據包的互斥鎖,而不是分配消息並將其傳遞給tcpip_thread
注意:從中斷上下文調用tcpip_input()時,這不起作用!
*/
#define LWIP_TCPIP_CORE_LOCKING_INPUT 0
/*
SYS_LIGHTWEIGHT_PROT == 1
在緩衝區分配,釋放和內存分配以及解除分配期間,爲某些關鍵區域啓用任務間保護(和任務與中斷保護)。
注意:從多個上下文中使用lwIP時需要這樣做! 如果你禁用它,你必須確定你在做什麼! */
#define SYS_LIGHTWEIGHT_PROT 1
/*
宏/函數,用於檢查當前函數調用期間是否滿足lwIP的線程/鎖定要求。
此宏通常調用在依賴於OS的sys層中實現的函數,並執行以下檢查:
不在ISR中(這也應該檢查NO_SYS == 1!)
如果LWIP_TCPIP_CORE_LOCKING = 1:保持TCPIP核心鎖定
如果LWIP_TCPIP_CORE_LOCKING = 0:從TCPIP線程調用函數
*/
#define LWIP_ASSERT_CORE_LOCKED()
/*
在lwIP TCPIP線程中首次調用。 可以與LWIP_ASSERT_CORE_LOCKED一起使用來檢查內核鎖定。
實際標識 TCPIP線程的句柄
*/
#define LWIP_MARK_TCPIP_THREAD()
-
Heap and memory pools
/*
---------- Memory options ----------
*/
/*
內存堆(heap)分配策略
MEM_LIBC_MALLOC==1: 使用C庫提供的malloc / free / realloc而不是lwip內部分配器。
一般情況,C庫的分配策略碎片化比較嚴重,不適用於嵌入式
*/
#define MEM_LIBC_MALLOC 0
/*
內存池分配策略(是否用內存堆分配策略實現內存池分配)
MEMP_MEM_MALLOC == 1:使用mem_malloc/mem_free而不是lwip內存池分配器。
(堆分配可能比池分配慢得多)
與MEM_USE_POOLS只能選擇其一
*/
#define MEMP_MEM_MALLOC 0
/*
MEMP_MEM_INIT == 1:
強制使用memset初始化池內存。 如果池在未初始化的內存部分中移動,則很有用。
這將確保pcbs結構中的默認值在所有條件下都能很好地初始化。
*/
#define MEMP_MEM_INIT 0
/* 字節對齊*/
#define MEM_ALIGNMENT 4
/*
MEM_SIZE:堆內存的大小。 如果應用程序將發送大量需要複製的數據,則應將其設置爲高。
*/
#define MEM_SIZE 1600
/*
內存池溢出檢查
0: 不檢查
1: 釋放時檢查
2:調用memp_malloc() or memp_free() 檢查,有用,但很慢
*/
#define MEMP_OVERFLOW_CHECK 0
/*
內存池健全性檢查
MEMP_SANITY_CHECK == 1:在每個memp_free()之後運行一次健全性檢查,以確保鏈表中沒有循環。
*/
#define MEMP_SANITY_CHECK 0
/*
堆內存溢出檢查
0: 不檢查
1: 釋放時檢查
2:調用mem_malloc() or mem_free() 檢查,有用,但很慢
*/
#define MEM_OVERFLOW_CHECK 0
/* 堆內存健全性檢查 */
#define MEM_SANITY_CHECK 0
/*
內存堆分配策略(是否用內存池分配策略實現內存堆分配)
MEM_USE_POOLS==1: 使用內存池方式,還必須啓用MEMP_USE_CUSTOM_POOLS。
與MEMP_MEM_MALLOC只能選擇其一
*/
#define MEM_USE_POOLS 0
/*
MEM_USE_POOLS_TRY_BIGGER_POOL== 1:
如果一個malloc_pool爲空,請嘗試下一個更大的池 -
警告:這個可能的廢物存儲器,但它可以使系統更可靠。
*/
#define MEM_USE_POOLS_TRY_BIGGER_POOL 0
/*
MEMP_USE_CUSTOM_POOLS== 1:
是否包含用戶文件lwippools.h,該文件定義了lwIP所需的“標準”之外的其他池。
如果將其設置爲1,則必須在包含路徑中的某個位置使用lwippools.h。
*/
#define MEMP_USE_CUSTOM_POOLS 0
/*
其他上下文釋放內存
*/
#define LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT 0
參考該博主文章:
https://blog.csdn.net/ZCShouCSDN/article/details/80282907
-
Internal memory pools
/*
協議包緩存數量 PBUF(Packet buffers)
(用於PBUF_ROM和PBUF_REF)。 如果應用程序從ROM(或其他靜態存儲器)發送大量數據,則應將其設置爲高。
*/
#define MEMP_NUM_PBUF 16
/*
Raw 協議控制塊數量(需LWIP_RAW選項)
*/
#define MEMP_NUM_RAW_PCB 4
/* UDP協議控制塊的數量。 每個活動UDP“連接”一個。 (需LWIP_UDP選項)*/
#define MEMP_NUM_UDP_PCB 4
/* 併發的TCP連接數。 (需要LWIP_TCP選項) */
#define MEMP_NUM_TCP_PCB 5
/* 偵聽TCP連接的數量。 (需要LWIP_TCP選項) */
#define MEMP_NUM_TCP_PCB_LISTEN 8
/* 同時排隊的TCP段的數量。 (需要LWIP_TCP選項) */
#define MEMP_NUM_TCP_SEG 16
/*
同時活動的altcp層控制塊的數量。
(需要LWIP_ALTCP選項)具有多個層的連接需要多個altcp_pcb(例如,TCP上的TLS需要2個altcp_pcbs, 一個用於TLS,一個用於TCP)。
*/
#define MEMP_NUM_ALTCP_PCB MEMP_NUM_TCP_PCB
/* 同時排隊等待重組的IP數據包數量(整個數據包,而不是片段!) */
#define MEMP_NUM_REASSDATA 5
/*
同時發送的IP分片數(片段,而不是整個數據包!)。
這僅用於LWIP_NETIF_TX_SINGLE_PBUF == 0並且只有在啓用DMA的MAC時必須> 1,其中當 netif->output返回時尚未發送數據包。
*/
#define MEMP_NUM_FRAG_PBUF 15
/*
ARP 隊列數(需要ARP_QUEUEING選項)
*/
#define MEMP_NUM_ARP_QUEUE 30
/* 組播網絡接口數 */
#define MEMP_NUM_IGMP_GROUP 8
/*
協議棧內核使用超時數量(不包含APP)此處爲所有已啓用的模塊計算默認的超時數。
*/
#define LWIP_NUM_SYS_TIMEOUT_INTERNAL (LWIP_TCP + IP_REASSEMBLY + LWIP_ARP + (2*LWIP_DHCP) + LWIP_AUTOIP + LWIP_IGMP + LWIP_DNS + PPP_NUM_TIMEOUTS + (LWIP_IPV6 * (1 + LWIP_IPV6_REASS + LWIP_IPV6_MLD)))
/* 同時活動的超時數。 此處爲所有已啓用的模塊計算默認的超時數。 公式要求設置爲“0”或“1”。 */
#define MEMP_NUM_SYS_TIMEOUT LWIP_NUM_SYS_TIMEOUT_INTERNAL
/*
netbuf 結構的數量。 (僅在使用sequential API時才需要,例如api_lib.c)
*/
#define MEMP_NUM_NETBUF 2
/*
netconns 結構的數量。 (僅在使用順序API時才需要,例如api_lib.c)
*/
#define MEMP_NUM_NETCONN 4
/*
lwip_select_cb 結構的數量。
(僅當你有LWIP_MPU_COMPATIBLE == 1並使用套接字API時才需要。在這種情況下,每個線程調用lwip_select需要一個。)
*/
#define MEMP_NUM_SELECT_CB 4
/*
struct tcpip_msg的數量,用於回調/超時API通信。 (僅在使用tcpip.c時才需要)
*/
#define MEMP_NUM_TCPIP_MSG_API 8
/*
struct tcpip_msg的數量,用於傳入的數據包。 (僅在使用tcpip.c時才需要)
*/
#define MEMP_NUM_TCPIP_MSG_INPKT 8
/* 併發運行的lwip_addrinfo()調用次數(在使用lwip_freeaddrinfo()釋放相應的內存之前)。 */
#define MEMP_NUM_NETDB 1
/* DNS_LOCAL_HOSTLIST_IS_DYNAMIC == 1時本地主機列表中的主機條目數。 */
#define MEMP_NUM_LOCALHOSTLIST 1
/* pbuf池中的緩衝區數。 */
#define PBUF_POOL_SIZE 16
/* 各種socket,netconn和tcpip函數的併發活動調用數 */
#define MEMP_NUM_API_MSG MEMP_NUM_TCPIP_MSG_API
/* netconn_gethostbyname的併發活動調用次數 */
#define MEMP_NUM_DNS_API_MSG MEMP_NUM_TCPIP_MSG_API
/* getsockopt / setsockopt的併發活動調用數 */
#define MEMP_NUM_SOCKET_SETGETSOCKOPT_DATA MEMP_NUM_TCPIP_MSG_API
/* netifapi函數同時調用的次數 */
#define MEMP_NUM_NETIFAPI_MSG MEMP_NUM_TCPIP_MSG_API
/*
LWIP_MIB2_CALLBACKS == 1:
打開SNMP MIB2回調。 打開它以獲得實現MIB2所需的回調。 通常也應該啓用MIB2_STATS。
*/
#define LWIP_MIB2_CALLBACKS 0
-
Multicast(組播)
/*
啓用多播TX支持,
如套接字選項IP_MULTICAST_TTL / IP_MULTICAST_IF / IP_MULTICAST_LOOP,
以及(當前僅支持)相應IPv6選項的核心支持。
*/
#define LWIP_MULTICAST_TX_OPTIONS ((LWIP_IGMP || LWIP_IPV6_MLD) && (LWIP_UDP || LWIP_RAW))
-
Threading
/* TCPIP 主線程名稱 */
#define TCPIP_THREAD_NAME "tcpip_thread"
/* TCPIP 主線程 棧大小 */
#define TCPIP_THREAD_STACKSIZE 0
/* TCPIP 主線程 優先級 */
#define TCPIP_THREAD_PRIO 1
/* TCPIP 主線程消息的郵箱大小 */
#define TCPIP_MBOX_SIZE 0
/* TCPIP 將其定義爲觸發監視程序的內容。 */
#define LWIP_TCPIP_THREAD_ALIVE()
/* SLIPIF 線程名稱 */
#define SLIPIF_THREAD_NAME "slipif_loop"
/* SLIPIF 線程 棧大小 */
#define SLIPIF_THREAD_STACKSIZE 0
/* SLIPIF 線程 優先級 */
#define SLIPIF_THREAD_PRIO 1
/* 默認 線程名稱 */
#define DEFAULT_THREAD_NAME "lwIP"
/* 默認 線程 棧大小 */
#define DEFAULT_THREAD_STACKSIZE 0
/* 默認 線程 優先級 */
#define DEFAULT_THREAD_PRIO 1
/* 默認 NETCONN_RAW傳入數據包的郵箱大小。 */
#define DEFAULT_RAW_RECVMBOX_SIZE 0
/* 默認 NETCONN_UDP傳入數據包的郵箱大小。 */
#define DEFAULT_UDP_RECVMBOX_SIZE 0
/* 默認 NETCONN_TCP傳入數據包的郵箱大小。 */
#define DEFAULT_TCP_RECVMBOX_SIZE 0
/* 默認 傳入連接的郵箱大小 */
#define DEFAULT_ACCEPTMBOX_SIZE 0
-
Checksum
/*
LWIP_CHECKSUM_CTRL_PER_NETIF== 1:
netif啓用/禁用校驗和生成/檢查
注意:如果啓用,則必須啓用CHECKSUM_GEN_ *和CHECKSUM_CHECK_ *定義!
*/
#define LWIP_CHECKSUM_CTRL_PER_NETIF 0
/* 爲傳出IP數據包生成校驗和*/
#define CHECKSUM_GEN_IP 1
/* 爲傳出UDP數據包生成校驗和*/
#define CHECKSUM_GEN_UDP 1
/* 爲傳出TCP數據包生成校驗和*/
#define CHECKSUM_GEN_TCP 1
/* 爲傳出ICMP數據包生成校驗和*/
#define CHECKSUM_GEN_ICMP 1
/* 爲傳出ICMP6數據包生成校驗和*/
#define CHECKSUM_GEN_ICMP6 1
/* 爲傳入IP數據包校驗和檢查 */
#define CHECKSUM_CHECK_IP 1
/* 爲傳入UDP數據包校驗和檢查 */
#define CHECKSUM_CHECK_UDP 1
/* 爲傳入TCP數據包校驗和檢查 */
#define CHECKSUM_CHECK_TCP 1
/* 爲傳入ICMP數據包校驗和檢查 */
#define CHECKSUM_CHECK_ICMP 1
/* 爲傳入ICMP6數據包校驗和檢查 */
#define CHECKSUM_CHECK_ICMP6 1
/* 將數據從應用程序緩衝區複製到pbuf時計算校驗和。 */
#define LWIP_CHECKSUM_ON_COPY 0
-
Hooks(鉤子選項)
/* 默認情況下鉤子未定義,如果需要,可將它們定義爲函數。 */
#define LWIP_HOOK_FILENAME "path/to/my/lwip_hooks.h"
#define LWIP_HOOK_TCP_ISN(local_ip, local_port, remote_ip, remote_port)
#define LWIP_HOOK_TCP_INPACKET_PCB(pcb, hdr, optlen, opt1len, opt2, p)
#define LWIP_HOOK_TCP_OUT_TCPOPT_LENGTH(pcb, internal_len)
#define LWIP_HOOK_TCP_OUT_ADD_TCPOPTS(p, hdr, pcb, opts)
#define LWIP_HOOK_IP4_INPUT(pbuf, input_netif)
#define LWIP_HOOK_IP4_ROUTE()
#define LWIP_HOOK_IP4_ROUTE_SRC(src, dest)
#define LWIP_HOOK_IP4_CANFORWARD(src, dest)
#define LWIP_HOOK_ETHARP_GET_GW(netif, dest)
#define LWIP_HOOK_IP6_INPUT(pbuf, input_netif)
#define LWIP_HOOK_IP6_ROUTE(src, dest)
#define LWIP_HOOK_ND6_GET_GW(netif, dest)
#define LWIP_HOOK_VLAN_CHECK(netif, eth_hdr, vlan_hdr)
#define LWIP_HOOK_VLAN_SET(netif, p, src, dst, eth_type)
#define LWIP_HOOK_MEMP_AVAILABLE(memp_t_type)
#define LWIP_HOOK_UNKNOWN_ETH_PROTOCOL(pbuf, netif)
#define LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, dhcp, state, msg, msg_type, options_len_ptr)
#define LWIP_HOOK_DHCP_PARSE_OPTION(netif, dhcp, state, msg, msg_type, option, len, pbuf, offset)
#define LWIP_HOOK_DHCP6_APPEND_OPTIONS(netif, dhcp6, state, msg, msg_type, options_len_ptr, max_len)
#define LWIP_HOOK_SOCKETS_SETSOCKOPT(s, sock, level, optname, optval, optlen, err)
#define LWIP_HOOK_SOCKETS_GETSOCKOPT(s, sock, level, optname, optval, optlen, err)
#define LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE(name, addr, addrtype, err)
2.2 IPv4
-
ARP
/*
LWIP_ARP == 1 : 使能ARP功能
*/
#define LWIP_ARP 1
/* MAC-IP地址緩存對大小*/
#define ARP_TABLE_SIZE 10
/* ARP條目在上次更新後保持有效的時間 */
#define ARP_MAXAGE 300
/*
ARP_QUEUEING== 1:
在硬件地址解析期間,多個傳出數據包排隊。 默認情況下,每個IP地址僅排隊最新的數據包。
這對大多數協議來說已足夠,主要是減少TCP連接啓動時間。
*/
#define ARP_QUEUEING 0
/*
其他網絡層可能爲每個未解析的地址排隊的最大數據包數。
默認爲3,0表示禁用。 丟棄舊數據包,新數據包排隊。
*/
#define ARP_QUEUE_LEN 3
/*
ETHARP_SUPPORT_VLAN == 1:支持使用VLAN標頭接收和發送以太網數據包
*/
#define ETHARP_SUPPORT_VLAN 0
/*
LWIP_ETHERNET== 1:啓用以太網支持
*/
#define LWIP_ETHERNET LWIP_ARP
/* 在以太網標頭之前添加的字節數,以確保在該標頭之後對齊有效負載。 */
#define ETH_PAD_SIZE 0
/*
ETHARP_SUPPORT_STATIC_ENTRIES== 1:
啓用以支持靜態ARP表條目(使用etharp_add_static_entry / etharp_remove_static_entry)。
*/
#define ETHARP_SUPPORT_STATIC_ENTRIES 0
/*
ETHARP_TABLE_MATCH_NETIF== 1:
匹配netif的ARP表條目。 如果禁用,則不支持多個netif上的重複IP地址(但這僅適用於AutoIP)
*/
#define ETHARP_TABLE_MATCH_NETIF !LWIP_SINGLE_NETIF
-
IP
/* 使能IPv4 */
#define LWIP_IPV4 1
/*
IP_FORWARD== 1:
啓用跨網絡接口轉發IP數據包的功能。 如果要在只有一個網絡接口的設備上運行lwIP,請將其定義爲0。
*/
#define IP_FORWARD 0
/*
IP_REASSEMBLY== 1:重新組合傳入的分段IP數據包。
*/
#define IP_REASSEMBLY 1
/*
IP_FRAG== 1:若傳出的IP數據包大小超過MTU,則將其分段。
*/
#define IP_FRAG 1
/*
定義IP選項的行爲。
IP_OPTIONS_ALLOWED == 0:丟棄所有帶IP選項的數據包。
IP_OPTIONS_ALLOWED == 1:允許IP選項(但未解析)
*/
#define IP_OPTIONS_ALLOWED 1
/*
分段IP數據包等待所有片段到達的最長時間。
如果此時並非所有片段都到達,則丟棄整個數據包。
秒
*/
#define IP_REASS_MAXAGE 15
/*
等待重新組裝的pbuf的最大總量。
由於接收到的pbuf已入隊,因此請務必配置PBUF_POOL_SIZE> IP_REASS_MAX_PBUFS,
以便即使最大數量的片段入隊重組,堆棧仍能夠接收數據包!
啓用IPv4和IPv6時,甚至會更改爲(PBUF_POOL_SIZE> 2 * IP_REASS_MAX_PBUFS)!
*/
#define IP_REASS_MAX_PBUFS 10
/* 傳輸層使用的生存時間的默認值。 */
#define IP_DEFAULT_TTL 255
/*
IP_SOF_BROADCAST= 1:
使用SOF_BROADCAST字段在udp和raw 發送
*/
#define IP_SOF_BROADCAST 0
/*
IP_SOF_BROADCAST_RECV==1:
(需要IP_SOF_BROADCAST = 1)啓用接收過濾。
*/
#define IP_SOF_BROADCAST_RECV 0
/*
IP_FORWARD_ALLOW_TX_ON_RX_NETIF== 1:
允許ip_forward()在收到它的netif上發回數據包。 僅用於無線網絡。
注意:當爲1時,請確保您的netif驅動程序使用相應的pbuf標記正確標記傳入的鏈路層廣播/多播數據包!
*/
#define IP_FORWARD_ALLOW_TX_ON_RX_NETIF 0
-
ICMP
/* 協議棧使能ICMP模塊*/
#define LWIP_ICMP 1
/* ICMP 數據包生存時間 */
#define ICMP_TTL IP_DEFAULT_TTL
/* LWIP_BROADCAST_PING== 1:響應廣播ping(默認爲僅單播)*/
#define LWIP_BROADCAST_PING 0
/* LWIP_MULTICAST_PING == 1:響應多播ping(默認爲單播) */
#define LWIP_MULTICAST_PING 0
-
DHCP
/* 使能 DHCP 功能 */
#define LWIP_DHCP 0
/* DHCP_DOES_ARP_CHECK== 1:對提供的地址進行ARP檢查。*/
#define DHCP_DOES_ARP_CHECK (LWIP_DHCP && LWIP_ARP)
/* LWIP_DHCP_BOOTP_FILE== 1:存儲provided_si_addr和boot_file_name。*/
#define LWIP_DHCP_BOOTP_FILE 0
/*
LWIP_DHCP_GETS_NTP== 1:
通過發現/選擇請求NTP服務器。 對於每個響應數據包,將調用一個回調,該回調必須由端口提供:
void dhcp_set_ntp_servers(u8_t num_ntp_servers,ip_addr_t * ntp_server_addrs);
*/
#define LWIP_DHCP_GET_NTP_SRV 0
/* NTP 服務最大請求數 */
#define LWIP_DHCP_MAX_NTP_SERVERS 1
#define LWIP_DHCP_MAX_DNS_SERVERS DNS_MAX_SERVERS
-
AUTOIP
/* 使能 AUTOIP 模塊*/
#define LWIP_AUTOIP 0
/*
LWIP_DHCP_AUTOIP_COOP == 1:允許同時在同一接口上同時啓用DHCP和AUTOIP。
*/
#define LWIP_DHCP_AUTOIP_COOP 0
/* DHCP 發現次數 */
#define LWIP_DHCP_AUTOIP_COOP_TRIES 9
-
IGMP
/* 使能 IGMP 模塊 */
#define LWIP_IGMP 0
2.3 Callback-style APIs
-
RAW
/* LWIP_RAW == 1:啓用應用層掛鉤到IP層本身。 */
#define LWIP_RAW 0
#define RAW_TTL IP_DEFAULT_TTL
-
DNS
/* DNS 模塊 */
#define LWIP_DNS 0
/* DNS本地維護的最大條目數。 */
#define DNS_TABLE_SIZE 4
/* 名稱表中支持的DNS最大主機名長度。 */
#define DNS_MAX_NAME_LENGTH 256
/* DNS服務器的最大數量。 */
#define DNS_MAX_SERVERS 2
/* 在“超時”之前,在請求名稱時DNS重試的最大次數。 */
#define DNS_MAX_RETRIES 4
/* DNS在查詢和響應之間進行名稱檢查。 */
#define DNS_DOES_NAME_CHECK 1
/* 控制DNS實施的安全級別,默認情況下使用所有DNS安全功能。 */
#define LWIP_DNS_SECURE (LWIP_DNS_SECURE_RAND_XID | LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING | LWIP_DNS_SECURE_RAND_SRC_PORT)
/* DNS 地址列表。 */
#define DNS_LOCAL_HOSTLIST 0
/* DNS 動態 地址列表 */
#define DNS_LOCAL_HOSTLIST_IS_DYNAMIC 0
/* MDNS 查詢支持*/
#define LWIP_DNS_SUPPORT_MDNS_QUERIES 0
-
UDP
/* 使能UDP */
#define LWIP_UDP 1
#define LWIP_UDPLITE 0
/* 生存時間 */
#define UDP_TTL IP_DEFAULT_TTL
/*
LWIP_NETBUF_RECVINFO == 1:將目標地址和端口附加到每個netbuf。
*/
#define LWIP_NETBUF_RECVINFO 0
-
TCP
/* 使能TCP */
#define LWIP_TCP 1
#define TCP_TTL IP_DEFAULT_TTL
/* TCP 窗口大小 :必須至少(2 * TCP_MSS)*/
#define TCP_WND (4 * TCP_MSS)
/* 數據段 最大重傳數 */
#define TCP_MAXRTX 12
/* SYN段 最大重傳數 */
#define TCP_SYNMAXRTX 6
/*
TCP_QUEUE_OOSEQ==1:
TCP將對無序到達的段進行排隊。 如果設備內存不足,請定義爲0。
*/
#define TCP_QUEUE_OOSEQ LWIP_TCP
/*
LWIP_TCP_SACK_OUT== 1:
TCP將支持發送選擇性確認(SACK)
*/
#define LWIP_TCP_SACK_OUT 0
#define LWIP_TCP_MAX_SACK_NUM 4
/* TCP_MSS:TCP最大段大小 */
#define TCP_MSS 536
/* tcp預計發送的分段長度,爲1則根據窗口大小分配 */
#define TCP_CALCULATE_EFF_SEND_MSS 1
/* 發送緩衝區(bytes)*/
#define TCP_SND_BUF (2 * TCP_MSS)
/* TCP發送方緩衝區空間(pbufs),隊列長度 */
#define TCP_SND_QUEUELEN ((4 * (TCP_SND_BUF) + (TCP_MSS - 1))/(TCP_MSS))
/* TCP可寫空間(bytes)。 這必須小於TCP_SND_BUF */
#define TCP_SNDLOWAT LWIP_MIN(LWIP_MAX(((TCP_SND_BUF)/2), (2 * TCP_MSS) + 1), (TCP_SND_BUF) - 1)
/*
TCP可寫bufs(pbuf計數)。 這必須小於TCP_SND_QUEUELEN。
如果在pcb上排隊的pbuf數量低於此數量,則select返回可寫(與TCP_SNDLOWAT結合使用)
*/
#define TCP_SNDQUEUELOWAT LWIP_MAX(((TCP_SND_QUEUELEN)/2), 5)
/* 在ooseq上排隊的默認最大字節數 */
#define TCP_OOSEQ_MAX_BYTES 0
/* 在ooseq上排隊的默認最大pbufs 數 */
#define TCP_OOSEQ_MAX_PBUFS 0
/* 啓用backlog選項 */
#define TCP_LISTEN_BACKLOG 0
/* TCP偵聽netconns允許的最大backlog */
#define TCP_DEFAULT_LISTEN_BACKLOG 0xff
/*
tcp_write可以提前分配的最大字節數,以嘗試創建更短的pbuf鏈進行傳輸。
有意義的範圍是0到TCP_MSS。
*/
#define TCP_OVERSIZE TCP_MSS
/* 支持TCP時間戳選項 */
#define LWIP_TCP_TIMESTAMPS 0
/* 窗口中的差異觸發顯式窗口更新 */
#define TCP_WND_UPDATE_THRESHOLD LWIP_MIN((TCP_WND / 4), (TCP_MSS * 4))
/* 事件或回調二選一,默認回調 */
#define LWIP_EVENT_API 0
#defin LWIP_CALLBACK_API 1
/* TCP Window Scale Option (WSopt): Kind: 3 Length: 3 bytes */
#define LWIP_WND_SCALE 0
#define TCP_RCV_SCALE 0
/* 擴展條目數 */
#define LWIP_TCP_PCB_NUM_EXT_ARGS 0
/*
Application layered TCP
LWIP_ALTCP == 1:
啓用altcp API。 altcp是一個抽象層,可以防止應用程序鏈接到tcp.h函數,但提供相同的功能。
LWIP_ALTCP == 0:
仍可編譯針對altcp API編寫的應用程序,但是直接鏈接到tcp.h回調API,然後無法使用分層協議。
*/
#define LWIP_ALTCP 0
/* LWIP_ALTCP_TLS== 1:altcp API啓用TLS(安全傳輸協議)支持 */
#define LWIP_ALTCP_TLS 0
2.4 PBUF
/* 鏈路層頭分配的字節數。 默認值爲14,即以太網的標準值。 */
#define PBUF_LINK_HLEN (14 + ETH_PAD_SIZE)
/* 以太網頭之前應爲其他封裝頭分配的字節數 */
#define PBUF_LINK_ENCAPSULATION_HLEN 0
/*
pbuf池中每個pbuf的大小。
默認設計用於在一個pbuf中容納單個完整大小的TCP幀,包括TCP_MSS,IP頭和鏈接頭。
*/
#define PBUF_POOL_BUFSIZE LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_ENCAPSULATION_HLEN+PBUF_LINK_HLEN)
/* pbuf中的Refcount類型。 如果255 refs不夠,可以增加u8_t的默認寬度。 */
#define LWIP_PBUF_REF_T u8_t
2.5 NETIF
/*
LWIP_SINGLE_NETIF== 1:
只使用一個netif。這是小型現實生活目標的常見情況。 可以省略一些像路由等代碼。
*/
#define LWIP_SINGLE_NETIF 0
/*
LWIP_NETIF_HOSTNAME== 1:
將DHCP_OPTION_HOSTNAME與netif的主機名字段一起使用。
*/
#define LWIP_NETIF_HOSTNAME 0
/*
LWIP_NETIF_API == 1:支持netif api(在netifapi.c中)
(to be used from non-TCPIP threads)
*/
#define LWIP_NETIF_API 0
/*
LWIP_NETIF_STATUS_CALLBACK== 1:
每當接口改變其上/下狀態時(即,由於DHCP IP獲取),支持回調功能
*/
#define LWIP_NETIF_STATUS_CALLBACK 0
/*
LWIP_NETIF_EXT_STATUS_CALLBACK== 1:
支持多個支持多個訂戶的netif相關事件的擴展回調函數。
*/
#define LWIP_NETIF_EXT_STATUS_CALLBACK 0
/*
LWIP_NETIF_LINK_CALLBACK== 1:
只要鏈接發生變化(即鏈接斷開),就從接口支持回調函數
*/
#define LWIP_NETIF_LINK_CALLBACK 0
/*
LWIP_NETIF_REMOVE_CALLBACK== 1:
支持在刪除netif時調用的回調函數
*/
#define LWIP_NETIF_REMOVE_CALLBACK 0
/*
LWIP_NETIF_HWADDRHINT== 1:在struct netif中緩存鏈接層地址提示(例如表索引)。
TCP和UDP可以利用它來防止掃描每個發送的數據包的ARP表。 雖然這對於大型ARP表或許多併發連接來說速 度更快,但如果您擁有一個小型ARP表或者從不存在併發連接,則可能會適得其反。
*/
#define LWIP_NETIF_HWADDRHINT 0
/*
單一PBUF發送
LWIP_NETIF_TX_SINGLE_PBUF== 1
lwIP會嘗試將所有數據發送到一個pbuf中。 這是爲了與不支持分散 - 聚集的支持DMA的MAC兼容。
*/
#define LWIP_NETIF_TX_SINGLE_PBUF 0
/* 可以在struct netif的client_data成員數組中存儲數據的客戶端數量(最多256個)。 */
#define LWIP_NUM_NETIF_CLIENT_DATA 0
2.6 IPv6
暫時不管
2.7 Thread-safe APIs
-
Netconn
/* LWIP_NETCONN==1: Enable Netconn API (require to use api_lib.c) */
#define LWIP_NETCONN 1
/*
LWIP_TCPIP_TIMEOUT== 1:
啓用tcpip_timeout / tcpip_untimeout以從另一個線程創建在tcpip_thread中運行的計時器。
*/
#define LWIP_TCPIP_TIMEOUT 0
/*
LWIP_NETCONN_SEM_PER_THREAD== 1:
每個線程使用一個(本地線程)信號量調用socket / netconn函數,而不是每netconn分配一個信號量(和每個選擇等)
*/
#define LWIP_NETCONN_SEM_PER_THREAD 0
/*
LWIP_NETCONN_FULLDUPLEX == 1:
啓用允許從一個線程讀取,從第二個線程寫入並同時從第三個線程關閉的代碼。
*/
#define LWIP_NETCONN_FULLDUPLEX 0
-
Sockets
/* LWIP_SOCKET==1: Enable Socket API (require to use sockets.c) */
#define LWIP_SOCKET 1
/*
LWIP_COMPAT_SOCKETS== 1:啓用BSD樣式的套接字函數名稱。
*/
#define LWIP_COMPAT_SOCKETS 1
/*
LWIP_POSIX_SOCKETS_IO_NAMES== 1:啓用POSIX樣式的套接字函數名稱
*/
#define LWIP_POSIX_SOCKETS_IO_NAMES 1
/* 增加LwIP創建的文件描述符編號 */
#define LWIP_SOCKET_OFFSET 0
#define LWIP_TCP_KEEPALIVE 0
/* 爲套接字/ netconns和SO_SNDTIMEO處理啓用發送超時。 */
#define LWIP_SO_SNDTIMEO 0
/* 爲套接字/ netconns和SO_SNDTIMEO處理啓用接收超時。 */
#define LWIP_SO_RCVTIMEO 0
#define LWIP_SO_SNDRCVTIMEO_NONSTANDARD 0
/* LWIP_SO_RCVBUF == 1:啓用SO_RCVBUF處理。 */
#define LWIP_SO_RCVBUF 0
/* LWIP_SO_LINGER == 1:啓用SO_LINGER處理。 */
#define LWIP_SO_LINGER 0
/* 如果使用LWIP_SO_RCVBUF,則這是recv_bufsize的默認值。 */
#define RECV_BUFSIZE_DEFAULT INT_MAX
/* 關閉超時默認值 */
#define LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT 20000
/* SO_REUSE==1: Enable SO_REUSEADDR option. */
#define SO_REUSE 0
#define SO_REUSE_RXTOALL 0
/* 數據模式選擇:0 win 1:linux*/
#define LWIP_FIONREAD_LINUXMODE 0
/*
LWIP_SOCKET_SELECT == 1(默認值):爲套接字啓用select()(使用netconn回調來跟蹤事件)。 這樣可以節省RAM(每個插槽的計數器)和代碼(netconn事件回調),這可以提高性能。
*/
#define LWIP_SOCKET_SELECT 1
/*
LWIP_SOCKET_POLL == 1(默認值):
爲套接字啓用poll()(包括struct pollfd,nfds_t和constants)
*/
#define LWIP_SOCKET_POLL 1
2.8 Debugging
-
Assertion handling(斷言檢查)
/* 禁用LWIP_ASSERT檢查:要禁用斷言,請在arch/cc.h中定義LWIP_NOASSERT。 */
#define LWIP_NOASSERT
-
Statistics(狀態信息)
/*
LWIP_STATS== 1:
在lwip_stats中啓用統計信息收集。
調試有幫助
*/
#define LWIP_STATS 1
/*
LWIP_STATS_DISPLAY== 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
-
Debug messages(調試信息)
/* 調試信息配置 */
#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_ALL
#define LWIP_DBG_TYPES_ON LWIP_DBG_ON
#define ETHARP_DEBUG LWIP_DBG_OFF
#define NETIF_DEBUG LWIP_DBG_OFF
#define PBUF_DEBUG LWIP_DBG_OFF
#define API_LIB_DEBUG LWIP_DBG_OFF
#define API_MSG_DEBUG LWIP_DBG_OFF
#define SOCKETS_DEBUG LWIP_DBG_OFF
#define ICMP_DEBUG LWIP_DBG_OFF
#define IGMP_DEBUG LWIP_DBG_OFF
#define INET_DEBUG LWIP_DBG_OFF
#define IP_DEBUG LWIP_DBG_OFF
#define IP_REASS_DEBUG LWIP_DBG_OFF
#define RAW_DEBUG LWIP_DBG_OFF
#define MEM_DEBUG LWIP_DBG_OFF
#define MEMP_DEBUG LWIP_DBG_OFF
#define SYS_DEBUG LWIP_DBG_OFF
#define TIMERS_DEBUG LWIP_DBG_OFF
#define TCP_DEBUG LWIP_DBG_OFF
#define TCP_INPUT_DEBUG LWIP_DBG_OFF
#define TCP_FR_DEBUG LWIP_DBG_OFF
#define TCP_RTO_DEBUG LWIP_DBG_OFF
#define TCP_CWND_DEBUG LWIP_DBG_OFF
#define TCP_WND_DEBUG LWIP_DBG_OFF
#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF
#define TCP_RST_DEBUG LWIP_DBG_OFF
#define TCP_QLEN_DEBUG LWIP_DBG_OFF
#define UDP_DEBUG LWIP_DBG_OFF
#define TCPIP_DEBUG LWIP_DBG_OFF
#define SLIP_DEBUG LWIP_DBG_OFF
#define DHCP_DEBUG LWIP_DBG_OFF
#define AUTOIP_DEBUG LWIP_DBG_OFF
#define DNS_DEBUG LWIP_DBG_OFF
#define IP6_DEBUG LWIP_DBG_OFF
#define DHCP6_DEBUG LWIP_DBG_OFF
-
Performance(性能測試)
/* LWIP_PERF: Enable performance testing for lwIP (if enabled, arch/perf.h is included) */
#define LWIP_PERF 0