On Fri, Dec 12, 2014 at 13:55, Ted Unangst wrote:
> This is pretty easy.
And essentially the same diff for ospf6d.
Index: lsupdate.c
===================================================================
RCS file: /cvs/src/usr.sbin/ospf6d/lsupdate.c,v
retrieving revision 1.10
diff -u -p -r1.10 lsupdate.c
--- lsupdate.c 25 Mar 2013 14:29:35 -0000 1.10
+++ lsupdate.c 12 Dec 2014 19:59:58 -0000
@@ -18,7 +18,6 @@
*/
#include <sys/types.h>
-#include <sys/hash.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip6.h>
@@ -27,6 +26,7 @@
#include <stdlib.h>
#include <string.h>
+#include <siphash.h>
#include "ospf6.h"
#include "ospf6d.h"
@@ -542,6 +542,8 @@ struct lsa_cache {
u_int32_t hashmask;
} lsacache;
+SIPHASH_KEY lsacachekey;
+
struct lsa_ref *lsa_cache_look(struct lsa_hdr *);
void
@@ -557,10 +559,17 @@ lsa_cache_init(u_int32_t hashsize)
for (i = 0; i < hs; i++)
LIST_INIT(&lsacache.hashtbl[i]);
+ arc4random_buf(&lsacachekey, sizeof(lsacachekey));
lsacache.hashmask = hs - 1;
}
+uint32_t
+lsa_hash_hdr(const struct lsa_hdr *hdr)
+{
+ return SipHash24(&lsacachekey, hdr, sizeof(*hdr));
+}
+
struct lsa_ref *
lsa_cache_add(void *data, u_int16_t len)
{
@@ -587,8 +596,7 @@ lsa_cache_add(void *data, u_int16_t len)
ref->len = len;
ref->refcnt = 1;
- head = &lsacache.hashtbl[hash32_buf(&ref->hdr, sizeof(ref->hdr),
- HASHINIT) & lsacache.hashmask];
+ head = &lsacache.hashtbl[lsa_hash_hdr(&ref->hdr) & lsacache.hashmask];
LIST_INSERT_HEAD(head, ref, entry);
return (ref);
}
@@ -626,8 +634,7 @@ lsa_cache_look(struct lsa_hdr *lsa_hdr)
struct lsa_cache_head *head;
struct lsa_ref *ref;
- head = &lsacache.hashtbl[hash32_buf(lsa_hdr, sizeof(*lsa_hdr),
- HASHINIT) & lsacache.hashmask];
+ head = &lsacache.hashtbl[lsa_hash_hdr(lsa_hdr) & lsacache.hashmask];
LIST_FOREACH(ref, head, entry) {
if (memcmp(&ref->hdr, lsa_hdr, sizeof(*lsa_hdr)) == 0)