X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fnetwork%2Fnetworkd-link.c;h=eff1ce94be9bb5273bfd2ec67dc63e598dd4ce95;hb=a97dcc12e486ecff531809802930a26c4da827f2;hp=077626cd17d82c8ff1d4a29e66de047b82569192;hpb=6a24f1484fcc1f59f89617afbe4282667a358eab;p=elogind.git diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 077626cd1..eff1ce94b 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -35,7 +35,7 @@ #include "conf-parser.h" #include "dhcp-lease-internal.h" -static bool link_dhcp6_enabled(Link *link) { +bool link_dhcp6_enabled(Link *link) { if (link->flags & IFF_LOOPBACK) return false; @@ -45,7 +45,7 @@ static bool link_dhcp6_enabled(Link *link) { return IN_SET(link->network->dhcp, ADDRESS_FAMILY_IPV6, ADDRESS_FAMILY_YES); } -static bool link_dhcp4_enabled(Link *link) { +bool link_dhcp4_enabled(Link *link) { if (link->flags & IFF_LOOPBACK) return false; @@ -55,7 +55,7 @@ static bool link_dhcp4_enabled(Link *link) { return IN_SET(link->network->dhcp, ADDRESS_FAMILY_IPV4, ADDRESS_FAMILY_YES); } -static bool link_dhcp4_server_enabled(Link *link) { +bool link_dhcp4_server_enabled(Link *link) { if (link->flags & IFF_LOOPBACK) return false; @@ -65,7 +65,7 @@ static bool link_dhcp4_server_enabled(Link *link) { return link->network->dhcp_server; } -static bool link_ipv4ll_enabled(Link *link) { +bool link_ipv4ll_enabled(Link *link) { if (link->flags & IFF_LOOPBACK) return false; @@ -75,7 +75,7 @@ static bool link_ipv4ll_enabled(Link *link) { return link->network->ipv4ll; } -static bool link_lldp_enabled(Link *link) { +bool link_lldp_enabled(Link *link) { if (link->flags & IFF_LOOPBACK) return false; @@ -283,12 +283,10 @@ static void link_free(Link *link) { sd_dhcp_client_unref(link->dhcp_client); sd_dhcp_lease_unref(link->dhcp_lease); - unlink(link->lease_file); free(link->lease_file); sd_lldp_free(link->lldp); - unlink(link->lldp_file); free(link->lldp_file); sd_ipv4ll_unref(link->ipv4ll); @@ -300,7 +298,6 @@ static void link_free(Link *link) { free(link->ifname); - unlink(link->state_file); free(link->state_file); udev_device_unref(link->udev_device); @@ -338,11 +335,24 @@ int link_get(Manager *m, int ifindex, Link **ret) { return 0; } +static void link_set_state(Link *link, LinkState state) { + assert(link); + + if (link->state == state) + return; + + link->state = state; + + link_send_changed(link, "AdministrativeState", NULL); + + return; +} + void link_drop(Link *link) { if (!link || link->state == LINK_STATE_LINGER) return; - link->state = LINK_STATE_LINGER; + link_set_state(link, LINK_STATE_LINGER); log_link_debug(link, "link removed"); @@ -356,7 +366,7 @@ static void link_enter_unmanaged(Link *link) { log_link_debug(link, "unmanaged"); - link->state = LINK_STATE_UNMANAGED; + link_set_state(link, LINK_STATE_UNMANAGED); link_save(link); } @@ -430,7 +440,7 @@ void link_enter_failed(Link *link) { log_link_warning(link, "failed"); - link->state = LINK_STATE_FAILED; + link_set_state(link, LINK_STATE_FAILED); link_stop_clients(link); @@ -473,7 +483,7 @@ static int link_enter_configured(Link *link) { log_link_info(link, "link configured"); - link->state = LINK_STATE_CONFIGURED; + link_set_state(link, LINK_STATE_CONFIGURED); link_save(link); @@ -536,7 +546,7 @@ static int link_enter_set_routes(Link *link) { assert(link->network); assert(link->state == LINK_STATE_SETTING_ADDRESSES); - link->state = LINK_STATE_SETTING_ROUTES; + link_set_state(link, LINK_STATE_SETTING_ROUTES); LIST_FOREACH(routes, rt, link->network->static_routes) { r = route_configure(rt, link, &route_handler); @@ -617,7 +627,7 @@ static int link_enter_set_addresses(Link *link) { assert(link->network); assert(link->state != _LINK_STATE_INVALID); - link->state = LINK_STATE_SETTING_ADDRESSES; + link_set_state(link, LINK_STATE_SETTING_ADDRESSES); LIST_FOREACH(addresses, ad, link->network->static_addresses) { r = address_configure(ad, link, &address_handler); @@ -1153,7 +1163,7 @@ static int link_enter_join_netdev(Link *link) { assert(link->network); assert(link->state == LINK_STATE_PENDING); - link->state = LINK_STATE_ENSLAVING; + link_set_state(link, LINK_STATE_ENSLAVING); link_save(link); @@ -1724,7 +1734,7 @@ int link_update(Link *link, sd_rtnl_message *m) { if (link->state == LINK_STATE_LINGER) { link_ref(link); log_link_info(link, "link readded"); - link->state = LINK_STATE_ENSLAVING; + link_set_state(link, LINK_STATE_ENSLAVING); } r = sd_rtnl_message_read_string(m, IFLA_IFNAME, &ifname); @@ -1843,11 +1853,11 @@ int link_update(Link *link, sd_rtnl_message *m) { } static void link_update_operstate(Link *link) { - + LinkOperationalState operstate; assert(link); if (link->kernel_operstate == IF_OPER_DORMANT) - link->operstate = LINK_OPERSTATE_DORMANT; + operstate = LINK_OPERSTATE_DORMANT; else if (link_has_carrier(link)) { Address *address; uint8_t scope = RT_SCOPE_NOWHERE; @@ -1863,17 +1873,22 @@ static void link_update_operstate(Link *link) { if (scope < RT_SCOPE_SITE) /* universally accessible addresses found */ - link->operstate = LINK_OPERSTATE_ROUTABLE; + operstate = LINK_OPERSTATE_ROUTABLE; else if (scope < RT_SCOPE_HOST) /* only link or site local addresses found */ - link->operstate = LINK_OPERSTATE_DEGRADED; + operstate = LINK_OPERSTATE_DEGRADED; else /* no useful addresses found */ - link->operstate = LINK_OPERSTATE_CARRIER; + operstate = LINK_OPERSTATE_CARRIER; } else if (link->flags & IFF_UP) - link->operstate = LINK_OPERSTATE_NO_CARRIER; + operstate = LINK_OPERSTATE_NO_CARRIER; else - link->operstate = LINK_OPERSTATE_OFF; + operstate = LINK_OPERSTATE_OFF; + + if (link->operstate != operstate) { + link->operstate = operstate; + link_send_changed(link, "OperationalState", NULL); + } } int link_save(Link *link) {