skb->truesize,len,datalen,size,等的區別

在南京看海發表於2016-07-26

套接字緩衝區有三種重要的資料型別:

1.struct sk_buff_head型別,管理套接字緩衝區

2.struct sk_buff型別,套接字緩衝區型別

3.struct skb_shared_info型別,管理套接字緩衝區的分片資訊

 

在alloc_skb()函式中

skb->truesize指緩衝區的總大小,即整個struct sk_buff skb的大小,所以當然不包括struct skb_shared_info型別。

skb->truesize=sizeof(struct sk_buff) + SKB_DATA_ALIGN(size)

說明:SKB_DATA_ALIGN(size)是在alloc_skbsizegfp_mask函式初始定義時的size的基礎上調整後的,通常把調整後的值再賦給size,代替原來的size。

即:size = SKB_DATA_ALIGN(size)

為什麼要調整呢?

因為X86 上為128 bytes,根據L1_CACHE_BYTES調整大小,補齊為128的整數倍;

所以SKB_DATA_ALIGN(size)的值比size的值要大。

初始化後:size的大小為head和end指標之間的大小

 

 

在用alloc_skb()函式分配緩衝區時,alloc_skb()建立了套接字緩衝區與struct skb_shared_info結構的關係。

用alloc_skb()函式分配的緩衝區大小為:

struct sk_buff + SKB_DATA_ALIGN(size) + struct skb_shared_info

這三個的大小之和。

 

skb->len是指資料長度(包括資料的包頭),即data,tail指標所指的部分。

當呼叫資料區的操作函式如:skb_put,skb_push,skb_pull,skb_trim來在資料區增加或去除協議的頭部,尾部時,即在增加或減少len的長度。

注意:headroom,tailroom,是當資料從協議棧的上層傳遞到下層時,可向這兩個區域填充協議欄位的內容。

協議欄位的內容並不是上面的協議的頭部或者尾部,

在struct sk_buff中,協議欄位的定義為:

unsigned short protocol //協議欄位

 

skb->datalen是指資料長度(不包括資料的包頭)

 

 

轉自 http://blog.chinaunix.net/uid-26029760-id-1746557.html

相關文章