修改默認選項時,不要修改opt.h文件,通過lwipopts.h修改。
和內存管理以及TCP發送性能相關的選項
// 為1時使用系統庫malloc/free進行內存管理 #ifndef MEM_LIBC_MALLOC #define MEM_LIBC_MALLOC 0 #endif
// 使用mem_malloc/mem_free替代pool內存池管理 // lwip支持使用內存池來管理一些需要經常分配/釋放的數據結構 // 例如pcb // 將下面選項置1禁用該特性 // 一般和MEM_LIBC_MALLOC選項一道使用 // 使得所有內存分配都通過系統庫進行 #ifndef MEMP_MEM_MALLOC #define MEMP_MEM_MALLOC 0 #endif
// 使用內存池而不是malloc來分配一般性內存 // 此選項需要和MEMP_USE_CUSTOM_POOLS一起使用 #ifndef MEM_USE_POOLS #define MEM_USE_POOLS 0 #endif
// 用於PBUF_ROM和PBUF_REF的pbuf結構數量 // 如果程序主要使用零拷貝方式發送大量數據 // 需要較大數量的該結構 #ifndef MEMP_NUM_PBUF #define MEMP_NUM_PBUF 16 #endif
// PBUF內存池(PBUF_POOL類型的PBUF)中的PBUF數量 #ifndef PBUF_POOL_SIZE #define PBUF_POOL_SIZE 16 #endif
// TCP發送緩沖區大小(已發出但還未收到ACK的最大允許數據量) // 只是設定大小,並不實際分配內存 // 如果你的程序需要發送大量零拷貝數據 // 可以將這個值設大一些
// (因為零拷貝數據“總是在那里”,不占LwIP動態內存)
// 最小不應小於單次調用tcp_write時可能發送的最大數據量
// 調用tcp_write時的參數len若大於tpcb->snd_buf將導致返回ERR_MEM
// (在LwIP代碼中,每成功執行一次tcp_write相應減小tpcb->snd_buf,
// 每收到一次ACK相應增加tpcb->snd_buf)
// 考慮到一般系統“隔一個確認”的原則,
// 一般設置為TCP_MSS的2倍或更大的值。 #ifndef TCP_SND_BUF #define TCP_SND_BUF (2 * TCP_MSS) #endif
// MEM_SIZE是一般意義上的動態內存大小 // 如果程序需要進行較大量的拷貝數據發送 // 則需要較大數量的該內存 // 因為所有的拷貝發送數據都需要復制到 // 這種“一般意義”的動態內存中
// PBUF_RAM類型的PBUF即從中分配 #ifndef MEM_SIZE #define MEM_SIZE 1600 #endif
// PBUF內存池中的每個PBUF大小 // 默認值是能放下一個完整的TCP包(包括下層協議頭)
// 如果你能確定很少接收全長TCP包,可以使用小一點的值 #ifndef PBUF_POOL_BUFSIZE #define PBUF_POOL_BUFSIZE LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_HLEN+4/*VLAN_TAG*/+4/*CRC*/) #endif
// 在單個pcb中排隊的待發pbuf數量上限
// 不應小於 (2 * TCP_SND_BUF/TCP_MSS)
// 考慮以下幾點:
// 1. 對於REF/ROM類型的數據,協議頭和協議數據是分開存放的,因此每段數據需要兩個PBUF
// 2. LwIP可能會將多次tcp_write中的待發數據合並到一起
// (如果每次tcp_write數據量都較小)
// 3. 需要Copy發送的數據,協議頭和數據在單一PBUF里面
// 一般用默認值即可 #ifndef TCP_SND_QUEUELEN #define TCP_SND_QUEUELEN ((4 * (TCP_SND_BUF) + (TCP_MSS - 1))/(TCP_MSS)) #endif
// App層發送的超過MSS大小的數據量會被拆分為SEG // 每個SEG內數據量不超過MSS // 每個SEG可能擁有多個pbuf
// 不小於TCP_SND_QUEUELEN #ifndef MEMP_NUM_TCP_SEG #define MEMP_NUM_TCP_SEG 16 #endif
