📄 ip.c.bak
字号:
#include "p_tcpip.h"
static INT8U iIpackId; //0x6bae
struct icmp_packet{
INT8U ep_src[4];
INT8U ep_dst[4];
INT8U ep_type[2];
INT8U ip_version;
INT8U ip_tos;
INT16U ip_len;
INT16U ip_id;
INT16U ip_fragoff;
INT8U ip_ttl;
INT8U ip_proto;
INT16 ip_checksum;
INT32U ip_src;
INT32U ip_dst;
INT8U ic_type;
INT8U ic_code;
INT8U ic_checksum[2];
INT16U ic_data[24];
};
static INT32U pIp_CkSum;//68f5
static struct icmp_packet pIc;//68fa
USHORT CheckSum(PXCHAR pip,UCHAR ilen)
{
LONG len ;
INT8U i ;
i=0;
len=0;
while(i<ilen)
{
len+=(ULONG)(*((PXSHORT)(pip+i*2)));
i++;
}
len=(len>>0x10)+(len&0xffff);
len+=len>>16;
return (~((USHORT)(len)));
}
void IpCheckSumLargePacket(PUCHAR ptr,ULONG head_cksum)
{
DLONG len ;
DSHORT slen ;
struct ip *pip=(struct ip *)ptr;
pip->id=iIpackId;
len=(ULONG)(pip->len));
len+=(ULONG)(iIpackId);
iIpackId++;
len=len+head_cksum;
len=(len>>0x10)+(len&0xffff);
len+=len>>16;
slen=~((USHORT)(len));
pip->cksum[0]=P_HIBYTE(slen);
pip->cksum[1]=P_LOBYTE(slen);
}
void IpCheckSum(PXCHAR ptr,ULONG head_cksum)
{
DLONG len ;
DSHORT slen ;
struct ip *pip=(struct ip *)ptr;
pip->id=iIpackId;
len=((ULONG)(pip->len));
len+=(ULONG)(iIpackId);
iIpackId++;
len=len+head_cksum;
len=(len>>0x10)+(len&0xffff);
len+=len>>16;
slen=~((USHORT)(len));
pip->cksum[0]=P_HIBYTE(slen);
pip->cksum[1]=P_LOBYTE(slen);
}
ULONG IpModifyCheckSum(PXCHAR pDstIp,ULONG head_cksum)
{
DLONG len ;
len=(ULONG)(*pDstIp);
len+=(ULONG)(*(pDstIp+2));
len=len<<8;
len+=*(pDstIp+1);
len+=*(pDstIp+3);
len+=head_cksum;
return len;
}
USHORT TcpCheckSum(PXCHAR ptr,UCHAR iLen)
{
DLONG len ;
INT8U i;
PXSHORT psrc;
struct tcp_packet *ptcp=(struct tcp_packet *)ptr;
psrc=pip->ip_src;
len=iLen+IPT_TCP;
len+=(DLONG)(*psrc);
len+=(DLONG)(*(psrc+2));
len+=(DLONG)(*(psrc+4));
len+=(DLONG)(*(psrc+6));//sum αIP header
if(!iLen)
{
*(ptr+IPMLEN+EP_HLEN+iLen)=0;
iLen++;
}
iLen>>=1;
psrc=(PXSHORT)(ptr+IPMLEN+EP_HLEN);
while(i<iLen)
{
len+=(DLONG)(*(psrc+i*2));
i++;
}
len=(len>>16)+(len&0xffff);
len+=len>>16;
return ~(USHORT)(len);
}
ULONG IpPrepareData(PXCHAR ptr,UCHAR iProtocol)
{
DLONG len;
INT8U i;// _at_ 0x5E;
PXSHORT psrc;
struct tcp_packet *ptcp=(struct tcp_packet *)ptr;
p_memcpy_x2x(ptcp->ep_src,Local_pMacAddress,EP_ALEN); //eh_src
ptcp->ep_type[0]=0x08;
ptcp->ep_type[1]=0; //eh_type=0800
p_memset_x(&(ptcp->ip_version),0,IPMLEN); // ip header init to 0
ptcp->ip_version=0x45; //ip version
ptcp->ip_ttl=IP_INIT_TTL; //ip_ttl
p_memcpy_x2x(ptcp->ip_src,Local_pIPAddress,IP_ALEN);//ip_src
ptcp->ip_tos=0; //ip_tos
ptcp->ip_proto=iProtocol; //ip_proto
psrc=ptr+EP_HLEN;
len=0;
i=0;
do
{
len+=(DLONG)(*(psrc+i*2));
i++;
} while(i<(IPMLEN/2));
if (iProtocol==IPT_UDP)
{
ptcp->udp->len[0]=0;
ptcp->udp->cksum=0;
ptcp->udp->cksum[1]=0;
}
return len; //return ip header checksum
}
void IcmpInitialize()
{
DLONG iSum;
iSum=IpPrepareData(1,&pIc);
pIp_CkSum=iSum;
}
void IcmpRun()
{
DLONG head_cksum;
INT8U len ;
INT8U type ;
DSHORT cksum ;
type=*(Adapter_pRcvPacket);
if (type != ICT_ECHO_REQ) //icmp packet type is not echo request
{
if(type!=ICT_REDIRECT) return;
// DebugVal(0x1029);
return;
}
len=Adapter_iRcvLen-4;
if(len>0x24) return; //icmp data size>36
p_memcpy_x2x(&pIc,pRemoteMacAddress,HW_ALEN);
p_memcpy_x2x(&pIc.ip_dst,pRemoteIPAddress,IP_ALEN); //pIc+0x1E
pIc.ip_len=Adapter_iRcvLen+IP_HLEN;//ip_len=ReceiveLen+20
head_cksum=pIp_CkSum;
head_cksum=IpModifyCheckSum(head_cksum,pRemoteIPAddress);
IpCheckSum(&(pIc.ep_data),head_cksum);
pIc.ic_type=0;
pIc.ic_code=0;
if(len)
p_memcpy_x2x(&(pIc.ic_data),Adapter_pRcvPacket+0x04,len);//receive ic_data to IC_Send_id
pIc.ic_data[Adapter_iRcvLen-4]=0;
pIc.ic_cksum=0;
ic_checksum[1]=0;
cksum=CheckSum(&(pIc.ic_type),((USHORT)Adapter_iRcvLen+1)/2));
pIc.ic_cksum=P_HIBYTE(cksum);
ic_checksum[1]=P_LOBYTE(cksum);
Ne2000Send(pIc,Adapter_iRcvLen+0x22);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -