+ 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");
+ return 0;
+ } else
+ link_get(m, ifindex, &link);
+
+ r = sd_rtnl_message_read_string(message, IFLA_IFNAME, &name);
+ if (r < 0 || !name) {
+ log_warning("rtnl: received link message without valid ifname");
+ return 0;
+ } else
+ netdev_get(m, name, &netdev);
+
+ switch (type) {
+ case RTM_NEWLINK:
+ if (!link) {
+ /* link is new, so add it */
+ r = link_add(m, message, &link);
+ if (r < 0) {
+ log_debug("could not add new link: %s",
+ strerror(-r));
+ return 0;
+ }
+ }
+
+ if (netdev) {
+ /* netdev exists, so make sure the ifindex matches */
+ r = netdev_set_ifindex(netdev, message);
+ if (r < 0) {
+ log_debug("could not set ifindex on netdev");
+ return 0;
+ }
+ }
+
+ r = link_update(link, message);
+ if (r < 0)
+ return 0;
+
+ break;
+
+ case RTM_DELLINK:
+ link_drop(link);
+ netdev_drop(netdev);
+
+ break;
+
+ default:
+ assert_not_reached("Received invalid RTNL message type.");
+ }
+
+ return 1;
+}
+
+int manager_rtnl_enumerate_links(Manager *m) {
+ _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL, *reply = NULL;
+ sd_rtnl_message *link;
+ int r, k;