return 0;
}
+
+void in_addr_data_hash_func(const void *p, struct siphash *state) {
+ const struct in_addr_data *a = p;
+
+ siphash24_compress(&a->family, sizeof(a->family), state);
+
+ if (a->family == AF_INET)
+ siphash24_compress(&a->address.in, sizeof(a->address.in), state);
+ else if (a->family == AF_INET6)
+ siphash24_compress(&a->address.in6, sizeof(a->address.in6), state);
+}
+
+int in_addr_data_compare_func(const void *a, const void *b) {
+ const struct in_addr_data *x = a, *y = b;
+
+ if (x->family != y->family)
+ return x->family - y->family;
+
+ if (x->family == AF_INET)
+ return memcmp(&x->address.in.s_addr, &y->address.in.s_addr, sizeof(struct in_addr));
+
+ if (x->family == AF_INET6)
+ return memcmp(&x->address.in6.s6_addr, &y->address.in6.s6_addr, sizeof(struct in6_addr));
+
+ return trivial_compare_func(a, b);
+}
+
+const struct hash_ops in_addr_data_hash_ops = {
+ .hash = in_addr_data_hash_func,
+ .compare = in_addr_data_compare_func,
+};
#include <stddef.h>
#include <sys/socket.h>
+#include "hash-funcs.h"
#include "macro.h"
#include "util.h"
}
#define IN_ADDR_NULL ((union in_addr_union) {})
+
+void in_addr_data_hash_func(const void *p, struct siphash *state);
+int in_addr_data_compare_func(const void *a, const void *b);
+extern const struct hash_ops in_addr_data_hash_ops;