diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2019-03-05 14:41:56 +0900 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2019-03-13 14:29:00 +0900 |
commit | c9cc03834369abfb91fba76fbb26a2e97d3fa9ad (patch) | |
tree | 0ff2cc60dfd46c76a8dd486f904d38d9b6ac405c | |
parent | 2cd6b9326c3555c4af6645beaa05ab482aff2e21 (diff) | |
download | systemd-c9cc03834369abfb91fba76fbb26a2e97d3fa9ad.tar.gz |
network: introduce 'degraded-carrier' operstate to order all states
Previously, 'degraded' state is ambiguous for bonding or bridge master:
1. one or more slave interfaces does not have carrier,
2. no link local address is assigned to the master,
3. combination of the above two.
This makes the above case 1 and 3 are in the new 'degraded-carrier'
state, and makes 'degraded' state as all slaves are active but no
link local address on master.
-rw-r--r-- | man/networkctl.xml | 11 | ||||
-rw-r--r-- | src/libsystemd/sd-network/network-util.c | 15 | ||||
-rw-r--r-- | src/libsystemd/sd-network/network-util.h | 1 | ||||
-rw-r--r-- | src/network/networkctl.c | 4 | ||||
-rw-r--r-- | src/network/networkd-link.c | 7 | ||||
-rwxr-xr-x | test/test-network/systemd-networkd-tests.py | 4 |
6 files changed, 24 insertions, 18 deletions
diff --git a/man/networkctl.xml b/man/networkctl.xml index 1fc94d7eda..c513d9542a 100644 --- a/man/networkctl.xml +++ b/man/networkctl.xml @@ -116,6 +116,13 @@ </listitem> </varlistentry> <varlistentry> + <term>degraded-carrier</term> + <listitem> + <para>for bond or bridge master, one of the bonding or bridge slave network interfaces is + in off, no-carrier, or dormant state</para> + </listitem> + </varlistentry> + <varlistentry> <term>carrier</term> <listitem> <para>the link has a carrier, or for bond or bridge master, all bonding or bridge slave @@ -125,9 +132,7 @@ <varlistentry> <term>degraded</term> <listitem> - <para>the link has carrier and addresses valid on the local link configured, or for bond - or bridge master, one of the bonding or bridge slave network interfaces is in off, - no-carrier, or dormant</para> + <para>the link has carrier and addresses valid on the local link configured</para> </listitem> </varlistentry> <varlistentry> diff --git a/src/libsystemd/sd-network/network-util.c b/src/libsystemd/sd-network/network-util.c index 86e9b1a751..f46a3ff788 100644 --- a/src/libsystemd/sd-network/network-util.c +++ b/src/libsystemd/sd-network/network-util.c @@ -21,13 +21,14 @@ bool network_is_online(void) { } static const char* const link_operstate_table[_LINK_OPERSTATE_MAX] = { - [LINK_OPERSTATE_OFF] = "off", - [LINK_OPERSTATE_NO_CARRIER] = "no-carrier", - [LINK_OPERSTATE_DORMANT] = "dormant", - [LINK_OPERSTATE_CARRIER] = "carrier", - [LINK_OPERSTATE_DEGRADED] = "degraded", - [LINK_OPERSTATE_ENSLAVED] = "enslaved", - [LINK_OPERSTATE_ROUTABLE] = "routable", + [LINK_OPERSTATE_OFF] = "off", + [LINK_OPERSTATE_NO_CARRIER] = "no-carrier", + [LINK_OPERSTATE_DORMANT] = "dormant", + [LINK_OPERSTATE_DEGRADED_CARRIER] = "degraded-carrier", + [LINK_OPERSTATE_CARRIER] = "carrier", + [LINK_OPERSTATE_DEGRADED] = "degraded", + [LINK_OPERSTATE_ENSLAVED] = "enslaved", + [LINK_OPERSTATE_ROUTABLE] = "routable", }; DEFINE_STRING_TABLE_LOOKUP(link_operstate, LinkOperationalState); diff --git a/src/libsystemd/sd-network/network-util.h b/src/libsystemd/sd-network/network-util.h index 82a16b092e..6936fd536b 100644 --- a/src/libsystemd/sd-network/network-util.h +++ b/src/libsystemd/sd-network/network-util.h @@ -11,6 +11,7 @@ typedef enum LinkOperationalState { LINK_OPERSTATE_OFF, LINK_OPERSTATE_NO_CARRIER, LINK_OPERSTATE_DORMANT, + LINK_OPERSTATE_DEGRADED_CARRIER, LINK_OPERSTATE_CARRIER, LINK_OPERSTATE_DEGRADED, LINK_OPERSTATE_ENSLAVED, diff --git a/src/network/networkctl.c b/src/network/networkctl.c index 2803f5210b..9452dabcde 100644 --- a/src/network/networkctl.c +++ b/src/network/networkctl.c @@ -213,7 +213,7 @@ static int list_links(int argc, char *argv[], void *userdata) { (void) pager_open(arg_pager_flags); if (arg_legend) - printf("%3s %-16s %-18s %-11s %-10s\n", + printf("%3s %-16s %-18s %-16s %-10s\n", "IDX", "LINK", "TYPE", @@ -241,7 +241,7 @@ static int list_links(int argc, char *argv[], void *userdata) { t = link_get_type_string(links[i].iftype, d); - printf("%3i %-16s %-18s %s%-11s%s %s%-10s%s\n", + printf("%3i %-16s %-18s %s%-16s%s %s%-10s%s\n", links[i].ifindex, links[i].name, strna(t), on_color_operational, strna(operational_state), off_color_operational, on_color_setup, strna(setup_state), off_color_setup); diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 6704c5d8a8..9a4ba7a93a 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -407,15 +407,14 @@ void link_update_operstate(Link *link, bool also_update_master) { link_is_enslaved(link)) operstate = LINK_OPERSTATE_ENSLAVED; - if (IN_SET(operstate, LINK_OPERSTATE_CARRIER, LINK_OPERSTATE_ENSLAVED, LINK_OPERSTATE_ROUTABLE)) { + if (operstate >= LINK_OPERSTATE_CARRIER) { Link *slave; HASHMAP_FOREACH(slave, link->slaves, i) { link_update_operstate(slave, false); - if (IN_SET(slave->operstate, - LINK_OPERSTATE_OFF, LINK_OPERSTATE_NO_CARRIER, LINK_OPERSTATE_DORMANT)) - operstate = LINK_OPERSTATE_DEGRADED; + if (slave->operstate < LINK_OPERSTATE_CARRIER) + operstate = LINK_OPERSTATE_DEGRADED_CARRIER; } } diff --git a/test/test-network/systemd-networkd-tests.py b/test/test-network/systemd-networkd-tests.py index eaf57cb540..1614af29b0 100755 --- a/test/test-network/systemd-networkd-tests.py +++ b/test/test-network/systemd-networkd-tests.py @@ -1200,7 +1200,7 @@ class NetworkdNetWorkBondTests(unittest.TestCase, Utilities): output = subprocess.check_output(['networkctl', 'status', 'bond99']).rstrip().decode('utf-8') print(output) - self.assertRegex(output, 'State: degraded \(configured\)') + self.assertRegex(output, 'State: degraded-carrier \(configured\)') self.assertEqual(subprocess.call(['ip', 'link', 'set', 'dummy98', 'up']), 0) time.sleep(2) @@ -1313,7 +1313,7 @@ class NetworkdNetWorkBridgeTests(unittest.TestCase, Utilities): time.sleep(3) output = subprocess.check_output(['networkctl', 'status', 'bridge99']).rstrip().decode('utf-8') - self.assertRegex(output, 'State: degraded \(configured\)') + self.assertRegex(output, 'State: degraded-carrier \(configured\)') self.assertEqual(subprocess.call(['ip', 'link', 'del', 'dummy98']), 0) time.sleep(3) |