用收到帧的内容填充sk_buff

问题描述 投票:0回答:1

我正在编写一个内核网络模块,当我收到一个以太网DIX帧(它表示为连续的字节序列)时,我必须将收到的数据包的所有内容正确地放入sk_buff中。我该怎么办?

我尝试像这样构建和传输我的框架

    struct sk_buff* skb = netdev_alloc_skb(dev,len);
    skb_reserve(skb,len);
    void* temp = skb_push(skb,len);
    memcpy(temp,data,len);
    netif_rx(skb);

但是在wireshark中我发现Linux将其视为Linux熟捕获而不是以太网 sniffed frame

linux-kernel network-programming linux-device-driver embedded-linux systems-programming
1个回答
0
投票

http://vger.kernel.org/~davem/skb_data.html

一个错误的事情是您正在运行 skb_reserve 来获取数据长度。 skb_put 扩展了缓冲区的已用数据区域,因此您需要执行两次。也尝试使用 skb_put。 尝试下面的代码:

netdev_alloc_skb(dev, len + NET_IP_ALIGN); 
skb_reserve(skb, NET_IP_ALIGN);
skb_put(skb, len); //skb_putpoints to the start of skb data
memcpy((void*)skb->data, data, len);

或者你可以尝试这个(未测试):

netdev_alloc_skb(dev, len + NET_IP_ALIGN); 
skb_reserve(skb, NET_IP_ALIGN);
skb_put_data(skb, data, len); //skb_putpoints to the start of skb data

NET_IP_ALIGN -> 你可以在这里阅读它 https://elixir.bootlin.com/linux/v5.4.1/source/include/linux/skbuff.h#L2588

您还可以比较 skb_put 和 skb_push 返回的指针,看看两者之间的区别。

© www.soinside.com 2019 - 2024. All rights reserved.