sk buff整理筆記(兩 操作函式)

2021-09-10 10:51:21 字數 1850 閱讀 6295

承接上一:sk_buff 整理筆記(一、資料結構)這一篇要講的是核心為sk_buff結構提供的一些操作函式。

第一、首先要講的是sk_buff中的四大指標:

四大指標各自是:head、data、tail、end;這四個指標都是指向了資料區的。資料區中存放的是協議頭和資料。head和end指標是每乙個資料報一樣的,也是有這兩個指標來確定資料區的大小的。最開始的時候head、data、tail三個指標都是指向一起的,當有協議資料加進來時才更改。

再來說下包的形成。首先是應用層的資料。然後到四層加上四層的tcp協議頭(如果為tcp包),然後發往三層。在三層時把四層發來的資料都當作是負載,然後再往負載前加上乙個三層ip協議頭。發往二層。最後二層加上個幀頭就能夠傳送了。所以在包形成時,這幾個指標起到了很關鍵的作用。以下來看下四個指標的指向位址大小,這也有利於對以下要講到一些操作函式的理解。

最後一句的意思是:當資料報在二層(即data指標指向二層協議頭)時。獲取到三層協議頭指標的一種方法。當然也能夠直接用自帶的獲取三層協議頭指標的函式(事實上函式裡面也是用上面這句**實現的),這裡僅僅是為了顯示data新增時,是往下移動的。

方便後面的幾個函式理解。

第二、幾個操作sk_buff指標的函式:

首先來說下三個空間。方便以下介紹函式時理解。第乙個是:headroom,就是skb->head和skb->data之間的空間。第二個是:data。就是skb->data和skb->tail之間的空間。第三個是:tailroom,就是skb->tail和skb->end之間的空間。例如以下圖:

接下來說下四個操作sk_buff結構中指標的函式:(a)skb_put(), (b)skb_push(), (c)skb_pull(), and (d)skb_reserve();這四個函式在資料報在各層之間傳輸時。起到了至關

重要。

(a)skb_put():向後擴大資料區空間。headroom空間不變,tailroom空間降低,skb->data指標不變,skb->tail指標下移;

(b)skb_push():向前擴大資料區空間。headroom空間降低,tailroom空間不變。skb->tail指標不變,skb->data指標上移;

(c)skb_pull():縮小資料區空間,headroom空間增大。tailroom空間不變,skb->data指標下移,skb->tail指標不變;

(d)skb_reserve():資料區不變,headroom空間增大,tailroom空間降低,skb->data和skb->tail同一時候下移;

大家也能夠照著源**來分析,還有個當大家看源**時。會發現好多函式都有個同名的,比方:skb_push()函式,就有兩個:static inline unsigned char *__skb_push(struct sk_buff *skb, unsigned int len);和unsigned char *skb_push(struct sk_buff *skb, unsigned int len);第乙個函式是詳細內容的實現(關鍵函式),第二個函式僅僅是在第乙個函式的基礎上進行一些合法性檢查。

第三、其它簡單的操作函式:

獲取/設定協議頭指標等一系列函式。如:獲取ip頭指標,unsigned char *skb_network_header(const struct sk_buff *skb);還有其它些函式(skb記憶體申請、skb轉殖和複製、skb佇列操作)將到後面做具體分析。

sk buff 函式操作 一)

1 alloc 分配完 之後的結構 僅僅是分配了線束資料區域,但是現在還沒有資料 2 skb reserve函式 static inline void skb reserve struct sk buff skb,int len 這個函式很重要,是為 協議頭 預留空間!而且是盡最大的空間預留,因為很...

sk buff整理筆記(三 記憶體申請和釋放)

第一 sk buff結構的記憶體申請 static inline struct sk buff alloc skb unsigned int size,gfp t priority static inline struct sk buff alloc skb fclone unsigned int ...

函式筆記整理

一 1.定義函式 def 函式名 函式名建議與所要實現的功能接近 函式體 注 定義函式,並不會執行函式體裡面的內容。若要執行函式,則必須呼叫函式 例 def hello print hello hello 2.函式裡巢狀函式 def fentiao print is femtiao def west...