Merge pull request #12762 from yuwata/network-introduce-carrier-and-network-state-12752

network: introduce carrier and address state to fix network_is_online()
This commit is contained in:
Lennart Poettering
2019-06-20 13:36:30 +02:00
committed by GitHub
13 changed files with 271 additions and 79 deletions
+27 -3
View File
@@ -7,14 +7,19 @@
#include "strv.h"
bool network_is_online(void) {
_cleanup_free_ char *state = NULL;
_cleanup_free_ char *carrier_state = NULL, *addr_state = NULL;
int r;
r = sd_network_get_operational_state(&state);
r = sd_network_get_carrier_state(&carrier_state);
if (r < 0) /* if we don't know anything, we consider the system online */
return true;
if (STR_IN_SET(state, "routable", "degraded"))
r = sd_network_get_address_state(&addr_state);
if (r < 0) /* if we don't know anything, we consider the system online */
return true;
if (STR_IN_SET(carrier_state, "degraded-carrier", "carrier") &&
STR_IN_SET(addr_state, "routable", "degraded"))
return true;
return false;
@@ -32,3 +37,22 @@ static const char* const link_operstate_table[_LINK_OPERSTATE_MAX] = {
};
DEFINE_STRING_TABLE_LOOKUP(link_operstate, LinkOperationalState);
static const char* const link_carrier_state_table[_LINK_CARRIER_STATE_MAX] = {
[LINK_CARRIER_STATE_OFF] = "off",
[LINK_CARRIER_STATE_NO_CARRIER] = "no-carrier",
[LINK_CARRIER_STATE_DORMANT] = "dormant",
[LINK_CARRIER_STATE_DEGRADED_CARRIER] = "degraded-carrier",
[LINK_CARRIER_STATE_CARRIER] = "carrier",
[LINK_CARRIER_STATE_ENSLAVED] = "enslaved",
};
DEFINE_STRING_TABLE_LOOKUP(link_carrier_state, LinkCarrierState);
static const char* const link_address_state_table[_LINK_ADDRESS_STATE_MAX] = {
[LINK_ADDRESS_STATE_OFF] = "off",
[LINK_ADDRESS_STATE_DEGRADED] = "degraded",
[LINK_ADDRESS_STATE_ROUTABLE] = "routable",
};
DEFINE_STRING_TABLE_LOOKUP(link_address_state, LinkAddressState);
+25
View File
@@ -20,5 +20,30 @@ typedef enum LinkOperationalState {
_LINK_OPERSTATE_INVALID = -1
} LinkOperationalState;
typedef enum LinkCarrierState {
LINK_CARRIER_STATE_OFF = LINK_OPERSTATE_OFF,
LINK_CARRIER_STATE_NO_CARRIER = LINK_OPERSTATE_NO_CARRIER,
LINK_CARRIER_STATE_DORMANT = LINK_OPERSTATE_DORMANT,
LINK_CARRIER_STATE_DEGRADED_CARRIER = LINK_OPERSTATE_DEGRADED_CARRIER,
LINK_CARRIER_STATE_CARRIER = LINK_OPERSTATE_CARRIER,
LINK_CARRIER_STATE_ENSLAVED = LINK_OPERSTATE_ENSLAVED,
_LINK_CARRIER_STATE_MAX,
_LINK_CARRIER_STATE_INVALID = -1
} LinkCarrierState;
typedef enum LinkAddressState {
LINK_ADDRESS_STATE_OFF,
LINK_ADDRESS_STATE_DEGRADED,
LINK_ADDRESS_STATE_ROUTABLE,
_LINK_ADDRESS_STATE_MAX,
_LINK_ADDRESS_STATE_INVALID = -1
} LinkAddressState;
const char* link_operstate_to_string(LinkOperationalState s) _const_;
LinkOperationalState link_operstate_from_string(const char *s) _pure_;
const char* link_carrier_state_to_string(LinkCarrierState s) _const_;
LinkCarrierState link_carrier_state_from_string(const char *s) _pure_;
const char* link_address_state_to_string(LinkAddressState s) _const_;
LinkAddressState link_address_state_from_string(const char *s) _pure_;
+24 -4
View File
@@ -18,13 +18,13 @@
#include "strv.h"
#include "util.h"
_public_ int sd_network_get_operational_state(char **state) {
static int network_get_string(const char *field, char **ret) {
_cleanup_free_ char *s = NULL;
int r;
assert_return(state, -EINVAL);
assert_return(ret, -EINVAL);
r = parse_env_file(NULL, "/run/systemd/netif/state", "OPER_STATE", &s);
r = parse_env_file(NULL, "/run/systemd/netif/state", field, &s);
if (r == -ENOENT)
return -ENODATA;
if (r < 0)
@@ -32,11 +32,23 @@ _public_ int sd_network_get_operational_state(char **state) {
if (isempty(s))
return -ENODATA;
*state = TAKE_PTR(s);
*ret = TAKE_PTR(s);
return 0;
}
_public_ int sd_network_get_operational_state(char **state) {
return network_get_string("OPER_STATE", state);
}
_public_ int sd_network_get_carrier_state(char **state) {
return network_get_string("CARRIER_STATE", state);
}
_public_ int sd_network_get_address_state(char **state) {
return network_get_string("ADDRESS_STATE", state);
}
static int network_get_strv(const char *key, char ***ret) {
_cleanup_strv_free_ char **a = NULL;
_cleanup_free_ char *s = NULL;
@@ -149,6 +161,14 @@ _public_ int sd_network_link_get_operational_state(int ifindex, char **state) {
return network_link_get_string(ifindex, "OPER_STATE", state);
}
_public_ int sd_network_link_get_carrier_state(int ifindex, char **state) {
return network_link_get_string(ifindex, "CARRIER_STATE", state);
}
_public_ int sd_network_link_get_address_state(int ifindex, char **state) {
return network_link_get_string(ifindex, "ADDRESS_STATE", state);
}
_public_ int sd_network_link_get_required_for_online(int ifindex) {
_cleanup_free_ char *s = NULL;
int r;