linux kernel - skb / sk_buff

收錄在 AIoT Ameba 2020 - Just for Fun

--
宣告
    netdev_alloc_skb() /  dev_alloc_skb() / alloc_skb()

    - 用 GFP_ATOMIC
    - 長度; 多一個 NET_SKB_PAD 來避免 重新 allocation 的負擔
                 即為 head - end 的大小

--
釋放
    dev_kfree_skb() / kfree_skb()

   如果會在 中斷中使用: dev_kfree_skb_irq()
   可能會在中斷中使用: dev_kfree_skb_any()

--
skb_reserve :

    head room 空間增大, tail room 空間減少


skb_put : 放 user data


skb_push / skb_pull
    可以用來放 header,  push 資料會往 head room 加, pull 會釋放回 head room


    push: 當 head room 不夠放時, 會 呼叫 skb_under_panic()

                  if (unlikely(skb->data < skb->head))
                                 skb_under_panic(skb, len, __builtin_return_address(0));


     pull : 當 data len < 要 pull 的長度時, 會 回傳 NULL


skb_clone : data 資料是用同一塊記憶體


skb_copy() : 資料部分也會複製一份

--
skb_shinfo()

在 宣告的時候, 在 end 後面會增加一塊給 skb_shared_info 使用

    size += SKB_DATA_ALIGN(sizeof(struct skb_shared_info));

在這欄位中, 會有個 frags 做分割

    skb_frag_t frags[MAX_SKB_FRAGS];

這邊能 組最大 64K bytes. 所以 MAX_SKB_FRAGS 為 (65536/PAGE_SIZE + 1)

skb_frag_size()

Covert skb_frag_t to bio_vec
http://patchwork.ozlabs.org/cover/1135350/



留言

熱門文章