lwIP TCP/IP 協議棧筆記之二: 配置文件 opt.h & lwipopts.h 詳解

目錄

1. 簡介

2. 配置 opt.h 說明

2.1 基礎配置(Infrastructure)

NO_SYS

Timers

memcpy

Core locking and MPU

Heap and memory pools

Internal memory pools

SNMP MIB2 callbacks

Multicast(組播)

Threading

Checksum

Hooks(鉤子選項)

2.2 IPv4

ARP

IP

ICMP

DHCP

AUTOIP

IGMP

2.3 Callback-style APIs

RAW

DNS

UDP

TCP

2.4 PBUF

2.5 NETIF

2.6 IPv6

2.7 Thread-safe APIs

Netconn

Sockets

2.8 Debugging

Assertion handling(斷言檢查)

Statistics(狀態信息)

Debug messages(調試信息)

Performance(性能測試)


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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章