📄 ls_net.c
字号:
#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 + -