Index: sys/netpfil/ipfw/ip_fw_table_algo.c =================================================================== --- sys/netpfil/ipfw/ip_fw_table_algo.c +++ sys/netpfil/ipfw/ip_fw_table_algo.c @@ -44,6 +44,7 @@ #include #include #include +#include #include #include #include @@ -3145,12 +3146,18 @@ return (0); } +#define UPDATE_CRC(c, x) (c) = calculate_crc32c((c), (const char*)&(x), sizeof(x)) + static __inline uint32_t hash_flow4(struct fhashentry4 *f, int hsize) { - uint32_t i; + uint32_t i = ~0u; - i = (f->dip.s_addr) ^ (f->sip.s_addr) ^ (f->e.dport) ^ (f->e.sport); + UPDATE_CRC(i, f->sip); + UPDATE_CRC(i, f->dip); + UPDATE_CRC(i, f->e.sport); + UPDATE_CRC(i, f->e.dport); + UPDATE_CRC(i, f->e.proto); return (i % (hsize - 1)); } @@ -3158,17 +3165,19 @@ static __inline uint32_t hash_flow6(struct fhashentry6 *f, int hsize) { - uint32_t i; + uint32_t i = ~0u; - i = (f->dip6.__u6_addr.__u6_addr32[2]) ^ - (f->dip6.__u6_addr.__u6_addr32[3]) ^ - (f->sip6.__u6_addr.__u6_addr32[2]) ^ - (f->sip6.__u6_addr.__u6_addr32[3]) ^ - (f->e.dport) ^ (f->e.sport); + UPDATE_CRC(i, f->sip6); + UPDATE_CRC(i, f->dip6); + UPDATE_CRC(i, f->e.sport); + UPDATE_CRC(i, f->e.dport); + UPDATE_CRC(i, f->e.proto); return (i % (hsize - 1)); } +#undef UPDATE_CRC + static uint32_t hash_flow_ent(struct fhashentry *ent, uint32_t size) {