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/
--
宣告
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
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/
留言
張貼留言