回复 #69 accessory 的帖子
这个已经写了.....不行另,写入 txstatus0 里面的值有限定吗?
回复 #70 sherf 的帖子
再次 review并检查ISR后,发现,每发一个数据包后,ISR的值总是3E。已查过spec,但是还是搞不懂到底哪里出了问题........... 你说的ISR 是INTRSTATUS (62) 吧? 0x3E表示TX_OK 和TX_ERR 都出现了. 不过既然又TX_OK, 那么读下 TXSTATUS 寄存器看看到底是什么状态了. 类似如下代码:txstatus = RTL_R32 (TxStatus0 + (entry * sizeof (u32)));
if (!(txstatus & (TxStatOK | TxUnderrun | TxAborted)))
break; /* It still hasn't been Txed */ 原帖由 accessory 于 2009-11-18 03:41 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
你说的ISR 是INTRSTATUS (62) 吧? 0x3E表示TX_OK 和TX_ERR 都出现了. 不过既然又TX_OK, 那么读下 TXSTATUS 寄存器看看到底是什么状态了. 类似如下代码:
txstatus = RTL_R32 (TxStatus0 + (entry * sizeof ( ...
谢谢,已能接收中断,原因是读写函数的取值不对(位数),真是搞死人........
另,目前还碰到一些其他的问题:
1、在进入中断程序后就一直在里面循环不出来。你们调试DEMO里的程序都会碰到这样的情况吗?我的理解是一次中断发一个包(忽略包的容量)或一次收一个包。
2、只能接收包,不能发送包。我起初怀疑是TCR的设置问题,我分别将8139too.c,8139cp.c,demo.c中对TCR的设置搬到我的程序中,并打开了发送屏蔽(IMR:0x04),但都不能引发发送中断。这里,我想再确认一下:
1)忽略数据包的大小和已打开发送中断屏蔽的情况下,一次发一个数据包就会引起一次发送中断,不可能是发了几个数据包才引发一次发送中断,是这样吗?
2)对于数据包的测试,我所建的数据包如下:
struct packet * buildpkg()
{
struct packet *pkg;
struct packet ppkg;
u8 buf;
int i;
pkg = ppkg;
pkg->length = 64;
pkg->buffer = buf;
//boardcast packet
for(i=0; i<6; i++)
{
pkg->buffer= 0xFF;
}
pkg->buffer = 0x00;
pkg->buffer = 0x33;
pkg->buffer = 0xaa;
pkg->buffer = 0xbb;
pkg->buffer= 0xcc;
pkg->buffer= 0xdd;
// ethernet type
pkg->buffer= 0x08;
pkg->buffer= 0x06;
// hardware type
pkg->buffer= 0x00;
pkg->buffer= 0x01;
//ip protocal
pkg->buffer= 0x08;
pkg->buffer= 0x00;
//mac and ip addr len
pkg->buffer= 0x06;
pkg->buffer= 0x04;
//opcode
pkg->buffer= 0x00;
pkg->buffer= 0x01;
//source mac
pkg->buffer = 0x00;
pkg->buffer = 0x33;
pkg->buffer = 0xaa;
pkg->buffer = 0xbb;
pkg->buffer = 0xcc;
pkg->buffer = 0xdd;
//source ip
pkg->buffer = 192;
pkg->buffer = 168;
pkg->buffer = 1;
pkg->buffer = 31;
//dest mac
for(i=33; i<39; i++)
{
pkg->buffer= 0xFF;
}
//dest ip
pkg->buffer = 192;
pkg->buffer = 168;
pkg->buffer = 0;
pkg->buffer = 13;
for(i=43; i<64; i++)
{
pkg->buffer= i & 0xFF;
}
return pkg;
}
这样建的数据包对吗?
[ 本帖最后由 sherf 于 2009-11-18 06:34 编辑 ] 1) 不对。有可能发了好几个包之后,才来了一个中断。
2)对发送的包好象没什么要求。有个crc,我记得是接收时用的。 原帖由 accessory 于 2009-11-18 03:41 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
你说的ISR 是INTRSTATUS (62) 吧? 0x3E表示TX_OK 和TX_ERR 都出现了. 不过既然又TX_OK, 那么读下 TXSTATUS 寄存器看看到底是什么状态了. 类似如下代码:
txstatus = RTL_R32 (TxStatus0 + (entry * sizeof ( ...
accessory,
已经设了,就是从这里退出来的:
txstatus = in_dword(rd->iobase+ TSD0+ entry * 4);
if(!(txstatus & ((TxStatOK | TxUnderrun | TxAborted)))
{
break;
}
我查了spec,但也没搞清楚造成 (TxStatOK | TxUnderrun | TxAborted) 的原因。是网络不通,导致的吗?如果是,那该如何设置?目前,我的网络配置应该是好的(另一个qemu模拟的winxp中验证过),但是由于我的程序是通过别的程序boot起来的,因此不能借助操作系统设置网络,只能通过qemu的启动脚本设置MAC地址和通过数据包里设置源、目的MAC和IP等信息,是否因为这个配置不够完善而导致网络不通?如果是,该如何配置qemu和设置数据包的信息(MAC、IP等)?
[ 本帖最后由 sherf 于 2009-11-19 05:03 编辑 ] sherf老兄,你是一个接收中断都没有发生过?还是发生过几次,后面的没有了?
网络一般来说应该通的. 你的网卡怎么设置的? 如果是连在TAP上面的,看看HOST 上面的TAP 设备有没有接收到包.
MAC, IP 那些地址假如不对的话, 结果是对方收不到包,而不是你发不出去. 原帖由 accessory 于 2009-11-19 05:39 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
sherf老兄,你是一个接收中断都没有发生过?还是发生过几次,后面的没有了?
网络一般来说应该通的. 你的网卡怎么设置的? 如果是连在TAP上面的,看看HOST 上面的TAP 设备有没有接收到包.
MAC, IP 那些地址假如不对 ...
accessory,
已能接收中断,接收中断是持续发生的(我试验了大概1分钟左右的时间,是持续发生接收中断的)。但是,有一点挺怪的,所有接收到的包的内容全为0(即从第一个字节(Dest Mac)开始到最后一个字节(第63个字节)都是0!感觉不是很正常,到网上翻了一下,也只是找到一些有关dest Mac为0的包的信息(里面的内容不为0)。accessory,你碰到过这种情况吗?
经你提醒,我重新做了几次模拟,每次都发一个数据包,然后立即ifconfig tap0(程序是连接在tap0上的),结果都能发现tap0收到一个包。这是否说明了网络是好的?其实我自己也认为网络应该没问题,毕竟能引发接收中断和发送中断.....但为何包没发送出去呢(TxStatOK | TxUnderrun | TxAborted)?
另,有关 qemu中的rtl8139虚拟网卡和接口tap0之间的关系还有些疑问。我个人认为就像主机上的物理网卡和上面的eth0,是一体的,网卡通过网路接口(eth0/tap0)发送数据包。同样,qemu中的8139虚拟网卡是通过tap0发送数据包的,那检查tap0上是否收到虚拟网卡发送的数据包有什么意义?(如果将tap0看成是另一张虚拟网卡,那检查tap0上是否收到从qemu8139虚拟网卡发过来的数据包是有意义的,毕竟是从“qemu中的8139虚拟网卡”发送成功才会转到“另一张虚拟网卡”tap0中去)......
[ 本帖最后由 sherf 于 2009-11-19 22:12 编辑 ] 接收包的内容应该不是0. 有可能你接收部分的代码有问题.
关于8139 和 TAP0 之间的关系,可以好好看看QEMU的文档. 我觉得他们2个可以认为是分开的2块虚拟网卡. 可以用TCPDUMP 或者类似工具 看看TAP0上都有什么包. 原帖由 accessory 于 2009-11-20 00:38 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
接收包的内容应该不是0. 有可能你接收部分的代码有问题.
关于8139 和 TAP0 之间的关系,可以好好看看QEMU的文档. 我觉得他们2个可以认为是分开的2块虚拟网卡. 可以用TCPDUMP 或者类似工具 看看TAP0上都有什么包.
接收包的问题已解决,确如你所说是代码中有bug(在函数切换过程中buffer被清空了)。
另,还是那个发送的问题,TxUnderrun 和 TxAborted 到底是怎样造成的(或者说造成的原因可能有哪些,我自己可以逐个去试)?网络通了,为何发不出去?
[ 本帖最后由 sherf 于 2009-11-20 01:39 编辑 ]