From: Yu Watanabe Date: Fri, 19 Jan 2024 11:12:09 +0000 (+0900) Subject: local-addresses: also save weight of multipath routes X-Git-Tag: v256-rc1~1074^2~4 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=eb1f9ed6a0f89c885904e9060bc44ad3049fd239;p=thirdparty%2Fsystemd.git local-addresses: also save weight of multipath routes --- diff --git a/src/shared/local-addresses.c b/src/shared/local-addresses.c index 55cff7479e8..a67a2bfd80e 100644 --- a/src/shared/local-addresses.c +++ b/src/shared/local-addresses.c @@ -29,6 +29,10 @@ static int address_compare(const struct local_address *a, const struct local_add if (r != 0) return r; + r = CMP(a->weight, b->weight); + if (r != 0) + return r; + r = CMP(a->ifindex, b->ifindex); if (r != 0) return r; @@ -64,6 +68,7 @@ static int add_local_address_full( int ifindex, unsigned char scope, uint32_t priority, + uint32_t weight, int family, const union in_addr_union *address) { @@ -80,6 +85,7 @@ static int add_local_address_full( .ifindex = ifindex, .scope = scope, .priority = priority, + .weight = weight, .family = family, .address = *address, }; @@ -95,7 +101,7 @@ static int add_local_address( int family, const union in_addr_union *address) { - return add_local_address_full(list, n_list, ifindex, scope, 0, family, address); + return add_local_address_full(list, n_list, ifindex, scope, 0, 0, family, address); } int local_addresses( @@ -216,10 +222,11 @@ static int add_local_gateway( size_t *n_list, int ifindex, uint32_t priority, + uint32_t weight, int family, const union in_addr_union *address) { - return add_local_address_full(list, n_list, ifindex, 0, priority, family, address); + return add_local_address_full(list, n_list, ifindex, 0, priority, weight, family, address); } int local_gateways( @@ -329,7 +336,7 @@ int local_gateways( if (r < 0 && r != -ENODATA) return r; if (r >= 0) { - r = add_local_gateway(&list, &n_list, ifi, priority, family, &gateway); + r = add_local_gateway(&list, &n_list, ifi, priority, 0, family, &gateway); if (r < 0) return r; @@ -350,7 +357,7 @@ int local_gateways( if (via.family != AF_INET6) return -EBADMSG; - r = add_local_gateway(&list, &n_list, ifi, priority, via.family, + r = add_local_gateway(&list, &n_list, ifi, priority, 0, via.family, &(union in_addr_union) { .in6 = via.address.in6 }); if (r < 0) return r; @@ -381,7 +388,7 @@ int local_gateways( continue; union in_addr_union a = mr->gateway.address; - r = add_local_gateway(&list, &n_list, ifi, priority, mr->gateway.family, &a); + r = add_local_gateway(&list, &n_list, ifi, priority, mr->weight, mr->gateway.family, &a); if (r < 0) return r; } @@ -404,7 +411,7 @@ static int add_local_outbound( int family, const union in_addr_union *address) { - return add_local_address_full(list, n_list, ifindex, 0, 0, family, address); + return add_local_address_full(list, n_list, ifindex, 0, 0, 0, family, address); } int local_outbounds( diff --git a/src/shared/local-addresses.h b/src/shared/local-addresses.h index 42bed2ba0d5..7afbc895690 100644 --- a/src/shared/local-addresses.h +++ b/src/shared/local-addresses.h @@ -9,6 +9,7 @@ struct local_address { int ifindex; unsigned char scope; uint32_t priority; + uint32_t weight; int family; union in_addr_union address; }; diff --git a/src/test/test-local-addresses.c b/src/test/test-local-addresses.c index c9ed7bf77d1..a7a684cc820 100644 --- a/src/test/test-local-addresses.c +++ b/src/test/test-local-addresses.c @@ -10,8 +10,8 @@ static void print_local_addresses(const struct local_address *a, size_t n) { FOREACH_ARRAY(i, a, n) - log_debug("%s ifindex=%i scope=%u priority=%"PRIu32" address=%s", - af_to_name(i->family), i->ifindex, i->scope, i->priority, + log_debug("%s ifindex=%i scope=%u priority=%"PRIu32" weight=%"PRIu32" address=%s", + af_to_name(i->family), i->ifindex, i->scope, i->priority, i->weight, IN_ADDR_TO_STRING(i->family, &i->address)); }