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()類" />
0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

sk_buff內(nèi)存空間布局情況與相關(guān)操作(二)

麥辣雞腿堡 ? 來(lái)源:技術(shù)簡(jiǎn)說(shuō) ? 作者:董旭 ? 2023-07-30 16:47 ? 次閱讀

操作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()類似,也并沒(méi)有真正向數(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ù)包封裝的過(guò)程中,每一層移動(dòng)data指針進(jìn)行數(shù)據(jù)報(bào)頭的封裝。

數(shù)據(jù)報(bào)文解封裝,解除協(xié)議頭: skb_pull通過(guò)將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)操作,通過(guò)分析可得:

  • head指向緩沖區(qū)的首地址,作為上邊界
  • end指向緩沖區(qū)的尾地址,作為下邊界
  • data指針在數(shù)據(jù)包頭部封裝和解封裝的過(guò)程中移動(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ù)。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5086

    文章

    19141

    瀏覽量

    305957
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11314

    瀏覽量

    209780
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3031

    瀏覽量

    74119
  • 指針
    +關(guān)注

    關(guān)注

    1

    文章

    480

    瀏覽量

    70580
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linux sk_buff四大指針與相關(guān)操作

     在以上文章中,沒(méi)有分析過(guò)Linux內(nèi)核網(wǎng)絡(luò)關(guān)鍵的數(shù)據(jù)結(jié)構(gòu)-套接字?jǐn)?shù)據(jù)緩存struct sk_buff,本文將第一次分享到sk_buff,但鑒于其在內(nèi)核網(wǎng)絡(luò)中一些復(fù)雜情況,本次只簡(jiǎn)單介紹sk_
    發(fā)表于 10-13 17:23 ?4665次閱讀
    Linux <b class='flag-5'>sk_buff</b>四大指針與<b class='flag-5'>相關(guān)</b><b class='flag-5'>操作</b>

    Linux內(nèi)存點(diǎn)滴 用戶進(jìn)程內(nèi)存空間

    , Data+Stack size (kb)nFLT, Page Fault countnDRT, Dirty Pages count盡管有注釋,但依然感覺(jué)有些晦澀,不知所指何意?進(jìn)程內(nèi)存空間正在運(yùn)行的程序,叫進(jìn)程。每個(gè)
    發(fā)表于 08-14 16:23

    嵌入式linux TCP/IP協(xié)議棧概述

    ;unsigned char *head,//緩存區(qū)的頭指針*data;//有效數(shù)據(jù)頭指針...};sk_buff相關(guān)操作函數(shù)
    發(fā)表于 12-07 10:05

    DM8127使用SWOSD_TI_alloc()分配內(nèi)存空間怎么加大?

    DM8127使用SWOSD_TI_alloc()分配內(nèi)存空間不夠,請(qǐng)問(wèn)在什么文件里怎樣修改加大內(nèi)存空間???
    發(fā)表于 04-16 10:56

    stm32 使用u*** host庫(kù)占用內(nèi)存空間很大?。?!

    如何解決stm32 使用u*** host庫(kù)占用內(nèi)存空間很大的問(wèn)題呢???
    發(fā)表于 01-22 16:44

    ARM32 Linux的內(nèi)存布局

    看我們實(shí)際上內(nèi)存布局是怎么樣的?Linux內(nèi)核在啟動(dòng)時(shí),會(huì)打印出內(nèi)核內(nèi)存空間布局圖,下面是ARM IMX6平臺(tái)打印出來(lái)的內(nèi)存空間布局圖這部
    發(fā)表于 04-24 14:20

    RTThread的動(dòng)態(tài)內(nèi)存空間該如何去分配呢

    關(guān)于rtt的動(dòng)態(tài)內(nèi)存空間分配,想問(wèn)一下以下我的幾點(diǎn)理解是對(duì)的嗎1、我看RTT NANO和MASTER版本的動(dòng)態(tài)內(nèi)存分配好像不太一樣,我的理解是MASTER版本的動(dòng)態(tài)內(nèi)存位置是從ZI段結(jié)束地址到RAM
    發(fā)表于 08-31 14:34

    freertos怎么釋放任務(wù)的內(nèi)存空間?

    freertos怎么釋放任務(wù)的內(nèi)存空間
    發(fā)表于 10-12 07:20

    Linux網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序

    當(dāng)要發(fā)送數(shù)據(jù)包的時(shí)候,內(nèi)核必須建立一個(gè)包含傳輸數(shù)據(jù)的sk_buff,然后將sk_buff交給下層,各層在sk_buff遞交給下一層,各層在sk_buff中添加不同的協(xié)議貞頭,直到交給網(wǎng)
    發(fā)表于 05-10 11:15 ?1831次閱讀

    如何讓你的手機(jī)省出內(nèi)存空間

    大家都知道,手機(jī)使用久了就會(huì)變得很卡頓,除了手機(jī)本身“老化”之外,還有一個(gè)重要的原因就是內(nèi)存堆積的太多了。事實(shí)上占用手機(jī)內(nèi)存的無(wú)非就是照片、視頻、微信等等,如果好好處理一下這幾個(gè)方面的問(wèn)題,相信你的手機(jī)一定能省出不少內(nèi)存空間,下
    的頭像 發(fā)表于 02-13 14:07 ?4290次閱讀

    網(wǎng)卡的Ring Buffer詳解

    DMA 將 NIC 接收的數(shù)據(jù)包逐個(gè)寫入 sk_buff ,一個(gè)數(shù)據(jù)包可能占用多個(gè) sk_buff , sk_buff 讀寫順序遵循FIFO(先入先出)原則。
    的頭像 發(fā)表于 03-17 14:25 ?1550次閱讀

    網(wǎng)卡的Ring Buffer詳解

    DMA 將 NIC 接收的數(shù)據(jù)包逐個(gè)寫入 sk_buff ,一個(gè)數(shù)據(jù)包可能占用多個(gè) sk_buff , sk_buff 讀寫順序遵循FIFO(先入先出)原則。
    的頭像 發(fā)表于 04-04 09:15 ?1170次閱讀

    sk_buff內(nèi)存空間布局情況相關(guān)操作(一)

    :報(bào)文數(shù)據(jù),保存了實(shí)際網(wǎng)絡(luò)中傳輸?shù)臄?shù)據(jù),在內(nèi)核協(xié)議棧起承上啟下的作用,也有很多值得關(guān)注的sk_buff操作。 1、sk_buff四大指針與相關(guān)操作
    的頭像 發(fā)表于 07-30 16:43 ?1244次閱讀
    <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>(一)

    sk_buff內(nèi)存空間布局情況相關(guān)操作(三)

    2、非線性區(qū)域 在1、中,可以看到每張sk_buff的圖: 在end指針緊挨著一個(gè)非線性區(qū)域 ; 在struct sk_buff中沒(méi)有指向skb_shared_info結(jié)構(gòu)的指針,利用end指針
    的頭像 發(fā)表于 07-30 16:48 ?1195次閱讀
    <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>(三)

    淺析新能源電動(dòng)汽車充電樁空間布局優(yōu)化研究

    新能源汽車充電樁空間布局優(yōu)化研究是一個(gè)復(fù)雜而重要的問(wèn)題,要以用戶實(shí)際需求為出發(fā)點(diǎn),需要綜合考慮充電樁的數(shù)量和分布、供電能力和供電網(wǎng)絡(luò)的可靠性以及充電樁的建設(shè)和運(yùn)營(yíng)管理等因素.通過(guò)優(yōu)化充電樁的空間布局,可以提高新能源汽車的充電便利性和用戶體驗(yàn),推動(dòng)新能源汽車的發(fā)展。
    的頭像 發(fā)表于 12-17 09:36 ?297次閱讀
    淺析新能源電動(dòng)汽車充電樁<b class='flag-5'>空間布局</b>優(yōu)化研究