skb buff 布局字段

2021-09-30 09:47:16 字數 1630 閱讀 6413

linux網路協議棧中主要的快取型別。定義在include/linux/skbuff.h中,它是乙個雙向鍊錶的資料結構。它的字段和函式主要分為四大類:

1. 布局字段:與整個sk_buff鍊錶結構相關的字段

2. 通用資訊字段:

3. 特性相關字段:

4. 管理功能函式:

為了很快地找到sk_buff鍊錶中的表頭,每個鍊錶中都有乙個這樣的字段:

struct sk_buff_head     *list;
這個域是指向sk_buff煉表頭的指標。

struct sk_buff_head ;
其中qlen為鍊錶長度,lock是與鍊錶管理相關的字段

整個鍊錶的結構如下:

其他字段如下:

struct sock *sk;  l4需要的字段,儲存與之相關的socket資訊,在其他層該字段為null

unsigned int len; buffer中資料的長度,包括head->next指向的主長度和分片長度

unsigned int data_len; 不同於上,該字段只指分片資料的長度

unsigned int mac_len; mac頭部長度

atomic_t users; 引用計數,防止在有其他程式引用該buffer時被釋放

unsigned int truesize; 表示buffer的所有長度,包括sk_buff結構自身的長度

unsigned char *head; unsigned char *end; unsigned char *data; unsigned char *tail; 這四個指標功能如下

void (*destructor)(...) 當buff被釋放時,函式指標可以進行某些工作

struct timeval stamp; 報文接收的時間

struct net_device *dev; 根據接收到了包或者是要傳送包,該指標指向的裝置所扮演的角色不同

struct net_device *input_dev; 包是從哪個裝置接收的

struct net_device *real_dev; 對於虛擬裝置這個欄位才是有意義的

union h; union nh; union mac h是l4的頭部,nh是l3的頭部,mac是l2的頭部。在包向上或者向下傳遞過程中,這些域會被依次有序地設定

char cb[40]; 存放每層私有的控制資料

unsigned int csum; unsigned char ip_summed 檢驗和相關狀態的字段

unsigned char cloned; 是否是從別的buffer複製過來的

unsigned char pkt_type; 報文型別,詳見include/linux/if_packet.h

CLR控制欄位的布局

為了提高效能,clr能按照它所選擇的任何方式來排列型別的字段。為了向clr發出指示,需要在定義的類或者結構上應用system.runtime.interopservices.structlayoutattribute屬性。可以向這個屬性的構造器傳遞layoutkind.auto,讓clr自動排列字段...

布局(flex布局)

彈性盒模型 display flex,排列方式根據主軸方向排列。子元素超出預設不換行,而是進行壓縮 flex direction 彈性盒模型主軸方向設定 row 預設 從左到右 側軸 從上到下 row reverse 從右到左 側軸 從上到下 column 從上到下 側軸 從左到右 column r...

Mysql 新增字段 修改字段 刪除字段

alter table 表名 add 欄位名 字段型別 字段長度 default 預設值 comment 注釋 例如 alter table order add code char 6 default null comment 優惠碼 2 修改字段 修改欄位名 字段型別 長度 a 修改欄位名 alt...