]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
local-addresses: also save weight of multipath routes
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 19 Jan 2024 11:12:09 +0000 (20:12 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 20 Jan 2024 07:07:19 +0000 (16:07 +0900)
src/shared/local-addresses.c
src/shared/local-addresses.h
src/test/test-local-addresses.c

index 55cff7479e8a3b95b7ecdb278373d1ee77ec96b1..a67a2bfd80e5d4584de926112dbbf4f835e75673 100644 (file)
@@ -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(
index 42bed2ba0d57fcf6f9639ef2d9d2a1d7c38ab66c..7afbc895690c1b1b306870e99a2a8a245d01219a 100644 (file)
@@ -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;
 };
index c9ed7bf77d11fe136d647eed0891df864c34cbf7..a7a684cc82012578ec1af76b16f7bbaedb14fe6d 100644 (file)
@@ -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));
 }