1
0
mirror of https://github.com/systemd/systemd.git synced 2024-11-06 08:26:52 +03:00

networkd: manager - refactor link tracking a bit

This commit is contained in:
Tom Gundersen 2014-05-09 17:59:20 +02:00
parent 5bb75bc745
commit 4d473d5dde

View File

@ -219,6 +219,7 @@ static int manager_udev_process_link(Manager *m, struct udev_device *device) {
static int manager_rtnl_process_link(sd_rtnl *rtnl, sd_rtnl_message *message, void *userdata) { static int manager_rtnl_process_link(sd_rtnl *rtnl, sd_rtnl_message *message, void *userdata) {
Manager *m = userdata; Manager *m = userdata;
Link *link = NULL; Link *link = NULL;
NetDev *netdev = NULL;
uint16_t type; uint16_t type;
char *name; char *name;
int r, ifindex; int r, ifindex;
@ -237,42 +238,50 @@ static int manager_rtnl_process_link(sd_rtnl *rtnl, sd_rtnl_message *message, vo
if (r < 0 || ifindex <= 0) { if (r < 0 || ifindex <= 0) {
log_warning("rtnl: received link message without valid ifindex"); log_warning("rtnl: received link message without valid ifindex");
return 0; return 0;
} } else
link_get(m, ifindex, &link);
link_get(m, ifindex, &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) {
log_debug("could not add new link");
return 0;
}
}
r = sd_rtnl_message_read_string(message, IFLA_IFNAME, &name); r = sd_rtnl_message_read_string(message, IFLA_IFNAME, &name);
if (r < 0) if (r < 0 || !name) {
log_warning("rtnl: received link message without valid ifname"); log_warning("rtnl: received link message without valid ifname");
else { return 0;
NetDev *netdev = NULL; } else
netdev_get(m, name, &netdev); netdev_get(m, name, &netdev);
if (type == RTM_DELLINK)
netdev_drop(netdev); switch (type) {
else if (netdev) { 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");
return 0;
}
}
if (netdev) {
/* netdev exists, so make sure the ifindex matches */
r = netdev_set_ifindex(netdev, message); r = netdev_set_ifindex(netdev, message);
if (r < 0) { if (r < 0) {
log_debug("could not set ifindex on netdev"); log_debug("could not set ifindex on netdev");
return 0; return 0;
} }
} }
}
if (type == RTM_NEWLINK) {
r = link_update(link, message); r = link_update(link, message);
if (r < 0) if (r < 0)
return 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; return 1;