mirror of
https://github.com/zeek/zeek.git
synced 2025-10-04 15:48:19 +00:00
Porting Matti's branch to git.
No changes.
This commit is contained in:
parent
5d41794034
commit
cb64bb6874
14 changed files with 795 additions and 154 deletions
|
@ -86,6 +86,14 @@ int udp_checksum(const struct ip* ip, const struct udphdr* up, int len)
|
|||
#ifdef BROv6
|
||||
int udp6_checksum(const struct ip6_hdr* ip6, const struct udphdr* up, int len)
|
||||
{
|
||||
/**From RFC for udp4 (same for udp6, except for different pseudoheader which is same as for icmp6)
|
||||
Computed as the 16-bit one's complement of the one's complement sum of a
|
||||
pseudo header of information from the IP header, the UDP header, and the
|
||||
data, padded as needed with zero bytes at the end to make a multiple of
|
||||
two bytes. If the checksum is cleared to zero, then checksuming is
|
||||
disabled. If the computed checksum is zero, then this field must be set
|
||||
to 0xFFFF.
|
||||
**/
|
||||
uint32 sum;
|
||||
|
||||
if ( len % 2 == 1 )
|
||||
|
@ -97,19 +105,61 @@ int udp6_checksum(const struct ip6_hdr* ip6, const struct udphdr* up, int len)
|
|||
sum = ones_complement_checksum((void*) ip6->ip6_src.s6_addr, 16, sum);
|
||||
sum = ones_complement_checksum((void*) ip6->ip6_dst.s6_addr, 16, sum);
|
||||
|
||||
sum = ones_complement_checksum((void*) &len, 4, sum);
|
||||
uint32 l = htonl(len);
|
||||
sum = ones_complement_checksum((void*) &l, 4, sum);
|
||||
uint32 addl_pseudo = htons(IPPROTO_UDP);
|
||||
sum = ones_complement_checksum((void*) &addl_pseudo, 4, sum);
|
||||
sum = ones_complement_checksum((void*) up, len, sum);
|
||||
|
||||
//printf("checksum, calculated for UDP6: %d\n",sum);
|
||||
|
||||
return sum;
|
||||
}
|
||||
|
||||
|
||||
int icmp6_checksum(const struct icmp* icmpp, const struct ip6_hdr* ip6, int len)
|
||||
{
|
||||
/**From RFC
|
||||
Checksum that covers the ICMPv6 message. This field contains the 16-bit one's
|
||||
complement of the one's complement sum of the entire ICMPv6 message starting
|
||||
with the ICMPv6 message type field, prepended with a pseudo-header of IPv6
|
||||
header fields.
|
||||
**/
|
||||
uint32 sum;
|
||||
|
||||
if ( len % 2 == 1 )
|
||||
// Add in pad byte.
|
||||
sum += htons(((const u_char*) icmpp)[len - 1] << 8);
|
||||
else
|
||||
sum = 0;
|
||||
|
||||
//pseudoheader as in udp6 above
|
||||
sum = ones_complement_checksum((void*) ip6->ip6_src.s6_addr, 16, sum);
|
||||
sum = ones_complement_checksum((void*) ip6->ip6_dst.s6_addr, 16, sum);
|
||||
uint32 l = htonl(len);
|
||||
sum = ones_complement_checksum((void*) &l, 4, sum);
|
||||
uint32 addl_pseudo = htons(IPPROTO_ICMPV6);
|
||||
sum = ones_complement_checksum((void*) &addl_pseudo, 4, sum);
|
||||
//pseudoheader complete
|
||||
|
||||
sum = ones_complement_checksum((void*) icmpp, len, sum);
|
||||
|
||||
//printf("checksum, calculated for ICMP6: %d\n",sum);
|
||||
|
||||
return sum;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
int icmp_checksum(const struct icmp* icmpp, int len)
|
||||
{
|
||||
/**From RFC
|
||||
Checksum that covers the ICMP message. This is the 16-bit one's
|
||||
complement of the one's complement sum of the ICMP message starting
|
||||
with the Type field. The checksum field should be cleared to zero
|
||||
before generating the checksum.
|
||||
**/
|
||||
uint32 sum;
|
||||
|
||||
if ( len % 2 == 1 )
|
||||
// Add in pad byte.
|
||||
sum = htons(((const u_char*) icmpp)[len - 1] << 8);
|
||||
|
@ -118,10 +168,15 @@ int icmp_checksum(const struct icmp* icmpp, int len)
|
|||
|
||||
sum = ones_complement_checksum((void*) icmpp, len, sum);
|
||||
|
||||
//printf("checksum, calculated for ICMP4: %d\n",sum);
|
||||
|
||||
return sum;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#define CLASS_A 0x00000000
|
||||
#define CLASS_B 0x80000000
|
||||
#define CLASS_C 0xc0000000
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue