swordzq 发表于 2007-3-16 23:56:02

ucosii4skyeye中网卡驱动ne2kif.c的问题

ne2kif.c网卡驱动中的接收数据驱动部分代码如下:
:?:
static struct pbuf *
low_level_receive(struct RTL8019if *rtl8019if)
{
u16_tpacketLength,len;
u8_t PDHeader;   // Temp storage for ethernet headers
struct pbuf * p;
struct pbuf * q;
u8_t * payload;


outb(ISR_RDC, NE_ISR);
outb(0x0f, NE_RBCR1);/* See controller manual , use send packet command */
outb(CMD_PAGE0 | CMD_SEND | CMD_RUN, NE_CR);

//get the first 18 bytes from nic
ne2k_copyin(18,PDHeader);

//Store real length, set len to packet length - header
packetLength = ((unsigned) PDHeader | (PDHeader << 8 ));

   //verify if the packet is an IP packet or ARP packet
if((PDHeader>0x06)||(PDHeader != 8)||(PDHeader != 0 && PDHeader != 6))
       {
   ne2k_discard(packetLength-14);
            return NULL;
       }
我的思路是这样的:

先申明一个18字节的数组u8_t PDHeader;   然后通过驱动程序从NIC接收18个字节的数据放入上面所申明的数组中!我猜测这个18个字节是指以太网头部的14个字节加上IP头部的前4个字节,取ip头部前四个字节,我的想法是为了取出IP数据报的长度,但是在packetLength = ((unsigned) PDHeader | (PDHeader << 8 ))中为什么要用PDHeadr和PDHeader来取IP报长度呢?

如果说PDHeader和PDHeader是存储了IP头中的“总长度”字段,也就是IP头部的第3,4个字节;那为什么IP头部储存到了PDHeader数组的前面而不是在该数组的最后面呢???

如果我以上的猜想是正确的!!那么为什么从NIC读出来的18数据字节中以太网头部14个字节放到了数组的后面而IP头部前4个字节放到了数组的最前面呢?????



我也考虑了是否是因为 以太II 和802.3帧封装的问题,但是我查阅了它们的资料还是想不通!在此小弟向各位大师请教!不胜感激!!!!!

AnthonyLee 发表于 2007-3-17 09:24:36

Re: ucosii4skyeye中网卡驱动ne2kif.c


先申明一个18字节的数组u8_t PDHeader;   然后通过驱动程序从NIC接收18个字节的数据放入上面所申明的数组中!我猜测这个18个字节是指以太网头部的14个字节加上IP头部的前4个字节,取ip头部前四个字节,我的想法是为了取出IP数据报的长度,但是在packetLength = ((unsigned) PDHeader | (PDHeader << 8 ))中为什么要用PDHeadr和PDHeader来取IP报长度呢?

如果说PDHeader和PDHeader是存储了IP头中的“总长度”字段,也就是IP头部的第3,4个字节;那为什么IP头部储存到了PDHeader数组的前面而不是在该数组的最后面呢???

如果我以上的猜想是正确的!!那么为什么从NIC读出来的18数据字节中以太网头部14个字节放到了数组的后面而IP头部前4个字节放到了数组的最前面呢?????



我也考虑了是否是因为 以太II 和802.3帧封装的问题,但是我查阅了它们的资料还是想不通!在此小弟向各位大师请教!不胜感激!!!!!

在 ne2000 卡中每个读取的 page 前 4 个字节为专用字节
第一个:接收状态
第二个:下一页起始地址
第三个:(包长度+4)的低位
第四个:(包长度+4)的高位

所以 PacketLength = ((unsigned) PDHeader | (PDHeader << 8 ))

其实 IP 报应从读入的 Packet 的第五个字节开始:
unsigned char *ethPacket = &PDHeader;
unsigned int ethPacketLength =((unsigned int) PDHeader | (PDHeader << 8 )) - 4;

swordzq 发表于 2007-3-19 12:25:27

谢谢AnthonyLee的解释!
页: [1]
查看完整版本: ucosii4skyeye中网卡驱动ne2kif.c的问题