Bug #851 ยป defrag-hash.c.diff
suricata-1.4.3/src/defrag-hash.c Sat Jul 6 14:57:57 2013 | ||
---|---|---|
typedef struct DefragHashKey4_ {
|
||
union {
|
||
struct {
|
||
uint32_t src, dst;
|
||
uint32_t id;
|
||
};
|
||
uint32_t dhk4src, dhk4dst;
|
||
uint32_t dhk4id;
|
||
} dhk4address;
|
||
uint32_t u32[3];
|
||
};
|
||
} DefragHashKey4;
|
||
... | ... | |
typedef struct DefragHashKey6_ {
|
||
union {
|
||
struct {
|
||
uint32_t src[4], dst[4];
|
||
uint32_t id;
|
||
};
|
||
uint32_t dhk6src[4], dhk6dst[4];
|
||
uint32_t dhk6id;
|
||
} dhk6address;
|
||
uint32_t u32[9];
|
||
};
|
||
} DefragHashKey6;
|
||
... | ... | |
uint32_t key;
|
||
if (p->ip4h != NULL) {
|
||
DefragHashKey4 dhk;
|
||
DefragHashKey4 dhk4;
|
||
if (p->src.addr_data32[0] > p->dst.addr_data32[0]) {
|
||
dhk.src = p->src.addr_data32[0];
|
||
dhk.dst = p->dst.addr_data32[0];
|
||
dhk4.dhk4address.dhk4src = (uint32_t) p->src.addr_data32[0];
|
||
dhk4.dhk4address.dhk4dst = (uint32_t) p->dst.addr_data32[0];
|
||
} else {
|
||
dhk.src = p->dst.addr_data32[0];
|
||
dhk.dst = p->src.addr_data32[0];
|
||
dhk4.dhk4address.dhk4src = p->dst.addr_data32[0];
|
||
dhk4.dhk4address.dhk4dst = p->src.addr_data32[0];
|
||
}
|
||
dhk.id = (uint32_t)IPV4_GET_IPID(p);
|
||
dhk4.dhk4address.dhk4id = (uint32_t)IPV4_GET_IPID(p);
|
||
uint32_t hash = hashword(dhk.u32, 3, defrag_config.hash_rand);
|
||
uint32_t hash = hashword(dhk4.u32, 3, defrag_config.hash_rand);
|
||
key = hash % defrag_config.hash_size;
|
||
} else if (p->ip6h != NULL) {
|
||
DefragHashKey6 dhk;
|
||
DefragHashKey6 dhk6;
|
||
if (DefragHashRawAddressIPv6GtU32(p->src.addr_data32, p->dst.addr_data32)) {
|
||
dhk.src[0] = p->src.addr_data32[0];
|
||
dhk.src[1] = p->src.addr_data32[1];
|
||
dhk.src[2] = p->src.addr_data32[2];
|
||
dhk.src[3] = p->src.addr_data32[3];
|
||
dhk.dst[0] = p->dst.addr_data32[0];
|
||
dhk.dst[1] = p->dst.addr_data32[1];
|
||
dhk.dst[2] = p->dst.addr_data32[2];
|
||
dhk.dst[3] = p->dst.addr_data32[3];
|
||
dhk6.dhk6address.dhk6src[0] = p->src.addr_data32[0];
|
||
dhk6.dhk6address.dhk6src[1] = p->src.addr_data32[1];
|
||
dhk6.dhk6address.dhk6src[2] = p->src.addr_data32[2];
|
||
dhk6.dhk6address.dhk6src[3] = p->src.addr_data32[3];
|
||
dhk6.dhk6address.dhk6dst[0] = p->dst.addr_data32[0];
|
||
dhk6.dhk6address.dhk6dst[1] = p->dst.addr_data32[1];
|
||
dhk6.dhk6address.dhk6dst[2] = p->dst.addr_data32[2];
|
||
dhk6.dhk6address.dhk6dst[3] = p->dst.addr_data32[3];
|
||
} else {
|
||
dhk.src[0] = p->dst.addr_data32[0];
|
||
dhk.src[1] = p->dst.addr_data32[1];
|
||
dhk.src[2] = p->dst.addr_data32[2];
|
||
dhk.src[3] = p->dst.addr_data32[3];
|
||
dhk.dst[0] = p->src.addr_data32[0];
|
||
dhk.dst[1] = p->src.addr_data32[1];
|
||
dhk.dst[2] = p->src.addr_data32[2];
|
||
dhk.dst[3] = p->src.addr_data32[3];
|
||
dhk6.dhk6address.dhk6src[0] = p->dst.addr_data32[0];
|
||
dhk6.dhk6address.dhk6src[1] = p->dst.addr_data32[1];
|
||
dhk6.dhk6address.dhk6src[2] = p->dst.addr_data32[2];
|
||
dhk6.dhk6address.dhk6src[3] = p->dst.addr_data32[3];
|
||
dhk6.dhk6address.dhk6dst[0] = p->src.addr_data32[0];
|
||
dhk6.dhk6address.dhk6dst[1] = p->src.addr_data32[1];
|
||
dhk6.dhk6address.dhk6dst[2] = p->src.addr_data32[2];
|
||
dhk6.dhk6address.dhk6dst[3] = p->src.addr_data32[3];
|
||
}
|
||
dhk.id = IPV6_EXTHDR_GET_FH_ID(p);
|
||
dhk6.dhk6address.dhk6id = IPV6_EXTHDR_GET_FH_ID(p);
|
||
uint32_t hash = hashword(dhk.u32, 9, defrag_config.hash_rand);
|
||
uint32_t hash = hashword(dhk6.u32, 9, defrag_config.hash_rand);
|
||
key = hash % defrag_config.hash_size;
|
||
} else
|
||
key = 0;
|