我正在嘗試調試在以太網上運行的ATM封裝層。基本上ATM信元按照順序存儲在以太網報頭之後。不過,我懷疑司機對sk_buffs的天真做法已經破裂。在Linux中處理sk_buff數據包的所有有效負載的正確方法是什麼
司機盲目假設是skb->數據可以通過但看着爲virtio_net.c內核代碼迭代:page_to_skb我看到以下行爲:進一步
memcpy(hdr, p, hdr_len);
len -= hdr_len;
p += offset;
copy = len;
if (copy > skb_tailroom(skb))
copy = skb_tailroom(skb);
memcpy(skb_put(skb, copy), p, copy);
然後在:
while (len) {
set_skb_frag(skb, page, offset, &len);
page = (struct page *)page->private;
offset = 0;
}
這看起來似乎表明緩衝區是碎片化的,只有第一部分可以從skb-> data直接訪問。
我應該用什麼來獲取底層數據。理想情況下,我希望在將memcpy分塊成爲我維護的重組緩衝區之前,將任意偏移量的幾個字節掃描到以太網數據包中。我應該用什麼來做到這一點?