From: Yu Watanabe Date: Tue, 31 Jul 2018 06:45:38 +0000 (+0900) Subject: basic: introduce in_addr_data_hash_ops X-Git-Tag: v240~876^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6c39e02609fe1df59dac6b821315431a9504e9fd;p=thirdparty%2Fsystemd.git basic: introduce in_addr_data_hash_ops --- diff --git a/src/basic/in-addr-util.c b/src/basic/in-addr-util.c index aed7601d50f..b9d3572baf5 100644 --- a/src/basic/in-addr-util.c +++ b/src/basic/in-addr-util.c @@ -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, +}; diff --git a/src/basic/in-addr-util.h b/src/basic/in-addr-util.h index 956c00a850a..e4be30dc0d3 100644 --- a/src/basic/in-addr-util.h +++ b/src/basic/in-addr-util.h @@ -5,6 +5,7 @@ #include #include +#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;