From: Yu Watanabe Date: Tue, 20 Apr 2021 01:49:21 +0000 (+0900) Subject: in-addr-util: introduce 'struct in_addr_prefix' and hash ops for it X-Git-Tag: v249-rc1~372^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=eccdc687717568303de1448f20863b20f7315cb4;p=thirdparty%2Fsystemd.git in-addr-util: introduce 'struct in_addr_prefix' and hash ops for it --- diff --git a/src/basic/in-addr-util.c b/src/basic/in-addr-util.c index 13cdb9e5a54..9d7e51f8fd7 100644 --- a/src/basic/in-addr-util.c +++ b/src/basic/in-addr-util.c @@ -825,6 +825,35 @@ static int in_addr_data_compare_func(const struct in_addr_data *x, const struct DEFINE_HASH_OPS(in_addr_data_hash_ops, struct in_addr_data, in_addr_data_hash_func, in_addr_data_compare_func); +static void in_addr_prefix_hash_func(const struct in_addr_prefix *a, struct siphash *state) { + assert(a); + assert(state); + + siphash24_compress(&a->family, sizeof(a->family), state); + siphash24_compress(&a->prefixlen, sizeof(a->prefixlen), state); + siphash24_compress(&a->address, FAMILY_ADDRESS_SIZE(a->family), state); +} + +static int in_addr_prefix_compare_func(const struct in_addr_prefix *x, const struct in_addr_prefix *y) { + int r; + + assert(x); + assert(y); + + r = CMP(x->family, y->family); + if (r != 0) + return r; + + r = CMP(x->prefixlen, y->prefixlen); + if (r != 0) + return r; + + return memcmp(&x->address, &y->address, FAMILY_ADDRESS_SIZE(x->family)); +} + +DEFINE_HASH_OPS(in_addr_prefix_hash_ops, struct in_addr_prefix, in_addr_prefix_hash_func, in_addr_prefix_compare_func); +DEFINE_HASH_OPS_WITH_KEY_DESTRUCTOR(in_addr_prefix_hash_ops_free, struct in_addr_prefix, in_addr_prefix_hash_func, in_addr_prefix_compare_func, free); + void in6_addr_hash_func(const struct in6_addr *addr, struct siphash *state) { assert(addr); assert(state); diff --git a/src/basic/in-addr-util.h b/src/basic/in-addr-util.h index 519ee53b3a4..d5caf662ab5 100644 --- a/src/basic/in-addr-util.h +++ b/src/basic/in-addr-util.h @@ -20,6 +20,12 @@ struct in_addr_data { union in_addr_union address; }; +struct in_addr_prefix { + int family; + uint8_t prefixlen; + union in_addr_union address; +}; + bool in4_addr_is_null(const struct in_addr *a); static inline bool in4_addr_is_set(const struct in_addr *a) { return !in4_addr_is_null(a); @@ -111,4 +117,6 @@ void in6_addr_hash_func(const struct in6_addr *addr, struct siphash *state); int in6_addr_compare_func(const struct in6_addr *a, const struct in6_addr *b); extern const struct hash_ops in_addr_data_hash_ops; +extern const struct hash_ops in_addr_prefix_hash_ops; +extern const struct hash_ops in_addr_prefix_hash_ops_free; extern const struct hash_ops in6_addr_hash_ops;