sherf 发表于 2009-11-18 02:47

回复 #69 accessory 的帖子

这个已经写了.....不行

另,写入 txstatus0 里面的值有限定吗?

sherf 发表于 2009-11-18 03:06

回复 #70 sherf 的帖子

再次 review并检查ISR后,发现,每发一个数据包后,ISR的值总是3E。已查过spec,但是还是搞不懂到底哪里出了问题...........

accessory 发表于 2009-11-18 03:41

你说的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 */

sherf 发表于 2009-11-18 06:31

原帖由 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 编辑 ]

accessory 发表于 2009-11-18 10:32

1) 不对。有可能发了好几个包之后,才来了一个中断。
2)对发送的包好象没什么要求。有个crc,我记得是接收时用的。

sherf 发表于 2009-11-19 04:44

原帖由 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 编辑 ]

accessory 发表于 2009-11-19 05:39

sherf老兄,你是一个接收中断都没有发生过?还是发生过几次,后面的没有了?
网络一般来说应该通的. 你的网卡怎么设置的? 如果是连在TAP上面的,看看HOST 上面的TAP 设备有没有接收到包.
MAC, IP 那些地址假如不对的话, 结果是对方收不到包,而不是你发不出去.

sherf 发表于 2009-11-19 15:47

原帖由 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 编辑 ]

accessory 发表于 2009-11-20 00:38

接收包的内容应该不是0. 有可能你接收部分的代码有问题.

关于8139 和 TAP0 之间的关系,可以好好看看QEMU的文档. 我觉得他们2个可以认为是分开的2块虚拟网卡. 可以用TCPDUMP 或者类似工具 看看TAP0上都有什么包.

sherf 发表于 2009-11-20 01:35

原帖由 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 编辑 ]
页: 1 2 3 4 5 6 7 [8] 9
查看完整版本: RTL8139 programming guide