]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
basic: introduce in_addr_data_hash_ops
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 31 Jul 2018 06:45:38 +0000 (15:45 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 31 Jul 2018 06:45:38 +0000 (15:45 +0900)
src/basic/in-addr-util.c
src/basic/in-addr-util.h

index aed7601d50fbd0d44f2f77cc35ec1fad81e18223..b9d3572baf5ecb42011fe1dcb78612cf2b584b0f 100644 (file)
@@ -571,3 +571,34 @@ int in_addr_prefix_from_string_auto(
         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,
+};
index 956c00a850a25dee93c704cbb4ab7fcde78e0906..e4be30dc0d3af57517cee12e108762db56845653 100644 (file)
@@ -5,6 +5,7 @@
 #include <stddef.h>
 #include <sys/socket.h>
 
+#include "hash-funcs.h"
 #include "macro.h"
 #include "util.h"
 
@@ -53,3 +54,7 @@ static inline size_t FAMILY_ADDRESS_SIZE(int family) {
 }
 
 #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;