我正在编写一个内核网络模块,当我收到一个以太网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);
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 返回的指针,看看两者之间的区别。