从虚拟 Linux 网络设备 driver 发送的 RX 数据包被丢弃

RX Packets sent from dummy Linux network device driver are dropped

我有两个(可能相关的)问题,但我会先描述标题中提到的那个。

我正在修改 dummy network device driver 以将传输的 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).

之前