X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fnetwork%2Fnetworkd-link.c;h=22864bd403b89552650ef1f0f9c04643a8c1ecab;hp=a8d9bc0a13a444d26da7b486d06eb83dcb6011f9;hb=9c0a72f961e00b0447767973e7117e131bea5b5d;hpb=4cd552bc502077f2626b07b8aa0706c3fb6c7f56 diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index a8d9bc0a1..22864bd40 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -1656,6 +1656,57 @@ int link_add(Manager *m, sd_rtnl_message *message, Link **ret) { return 0; } +static int link_carrier_gained(Link *link) { + int r; + + assert(link); + + if (link->network) { + r = link_acquire_conf(link); + if (r < 0) { + link_enter_failed(link); + return r; + } + } + + return 0; +} + +static int link_carrier_lost(Link *link) { + int r; + + assert(link); + + r = link_stop_clients(link); + if (r < 0) { + link_enter_failed(link); + return r; + } + + return 0; +} + +int link_carrier_reset(Link *link) { + int r; + + assert(link); + + if (link_has_carrier(link)) { + r = link_carrier_lost(link); + if (r < 0) + return r; + + r = link_carrier_gained(link); + if (r < 0) + return r; + + log_link_info(link, "reset carrier"); + } + + return 0; +} + + int link_update(Link *link, sd_rtnl_message *m) { struct ether_addr mac; const char *ifname; @@ -1773,21 +1824,16 @@ int link_update(Link *link, sd_rtnl_message *m) { if (carrier_gained) { log_link_info(link, "gained carrier"); - if (link->network) { - r = link_acquire_conf(link); - if (r < 0) { - link_enter_failed(link); - return r; - } - } + r = link_carrier_gained(link); + if (r < 0) + return r; } else if (carrier_lost) { log_link_info(link, "lost carrier"); - r = link_stop_clients(link); - if (r < 0) { - link_enter_failed(link); + r = link_carrier_lost(link); + if (r < 0) return r; - } + } return 0;