操作tailroom中用戶數(shù)據(jù)塊區(qū)域:skb_put用于修改指向數(shù)據(jù)區(qū)末尾的指針tail:
void *skb_put(struct sk_buff *skb, unsigned int len)
{
void *tmp = skb_tail_pointer(skb);
SKB_LINEAR_ASSERT(skb);
skb- >tail += len;
skb- >len += len;
if (unlikely(skb- >tail > skb- >end))
skb_over_panic(skb, len, __builtin_return_address(0));
return tmp;
}
可以看到 tail指針的移動(dòng)是擴(kuò)大數(shù)據(jù)區(qū)域 ,即數(shù)據(jù)區(qū)向下擴(kuò)大len字節(jié),并更新數(shù)據(jù)區(qū)長(zhǎng)度len。
增加headroom區(qū)域的協(xié)議頭: skb_push函數(shù)用于移動(dòng)data指針,增加頭部協(xié)議, 與skb_reserve()類似,也并沒有真正向數(shù)據(jù)緩存區(qū)中添加數(shù)據(jù),而只是移動(dòng)數(shù)據(jù)緩存區(qū)的頭指針data。數(shù)據(jù)由其他函數(shù)復(fù)制到數(shù)據(jù)緩存區(qū)中。 函數(shù)如下:
void *skb_push(struct sk_buff *skb, unsigned int len)
{
skb- >data -= len;
skb- >len += len;
if (unlikely(skb- >data< skb- >head))
skb_under_panic(skb, len, __builtin_return_address(0));
return skb- >data;
}
如下兩張圖分別是由傳輸層、網(wǎng)絡(luò)層,數(shù)據(jù)包向下傳遞時(shí)data指針移動(dòng),進(jìn)行頭部協(xié)議的封裝。
- TCP層添加TCP首部。
- SKB傳遞到IP層,IP層為數(shù)據(jù)包添加IP首部。
- SKB傳遞到鏈路層,鏈路層為數(shù)據(jù)包添加鏈路層首部。
可以看到在數(shù)據(jù)包封裝的過程中,每一層移動(dòng)data指針進(jìn)行數(shù)據(jù)報(bào)頭的封裝。
數(shù)據(jù)報(bào)文解封裝,解除協(xié)議頭: skb_pull通過將data指針向下移動(dòng),進(jìn)行數(shù)據(jù)報(bào)文的解封裝,函數(shù)如下所示:
static inline void *__skb_pull(struct sk_buff *skb, unsigned int len)
{
skb- >len -= len;
BUG_ON(skb- >len < skb- >data_len);
return skb- >data += len;
}
如下圖所示,在收包流程上,向上層協(xié)議,如下網(wǎng)絡(luò)層向傳輸層傳送的時(shí)候,調(diào)用skb_pull進(jìn)行數(shù)據(jù)包的解封裝。
以上就是struct sk_buff的四大指針的相關(guān)操作,通過分析可得:
- head指向緩沖區(qū)的首地址,作為上邊界
- end指向緩沖區(qū)的尾地址,作為下邊界
- data指針在數(shù)據(jù)包頭部封裝和解封裝的過程中移動(dòng),指向各層的協(xié)議頭,skb_push函數(shù)將data的指向,向低地址移動(dòng)(向上),完成協(xié)議頭空間的占據(jù),skb_pull函數(shù)將data的指向,向高地址移動(dòng)(向下),完成協(xié)議頭的解封裝。
- tail指針在增加應(yīng)用層用戶緩沖數(shù)據(jù)時(shí)移動(dòng),skb_put函數(shù)將該指針向高地址移動(dòng)(向上),完成用戶數(shù)據(jù)空間的占據(jù)。
-
嵌入式
+關(guān)注
關(guān)注
5094文章
19184瀏覽量
307842 -
Linux
+關(guān)注
關(guān)注
87文章
11350瀏覽量
210460 -
內(nèi)存
+關(guān)注
關(guān)注
8文章
3060瀏覽量
74353 -
指針
+關(guān)注
關(guān)注
1文章
481瀏覽量
70611
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
Linux sk_buff四大指針與相關(guān)操作
![Linux <b class='flag-5'>sk_buff</b>四大指針與<b class='flag-5'>相關(guān)</b><b class='flag-5'>操作</b>](https://file.elecfans.com/web2/M00/6F/CE/poYBAGNH1sCANs83AAAOVhEjMFs521.png)
Linux內(nèi)存點(diǎn)滴 用戶進(jìn)程內(nèi)存空間
嵌入式linux TCP/IP協(xié)議棧概述
DM8127使用SWOSD_TI_alloc()分配內(nèi)存空間怎么加大?
stm32 使用u*** host庫(kù)占用內(nèi)存空間很大?。?!
ARM32 Linux的內(nèi)存布局
RTThread的動(dòng)態(tài)內(nèi)存空間該如何去分配呢
Linux網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序
如何讓你的手機(jī)省出內(nèi)存空間
網(wǎng)卡的Ring Buffer詳解
網(wǎng)卡的Ring Buffer詳解
sk_buff內(nèi)存空間布局情況與相關(guān)操作(一)
![<b class='flag-5'>sk_buff</b><b class='flag-5'>內(nèi)存空間布局</b><b class='flag-5'>情況</b>與<b class='flag-5'>相關(guān)</b><b class='flag-5'>操作</b>(一)](https://file1.elecfans.com/web2/M00/8E/64/wKgZomTGIkGATBedAAAtEVHk4wo547.jpg)
sk_buff內(nèi)存空間布局情況與相關(guān)操作(三)
![<b class='flag-5'>sk_buff</b><b class='flag-5'>內(nèi)存空間布局</b><b class='flag-5'>情況</b>與<b class='flag-5'>相關(guān)</b><b class='flag-5'>操作</b>(三)](https://file1.elecfans.com/web2/M00/8E/67/wKgaomTGI5WAeCRcAABWkoA2Sls435.jpg)
淺析新能源電動(dòng)汽車充電樁空間布局優(yōu)化研究
![淺析新能源電動(dòng)汽車充電樁<b class='flag-5'>空間布局</b>優(yōu)化研究](https://file1.elecfans.com//web3/M00/02/76/wKgZPGdf25OAYzS6AACh3TFyOrA435.png)
評(píng)論