⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ls_net.c

📁 5402控制88796网卡的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "c54reg.h"
#include "ls_net.h"  
#include "ls_system.h"        
/////////////////////////////////    
word arp_data[]=
{0xffff,0xffff,0xffff,    //以太网目的地址  
0,0,0,                  //以太网源地址
0x0608,                 //帧类型
0x0100,                 //硬件类型
0x0008,                 //协议类型
0x0406,                 //协议长度,硬件长度
0x0100,                 //arp请求
0,0,0,                  //发送端以太网地址
0,0,                    //发送端ip地址
0xffff,0xffff,0xffff,   //目的以太网地址
0,0                     //目的ip地址
};

word ip_data[]=
{
0x0008,                 //帧类型
0x0045,                 //TOS+VER+LG
0x0000,                 //LONG
0x0000,                 //FLAG
0x0000,                 //OFFICE
0x1120,                 //PR+TTL
0x0000,                 //SUM
};
////////////////////////////////////////////////////////////////////////
ip_table  des_ip,sur_ip; //主机ip,本机ip,服务器ip,教师终端ip   
//ip_add_table ip_address;
set_type set;
word net_buff[100];
word use_receive_buff[512];
word use_send_buff[100];
//word tmp_buff[512];
word net_receive;                             
word uxp[40];
sum_type *uip;
command_type command;
sum_type *np;             
extern system_type system;
///////////////////////////////////////////
void init_net(void);  
word net_sum(word *p,word lg);
void net_send_data(word *data,word lg);
void ini_xip(xip_type *xp);
word net_read_incept_state(void);
void net_move_add(word dma_address,word *pdata,word lg);
void page(word num);
void delay(void);
void copy_add_mem(int *sur,int *des,word lg);
word net_receiv_state(void);
void net_send_option(word dma_address,word lg);
void net_send_dma(word dma_address,word *pdata,word lg);
void net_receive_dma(word dma_address,word *pdata,word lg);
void net_buff_full(word dma_address,word val,word lg);
word swap(word val);
//////////////////////////////////////////////////
//////////////////////////////////////////////////
//      模块名称:rtl8019(包含88796)
//      模块功能:以太网中断服务程序及TCP/IP协议
//      入口参数:无
//      返回参数:无
//      版本序号:v1.1
//      测试日期:2003.3.8
//////////////////////////////////////////////////
interrupt  void rtl8019(void)
{word mbnry,mcur,*rtp,rlg,tmp; 
asm("	ssbx INTM");       
  
//asm("	ssbx xf");
np=(sum_type *)net_buff;                             

/// 中断接收/////////////////////////
next:        
 ISR=0xff;            
 mcur=CPR&0xff;//CURR&0xff;
 mbnry=BNRY&0xff;  
 asm("	nop");
 asm("	nop");
 mbnry++;
 if (mbnry==mcur) goto net_end;             
///////////缓冲区中有数据//////////////////////////// 
 net_receive_dma(mbnry*256,(word *)&net_buff,46);
 if (np->hd.type==ARP) goto run_arp;  //ARP包
 if (np->hd.type==IP) goto run_ip;    //IP包
 goto next_pake;
////////////ARP应答包处理///////////////////////////////////////////////////////////////
run_arp:
 if (compare_mem((word *)&np->thd.arp.dip_address,(word *)&sur_ip,2)!=1) goto next_pake;
 
 if (compare_mem((word *)&np->thd.arp.sip_address,(word *)&des_ip,2)==1)
 {
 	copy_mem((word *)&np->thd.arp.shd_address,(word *)&des_ip.hd_address,3);
  	set.save_des=1;  
  };	
 /*	if (compare_mem((word *)&np->thd.arp.sip_address,(word *)&sev_ip,2)==1)
 	{
 		copy_mem((word *)&np->thd.arp.shd_address,(word *)&sev_ip.hd_address,3);
  		set.save_sev=1;
 	};  
 }
 else if (compare_mem((word *)&np->thd.arp.sip_address,(word *)&sev_ip,2)==1)
 {
 	copy_mem((word *)&np->thd.arp.shd_address,(word *)&sev_ip.hd_address,3);
  	set.save_sev=1;
 }
 else
 {                          
   if (compare_mem((word *)&np->thd.arp.sip_address,(word *)&stu_ip,2)==1)
    	{copy_mem((word *)&np->thd.arp.shd_address,(word *)&stu_ip.hd_address,3);
    	 set.save_stu=1;
    	};
 };*/  
 
    if (np->thd.arp.option!=ARP_REQ) goto next_pake;                      
     sur_ip.hd_address[0]=0xbbaa;
     copy_mem((word *)&sur_ip.ip_address,(word *)&sur_ip.hd_address[1],2);
     copy_mem((word *)&np->thd.arp.shd_address,(word *)&np->thd.arp.dhd_address,5);
     copy_mem((word *)&sur_ip.ip_address,(word *)&np->thd.arp.sip_address,2);
     copy_mem((word *)&sur_ip.hd_address,(word *)&np->thd.arp.shd_address,3);
     np->thd.arp.option=ARP_ACK;     
     copy_mem((word *)&np->thd.arp.dhd_address,(word *)&np->hd.dhd_address,3);
     copy_mem((word *)&np->thd.arp.shd_address,(word *)&np->hd.shd_address,3);
     rtp=(word *)&np->hd.dhd_address;
     net_send_dma(0x4000,rtp,42);
     rlg=0x40;
     goto send_ack;
//////////IP包处理/////////////////////////////////////////////////////////////// 
run_ip:        
//p_ip=&rip.thd.ip_head.ip;
 if (compare_mem((word *)&np->thd.ip_head.ip.dip_address,(word *)&sur_ip.ip_address,2)==1)
  {ggg: 
   rlg=np->thd.ip_head.ip.ttl&0xff00;
   if (rlg==ICMP) goto icmp_pake;  //ping处理
   if (rlg==UDP)  goto udp_pake;   //udp包处理
   goto next_pake;
  }    //endif ip==
  else
   {if ((np->thd.ip_head.ip.dip_address[0]&0xff)==224) goto ggg;
   if ((np->thd.ip_head.ip.dip_address[0]==0xffff)&&
        (np->thd.ip_head.ip.dip_address[1]==0xffff))
      goto ggg;  //广播包
    goto next_pake;
    };
/////////ICMP包处理//////////////////////////////////////////////////////////////
icmp_pake:          
  if (np->thd.ip_head.pr.icmp.option!=ICMP_REQ) 
       goto next_pake;
   rlg=((np->thd.ip_head.ip.lg)>>8)-28; 
   if (rlg>200) goto next_pake;
   net_receive_dma(mbnry*256+46,(word *)(net_buff+23),rlg);
   np->thd.ip_head.pr.icmp.option=ICMP_ACK;
   np->thd.ip_head.pr.icmp.sum=0;
   np->thd.ip_head.ip.sum=0;           
   copy_mem((word *)&np->thd.ip_head.ip.sip_address,(word *)&np->thd.ip_head.ip.dip_address,2);
   copy_mem((word *)&sur_ip.ip_address,(word *)&np->thd.ip_head.ip.sip_address,2);   
   np->thd.ip_head.ip.ttl=ICMP|0x20;
   np->thd.ip_head.ip.flag=0;       
   copy_mem((word *)&np->hd.shd_address,(word *)&np->hd.dhd_address,3);
   sur_ip.hd_address[0]=0xbbaa;
   copy_mem((word *)&sur_ip.ip_address,(word *)&sur_ip.hd_address[1],2);   
   copy_mem((word *)&sur_ip.hd_address,(word *)&np->hd.shd_address,3);
   ////////////////IP包校验和的计算//////////////////////////////////////
   rtp=(word *)&np->thd;        
   np->thd.ip_head.ip.sum=~net_sum(rtp,9);
   rlg=(np->thd.ip_head.ip.lg>>8)-20;
   ////////////////ICMP包校验和的计算//////////////////////////////////////
   rtp=(word *)&np->thd.ip_head.pr.icmp;
   np->thd.ip_head.pr.icmp.sum=~net_sum(rtp,rlg/2-1);
   net_send_dma(0x4000,(word *)&np->hd.dhd_address,rlg+34);
   rlg=rlg+34;
   goto send_ack;
////////UDP包处理////////////////////////////////////////////////////////////
udp_pake:
   rlg=((np->thd.ip_head.ip.lg&0xff)<<8)+((np->thd.ip_head.ip.lg&0xff00)>>8)-28;
   if ((rlg<4)||(rlg>1008)) goto next_pake;
/*   
   if (np->thd.ip_head.pr.udp.dnumber==system.com_num) goto my_pake; //公共端口
   if (np->thd.ip_head.pr.udp.dnumber==system.t_num) goto my_pake; 
   #ifdef DS_DN
		if (np->thd.ip_head.pr.udp.dnumber==0x450d) goto my_pake; 
   #endif 
   if (np->thd.ip_head.pr.udp.dnumber==system.sev_num) goto my_pake; 
   if (np->thd.ip_head.pr.udp.dnumber==swap(swap(system.g_num)+set.number_off)) goto my_pake;//广播端口
   */
////////////命令数据////////////////////////////////////////////////////   
   net_receive_dma(mbnry*256+46,(word *)&command,12);
   if (command.flag1!=0x5aaa) goto next_pake;
   if (command.flag2!=0xa5aa) goto next_pake;
   if (rlg>512) rlg=512;
   net_receive_dma(mbnry*256+46+4,use_receive_buff,rlg-4); 
   rtp=use_receive_buff;
   for (tmp=0;tmp<rlg/2;tmp++)
    	*rtp++=(*rtp>>8)+(*rtp<<8);    
   	
   if ((use_receive_buff[2]==0x1006)&&(use_receive_buff[3]==0x0100))
     {system.net_command=FLAG_COMMAND_ACK;
        system.dnumber=np->thd.ip_head.pr.udp.dnumber;
        des_ip.ip_address[0]=swap(use_receive_buff[0]);
        des_ip.ip_address[1]=swap(use_receive_buff[1]);     
     }
   else
     if ((use_receive_buff[2]==0x1002)&&(use_receive_buff[3]==0x0100))
       {system.net_command=FLAG_COMMAND_ERASE;}
    else
      if ((use_receive_buff[2]==0x1004)&&(use_receive_buff[3]==0x0100))    
         system.net_up_new=1;
  
   goto next_pake;

///////发送响应包//////////////////////////////////////////////////////
send_ack:
    net_send_option(0x40,rlg);
//////检查缓冲区处理下一包/////////////////////////////////////////////
next_pake:
	 mcur=CPR&0xff;//CURR&0xff;  
	 mbnry=((np->hd.state[0]&0xff00)>>8)-1;
     if ((mbnry>0x7f)||(mbnry<0x4b))
        init_net();   
     else   
       BNRY=mbnry;
     if (mcur!=(mbnry+1))  goto next;
  
net_end: 
 mcur=CPR&0xff;//CURR&0xff;  
 mbnry=BNRY&0xff;  
 if (mbnry==mcur)
    init_net();
 if ((ISR&0x01)!=0) goto next;   

asm("	rsbx intm"); 
}                        
//////////////////////////////////////////////////
//      模块名称:void ini_net(void)
//      模块功能:初始化RTL8019,此函数由INI_5402调用
//      入口参数:无
//      返回参数:无
//      版本序号:v1.1
//      测试日期:2003.3.8
//////////////////////////////////////////////////
void init_net(void)
{word rlg;      
RESET=0;
NCR=0x21;       
for (rlg=0;rlg<0xff;rlg++);
page(0);

RBCR0=0;      
RBCR1=0;      
NDCR=0xe0;
NTCR=0xe2;    
NDCR=0xb9;//ca;//0xcf;
ISR=0xff;     
NRCR=0xcc;    
NTCR=0xe0;    
//local DMA
PSTART=0x4c;  
PSTOP=0x80;   
BNRY=0x4c;    
page(1);
CURR=0x4d;       
sur_ip.hd_address[0]=0xbbaa;
copy_mem((word *)&sur_ip.ip_address,(word *)&sur_ip.hd_address[1],2);
PAR0=sur_ip.hd_address[0];
PAR1=sur_ip.hd_address[0]>>8;
PAR2=sur_ip.hd_address[1];
PAR3=sur_ip.hd_address[1]>>8;
PAR4=sur_ip.hd_address[2];
PAR5=sur_ip.hd_address[2]>>8;
MAR0=0x00;    
MAR1=0x00;    
MAR2=0x00;    
MAR3=0x00;    
MAR4=0x00;    
MAR5=0x00;    
MAR6=0x00;    
MAR7=0x00;    
page(0);

NDCR=0x81;
NTCR=0xa1;
NRCR=0x4e;
ISR=0xff;      
PNIMR=0x81;
NCR=0x22; 

}     
/////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -