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);
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");
log_link_warning_errno(link, r, "Failed to start IPv4ACD client, ignoring: %m");
}
+ if (ret)
+ *ret = a;
+
return 1;
}
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);
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),
"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)
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)
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)
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;
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)
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)
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)
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)
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)
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)
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)
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)
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;
sd_event_source_unref(route->expire);
route->expire = TAKE_PTR(expire);
+ if (ret)
+ *ret = route;
+
return 1;
}
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);