📄 pgpnetiphelper.c
字号:
/*____________________________________________________________________________
Copyright (C) 2002 PGP Corporation
All rights reserved.
$Id: pgpnetIpHelper.c,v 1.5 2002/08/06 20:10:27 dallen Exp $
____________________________________________________________________________*/
#if PGP_WIN32
#include <ndis.h>
#endif
#include "pgpBase.h"
#include "pgpNetIPdef.h"
PGPUInt32 GetIPAddressFromARP(void * block)
{
PARP_HEADER arp_header;
arp_header = (PARP_HEADER)block;
if ( (arp_header->arp_src_ip_addr == arp_header->arp_dst_ip_addr) &&
arp_header->arp_src_ip_addr != 0L)
return arp_header->arp_src_ip_addr;
else
return 0;
}
PGPBoolean BroadcastEthernetAddress(PGPByte* eth_dstAddress)
{
int i;
for (i = 0; i < 6; i ++)
{
if (eth_dstAddress[i] != 0xFF)
return FALSE;
}
return TRUE;
}
PGPBoolean EmptyEthernetAddress(PGPByte* eth_address)
{
int i;
for (i = 0; i < 6; i ++)
{
if (eth_address[i] != 0)
return FALSE;
}
return TRUE;
}
typedef enum
{
TYPE_IP,
TYPE_ICMP,
TYPE_UDP,
TYPE_TCP
} HeadType;
PGPUInt16 HeaderChecksum(PGPUInt16 *header, HeadType type)
{
PGPUInt16 i = 0;
PGPUInt32 chksum =0;
PGPUInt16 headerSize = 0;
switch (type)
{
case TYPE_IP:
headerSize = sizeof(IP_HEADER);
break;
case TYPE_ICMP:
{
PICMP_HEADER icmpHeader;
icmpHeader = (PICMP_HEADER)header;
if (icmpHeader->icmp_type == 3)
headerSize = sizeof(TYPE3_ICMP_HEADER);
else
headerSize = sizeof(ICMP_HEADER);
}
break;
case TYPE_UDP:
headerSize = sizeof(UDP_HEADER);
break;
case TYPE_TCP:
//headerSize = sizeof(TCP_HEADER);
break;
default:
return 0;
}
while(i++ < headerSize/2)
chksum += *header++;
chksum = (chksum >> 16) + (chksum & 0xffff);
chksum += (chksum >> 16);
chksum = ~chksum;
return (PGPUInt16)chksum;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -