在Linux内核代码(最多3.1.*)中,我看到了这样的结构定义:
struct skb_frag_struct {
struct page *page;
/* ... */
Run Code Online (Sandbox Code Playgroud)
在较新的内核版本中,这已演变为:
struct skb_frag_struct {
struct {
struct page *p;
} page;
/* ... */
Run Code Online (Sandbox Code Playgroud)
在这种特殊情况下,这种包装可以用于什么目的?为什么在一般情况下可能需要它?
我目前正在尝试调试在以太网上运行的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);
Run Code Online (Sandbox Code Playgroud)
然后进一步说:
while (len) {
set_skb_frag(skb, page, offset, &len);
page = (struct page *)page->private;
offset = 0;
}
Run Code Online (Sandbox Code Playgroud)
这似乎表明缓冲区是碎片化的,只有第一部分可以直接从skb-> data访问.
我应该用什么来获取基础数据.理想情况下,我希望在memcpy将块存入我维护的重组缓冲区之前,将任意偏移量的几个字节查看到以太网数据包中.我该怎么用呢?