From: Yu Watanabe Date: Mon, 9 Sep 2019 15:17:28 +0000 (+0900) Subject: network: take more route information into hash func X-Git-Tag: v244-rc1~283^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c077a205e71cb4c0c837c69f28b001553b9be3f9;p=thirdparty%2Fsystemd.git network: take more route information into hash func --- diff --git a/src/network/networkd-dhcp4.c b/src/network/networkd-dhcp4.c index c5644f844b8..d9951abe247 100644 --- a/src/network/networkd-dhcp4.c +++ b/src/network/networkd-dhcp4.c @@ -181,7 +181,7 @@ static int link_set_dhcp_routes(Link *link) { * the addresses now, let's not configure the routes either. */ return 0; - r = set_ensure_allocated(&link->dhcp_routes, &route_full_hash_ops); + r = set_ensure_allocated(&link->dhcp_routes, &route_hash_ops); if (r < 0) return log_oom(); diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c index c95737e7abd..b6da560afe5 100644 --- a/src/network/networkd-route.c +++ b/src/network/networkd-route.c @@ -154,68 +154,6 @@ static void route_hash_func(const Route *route, struct siphash *state) { siphash24_compress(&route->family, sizeof(route->family), state); - switch (route->family) { - case AF_INET: - case AF_INET6: - /* Equality of routes are given by the 4-touple - (dst_prefix,dst_prefixlen,tos,priority,table) */ - siphash24_compress(&route->dst, FAMILY_ADDRESS_SIZE(route->family), state); - siphash24_compress(&route->dst_prefixlen, sizeof(route->dst_prefixlen), state); - siphash24_compress(&route->tos, sizeof(route->tos), state); - siphash24_compress(&route->priority, sizeof(route->priority), state); - siphash24_compress(&route->table, sizeof(route->table), state); - - break; - default: - /* treat any other address family as AF_UNSPEC */ - break; - } -} - -static int route_compare_func(const Route *a, const Route *b) { - int r; - - r = CMP(a->family, b->family); - if (r != 0) - return r; - - switch (a->family) { - case AF_INET: - case AF_INET6: - r = CMP(a->dst_prefixlen, b->dst_prefixlen); - if (r != 0) - return r; - - r = CMP(a->tos, b->tos); - if (r != 0) - return r; - - r = CMP(a->priority, b->priority); - if (r != 0) - return r; - - r = CMP(a->table, b->table); - if (r != 0) - return r; - - r = memcmp(&a->dst, &b->dst, FAMILY_ADDRESS_SIZE(a->family)); - if (r != 0) - return r; - - return memcmp(&a->gw, &b->gw, FAMILY_ADDRESS_SIZE(a->family)); - default: - /* treat any other address family as AF_UNSPEC */ - return 0; - } -} - -DEFINE_PRIVATE_HASH_OPS(route_hash_ops, Route, route_hash_func, route_compare_func); - -static void route_full_hash_func(const Route *route, struct siphash *state) { - assert(route); - - siphash24_compress(&route->family, sizeof(route->family), state); - switch (route->family) { case AF_INET: case AF_INET6: @@ -240,7 +178,7 @@ static void route_full_hash_func(const Route *route, struct siphash *state) { } } -static int route_full_compare_func(const Route *a, const Route *b) { +static int route_compare_func(const Route *a, const Route *b) { int r; r = CMP(a->family, b->family); @@ -302,10 +240,10 @@ static int route_full_compare_func(const Route *a, const Route *b) { } DEFINE_HASH_OPS_WITH_KEY_DESTRUCTOR( - route_full_hash_ops, + route_hash_ops, Route, - route_full_hash_func, - route_full_compare_func, + route_hash_func, + route_compare_func, route_free); bool route_equal(Route *r1, Route *r2) { diff --git a/src/network/networkd-route.h b/src/network/networkd-route.h index a2468436254..89d54020db8 100644 --- a/src/network/networkd-route.h +++ b/src/network/networkd-route.h @@ -49,7 +49,7 @@ struct Route { LIST_FIELDS(Route, routes); }; -extern const struct hash_ops route_full_hash_ops; +extern const struct hash_ops route_hash_ops; int route_new(Route **ret); void route_free(Route *route);