csum function fixes. Improves alert accuracy. FPs on invalid-csums decoder rules fixed

remotes/origin/HEAD
Anoop Saldanha 14 years ago committed by Victor Julien
parent 46e1145cff
commit 98a8234e0a

@ -339,6 +339,7 @@ static inline uint16_t ICMPV4CalculateChecksum(uint16_t *pkt, uint16_t tlen)
}
csum = (csum >> 16) + (csum & 0x0000FFFF);
csum += (csum >> 16);
return (uint16_t) ~csum;
}

@ -247,6 +247,7 @@ static inline uint16_t ICMPV6CalculateChecksum(uint16_t *shdr, uint16_t *pkt,
}
csum = (csum >> 16) + (csum & 0x0000FFFF);
csum += (csum >> 16);
return (uint16_t) ~csum;
}

@ -212,39 +212,40 @@ static inline uint16_t IPV4CalculateChecksum(uint16_t *pkt, uint16_t hlen)
if (hlen == 0) {
;
}
if (hlen == 4)
} else if (hlen == 4) {
csum += pkt[0] + pkt[1];
else if (hlen == 8)
} else if (hlen == 8) {
csum += pkt[0] + pkt[1] + pkt[2] + pkt[3];
else if (hlen == 12)
} else if (hlen == 12) {
csum += pkt[0] + pkt[1] + pkt[2] + pkt[3] + pkt[4] + pkt[5];
else if (hlen == 16)
} else if (hlen == 16) {
csum += pkt[0] + pkt[1] + pkt[2] + pkt[3] + pkt[4] + pkt[5] + pkt[6] +
pkt[7];
else if (hlen == 20)
} else if (hlen == 20) {
csum += pkt[0] + pkt[1] + pkt[2] + pkt[3] + pkt[4] + pkt[5] + pkt[6] +
pkt[7] + pkt[8] + pkt[9];
else if (hlen == 24)
} else if (hlen == 24) {
csum += pkt[0] + pkt[1] + pkt[2] + pkt[3] + pkt[4] + pkt[5] + pkt[6] +
pkt[7] + pkt[8] + pkt[9] + pkt[10] + pkt[11];
else if (hlen == 28)
} else if (hlen == 28) {
csum += pkt[0] + pkt[1] + pkt[2] + pkt[3] + pkt[4] + pkt[5] + pkt[6] +
pkt[7] + pkt[8] + pkt[9] + pkt[10] + pkt[11] + pkt[12] + pkt[13];
else if (hlen == 32)
} else if (hlen == 32) {
csum += pkt[0] + pkt[1] + pkt[2] + pkt[3] + pkt[4] + pkt[5] + pkt[6] +
pkt[7] + pkt[8] + pkt[9] + pkt[10] + pkt[11] + pkt[12] + pkt[13] +
pkt[14] + pkt[15];
if (hlen == 36)
} else if (hlen == 36) {
csum += pkt[0] + pkt[1] + pkt[2] + pkt[3] + pkt[4] + pkt[5] + pkt[6] +
pkt[7] + pkt[8] + pkt[9] + pkt[10] + pkt[11] + pkt[12] + pkt[13] +
pkt[14] + pkt[15] + pkt[16] + pkt[17];
if (hlen == 40)
} else if (hlen == 40) {
csum += pkt[0] + pkt[1] + pkt[2] + pkt[3] + pkt[4] + pkt[5] + pkt[6] +
pkt[7] + pkt[8] + pkt[9] + pkt[10] + pkt[11] + pkt[12] + pkt[13] +
pkt[14] + pkt[15] + pkt[16] + pkt[17] + pkt[18] + pkt[19];
}
csum = (csum >> 16) + (csum & 0x0000FFFF);
csum += (csum >> 16);
return (uint16_t) ~csum;
}

@ -182,7 +182,7 @@ static inline uint16_t TCPV6CalculateChecksum(uint16_t *, uint16_t *, uint16_t);
* \retval csum Checksum for the TCP packet
*/
static inline uint16_t TCPCalculateChecksum(uint16_t *shdr, uint16_t *pkt,
uint16_t tlen)
uint16_t tlen)
{
uint16_t pad = 0;
uint32_t csum = shdr[0];

@ -72,7 +72,7 @@ static inline uint16_t UDPV6CalculateChecksum(uint16_t *, uint16_t *, uint16_t);
* \retval csum Checksum for the UDP packet
*/
static inline uint16_t UDPV4CalculateChecksum(uint16_t *shdr, uint16_t *pkt,
uint16_t tlen)
uint16_t tlen)
{
uint16_t pad = 0;
uint32_t csum = shdr[0];
@ -118,7 +118,11 @@ static inline uint16_t UDPV4CalculateChecksum(uint16_t *shdr, uint16_t *pkt,
csum = (csum >> 16) + (csum & 0x0000FFFF);
csum += (csum >> 16);
return (uint16_t)~csum;
uint16_t csum_u16 = (uint16_t)~csum;
if (csum_u16 == 0)
return 0xFFFF;
else
return csum_u16;
}
/**
@ -132,7 +136,7 @@ static inline uint16_t UDPV4CalculateChecksum(uint16_t *shdr, uint16_t *pkt,
* \retval csum Checksum for the UDP packet
*/
static inline uint16_t UDPV6CalculateChecksum(uint16_t *shdr, uint16_t *pkt,
uint16_t tlen)
uint16_t tlen)
{
uint16_t pad = 0;
uint32_t csum = shdr[0];
@ -180,6 +184,12 @@ static inline uint16_t UDPV6CalculateChecksum(uint16_t *shdr, uint16_t *pkt,
csum = (csum >> 16) + (csum & 0x0000FFFF);
csum += (csum >> 16);
uint16_t csum_u16 = (uint16_t)~csum;
if (csum_u16 == 0)
return 0xFFFF;
else
return csum_u16;
return (uint16_t)~csum;
}

@ -239,7 +239,7 @@ int DetectIPV4CsumMatch(ThreadVars *t, DetectEngineThreadCtx *det_ctx,
if (p->ip4vars.comp_csum == -1)
p->ip4vars.comp_csum = IPV4CalculateChecksum((uint16_t *)p->ip4h,
IPV4_GET_RAW_HLEN(p->ip4h));
IPV4_GET_HLEN(p));
if (p->ip4vars.comp_csum == p->ip4h->ip_csum && cd->valid == 1)
return 1;

Loading…
Cancel
Save