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

📄 ip.c.bak

📁 一种操作系统源码核
💻 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 + -