从虚拟Linux网络设备驱动程序发送的RX数据包被丢弃

阿尔山

我有两个(可能是相关的)问题,但我将首先描述标题中提到的一个。

我正在修改虚拟网络设备驱动程序,以将传输的UDP数据包回显到传输接口。在的回调函数中ndo_start_xmit,我添加了以下代码以回显传输的数据包:

struct sk_buff *skb2;
unsigned char *ptr;
skb2 = netdev_alloc_skb(dev, pkt_len + 2);
if(skb2)
{
  ptr = skb_put(skb2 , pkt_len);
  memcpy(ptr , (void*)skb->data, pkt_len);
  /* Code to swap source and destination IP & Ports and increment tx rx counts here */
  netif_rx(skb2);
}

现在,如果在插入此模块后为接口分配IP,在此接口上发送数据包,然后运行ifconfig dummy0则会得到以下输出:

dummy0    Link encap:Ethernet  HWaddr 42:cd:19:7d:52:3f
          inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::40cd:19ff:fe7d:523f/64 Scope:Link
          UP BROADCAST RUNNING NOARP  MTU:1500  Metric:1
          RX packets:4 errors:0 dropped:4 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:192 (192.0 B)  TX bytes:258 (258.0 B)

在这里我们可以看到,与数据包TX和RX计数一起,RX Drop计数也在增加。有人可以指出丢包的原因吗?

现在谈到第二个问题,如果我尝试运行tcpdump以捕获数据包,则当某个数据包到达此dummy0接口的RX时,整个虚拟机将挂起(我猜是内核恐慌)。代码中是否缺少导致此问题的内容?

阿尔山

通过添加以下内容,我能够解决这两个问题:

skb2->protocol = eth_type_trans(skb2, dev);

就在之前netif_rx(skb2)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

长时间写入linux char设备驱动程序?

Linux设备驱动程序访问控制

如何编写简单的Linux设备驱动程序?

如何练习编写真正的Linux设备驱动程序?

写入Linux设备驱动程序会导致无限循环

IOCTL Linux设备驱动程序

Linux平台驱动程序和普通设备驱动程序有什么区别?

在Linux设备驱动程序编程中使用struct inode和struct文件传递数据的原因

ODP.net托管驱动程序引发ORA-12570:网络会话:意外的数据包读取错误

Linux内核驱动程序模块:使用单个驱动程序处理多个设备文件

Nexus 6和Samsung Galaxy S6的存储和网络设备驱动程序源代码

Linux设备驱动程序:重温睡眠锁定

raspberry pi:编写Linux设备驱动程序

使用TIdNotify.NotifyMethod时某些数据包被丢弃

了解网络摄像头的Linux设备驱动程序

使用默认HID驱动程序时,应用程序忽略USB设备的传入数据包

Linux设备驱动程序通过USB发送和接收音频

如何在正在运行的Debian Linux机器上换出网络设备的驱动程序?

Linux:以独立方式编译内核设备驱动程序

Linux:如何查找用于设备的设备驱动程序?

Linux是否具有USB端口的设备驱动程序?

如何在安装新内核时自动安装网络设备驱动程序r8168

可以在Linux NIC驱动程序上动态更改Rx / Tx数据包缓冲区的大小吗?

Linux字符设备驱动程序问题

Linux内核中的WS2812设备驱动程序

如何编写虚拟网络设备驱动程序

如何使用 SPI 编写网络设备驱动程序?

Linux 中的字符设备驱动程序读/写

linux 设备驱动程序文档