/* callback for brige netdev's parameter set */
static int netdev_bridge_set_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) {
- _cleanup_(netdev_unrefp) NetDev *netdev = userdata;
+ NetDev *netdev = userdata;
int r;
assert(netdev);
if (r < 0)
return log_netdev_error_errno(netdev, r, "Could not append IFLA_INFO_DATA attribute: %m");
- r = sd_netlink_call_async(netdev->manager->rtnl, req, netdev_bridge_set_handler, NULL, netdev, 0, NULL);
+ r = sd_netlink_call_async(netdev->manager->rtnl, req, netdev_bridge_set_handler,
+ netdev_netlink_destroy_callback, netdev, 0, NULL);
if (r < 0)
return log_netdev_error_errno(netdev, r, "Could not send rtnetlink message: %m");
/* callback for geneve netdev's created without a backing Link */
static int geneve_netdev_create_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) {
- _cleanup_(netdev_unrefp) NetDev *netdev = userdata;
+ NetDev *netdev = userdata;
int r;
+ assert(netdev);
assert(netdev->state != _NETDEV_STATE_INVALID);
r = sd_netlink_message_get_errno(m);
if (r < 0)
return log_netdev_error_errno(netdev, r, "Could not append IFLA_LINKINFO attribute: %m");
- r = sd_netlink_call_async(netdev->manager->rtnl, m, geneve_netdev_create_handler, NULL, netdev, 0, NULL);
+ r = sd_netlink_call_async(netdev->manager->rtnl, m, geneve_netdev_create_handler,
+ netdev_netlink_destroy_callback, netdev, 0, NULL);
if (r < 0)
return log_netdev_error_errno(netdev, r, "Could not send rtnetlink message: %m");
netdev_ref(netdev);
-
netdev->state = NETDEV_STATE_CREATING;
log_netdev_debug(netdev, "Creating");
DEFINE_STRING_TABLE_LOOKUP(netdev_kind, NetDevKind);
DEFINE_CONFIG_PARSE_ENUM(config_parse_netdev_kind, netdev_kind, NetDevKind, "Failed to parse netdev kind");
-static void netdev_cancel_callbacks(NetDev *netdev) {
- _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL;
+static void netdev_callbacks_clear(NetDev *netdev) {
netdev_join_callback *callback;
- if (!netdev || !netdev->manager)
+ if (!netdev)
return;
- rtnl_message_new_synthetic_error(netdev->manager->rtnl, -ENODEV, 0, &m);
-
while ((callback = netdev->callbacks)) {
- if (m) {
- assert(callback->link);
- assert(callback->callback);
- assert(netdev->manager);
- assert(netdev->manager->rtnl);
-
- callback->callback(netdev->manager->rtnl, m, callback->link);
- }
-
LIST_REMOVE(callbacks, netdev->callbacks, callback);
link_unref(callback->link);
free(callback);
static NetDev *netdev_free(NetDev *netdev) {
assert(netdev);
- netdev_cancel_callbacks(netdev);
+ netdev_callbacks_clear(netdev);
if (netdev->ifname && netdev->manager)
hashmap_remove(netdev->manager->netdevs, netdev->ifname);
DEFINE_TRIVIAL_REF_UNREF_FUNC(NetDev, netdev, netdev_free);
+void netdev_netlink_destroy_callback(void *userdata) {
+ NetDev *netdev = userdata;
+
+ assert(userdata);
+
+ netdev_unref(netdev);
+}
+
void netdev_drop(NetDev *netdev) {
if (!netdev || netdev->state == NETDEV_STATE_LINGER)
return;
log_netdev_debug(netdev, "netdev removed");
- netdev_cancel_callbacks(netdev);
+ netdev_callbacks_clear(netdev);
netdev_unref(netdev);
static int netdev_enter_failed(NetDev *netdev) {
netdev->state = NETDEV_STATE_FAILED;
- netdev_cancel_callbacks(netdev);
+ netdev_callbacks_clear(netdev);
return 0;
}
if (r < 0)
return log_netdev_error_errno(netdev, r, "Could not append IFLA_MASTER attribute: %m");
- r = sd_netlink_call_async(netdev->manager->rtnl, req, callback, NULL, link, 0, NULL);
+ r = sd_netlink_call_async(netdev->manager->rtnl, req, callback,
+ link_netlink_destroy_callback, link, 0, NULL);
if (r < 0)
return log_netdev_error_errno(netdev, r, "Could not send rtnetlink message: %m");
/* callback for netdev's created without a backing Link */
static int netdev_create_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) {
- _cleanup_(netdev_unrefp) NetDev *netdev = userdata;
+ NetDev *netdev = userdata;
int r;
+ assert(netdev);
assert(netdev->state != _NETDEV_STATE_INVALID);
r = sd_netlink_message_get_errno(m);
return log_oom();
cb->callback = callback;
- cb->link = link;
- link_ref(link);
+ cb->link = link_ref(link);
LIST_PREPEND(callbacks, netdev->callbacks, cb);
return log_netdev_error_errno(netdev, r, "Could not append IFLA_LINKINFO attribute: %m");
if (link) {
- r = sd_netlink_call_async(netdev->manager->rtnl, m, callback, NULL, link, 0, NULL);
+ r = sd_netlink_call_async(netdev->manager->rtnl, m, callback,
+ link_netlink_destroy_callback, link, 0, NULL);
if (r < 0)
return log_netdev_error_errno(netdev, r, "Could not send rtnetlink message: %m");
link_ref(link);
} else {
- r = sd_netlink_call_async(netdev->manager->rtnl, m, netdev_create_handler, NULL, netdev, 0, NULL);
+ r = sd_netlink_call_async(netdev->manager->rtnl, m, netdev_create_handler,
+ netdev_netlink_destroy_callback, netdev, 0, NULL);
if (r < 0)
return log_netdev_error_errno(netdev, r, "Could not send rtnetlink message: %m");
NetDev *netdev_unref(NetDev *netdev);
NetDev *netdev_ref(NetDev *netdev);
-
+void netdev_netlink_destroy_callback(void *userdata);
DEFINE_TRIVIAL_CLEANUP_FUNC(NetDev*, netdev_unref);
int netdev_get(Manager *manager, const char *name, NetDev **ret);
if (r < 0)
return log_error_errno(r, "Could not append IFA_ADDRESS attribute: %m");
- r = sd_netlink_call_async(link->manager->rtnl, req, callback, NULL, link, 0, NULL);
+ r = sd_netlink_call_async(link->manager->rtnl, req, callback,
+ link_netlink_destroy_callback, link, 0, NULL);
if (r < 0)
return log_error_errno(r, "Could not send rtnetlink message: %m");
if (r < 0)
return log_error_errno(r, "Could not append IFA_LOCAL attribute: %m");
- r = sd_netlink_call_async(link->manager->rtnl, req, callback, NULL, link, 0, NULL);
+ r = sd_netlink_call_async(link->manager->rtnl, req, callback,
+ link_netlink_destroy_callback, link, 0, NULL);
if (r < 0)
return log_error_errno(r, "Could not send rtnetlink message: %m");
if (r < 0)
return r;
- r = sd_netlink_call_async(link->manager->rtnl, req, callback, NULL, link, 0, NULL);
+ r = sd_netlink_call_async(link->manager->rtnl, req, callback,
+ link_netlink_destroy_callback, link, 0, NULL);
if (r < 0) {
address_release(address);
return log_error_errno(r, "Could not send rtnetlink message: %m");
return log_link_error_errno(link, r, "Could not close IFLA_AF_SPEC container: %m");
/* send message to the kernel */
- r = sd_netlink_call_async(rtnl, req, set_brvlan_handler, NULL, link, 0, NULL);
+ r = sd_netlink_call_async(rtnl, req, set_brvlan_handler,
+ link_netlink_destroy_callback, link, 0, NULL);
if (r < 0)
return log_link_error_errno(link, r, "Could not send rtnetlink message: %m");
+ link_ref(link);
+
return 0;
}
static int dhcp4_route_handler(sd_netlink *rtnl, sd_netlink_message *m,
void *userdata) {
- _cleanup_(link_unrefp) Link *link = userdata;
+ Link *link = userdata;
int r;
assert(link);
static int dhcp4_address_handler(sd_netlink *rtnl, sd_netlink_message *m,
void *userdata) {
- _cleanup_(link_unrefp) Link *link = userdata;
+ Link *link = userdata;
int r;
assert(link);
static int dhcp6_route_remove_cb(sd_netlink *nl, sd_netlink_message *m,
void *userdata) {
- Link *l = userdata;
+ Link *link = userdata;
int r;
+ assert(link);
+
r = sd_netlink_message_get_errno(m);
if (r < 0)
- log_link_debug_errno(l, r, "Received error on unreachable route removal for DHCPv6 delegated subnetl: %m");
-
- l = link_unref(l);
+ log_link_debug_errno(link, r, "Received error on unreachable route removal for DHCPv6 delegated subnetl: %m");
return 0;
}
continue;
}
- link = link_ref(link);
log_link_debug(link, "Removing unreachable route %s/%u",
strnull(buf), pd_prefix_len);
static int dhcp6_route_add_cb(sd_netlink *nl, sd_netlink_message *m,
void *userdata) {
- Link *l = userdata;
+ Link *link = userdata;
int r;
+ assert(link);
+
r = sd_netlink_message_get_errno(m);
if (r < 0 && r != -EEXIST)
- log_link_debug_errno(l, r, "Received error when adding unreachable route for DHCPv6 delegated subnet: %m");
-
- l = link_unref(l);
+ log_link_debug_errno(link, r, "Received error when adding unreachable route for DHCPv6 delegated subnet: %m");
return 0;
}
route_free(route);
continue;
}
- link = link_ref(link);
route_free(route);
static int dhcp6_address_handler(sd_netlink *rtnl, sd_netlink_message *m,
void *userdata) {
- _cleanup_(link_unrefp) Link *link = userdata;
+ Link *link = userdata;
int r;
assert(link);
}
/* send message to the kernel to update its internal static MAC table. */
- r = sd_netlink_call_async(rtnl, req, set_fdb_handler, NULL, link, 0, NULL);
+ r = sd_netlink_call_async(rtnl, req, set_fdb_handler,
+ link_netlink_destroy_callback, link, 0, NULL);
if (r < 0)
return log_link_error_errno(link, r, "Could not send rtnetlink message: %m");
+ link_ref(link);
+
return 0;
}
}
static int ipv4ll_route_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) {
- _cleanup_(link_unrefp) Link *link = userdata;
+ Link *link = userdata;
int r;
assert(link);
}
static int ipv4ll_address_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) {
- _cleanup_(link_unrefp) Link *link = userdata;
+ Link *link = userdata;
int r;
assert(link);
if (r < 0)
return rtnl_log_create_error(r);
- r = sd_netlink_call_async(rtnl, req, set_ipv6_proxy_ndp_address_handler, NULL, link, 0, NULL);
+ r = sd_netlink_call_async(rtnl, req, set_ipv6_proxy_ndp_address_handler,
+ link_netlink_destroy_callback, link, 0, NULL);
if (r < 0)
return log_link_error_errno(link, r, "Could not send rtnetlink message: %m");
+ link_ref(link);
+
return 0;
}
return 0;
}
+DEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_unref);
+
static int link_new(Manager *manager, sd_netlink_message *message, Link **ret) {
_cleanup_(link_unrefp) Link *link = NULL;
uint16_t type;
if (link->manager) {
hashmap_remove(link->manager->links, INT_TO_PTR(link->ifindex));
set_remove(link->manager->links_requesting_uuid, link);
+ link_clean(link);
}
free(link->ifname);
DEFINE_TRIVIAL_REF_UNREF_FUNC(Link, link, link_free);
+void link_netlink_destroy_callback(void *userdata) {
+ Link *link = userdata;
+
+ assert(userdata);
+
+ link_unref(link);
+}
+
int link_get(Manager *m, int ifindex, Link **ret) {
Link *link;
}
static int route_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) {
- _cleanup_(link_unrefp) Link *link = userdata;
+ Link *link = userdata;
int r;
+ assert(link);
assert(link->route_messages > 0);
assert(IN_SET(link->state, LINK_STATE_SETTING_ADDRESSES,
LINK_STATE_SETTING_ROUTES, LINK_STATE_FAILED,
}
int link_route_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) {
- _cleanup_(link_unrefp) Link *link = userdata;
+ Link *link = userdata;
int r;
assert(m);
}
static int address_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) {
- _cleanup_(link_unrefp) Link *link = userdata;
+ Link *link = userdata;
int r;
assert(rtnl);
}
static int address_label_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) {
- _cleanup_(link_unrefp) Link *link = userdata;
+ Link *link = userdata;
int r;
assert(rtnl);
}
int link_address_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) {
- _cleanup_(link_unrefp) Link *link = userdata;
+ Link *link = userdata;
int r;
assert(m);
}
static int link_set_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) {
- _cleanup_(link_unrefp) Link *link = userdata;
+ Link *link = userdata;
int r;
+ assert(link);
+
log_link_debug(link, "Set link");
r = sd_netlink_message_get_errno(m);
static int link_configure_after_setting_mtu(Link *link);
static int set_mtu_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) {
- _cleanup_(link_unrefp) Link *link = userdata;
+ Link *link = userdata;
int r;
assert(m);
if (r < 0)
return log_link_error_errno(link, r, "Could not append MTU: %m");
- r = sd_netlink_call_async(link->manager->rtnl, req, set_mtu_handler, NULL, link, 0, NULL);
+ r = sd_netlink_call_async(link->manager->rtnl, req, set_mtu_handler,
+ link_netlink_destroy_callback, link, 0, NULL);
if (r < 0)
return log_link_error_errno(link, r, "Could not send rtnetlink message: %m");
- link->setting_mtu = true;
-
link_ref(link);
+ link->setting_mtu = true;
return 0;
}
static int set_flags_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) {
- _cleanup_(link_unrefp) Link *link = userdata;
+ Link *link = userdata;
int r;
assert(m);
if (r < 0)
return log_link_error_errno(link, r, "Could not set link flags: %m");
- r = sd_netlink_call_async(link->manager->rtnl, req, set_flags_handler, NULL, link, 0, NULL);
+ r = sd_netlink_call_async(link->manager->rtnl, req, set_flags_handler,
+ link_netlink_destroy_callback, link, 0, NULL);
if (r < 0)
return log_link_error_errno(link, r, "Could not send rtnetlink message: %m");
if (r < 0)
return log_link_error_errno(link, r, "Could not append IFLA_LINKINFO attribute: %m");
- r = sd_netlink_call_async(link->manager->rtnl, req, link_set_handler, NULL, link, 0, NULL);
+ r = sd_netlink_call_async(link->manager->rtnl, req, link_set_handler,
+ link_netlink_destroy_callback, link, 0, NULL);
if (r < 0)
return log_link_error_errno(link, r, "Could not send rtnetlink message: %m");
if (r < 0)
return log_link_error_errno(link, r, "Could not append IFLA_INFO_DATA attribute: %m");
- r = sd_netlink_call_async(link->manager->rtnl, req, set_flags_handler, NULL, link, 0, NULL);
+ r = sd_netlink_call_async(link->manager->rtnl, req, set_flags_handler,
+ link_netlink_destroy_callback, link, 0, NULL);
if (r < 0)
return log_link_error_errno(link, r, "Could not send rtnetlink message: %m");
}
static int link_up_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) {
- _cleanup_(link_unrefp) Link *link = userdata;
+ Link *link = userdata;
int r;
assert(link);
if (r < 0)
return log_link_error_errno(link, r, "Could not close IFLA_AF_SPEC container: %m");
- r = sd_netlink_call_async(link->manager->rtnl, req, link_up_handler, NULL, link, 0, NULL);
+ r = sd_netlink_call_async(link->manager->rtnl, req, link_up_handler,
+ link_netlink_destroy_callback, link, 0, NULL);
if (r < 0)
return log_link_error_errno(link, r, "Could not send rtnetlink message: %m");
if (r < 0)
return log_link_error_errno(link, r, "Could not set link flags: %m");
- r = sd_netlink_call_async(link->manager->rtnl, req, link_up_handler, NULL, link, 0, NULL);
+ r = sd_netlink_call_async(link->manager->rtnl, req, link_up_handler,
+ link_netlink_destroy_callback, link, 0, NULL);
if (r < 0)
return log_link_error_errno(link, r, "Could not send rtnetlink message: %m");
if (r < 0)
return log_link_error_errno(link, r, "Failed to close netlink container: %m");
- r = sd_netlink_call_async(link->manager->rtnl, m, link_set_handler, NULL, link, 0, NULL);
+ r = sd_netlink_call_async(link->manager->rtnl, m, link_set_handler,
+ link_netlink_destroy_callback, link, 0, NULL);
if (r < 0)
return log_link_error_errno(link, r, "Could not send rtnetlink message: %m");
}
static int link_down_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) {
- _cleanup_(link_unrefp) Link *link = userdata;
+ Link *link = userdata;
int r;
assert(link);
if (r < 0)
log_link_warning_errno(link, r, "Could not bring down interface: %m");
- if (streq_ptr(link->kind, "can")) {
- link_ref(link);
+ if (streq_ptr(link->kind, "can"))
link_set_can(link);
- }
return 1;
}
if (r < 0)
return log_link_error_errno(link, r, "Could not set link flags: %m");
- r = sd_netlink_call_async(link->manager->rtnl, req, link_down_handler, NULL, link, 0, NULL);
+ r = sd_netlink_call_async(link->manager->rtnl, req, link_down_handler,
+ link_netlink_destroy_callback, link, 0, NULL);
if (r < 0)
return log_link_error_errno(link, r, "Could not send rtnetlink message: %m");
}
static int netdev_join_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) {
- _cleanup_(link_unrefp) Link *link = userdata;
+ Link *link = userdata;
int r;
assert(link);
static int link_initialized_and_synced(sd_netlink *rtnl, sd_netlink_message *m,
void *userdata) {
- _cleanup_(link_unrefp) Link *link = userdata;
+ Link *link = userdata;
Network *network;
int r;
r = sd_netlink_call_async(link->manager->rtnl, req,
link_initialized_and_synced,
- NULL, link, 0, NULL);
+ link_netlink_destroy_callback, link, 0, NULL);
if (r < 0)
return r;
if (r < 0)
goto failed;
} else {
- /* we are calling a callback directly, so must take a ref */
- link_ref(link);
-
r = link_initialized_and_synced(m->rtnl, NULL, link);
if (r < 0)
goto failed;
assert(m);
if (link->state == LINK_STATE_LINGER) {
- link_ref(link);
log_link_info(link, "Link readded");
link_set_state(link, LINK_STATE_ENSLAVING);
assert(link);
assert(link->manager);
- set_remove(link->manager->dirty_links, link);
- link_unref(link);
+ link_unref(set_remove(link->manager->dirty_links, link));
}
static const char* const link_state_table[_LINK_STATE_MAX] = {
Link *link_unref(Link *link);
Link *link_ref(Link *link);
+void link_netlink_destroy_callback(void *userdata);
+
int link_get(Manager *m, int ifindex, Link **ret);
int link_add(Manager *manager, sd_netlink_message *message, Link **ret);
void link_drop(Link *link);
int link_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error);
int link_send_changed(Link *link, const char *property, ...) _sentinel_;
-DEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_unref);
-
/* Macros which append INTERFACE= to the message */
#define log_link_full(link, level, error, ...) \
static int dhcp6_route_add_callback(sd_netlink *nl, sd_netlink_message *m,
void *userdata) {
- Link *l = userdata;
+ Link *link = userdata;
int r;
+ assert(link);
+
r = sd_netlink_message_get_errno(m);
if (r < 0 && r != -EEXIST)
- log_link_debug_errno(l, r, "Received error adding DHCPv6 Prefix Delegation route: %m");
-
- l = link_unref(l);
+ log_link_debug_errno(link, r, "Received error adding DHCPv6 Prefix Delegation route: %m");
return 0;
}
(void) in_addr_to_string(AF_INET6, (union in_addr_union *) addr, &buf);
log_link_debug(link, "Adding prefix route %s/64", strnull(buf));
- link = link_ref(link);
-
return hashmap_put(m->dhcp6_prefixes, addr, link);
}
static int dhcp6_route_remove_callback(sd_netlink *nl, sd_netlink_message *m,
void *userdata) {
- Link *l = userdata;
+ Link *link = userdata;
int r;
+ assert(link);
+
r = sd_netlink_message_get_errno(m);
if (r < 0)
- log_link_debug_errno(l, r, "Received error on DHCPv6 Prefix Delegation route removal: %m");
-
- l = link_unref(l);
+ log_link_debug_errno(link, r, "Received error on DHCPv6 Prefix Delegation route removal: %m");
return 0;
}
(void) in_addr_to_string(AF_INET6, (union in_addr_union *) addr, &buf);
log_link_debug(l, "Removing prefix route %s/64", strnull(buf));
- l = link_ref(l);
-
return 0;
}
free(m->state_file);
+ sd_netlink_unref(m->rtnl);
+ sd_netlink_unref(m->genl);
+
while ((network = m->networks))
network_free(network);
set_free_with_destructor(m->rules_foreign, routing_policy_rule_free);
set_free_with_destructor(m->rules_saved, routing_policy_rule_free);
- sd_netlink_unref(m->rtnl);
- sd_netlink_unref(m->genl);
sd_event_unref(m->event);
sd_resolve_unref(m->resolve);
#define NDISC_PREFIX_LFT_MIN 7200U
static int ndisc_netlink_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) {
- _cleanup_(link_unrefp) Link *link = userdata;
+ Link *link = userdata;
int r;
assert(link);
return log_error_errno(r, "Could not append RTA_OIF attribute: %m");
}
- r = sd_netlink_call_async(link->manager->rtnl, req, callback, NULL, link, 0, NULL);
+ r = sd_netlink_call_async(link->manager->rtnl, req, callback,
+ link_netlink_destroy_callback, link, 0, NULL);
if (r < 0)
return log_error_errno(r, "Could not send rtnetlink message: %m");
if (r < 0)
return log_error_errno(r, "Could not append RTA_METRICS attribute: %m");
- r = sd_netlink_call_async(link->manager->rtnl, req, callback, NULL, link, 0, NULL);
+ r = sd_netlink_call_async(link->manager->rtnl, req, callback,
+ link_netlink_destroy_callback, link, 0, NULL);
if (r < 0)
return log_error_errno(r, "Could not send rtnetlink message: %m");
}
static int routing_policy_rule_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) {
- _cleanup_(link_unrefp) Link *link = userdata;
+ Link *link = userdata;
int r;
assert(m);
return log_error_errno(r, "Could not set destination prefix length: %m");
}
- r = sd_netlink_call_async(link->manager->rtnl, m, callback, NULL, link, 0, NULL);
+ r = sd_netlink_call_async(link->manager->rtnl, m, callback,
+ link_netlink_destroy_callback, link, 0, NULL);
if (r < 0)
return log_error_errno(r, "Could not send rtnetlink message: %m");
}
int link_routing_policy_rule_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) {
- _cleanup_(link_unrefp) Link *link = userdata;
+ Link *link = userdata;
int r;
assert(rtnl);
rule->link = link;
- r = sd_netlink_call_async(link->manager->rtnl, m, callback, NULL, link, 0, NULL);
+ r = sd_netlink_call_async(link->manager->rtnl, m, callback,
+ link_netlink_destroy_callback, link, 0, NULL);
if (r < 0)
return log_error_errno(r, "Could not send rtnetlink message: %m");