sk buff 函式操作 一)

2021-07-25 21:36:28 字數 2236 閱讀 6136

1: alloc 分配完 之後的結構 僅僅是分配了線束資料區域,但是現在還沒有資料

2:skb_reserve函式

static inline void skb_reserve(struct sk_buff *skb, int len)

這個函式很重要,是為「協議頭」預留空間!而且是盡最大的空間預留,因為很多頭都會有可選項,那麼我們不知道可選項是多大,所以只能是按照最大的分配,那麼也說明了一點,預留的空間headroom也就是不一定都能使用完的!可能還有剩餘的,由上面的圖也可以看出來!這也是為什麼需要這麼多指標的問題!那麼這個函式直接導致head指標和tail、data指標分離

注意headroom就是用來儲存各個協議頭的足夠大的空間,tailroom就可以認為是儲存其他線性資料的空間。( 這裡不要曲解協議頭不是線性資料,其實協議頭也是!!!所以當增加頭的時候,data指標向上移動,當增加其他資料的時候,tail指標向下移動 )。現在data和tail指向一起,那麼還是說明資料沒有!!!

skb_put函式 ----> 用於操作線性資料區域(tailroom區域)的使用者資料

static inline unsigned char *skb_put(struct sk_buff *skb, unsigned int len)

這函式其實就是從tailroom預留空間,相當於是移動tail指標,這樣如果從上圖(圖六)開始看,也就是tail開始向下移動,和data分離了。。。一般來說,這樣做都是為了使用者資料再次處理,或者說為tcp/ip的負載預留空間!

skb_push函式:----------> 用於操作headroom區域的協議頭

static inline unsigned char *skb_push(struct sk_buff *skb, unsigned int len)

和skb_put對應,上面試操作使用者資料的,這裡是操作協議頭的!其實就是data指標向上移動而已~注意len增大了哦~前面說了協議頭也是屬於資料!

skb_pull函式:-----------> 其實這個函式才是與skb_push函式對應的函式!因為這是去頭函式,而skb_push是增頭函式!所以這個函式一般用在解包的時候!

static inline unsigned char *skb_pull(struct sk_buff *skb, unsigned int len)  

static inline unsigned char *__pskb_pull(struct sk_buff *skb, unsigned int len)

其實就是data指標向下移動,當前乙個協議頭被去掉,headroom剩餘的空間增大了!看下圖:

虛線是data之前的指標位置,現在移動到下面實線!!需注意:len的長度減小,減小的大小是剝去的頭的大小!!

1:從應用層使用者資料開始,直到物理層傳送出去

> 初始化的什麼就不多說了,和前面的差不多,現在也加入使用者資料已經在了,如圖七所示一樣!那麼到了tcp層,需要增加

tcp層的頭:

需要注意的是這裡是傳輸層,那麼傳輸層的結構u中的th代表的是tcp的頭,那麼tcp指向tcp頭ok!同時注意 len長度+=l1 哦~~~

> 再看到了ip層:如圖11

到鏈路層了:

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

承接上一 sk buff 整理筆記 一 資料結構 這一篇要講的是核心為sk buff結構提供的一些操作函式。第一 首先要講的是sk buff中的四大指標 四大指標各自是 head data tail end 這四個指標都是指向了資料區的。資料區中存放的是協議頭和資料。head和end指標是每乙個資料...

PHP檔案操作函式一

created on 2013 6 26 判斷檔案的型別 echo filetype array.php 這是乙個檔案 echo filetype picture 這是乙個資料夾 echo filetype none 不出在的 獲取檔案的屬性 tt stat array.php print r tt...

一些檔案操作函式

fileage 函式 返回檔案已存在的時間 fileclose 命令 關閉指定的檔案 filecreate 命令 用指定的檔名建立新檔案 filedatetodatetime 函式 將dos的日期格式轉換為delphi的日期格式 fileexists 函式 檢查檔案是否存在 filegatattr ...