qwerty1231 发表于 2013-01-04 11:42

linux中tap虚拟网卡问题,请各位大侠帮帮忙,简单看下

我跑的linux内核版本是Linux version 2.6.14
现在在板子上使用虚拟网卡tap后,将eth0设置为杂收模式,在测试ping时出现了如下问题:
# ping 192.168.1.66
PING 192.168.1.66 (192.168.1.66): 56 data bytes
84 bytes from 192.168.1.66: icmp_seq=0 ttl=64 time=31.6 ms
84 bytes from 192.168.1.66: icmp_seq=0 ttl=64 time=35.7 ms (DUP!)
84 bytes from 192.168.1.66: icmp_seq=1 ttl=64 time=2.0 ms
84 bytes from 192.168.1.66: icmp_seq=1 ttl=64 time=5.2 ms (DUP!)
84 bytes from 192.168.1.66: icmp_seq=2 ttl=64 time=2.0 ms
84 bytes from 192.168.1.66: icmp_seq=2 ttl=64 time=5.3 ms (DUP!)
84 bytes from 192.168.1.66: icmp_seq=3 ttl=64 time=2.0 ms
84 bytes from 192.168.1.66: icmp_seq=3 ttl=64 time=5.2 ms (DUP!)
84 bytes from 192.168.1.66: icmp_seq=4 ttl=64 time=2.0 ms
84 bytes from 192.168.1.66: icmp_seq=4 ttl=64 time=5.3 ms (DUP!)
84 bytes from 192.168.1.66: icmp_seq=5 ttl=64 time=2.0 ms
84 bytes from 192.168.1.66: icmp_seq=5 ttl=64 time=5.3 ms (DUP!)
84 bytes from 192.168.1.66: icmp_seq=6 ttl=64 time=2.0 ms
84 bytes from 192.168.1.66: icmp_seq=6 ttl=64 time=5.9 ms (DUP!)
84 bytes from 192.168.1.66: icmp_seq=7 ttl=64 time=2.0 ms
84 bytes from 192.168.1.66: icmp_seq=7 ttl=64 time=5.3 ms (DUP!)
每一个ping后都有1个(DUP!)。

这个是我的网卡配置:
# ifconfig
eth0      Link encap:EthernetHWaddr 00:19:54:31:12:02
          UP BROADCAST RUNNING PROMISC MULTICASTMTU:1500Metric:1
          RX packets:7539 errors:0 dropped:0 overruns:0 frame:0
          TX packets:284 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:824273 (804.9 KiB)TX bytes:28980 (28.3 KiB)
          Interrupt:6 Base address:0x6000

tap       Link encap:EthernetHWaddr 00:19:54:31:12:02
          inet addr:192.168.1.171Bcast:192.168.1.255Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICASTMTU:1500Metric:1
          RX packets:7541 errors:0 dropped:0 overruns:0 frame:0
          TX packets:282 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500
          RX bytes:794201 (775.5 KiB)TX bytes:28896 (28.2 KiB)

想请问一下造成这个(DUP!),重传现象是因为我将eth0的mac和tap的mac设置成一样引起的吗?
我网上查了一下,都说的是网里有回路,但是我现在是计算机和板子直连的,没有通过hub或路由器。
我后面又将tap的物理地址改为了和eth0不同,但是结果是测试ping时,无法ping通,通过net抓包工具分析看是有ICMP包发给计算机,计算机也回复了对应的包,但是板子上程序就是始终无法收取到,但是板子上的程序是可以收取arp包的。
请各位达人帮忙,看下我这个为什么eth0和tap的mac地址不一致时就无法收包?一致时就会有DUP!是什么问题??

Cyberman.Wu 发表于 2013-01-04 18:04

你具体怎么做的,没有自己做程序吗?正常而言,一个tap其实是通过一个字符设备文件和外界交换数据包的,向字符设备写入一个包就是tap从外界收到一个包,而tap向外发的包是需要通过字符设备来收取的。

qwerty1231 发表于 2013-01-09 14:15

你好,感谢你的回复!
我有自己做程序,你说的这个字符设备文件应该就说该文件吧在/dev/net/tun
我是通过eth0设置为杂收模式,然后读取eth0的数据,写入到tap的,最后是通过读取tap的数据写入到eth0的。

Cyberman.Wu 发表于 2013-01-11 15:09

看不到程序,只能去猜了,你应该是用PF_PACKET做的?设置为混杂模式之后eth0应该是把ping的响应收到内核了,然后你的应用层程序又向内核写入一个,就导致重复的ICMP echo reply。

qwerty1231 发表于 2013-01-11 15:55

你好!十分感谢你的回复!
确实我们这边用的是PF_PACKET。
“设置为混杂模式之后eth0应该是把ping的响应收到内核了,然后你的应用层程序又向内核写入一个,就导致重复的ICMP echo reply”
你说的这种情况确实跟我现在的现象相符,但是我这个程序在不仅仅只在一个嵌入式平台上运行过,相同的程序在另一个平台上,却是很正常的。
但是在我现在运行的平台上就出现(DUP!),平台不同所以对应的kernel及其网卡驱动程序是不同的。
我想不通为什么非要将tap的物理地址改为了和eth0一样,才能ping通?如果tap和eth0的mac地址不同,就无法ping通。

Cyberman.Wu 发表于 2013-02-04 13:53

回复 5# qwerty1231


    是不是你的网口有MAC过滤功能,外部来的数据目标MAC非MC/BC、非它自己的地址就直接过滤掉了?你说的另一个平台上是不显示的,未必就是内核没有收到吧。
页: [1]
查看完整版本: linux中tap虚拟网卡问题,请各位大侠帮帮忙,简单看下