Linux協議棧skb操作函數介紹

接字緩衝區函數

函數名

功能

函數形成

參數

描述

skb_queue_empty

檢查隊列是否爲空

int skb_queue_empty (struct sk_buff_head * list)

list爲隊列頭

如果隊列爲空返回真,否則返回假

skb_get

引用緩衝區

struct sk_buff * skb_get (struct sk_buff * skb)

skb爲要引用的緩衝區

對套接字緩衝區再引用一次,返回指向緩衝區的指針

kfree_skb

釋放一個sk_buff

void kfree_skb (struct sk_buff * skb)

sk爲要釋放的緩衝區

刪除對一個緩衝區的引用,如果其引用計數變爲0,則釋放它

skb_cloned

緩衝區是否是克隆的

int skb_cloned (struct sk_buff * skb)

skb爲要檢查的緩衝區

如果以skb_clone標誌來產生緩衝區,並且是緩衝區多個共享拷貝中的一個,則返回真。克隆的緩衝區具有共享數據,因此在正常情況下不必對其進行寫。

 

skb_shared

緩衝區是否是共享的

int skb_shared (struct sk_buff * skb)

skb爲要檢查的緩衝區

如果有多於一個的人引用這個緩衝區就返回真。

skb_share_check

檢查緩衝區是否共享的,如果是就克隆它

struct sk_buff * skb_share_check (struct sk_buff * skb, int pri)

skb爲要檢查的緩衝區,pri爲內存分配的優先級

如果緩衝區是共享的,就克隆這個緩衝區,並把原來緩衝區的引用計數減1,返回新克隆的緩衝區。如果不是共享的,則返回原來的緩衝區。當從中斷狀態或全局鎖調用該函數時,pri必須是GFP_ATOMIC。

 內存分配失敗則返回NULL。

skb_unshare

產生一個共享緩衝區的拷貝

struct sk_buff * skb_unshare (struct sk_buff * skb, int pri);

skb爲要檢查的緩衝區,pri爲內存分配的優先級

如果套接字緩衝區是克隆的,那麼這個函數就創建一個新的數據拷貝,並把原來緩衝區的引用計數減1,返回引用計數爲1的新拷貝。如果不是克隆的,就返回原緩衝區。當從中斷狀態或全局鎖調用該函數時,pri必須是GFP_ATOMIC。

 內存分配失敗則返回NULL。

skb_queue_len

獲得隊列的長度

__u32 skb_queue_len (struct sk_buff_head * list_)

list_爲測量的鏈表

 

返回&sk_buff 隊列的指針。

__skb_queue_head

在鏈表首部對一個緩衝區排隊

void __skb_queue_head (struct sk_buff_head * list, struct sk_buff * newsk)

list爲要使用的鏈表,

newsk爲要排隊的緩衝區。

在鏈表首部對一個緩衝區進行排隊。這個函數沒有鎖,因此在調用它之前必須持有必要的鎖。一個緩衝區不能同時放在兩個鏈表中。

skb_queue_head

在鏈表首部對一個緩衝區排隊

void skb_queue_head (struct sk_buff_head * list, struct sk_buff * newsk)

list爲要使用的鏈表,

newsk爲要排隊的緩衝區。

在鏈表首部對一個緩衝區進行排隊。這個函持有鎖,因此可以安全地使用。一個緩衝區不能同時放在兩個鏈表中。

__skb_queue_tail

在鏈表尾部對一個緩衝區排隊

void __skb_queue_tail (struct sk_buff_head * list, struct sk_buff * newsk)

list爲要使用的鏈表,

newsk爲要排隊的緩衝區。

在鏈表尾部對一個緩衝區進行排隊。這個函數沒有鎖,因此在調用它之前必須持有必要的鎖。一個緩衝區不能同時放在兩個鏈表中。

skb_queue_tail

在鏈表尾部對一個緩衝區排隊

void skb_queue_tail (struct sk_buff_head * list, struct sk_buff * newsk)

list爲要使用的鏈表,

newsk爲要排隊的緩衝區。

在鏈表尾部對一個緩衝區進行排隊。這個函持有鎖,因此可以安全地使用。一個緩衝區不能同時放在兩個鏈表中。

__skb_dequeue

從隊列的首部刪除一個緩衝區

struct sk_buff * __skb_dequeue (struct sk_buff_head * list)

list爲要操作的隊列

刪除鏈表首部。這個函數不持有任何鎖,因此使用時應當持有適當的鎖。如果隊鏈表爲空則返回NULL,成功則返回首部元素。

skb_dequeue

從隊列的首部刪除一個緩衝區

struct sk_buff * skb_dequeue (struct sk_buff_head * list)

list爲要操作的隊列

刪除鏈表首部,這個函數持有鎖,因此可以安全地使用。如果隊鏈表爲空則返回NULL,成功則返回首部元素。

skb_insert

插入一個緩衝區

void skb_insert (struct sk_buff * old, struct sk_buff * newsk)

old爲插入之前的緩衝區,newsk爲要插入的緩衝區

把一個數據包放在鏈表中給定的包之前。該函數持有鏈表鎖,並且是原子操作。一個緩衝區不能同時放在兩個鏈表中。

skb_append

追加一個緩衝區

void skb_append (struct sk_buff * old, struct sk_buff * newsk)

old爲插入之前的緩衝區,newsk爲要插入的緩衝區

把一個數據包放在鏈表中給定的包之前。該函數持有鏈表鎖,並且是原子操作。一個緩衝區不能同時放在兩個鏈表中。

skb_unlink

從鏈表刪除一個緩衝區

void skb_unlink (struct sk_buff * skb);

Skb爲要刪除的緩衝區

把一個數據包放在鏈表中給定的包之前。該函數持有鏈表鎖,並且是原子操作。

 

_skb_dequeue_tail

從隊尾刪除

struct sk_buff * __skb_dequeue_tail (struct sk_buff_head * list)

List爲要操作的鏈表

從鏈表尾部刪除。這個函數不持有任何鎖,因此必須持以合適的鎖來使用。如果鏈表爲空,則返回NULL,成功則返首部元素。

skb_dequeue_tail

從隊頭刪除

struct sk_buff * skb_dequeue_tail (struct sk_buff_head * list)

List爲要操作的鏈表

刪除鏈表尾部,這個函數持有鎖,因此可以安全地使用。如果隊鏈表爲空則返回NULL,成功則返回首部元素。

skb_put

把數據加到緩衝區

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

skb爲要使用的緩衝區,len爲要增加的數據長度

這個函數擴充緩衝區所使用的數據區。如果擴充後超過緩衝區總長度,內核會產生警告。函數返回的指針指向所擴充數據的第一個字節。

skb_push

把數據加到緩衝區的開始

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

skb爲要使用的緩衝區,len爲要增加的數據長度

這個函數擴充在緩衝區的開始處緩衝區所使用的數據區。如果擴充後超過緩衝區首部空間的總長度,內核會產生警告。函數返回的指針指向所擴充數據的第一個字節。

skb_pull

從緩衝區的開始刪除數據

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

skb爲要使用的緩衝區,len爲要刪除的數據長度

這個函數從鏈表開始處刪除數據,把騰出的內存歸還給首部空間。把指向下一個緩衝區的指針返回。

skb_headroom

緩衝區首部空閒空間的字節數

int skb_headroom (const struct sk_buff * skb)

 

skb爲要檢查的緩衝區

返回&sk_buff首部空閒空間的字節數

skb_tailroom

緩衝區尾部的空閒字節數

int skb_tailroom (const struct sk_buff * skb)

skb爲要檢查的緩衝區

返回&sk_buff尾部空閒空間的字節數

skb_reserve

調整頭部的空間

void skb_reserve (struct sk_buff * skb, unsigned int len)

skb爲要改變的緩衝區,len爲要刪除的字節數

通過減少尾部空間,增加一個空&sk_buff的首部空間。這僅僅適用於空緩衝區。

 

skb_trim

從緩衝區刪除尾部

void skb_trim (struct sk_buff * skb, unsigned int len);

skb爲要改變的緩衝區,len爲新的長度

通過從尾部刪除數據,剪切緩衝區的長度。如果緩衝區已經處於指定的長度,則不用改變。

skb_orphan

使一個緩衝區成爲孤兒

void skb_orphan (struct sk_buff * skb);

skb是要成爲孤兒的緩衝區

如果一個緩衝區當前有一個擁有者,我們就調用擁有者的析構函數,使skb沒有擁有者。該緩衝區繼續存在,但以前的擁有者不再對其“負責”。

skb_queue_purge

使一個鏈表空

void skb_queue_purge (struct sk_buff_head * list)

list爲要騰空的鏈表

刪除在&sk_buff鏈表上的所有緩衝區。這個函數持有鏈表鎖,並且是原子的。

__skb_queue_purge

使一個鏈表空

void __skb_queue_purge (struct sk_buff_head * list);

list爲要騰空的鏈表

刪除在&sk_buff鏈表上的所有緩衝區。這個函數不持有鏈表鎖,調用者必須持有相關的鎖來使用它。

dev_alloc_skb

爲發送分配一個skbuff

struct sk_buff * dev_alloc_skb (unsigned int length)

Length爲要分配的長度

分配一個新的&sk_buff,並賦予它一個引用計數。這個緩衝區有未確定的頭空間。用戶應該分配自己需要的頭空間。

  如果沒有空閒內存,則返回NULL。儘管這個函數是分配內存,但也可以從中斷來調用。

skb_cow

當需要時拷貝skb的首部

struct sk_buff * skb_cow (struct sk_buff * skb, unsigned int headroom)

Skb爲要拷貝的緩衝區,headroom爲需要的頭空間

如果傳遞過來的緩衝區缺乏足夠的頭空間或是克隆的,則該緩衝區被拷貝,並且附加的頭空間變爲可用。如果沒有空閒的內存,則返回空。如果緩衝區拷貝成功,則返回新的緩衝區,否則返回已存在的緩衝區。

skb_over_panic

私有函數

void skb_over_panic (struct sk_buff * skb, int sz, void * here)

skb爲緩衝區,sz爲大小,here爲地址。

用戶不可調用。

skb_under_panic

私有函數

void skb_under_panic (struct sk_buff * skb, int sz, void * here)

skb爲緩衝區,sz爲大小,here爲地址。

用戶不可調用。

alloc_skb

分配一個網絡緩衝區

struct sk_buff * alloc_skb (unsigned int size, int gfp_mask)

size爲要分配的大小,gfp_mask爲分配掩碼

分配一個新的&sk_buff。返回的緩衝區沒有size大小的頭空間和尾空間。新緩衝區的引用計數爲1。返回值爲一緩衝區,如果失敗則返回空。從中斷分配緩衝區,掩碼只能使用GFP_ATOMIC的gfp_mask。

__kfree_skb

私有函數

void __kfree_skb (struct sk_buff * skb)

skb爲緩衝區

釋放一個sk_buff。釋放與該緩衝區相關的所有事情,清除狀態。這是一個內部使用的函數,用戶應當調用kfree_skb。

skb_clone

複製一個sk_buff

struct sk_buff * skb_clone (struct sk_buff * skb, int gfp_mask)

skb爲要克隆的緩衝區,gfp_mask爲分配掩碼。

複製一個&sk_buff。新緩衝區不是由套接字擁有。兩個拷貝共享相同的數據包而不是結構。新緩衝區的引用計數爲1。如果分配失敗,函數返回NULL,否則返回新的緩衝區。如果從中斷調用這個函數,掩碼只能使用GFP_ATOMIC的gfp_mask。

skb_copy

創建一個sk_buff的私有拷貝

struct sk_buff * skb_copy (const struct sk_buff * skb, int gfp_mask)

skb爲要拷貝的緩衝區,gfp_mask爲分配優先級。

既拷貝&sk_buff也拷貝其數據。該函數用在調用者希望修改數據並需要數據的私有拷貝來進行改變時。失敗返回NULL,成功返回指向緩衝區的指針。

返回的緩衝區其引用計數爲1。如果從中斷調用,則必須傳遞的優先級爲GFP_ATOMIC。

skb_copy_expand

拷貝並擴展sk_buff

struct sk_buff * skb_copy_expand (const struct sk_buff * skb, int

newheadroom, int newtailroom, int gfp_mask);

skb爲要拷貝的緩衝區,newheadroom爲頭部的新空閒字節數,newtailroom爲尾部的新空閒字節數。

既拷貝&sk_buff也拷貝其數據,同時分配額外的空間。當調用者希望修改數據並需要對私有數據進行改變,以及給新的域更多的空間時調用該函數。失敗返回NULL,成功返回指向緩衝區的指針。

返回的緩衝區其引用計數爲1。如果從中斷調用,則必須傳遞的優先級爲GFP_ATOMIC。




本文來自:http://www.233.com/linux/fudao/20110119/140852604.html

感謝作者的分享


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章