发送相关的函数如下, 你也可以自己去QEMU/HW/RTL8139.C里面去看
static int rtl8139_transmit_one(RTL8139State *s, int descriptor)
{
if (!rtl8139_transmitter_enabled(s))
{
DEBUG_PRINT(("RTL8139: +++ cannot transmit from descriptor %d: transmitter disabled\n",
descriptor));
return 0;
}
if (s->TxStatus & TxHostOwns)
{
DEBUG_PRINT(("RTL8139: +++ cannot transmit from descriptor %d: owned by host (%08x)\n",
descriptor, s->TxStatus));
return 0;
}
DEBUG_PRINT(("RTL8139: +++ transmitting from descriptor %d\n", descriptor));
int txsize = s->TxStatus & 0x1fff;
uint8_t txbuffer;
DEBUG_PRINT(("RTL8139: +++ transmit reading %d bytes from host memory at 0x%08x\n",
txsize, s->TxAddr));
cpu_physical_memory_read(s->TxAddr, txbuffer, txsize);
/* Mark descriptor as transferred */
s->TxStatus |= TxHostOwns;
s->TxStatus |= TxStatOK;
rtl8139_transfer_frame(s, txbuffer, txsize, 0);
DEBUG_PRINT(("RTL8139: +++ transmitted %d bytes from descriptor %d\n", txsize, descriptor));
/* update interrupt */
s->IntrStatus |= TxOK;
rtl8139_update_irq(s);
return 1;
}
static void rtl8139_transmit(RTL8139State *s)
{
int descriptor = s->currTxDesc, txcount = 0;
/*while*/
if (rtl8139_transmit_one(s, descriptor))
{
++s->currTxDesc;
s->currTxDesc %= 4;
++txcount;
}
/* Mark transfer completed */
if (!txcount)
{
DEBUG_PRINT(("RTL8139: transmitter queue stalled, current TxDesc = %d\n", s->currTxDesc));
}
} 原帖由 accessory 于 2009-11-20 06:00 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
TxUnderrun 和 TxAborted 在QEMU里根本就不会出现. 反正我在代码里没找到使用的地方.
发送相关的函数如下, 你也可以自己去QEMU/HW/RTL8139.C里面去看
static int rtl8139_transmit_one(RTL8139State *s,...
accessory,
不用查了,我知道原因了,真的挺令人沮丧的,居然是头文件中对TSD_TOK | TxUnderrun | TxAbortedT 出错!(都多了个0)。因为头文件都是copy过来的,之前没细看......(发那个例子(不是demo,demo里是对的)的人居然能调试出来.........)
[ 本帖最后由 sherf 于 2009-11-20 06:45 编辑 ]
回复 #81 sherf 的帖子
accessory,另,对于抓包的问题,因为在tap0里已经发现我发的包,因此我想利用tcpdump抓出来,到网上翻了一下找了个命令(tap0的 ip 是 192.168.0.11):
sudo tcpdump -s 0 -w pakect.tmp host 192.168.0.11
我先执行了这个命令,然后运行我的程序,当发包完了以后过一会我停了程序,并打开 packet.tmp 查看,但发现是空的,没抓到包。
疑问:上面tcpdump命令使用正确吗?(我看到网上有很多关于tcpdump的介绍,但感觉我没使用嗯错,但却抓不到包.....)
回复 #83 accessory 的帖子
accessory,谢谢你的建议。
我在你的命令里改了一下(加了输出文件):sudo tcpdump -s 0 -w packet.txt -i tap0,文件有内容,但是是乱码,在ubuntu里用 textedit 打开,换了几种编码显示都不行,你平常是用那种编码格式打开的?
回复 #84 sherf 的帖子
accessory,已解决(ethereal)。谢谢之前你的回复。 不客气. 终于搞定了啊
回复 #86 accessory 的帖子
accessory,还有一点想请教一下,是关于PCI的存储空间方面的。例如:
1)通过PCI配置空间获得 iobase
for(dev=0; dev<32; dev++)
{
base = 0x80000000 + (dev << 11);
out_dword(0xCF8, base);
data = in_dword(0xCFC);
if(data != 0xFFFFFFFF)
{
dev1->device_id = data >> 16 ;
dev1->vendor_id = data & 0x0000FFFF;
//注:获得iobase
out_dword(0xCF8, base + 0x10);
dev1->iobase = in_dword(0xCFC) & 0xFFFFFFFC;
.....
}
}
2)基于iobase 对网卡芯片做 reset 操作
out_byte(rd->iobase + CR, CR_RST);
------------------------------
PCI存储空间包括 I/O Space 和 Memory Space,该怎么区分?比如,像上面 1) 和 2) 是不是都使用了 I/O Space ? 我对硬件了解不是很多(只是看了一些PCI方面的资料),对我而言,1)和 2)更多的只是端口的读写。但了解到,如果多个PCI设备共存的话,它们的存储空间是不能重叠的,因此想搞清楚 PCI的存储空间到底怎么理解,谢谢。
回复 #87 sherf 的帖子
顶一下 关于PCI 可以看看这个连接: http://tldp.org/LDP/tlk/dd/pci.html总的来说PCI有3个空间, 配置, IO, MEMORY 空间. 你的87贴里的1) 是在访问配置空间. 不过是通过INTEL X86 的IO指令来访问的. 可以理解为 CF8, CFC 是2个比较特殊的IO端口,通过他们可以访问到PCI的配置空间.
87贴里的2)是访问I/O 空间.