标签: skb

将指针包装在C中的结构中的目的

在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)

在这种特殊情况下,这种包装可以用于什么目的?为什么在一般情况下可能需要它?

c struct pointers linux-kernel skb

9
推荐指数
1
解决办法
140
查看次数

在Linux中处理sk_buff数据包的所有有效负载的正确方法是什么

我目前正在尝试调试在以太网上运行的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将块存入我维护的重组缓冲区之前,将任意偏移量的几个字节查看到以太网数据包中.我该怎么用呢?

c networking linux-kernel skb

6
推荐指数
1
解决办法
5546
查看次数

标签 统计

c ×2

linux-kernel ×2

skb ×2

networking ×1

pointers ×1

struct ×1