我有两个(可能是相关的)问题,但我将首先描述标题中提到的一个。
我正在修改虚拟网络设备驱动程序,以将传输的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] 删除。
我来说两句