我目前正在尝试调试在以太网之上运行的 ATM 封装层。基本上,ATM 信元在以太网标头之后按顺序存储。但是我怀疑司机对 sk_buffs 的天真方法被打破了。
驱动程序盲目地假设 skb->data 可以迭代,但查看 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 将块放入我维护的重组缓冲区之前,在以太网数据包中的任意偏移处查看几个字节。我应该用什么来做到这一点?