📄 ip._c
字号:
#include "main.h"
#include "rtl8019as.h"
#include "arp.h"
#include "ip.h"
#include "icmp.h"
#include "udp.h"
extern unsigned int ip_id;
extern unsigned char tempip_d3;
extern unsigned char tempip_d2;
extern unsigned char tempip_d1;
extern unsigned char tempip_d0;
unsigned char tempip_d3;
unsigned char tempip_d2;
unsigned char tempip_d1;
unsigned char tempip_d0;
unsigned char ip_packhandle(unsigned char *ipbegin)
{
unsigned char handleok=0;
unsigned char ipheadlen=0;
unsigned int totallen=0;
unsigned int ippackid=0;
unsigned int offset=0;
unsigned char protocol=0;
unsigned char sou_ip3=0;
unsigned char sou_ip2=0;
unsigned char sou_ip1=0;
unsigned char sou_ip0=0;
unsigned int ipcksum=0;
if((*(ipbegin+16)!=myip_3) || //匹配本地IP,不匹配者忽略
(*(ipbegin+17)!=myip_2) ||
(*(ipbegin+18)!=myip_1) ||
(*(ipbegin+19)!=myip_0)
)
{
return 0;
}
ipheadlen=((*ipbegin)&0x0F); //获取ip头长度
ipheadlen<<=2;
totallen=*(ipbegin+2); //获取总长度
totallen<<=8;
totallen|=*(ipbegin+3);
ippackid=*(ipbegin+4); //获取ip包id
ippackid<<=8;
ippackid|=*(ipbegin+5);
offset=*(ipbegin+6); //获取包偏移量
offset<<=8;
offset|=*(ipbegin+7);
protocol=*(ipbegin+9); //获取协议类型
sou_ip3=*(ipbegin+12); //获取源IP
sou_ip2=*(ipbegin+13);
sou_ip1=*(ipbegin+14);
sou_ip0=*(ipbegin+15);
tempip_d3=sou_ip3;
tempip_d2=sou_ip2;
tempip_d1=sou_ip1;
tempip_d0=sou_ip0;
switch(protocol)
{
case 1: //ICMP协议
if(icmp_packhandle(ipbegin+ipheadlen,totallen-ipheadlen))
{
ip_id++; //生成IP标识
*(ipbegin+4)=(ip_id>>8)&0xFF;
*(ipbegin+5)=(ip_id&0xFF);
*(ipbegin+10)=0;//求头部校验和
*(ipbegin+11)=0;
ipcksum=tsum((unsigned int *)ipbegin,ipheadlen); //校验和的求法
*(ipbegin+10)=ipcksum&0xFF;
*(ipbegin+11)=(ipcksum>>8)&0xFF;
*(ipbegin+12)=myip_3;//写入本地IP
*(ipbegin+13)=myip_2;
*(ipbegin+14)=myip_1;
*(ipbegin+15)=myip_0;
*(ipbegin+16)=sou_ip3;//写入远程IP
*(ipbegin+17)=sou_ip2;
*(ipbegin+18)=sou_ip1;
*(ipbegin+19)=sou_ip0;
break;
}
protocol=0;
break;
case 6: //TCP协议
break;
case 17: //UDP协议
if(udp_packhandle(ipbegin+ipheadlen,totallen-ipheadlen))
{
break;
}
protocol=0;
default:break;
}
return(protocol);
}
void ip_buildpack(unsigned char *ipsendbuffer,
unsigned int totallen,
unsigned int ipid,
unsigned char protocol,
unsigned char des_ip3,
unsigned char des_ip2,
unsigned char des_ip1,
unsigned char des_ip0
)
{
unsigned char i=0;
unsigned int sum=0;
*ipsendbuffer=0x45; //版本4,头部长20
*(ipsendbuffer+1)=0x00; //服务类型
*(ipsendbuffer+2)=totallen>>8;
*(ipsendbuffer+3)=(totallen&0xFF);
*(ipsendbuffer+4)=ipid>>8;
*(ipsendbuffer+5)=(ipid&0xFF);
*(ipsendbuffer+6)=0;
*(ipsendbuffer+7)=0;
*(ipsendbuffer+8)=128;
*(ipsendbuffer+9)=protocol;
*(ipsendbuffer+10)=0;
*(ipsendbuffer+11)=0;
*(ipsendbuffer+12)=myip_3;
*(ipsendbuffer+13)=myip_2;
*(ipsendbuffer+14)=myip_1;
*(ipsendbuffer+15)=myip_0;
*(ipsendbuffer+16)=des_ip3;
*(ipsendbuffer+17)=des_ip2;
*(ipsendbuffer+18)=des_ip1;
*(ipsendbuffer+19)=des_ip0;
sum=tsum((unsigned int *)ipsendbuffer,20); //校验和的求法
*(ipsendbuffer+10)=(sum&0xFF);
*(ipsendbuffer+11)=(sum>>8)&0xFF;
totallen-=20;
switch(protocol)
{
case 17:
udp_buildpack((ipsendbuffer+20),totallen,localport_udp_port00,remoteport_udp_port00);
udp_builddata((ipsendbuffer+20),&udpsendbuffer_ex[0],totallen-8);
break;
default:break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -