From: Tom Gundersen Date: Sat, 19 Apr 2014 15:14:36 +0000 (+0200) Subject: networkd: netdev - give up early when setting already set ifindex X-Git-Tag: v213~373 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=a21df104887552e8558d6c11388dff466641a031;ds=sidebyside networkd: netdev - give up early when setting already set ifindex We may receive RTM_NEWLINK messages with missing LINKINFO after the initial NEWLINK message, don't bother verifying these, just drop out early after checking that the ifindex is not in conflict. --- diff --git a/src/network/networkd-netdev.c b/src/network/networkd-netdev.c index 30cb74b8b..717ecdf0e 100644 --- a/src/network/networkd-netdev.c +++ b/src/network/networkd-netdev.c @@ -392,6 +392,29 @@ int netdev_set_ifindex(NetDev *netdev, sd_rtnl_message *message) { return -EINVAL; } + r = sd_rtnl_message_link_get_ifindex(message, &ifindex); + if (r < 0) { + log_error_netdev(netdev, "Could not get ifindex: %s", strerror(-r)); + netdev_enter_failed(netdev); + return r; + } else if (ifindex <= 0) { + log_error_netdev(netdev, "Got invalid ifindex: %d", ifindex); + netdev_enter_failed(netdev); + return r; + } + + + if (netdev->ifindex > 0) { + if (netdev->ifindex != ifindex) { + log_error_netdev(netdev, "Could not set ifindex to %d, already set to %d", + ifindex, netdev->ifindex); + netdev_enter_failed(netdev); + return -EEXIST; + } else + /* ifindex already set to the same for this netdev */ + return 0; + } + r = sd_rtnl_message_read_string(message, IFLA_IFNAME, &received_name); if (r < 0) { log_error_netdev(netdev, "Could not get IFNAME"); @@ -437,24 +460,6 @@ int netdev_set_ifindex(NetDev *netdev, sd_rtnl_message *message) { return r; } - r = sd_rtnl_message_link_get_ifindex(message, &ifindex); - if (r < 0) { - log_error_netdev(netdev, "Could not get ifindex: %s", strerror(-r)); - netdev_enter_failed(netdev); - return r; - } else if (ifindex <= 0) { - log_error_netdev(netdev, "Got invalid ifindex: %d", ifindex); - netdev_enter_failed(netdev); - return r; - } - - if (netdev->ifindex > 0 && netdev->ifindex != ifindex) { - log_error_netdev(netdev, "Could not set ifindex to %d, already set to %d", - ifindex, netdev->ifindex); - netdev_enter_failed(netdev); - return -EEXIST; - } - netdev->ifindex = ifindex; netdev_enter_ready(netdev);