From 80b0e8608496df5c9592378fb7d3cc1a9583583f Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Wed, 22 Jul 2020 09:41:30 +0900 Subject: [PATCH] network: make address/route_configure optionally return created Address/Route object --- src/network/networkd-address.c | 11 ++++++++--- src/network/networkd-address.h | 2 +- src/network/networkd-dhcp6.c | 8 ++++---- src/network/networkd-ipv4ll.c | 2 +- src/network/networkd-link.c | 6 +++--- src/network/networkd-ndisc.c | 10 +++++----- src/network/networkd-route.c | 6 +++++- src/network/networkd-route.h | 2 +- 8 files changed, 28 insertions(+), 19 deletions(-) diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index 96782d608a5..19a007906b7 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -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; } diff --git a/src/network/networkd-address.h b/src/network/networkd-address.h index 18d25465530..3fc9935d16b 100644 --- a/src/network/networkd-address.h +++ b/src/network/networkd-address.h @@ -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); diff --git a/src/network/networkd-dhcp6.c b/src/network/networkd-dhcp6.c index 1f78e24110f..b571d923d52 100644 --- a/src/network/networkd-dhcp6.c +++ b/src/network/networkd-dhcp6.c @@ -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) diff --git a/src/network/networkd-ipv4ll.c b/src/network/networkd-ipv4ll.c index aaca215e56b..e57b9e420fe 100644 --- a/src/network/networkd-ipv4ll.c +++ b/src/network/networkd-ipv4ll.c @@ -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; diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 0acd35444e9..23870eab3f2 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -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) diff --git a/src/network/networkd-ndisc.c b/src/network/networkd-ndisc.c index dcfe3e726ca..2f6cc4042e1 100644 --- a/src/network/networkd-ndisc.c +++ b/src/network/networkd-ndisc.c @@ -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) diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c index 62a9b8b9b3d..d8739b76792 100644 --- a/src/network/networkd-route.c +++ b/src/network/networkd-route.c @@ -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; } diff --git a/src/network/networkd-route.h b/src/network/networkd-route.h index e926ccd7a42..3beee9b03b1 100644 --- a/src/network/networkd-route.h +++ b/src/network/networkd-route.h @@ -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); -- 2.39.2