简单的网络(四)发收包

原创
2014/07/06 23:41
阅读数 1.2K

简单的网络(一)了解PCI

简单的网络(二)环境模拟搭建

简单的网络(三)

简单的网络(四)发收包

一、初始化

通过上一个部分我们知道重置在18-1F端口写入数据就可以了。
通常是0x18

然后判断0x07位ISR寄存器的最高位

                     当网卡(NIC)进入复位状态时置 1,执行开始命令后清零;当接
                     收缓冲区溢出时置 1,读出一个或多个包后自动清零。
初始化主要设置缓冲区的配置
          //设置接收配置寄存器 RCR 对数据包接收配置
	port_write_byte(NE2K_IOADDR + 12, 0xE0);
	//设置发送配置寄存器
	port_write_byte(NE2K_IOADDR + 13, 0xE2);
    
	//0x9正常宽字    0x01 loopbakce宽字 TCR设置
           port_write_byte(NE2K_IOADDR + 14, 0xC8);
 
	//长度第八位,高八位
           port_write_byte(NE2K_IOADDR + 10, 0x00);
         port_write_byte(NE2K_IOADDR + 11, 0x00);

	
	//清楚中断标志
	port_write_byte(NE2K_IOADDR + 7, 0xFF);

         port_write_byte(NE2K_IOADDR + 0, 0x0A);	
         //写物理网卡地址  选择了page1
	port_write_byte(NE2K_IOADDR + NIC_COMMAND,0x61);
	
	for(i=0;i<6;i++){
	 port_write_byte(NE2K_IOADDR +i+1,buf[i*2]);
	}
	
	//当前寄存器位置
	port_write_byte(NE2K_IOADDR + 7, 0x50);
        //设置多播地址
	port_write_byte(NE2K_IOADDR + 8, 0x00);
	port_write_byte(NE2K_IOADDR + 9, 0x41);
	port_write_byte(NE2K_IOADDR + 10, 0x00);
	port_write_byte(NE2K_IOADDR + 11, 0x80);
	port_write_byte(NE2K_IOADDR + 12, 0x00);
	port_write_byte(NE2K_IOADDR + 13, 0x00);
	port_write_byte(NE2K_IOADDR + 14, 0x00);
	port_write_byte(NE2K_IOADDR + 15, 0x00);
	
	port_write_byte(NE2K_IOADDR + 0, 0x21);
        //设置接收页开始地址
	port_write_byte(NE2K_IOADDR + 1, 0x50);
	//设置接收页结束地址
	port_write_byte(NE2K_IOADDR + 2, 0x80);
	//设置边界地址 
	port_write_byte(NE2K_IOADDR + 3, 0x50);
        
         port_write_byte(NE2K_IOADDR + 4, 0x40);//发送起始页
	 
           port_write_byte(NE2K_IOADDR + 12, 0xCC);
	port_write_byte(NE2K_IOADDR + 13, 0xE2);//方便测试loopback
	
         port_write_byte(NE2K_IOADDR + 15, 0x00);
	
         port_write_byte(NE2K_IOADDR + 0, 0x22);

二、获取网卡地址

网卡地址的获取
1.设置读的位置
2.设置读页的高地位
3.设置读长度高地位
4.读取

网卡存储是重复存储在前面的12个字节的

三、设置网卡地址

第一页的前6个是设置mac的地址
          7个是设置当前缓存指针的位置
          8-F设置的是多播的地址匹配

四、发送包

 

1.缓冲位置
2.长度大小
3.写
4.实际长度
5.发射

检测发射成功 :
CR 的第二位 这一位在置1时发送数据包,在发送完毕或终止时自动清零,写 0 没影响
ISR的第零位 这一位显示接收无错误(接收收到数据包并无错误时置 1)
      一位 这一位显示发送无错误(发送完数据包并无错误时置 1)


五、接收包

1.读取当前位置
2.读取边界位置

  当前》边界
             可以读取前面4个字节
                         0:接受状态,1:下一页,2:当度第八位,3:长度高八位
                         
             读取缓冲区内容剔除前面这四个标志位

六、效果

 七、bug补充

图片中的两个bug 1.状态01 有问题 如果是发送是正常则对头,如果是loopback模式则无效 (测试结果)
                   CR寄存器发送完成后 &0x04==0   loopback模式对头  正常发射 错
                   TSR寄存器发送成功  &0x01==1   loopback模式错    正常发射 对
                   ISR寄存器                       loopback模式对    正常发射 对

有知道上面CR和ISR的状态的还望告诉我!!!
                                             

                 2.高八位应该是零,结果跟第八位一样,排查发现跟自己写的C的转换函数有关系BUG。(跟指针有关)

 

展开阅读全文
打赏
0
40 收藏
分享
加载中
更多评论
打赏
0 评论
40 收藏
0
分享
返回顶部
顶部