]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: make address/route_configure optionally return created Address/Route object
authorYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 22 Jul 2020 00:41:30 +0000 (09:41 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 28 Jul 2020 17:05:05 +0000 (02:05 +0900)
src/network/networkd-address.c
src/network/networkd-address.h
src/network/networkd-dhcp6.c
src/network/networkd-ipv4ll.c
src/network/networkd-link.c
src/network/networkd-ndisc.c
src/network/networkd-route.c
src/network/networkd-route.h

index 96782d608a58538e37a22c571bb0474c19e9d9e2..19a007906b7f600cf3bd68a3cc79efeb69754957 100644 (file)
@@ -592,9 +592,11 @@ int address_configure(
                 Address *address,
                 Link *link,
                 link_netlink_message_handler_t callback,
-                bool update) {
+                bool update,
+                Address **ret) {
 
         _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
+        Address *a;
         int r;
 
         assert(address);
@@ -703,9 +705,9 @@ int address_configure(
         link_ref(link);
 
         if (address->family == AF_INET6 && !in_addr_is_null(address->family, &address->in_addr_peer))
-                r = address_add(link, address->family, &address->in_addr_peer, address->prefixlen, NULL);
+                r = address_add(link, address->family, &address->in_addr_peer, address->prefixlen, &a);
         else
-                r = address_add(link, address->family, &address->in_addr, address->prefixlen, NULL);
+                r = address_add(link, address->family, &address->in_addr, address->prefixlen, &a);
         if (r < 0) {
                 address_release(address);
                 return log_link_error_errno(link, r, "Could not add address: %m");
@@ -725,6 +727,9 @@ int address_configure(
                         log_link_warning_errno(link, r, "Failed to start IPv4ACD client, ignoring: %m");
         }
 
+        if (ret)
+                *ret = a;
+
         return 1;
 }
 
index 18d25465530075db24fa39425b1c4a160d94ed79..3fc9935d16ba7b2e5c7e089e5794762a9bf3ad38 100644 (file)
@@ -64,7 +64,7 @@ int address_get(Link *link, int family, const union in_addr_union *in_addr, unsi
 bool address_exists(Link *link, int family, const union in_addr_union *in_addr);
 int address_update(Address *address, unsigned char flags, unsigned char scope, const struct ifa_cacheinfo *cinfo);
 int address_drop(Address *address);
-int address_configure(Address *address, Link *link, link_netlink_message_handler_t callback, bool update);
+int address_configure(Address *address, Link *link, link_netlink_message_handler_t callback, bool update, Address **ret);
 int address_remove(Address *address, Link *link, link_netlink_message_handler_t callback);
 bool address_equal(Address *a1, Address *a2);
 bool address_is_ready(const Address *a);
index 1f78e24110f7a2c45d6d8c9f316814c858c1b6e6..b571d923d52ac6f39d28426d59fdd5028f65cad9 100644 (file)
@@ -390,7 +390,7 @@ static int dhcp6_lease_pd_prefix_acquired(sd_dhcp6_client *client, Link *link) {
                         route->table = link_get_dhcp_route_table(link);
                         route->type = RTN_UNREACHABLE;
 
-                        r = route_configure(route, link, dhcp6_route_handler);
+                        r = route_configure(route, link, dhcp6_route_handler, NULL);
                         if (r < 0) {
                                 log_link_warning_errno(link, r, "Cannot configure unreachable route for delegated subnet %s/%u: %m",
                                                        strnull(buf),
@@ -581,7 +581,7 @@ static int dhcp6_address_change(
                       "DHCPv6 address %s/%d timeout preferred %d valid %d",
                       strnull(buffer), addr->prefixlen, lifetime_preferred, lifetime_valid);
 
-        r = address_configure(addr, link, dhcp6_address_handler, true);
+        r = address_configure(addr, link, dhcp6_address_handler, true, NULL);
         if (r < 0)
                 return log_link_warning_errno(link, r, "Could not assign DHCPv6 address: %m");
         if (r > 0)
@@ -954,7 +954,7 @@ static int dhcp6_prefix_add(Manager *m, struct in6_addr *addr, Link *link) {
         link->dhcp6_pd_route_configured = false;
         link_set_state(link, LINK_STATE_CONFIGURING);
 
-        r = route_configure(route, link, dhcp6_pd_route_handler);
+        r = route_configure(route, link, dhcp6_pd_route_handler, NULL);
         if (r < 0)
                 return r;
         if (r > 0)
@@ -1130,7 +1130,7 @@ static int dhcp6_assign_delegated_prefix(Link *link,
         link->dhcp6_pd_address_configured = false;
         link_set_state(link, LINK_STATE_CONFIGURING);
 
-        r = address_configure(address, link, dhcp6_pd_address_handler, true);
+        r = address_configure(address, link, dhcp6_pd_address_handler, true, NULL);
         if (r < 0)
                 return log_link_warning_errno(link, r, "Failed to set acquired DHCPv6 delegated prefix address: %m");
         if (r > 0)
index aaca215e56b3ec9c497e6963c9d994c109a62fa2..e57b9e420fe157fd2e0276fbc312af7c8526bca8 100644 (file)
@@ -92,7 +92,7 @@ static int ipv4ll_address_claimed(sd_ipv4ll *ll, Link *link) {
         ll_addr->broadcast.s_addr = ll_addr->in_addr.in.s_addr | htobe32(0xfffffffflu >> ll_addr->prefixlen);
         ll_addr->scope = RT_SCOPE_LINK;
 
-        r = address_configure(ll_addr, link, ipv4ll_address_handler, false);
+        r = address_configure(ll_addr, link, ipv4ll_address_handler, false, NULL);
         if (r < 0)
                 return r;
 
index 0acd35444e986243012ca6cb347bcd32b6bced1d..23870eab3f272e3bedce66e200f2bc188389d1a3 100644 (file)
@@ -1061,7 +1061,7 @@ int link_request_set_routes(Link *link) {
                         if ((in_addr_is_null(rt->family, &rt->gw) && ordered_set_isempty(rt->multipath_routes)) != (phase == PHASE_NON_GATEWAY))
                                 continue;
 
-                        r = route_configure(rt, link, route_handler);
+                        r = route_configure(rt, link, route_handler, NULL);
                         if (r < 0)
                                 return log_link_warning_errno(link, r, "Could not set routes: %m");
                         if (r > 0)
@@ -1304,7 +1304,7 @@ static int link_request_set_addresses(Link *link) {
                 else
                         update = address_get(link, ad->family, &ad->in_addr, ad->prefixlen, NULL) > 0;
 
-                r = address_configure(ad, link, address_handler, update);
+                r = address_configure(ad, link, address_handler, update, NULL);
                 if (r < 0)
                         return log_link_warning_errno(link, r, "Could not set addresses: %m");
                 if (r > 0)
@@ -1333,7 +1333,7 @@ static int link_request_set_addresses(Link *link) {
                                 return r;
 
                         address->family = AF_INET6;
-                        r = address_configure(address, link, address_handler, true);
+                        r = address_configure(address, link, address_handler, true, NULL);
                         if (r < 0)
                                 return log_link_warning_errno(link, r, "Could not set addresses: %m");
                         if (r > 0)
index dcfe3e726ca529c04f88b0b77101c9e08a7f5003..2f6cc4042e1901a7e8089d56fe2646540de33737 100644 (file)
@@ -155,7 +155,7 @@ static int ndisc_router_process_default(Link *link, sd_ndisc_router *rt) {
         route->lifetime = time_now + lifetime * USEC_PER_SEC;
         route->mtu = mtu;
 
-        r = route_configure(route, link, ndisc_route_handler);
+        r = route_configure(route, link, ndisc_route_handler, NULL);
         if (r < 0)
                 return log_link_error_errno(link, r, "Could not set default route: %m");
         if (r > 0)
@@ -171,7 +171,7 @@ static int ndisc_router_process_default(Link *link, sd_ndisc_router *rt) {
 
                 route_gw->gw = gateway;
 
-                r = route_configure(route_gw, link, ndisc_route_handler);
+                r = route_configure(route_gw, link, ndisc_route_handler, NULL);
                 if (r < 0)
                         return log_link_error_errno(link, r, "Could not set gateway: %m");
                 if (r > 0)
@@ -387,7 +387,7 @@ static int ndisc_router_process_autonomous_prefix(Link *link, sd_ndisc_router *r
 
                 address->in_addr.in6 = *a;
 
-                r = address_configure(address, link, ndisc_address_handler, true);
+                r = address_configure(address, link, ndisc_address_handler, true, NULL);
                 if (r < 0)
                         return log_link_error_errno(link, r, "Could not set SLAAC address: %m");
                 if (r > 0)
@@ -435,7 +435,7 @@ static int ndisc_router_process_onlink_prefix(Link *link, sd_ndisc_router *rt) {
         if (r < 0)
                 return log_link_error_errno(link, r, "Failed to get prefix address: %m");
 
-        r = route_configure(route, link, ndisc_route_handler);
+        r = route_configure(route, link, ndisc_route_handler, NULL);
         if (r < 0)
                 return log_link_error_errno(link, r, "Could not set prefix route: %m");;
         if (r > 0)
@@ -494,7 +494,7 @@ static int ndisc_router_process_route(Link *link, sd_ndisc_router *rt) {
         if (r < 0)
                 return log_link_error_errno(link, r, "Failed to get route address: %m");
 
-        r = route_configure(route, link, ndisc_route_handler);
+        r = route_configure(route, link, ndisc_route_handler, NULL);
         if (r < 0)
                 return log_link_error_errno(link, r, "Could not set additional route: %m");
         if (r > 0)
index 62a9b8b9b3d7cba36e472f7de69af011d78b81dc..d8739b767928c3c656f0038d7438297272bd09f8 100644 (file)
@@ -597,7 +597,8 @@ static int append_nexthops(Route *route, sd_netlink_message *req) {
 int route_configure(
                 Route *route,
                 Link *link,
-                link_netlink_message_handler_t callback) {
+                link_netlink_message_handler_t callback,
+                Route **ret) {
 
         _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
         _cleanup_(sd_event_source_unrefp) sd_event_source *expire = NULL;
@@ -803,6 +804,9 @@ int route_configure(
         sd_event_source_unref(route->expire);
         route->expire = TAKE_PTR(expire);
 
+        if (ret)
+                *ret = route;
+
         return 1;
 }
 
index e926ccd7a42987246def7009cd20aa736e322722..3beee9b03b159aa023f9bf14e8a68cb162b618a9 100644 (file)
@@ -66,7 +66,7 @@ extern const struct hash_ops route_hash_ops;
 
 int route_new(Route **ret);
 void route_free(Route *route);
-int route_configure(Route *route, Link *link, link_netlink_message_handler_t callback);
+int route_configure(Route *route, Link *link, link_netlink_message_handler_t callback, Route **ret);
 int route_remove(Route *route, Link *link, link_netlink_message_handler_t callback);
 
 int route_get(Link *link, Route *in, Route **ret);