Date: Mon, 15 May 2017 21:02:58 +0000 From: bugzilla-noreply@freebsd.org To: freebsd-bugs@FreeBSD.org Subject: [Bug 217618] Enhance hash function in ip_fw_table_algo.c for flow:hash Message-ID: <bug-217618-8-Qqxtbq40jg@https.bugs.freebsd.org/bugzilla/> In-Reply-To: <bug-217618-8@https.bugs.freebsd.org/bugzilla/> References: <bug-217618-8@https.bugs.freebsd.org/bugzilla/>
next in thread | previous in thread | raw e-mail | index | archive | help
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D217618 --- Comment #3 from lutz@donnerhacke.de --- The patch is wrong. It does include too much fields from the record, especi= ally nonstatic ones (e.next) or unknown ones (e.value). The following patch runs ins a production environment. --- sys/netpfil/ipfw/ip_fw_table_algo.c (revision 314807) +++ sys/netpfil/ipfw/ip_fw_table_algo.c (working copy) @@ -44,6 +44,7 @@ #include <sys/malloc.h> #include <sys/kernel.h> #include <sys/lock.h> +#include <sys/libkern.h> #include <sys/rwlock.h> #include <sys/rmlock.h> #include <sys/socket.h> @@ -3158,30 +3171,35 @@ return (0); } +#define UPDATE_CRC(c, x) c =3D 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 =3D ~0u; + + 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); - i =3D (f->dip.s_addr) ^ (f->sip.s_addr) ^ (f->e.dport) ^ (f->e.spor= t); - - return (i % (hsize - 1)); + return ((~i) % (hsize - 1)); } static __inline uint32_t hash_flow6(struct fhashentry6 *f, int hsize) { - uint32_t i; + uint32_t i =3D ~0u; + + 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); - i =3D (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); - - return (i % (hsize - 1)); + return ((~i) % (hsize - 1)); } - +#undef UPDATE_CRC static uint32_t hash_flow_ent(struct fhashentry *ent, uint32_t size) { --=20 You are receiving this mail because: You are the assignee for the bug.=
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?bug-217618-8-Qqxtbq40jg>