lwip資訊包是儲存在pbufs中,pbufs作為lwip的資料緩衝區,是由pbuf結構組成的鍊錶。資料存在pbufs鏈中各個pbuf節點所指向儲存塊中。
pbuf結構體的定義如下:
struct pbuf ;
pbuf中的type成員表示pbuf的型別
pbuf一共有四種型別
在pbuf.h中的型別包含在pbuf_type列舉中。如下
typedef enum pbuf_type;
1:pbuf_ram型別的pbuf是通過記憶體堆分配得到的。在申請pbuf_ram型別時,記憶體堆中分配相應的大小位址連續的記憶體塊,其容量能夠儲存pbuf結構體+資料緩衝區。資料緩衝區可能包括資料報頭+資料也可以沒有資料報頭,具體看申請的方式。如圖所示:
2: pbuf_pool 型別的它由分配自固定大小的 pbufs 池裡的固定大小的 pbufs 組成
。其他的跟pbuf_ram很相似,其結構體+資料緩衝區也是存在於連續的記憶體塊中。如圖:乙個來自於 pbuf 池中的被鏈結的 pbuf_pool pbuf,這些節點的大小都是大小都是一樣大的:
3:pbuf_rom型別的pbuf是從記憶體堆中分配申請乙個相應的結構頭,並不會申請資料區的空間。其資料空間不跟結構頭在一塊連續的空間上,資料空間有在rom上,有結構頭中的payload指標成員指向該空間。包含有資料 包頭的資料不能儲存在該型別的pbuf上。
4:pbuf_ref和pbuf_rom 型別的 pbuf 基本相同,但是資料空間在ram上。
pbuf_ref和pbuf_rom的結構如圖所示
資料報pbufs鍊錶可以由以上四種pbuf結構中的任意型別混合組成。
pbuf的申請
pbuf的申請函式struct pbuf * pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type)
其中layer跟報文的所在協議的層有關係,不同的協議層的資料報頭不一樣,鍊錶第乙個節點的在資料緩衝區的包頭大小也不一樣。
與pbuf相關的layer有四種,pbuf_transport(傳輸層), pbuf_ip(ip層),pbuf_link(鏈路層),pbuf_raw(raw型別)
例如,若是傳輸層pbuf,其報文包頭佔的大小為鏈路層報文的頭部+ip頭部+傳輸層的頭部。
case pbuf_transport:
offset = pbuf_link_hlen + pbuf_ip_hlen + pbuf_transport_hlen;
break;
若是ip層pbuf,offset = pbuf_link_hlen + pbuf_ip_hlen;
當申請的pbuf型別為pbuf_pool時,先想pbuf記憶體池申請一塊記憶體。
p = (struct pbuf *)memp_malloc(memp_pbuf_pool);
第一塊的記憶體塊的資料儲存區的首位址需要跳過資料報頭的長度,即offset
p->payload = lwip_mem_align((void *)((u8_t *)p + (sizeof_struct_pbuf + offset)))
若是一塊的容量不夠,則繼續申請第二塊,還不夠繼續申請。這些從記憶體申請到的記憶體塊,組成鍊錶。並且返回首塊的位址。
當申請的pbuf型別為pbuf_ram時,呼叫mem_malloc,直接向堆疊的申請。
p = (struct pbuf*)mem_malloc(lwip_mem_align_size(sizeof_struct_pbuf + offset) + lwip_mem_align_size(length));
當為pbuf_rom和pbuf_ref,呼叫mem_malloc,直接向堆疊的申請不含資料區pbuf結構大小的記憶體塊。
pbuf的釋放
pbuf的釋放由函式void pbuf_realloc(struct pbuf *p, u16_t new_len)實現
在釋放pbuf的時候,若成員pbuf結構體成員ref為0 的時候(被引用數),才能進行釋放。
若第乙個節點不能被釋放,那麼鍊錶後面的節點的ref也至少為1。不可能被釋放。只有第乙個節點被釋放後,後面的節點才有可能被依此釋放。
LWIP手記 A arp高速緩衝區清零
arp快取記憶體裡面存放了最近的internet位址到mac位址之間的對映記錄。快取記憶體的每一項的生存時間一般是20分鐘,起始時間從被建立時開始計算。lwip裡面的全域性變數arp talbe的結構體成員ctime就是記錄這個時間的。這裡注意,每一項都有乙個生存時間,每一項都是單獨計時的。另外注意...
輸入緩衝區與輸出緩衝區
本博文通過一段程式來理解輸入緩衝區與輸出緩衝區。程式如下 author wanghao created time thu 17 may 2018 06 03 12 ampdt file name test.c description include int main int argc,const c...
使用者程序緩衝區和核心緩衝區
常常聽到有程式設計師會跟你討論 我們在讀寫檔案的時候,系統是有快取的 但實際上有一部分人把使用者程序緩衝區和系統空間的緩衝區的概念混淆了,包括這兩種緩衝區的用法和所要解決的問題,還有其它類似的概念。本文就來區分一下不同的緩衝區概念 主要針對類unix平台 使用者程序和作業系統的關係 首先我用一張圖來...