sd_event_unref(m->event);
while ((link = hashmap_first(m->links)))
- link_free(link);
+ link_unref(link);
hashmap_free(m->links);
while ((network = m->networks))
network_free(network);
while ((netdev = hashmap_first(m->netdevs)))
- netdev_free(netdev);
+ netdev_unref(netdev);
hashmap_free(m->netdevs);
sd_rtnl_unref(m->rtnl);
static int manager_rtnl_process_link(sd_rtnl *rtnl, sd_rtnl_message *message, void *userdata) {
Manager *m = userdata;
Link *link = NULL;
+ uint16_t type;
char *name;
int r, ifindex;
assert(message);
assert(m);
+ r = sd_rtnl_message_get_type(message, &type);
+ if (r < 0) {
+ log_warning("rtnl: could not get message type");
+ return 0;
+ }
+
r = sd_rtnl_message_link_get_ifindex(message, &ifindex);
if (r < 0 || ifindex <= 0) {
log_warning("rtnl: received link message without valid ifindex");
}
link_get(m, ifindex, &link);
- if (!link) {
+ if (type == RTM_DELLINK)
+ link_drop(link);
+ else if (!link) {
/* link is new, so add it */
r = link_add(m, message, &link);
if (r < 0) {
if (r < 0)
log_warning("rtnl: received link message without valid ifname");
else {
- NetDev *netdev;
+ NetDev *netdev = NULL;
- r = netdev_get(m, name, &netdev);
- if (r >= 0) {
+ netdev_get(m, name, &netdev);
+ if (type == RTM_DELLINK)
+ netdev_drop(netdev);
+ else if (netdev) {
r = netdev_set_ifindex(netdev, message);
if (r < 0) {
log_debug("could not set ifindex on netdev");
}
}
- r = link_update(link, message);
- if (r < 0)
- return 0;
+ if (type == RTM_NEWLINK) {
+ r = link_update(link, message);
+ if (r < 0)
+ return 0;
+ }
return 1;
}
if (r < 0)
return r;
+ r = sd_rtnl_add_match(m->rtnl, RTM_DELLINK, &manager_rtnl_process_link, m);
+ if (r < 0)
+ return r;
+
return 0;
}