diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2019-09-10 00:17:28 +0900 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2019-09-17 21:53:42 +0900 |
commit | c077a205e71cb4c0c837c69f28b001553b9be3f9 (patch) | |
tree | fa91fcd4e248d8602233477980d3e9e69218932e | |
parent | f1368755493c73734c830150f0c9cd1c928ac29c (diff) | |
download | systemd-c077a205e71cb4c0c837c69f28b001553b9be3f9.tar.gz |
network: take more route information into hash func
-rw-r--r-- | src/network/networkd-dhcp4.c | 2 | ||||
-rw-r--r-- | src/network/networkd-route.c | 70 | ||||
-rw-r--r-- | src/network/networkd-route.h | 2 |
3 files changed, 6 insertions, 68 deletions
diff --git a/src/network/networkd-dhcp4.c b/src/network/networkd-dhcp4.c index c5644f844b..d9951abe24 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 c95737e7ab..b6da560afe 100644 --- a/src/network/networkd-route.c +++ b/src/network/networkd-route.c @@ -157,68 +157,6 @@ static void route_hash_func(const Route *route, struct siphash *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: siphash24_compress(&route->gw, FAMILY_ADDRESS_SIZE(route->family), state); siphash24_compress(&route->dst, FAMILY_ADDRESS_SIZE(route->family), state); siphash24_compress(&route->dst_prefixlen, sizeof(route->dst_prefixlen), state); @@ -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 a246843625..89d54020db 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); |