summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--man/networkctl.xml11
-rw-r--r--src/libsystemd/sd-network/network-util.c15
-rw-r--r--src/libsystemd/sd-network/network-util.h1
-rw-r--r--src/network/networkctl.c4
-rw-r--r--src/network/networkd-link.c7
-rwxr-xr-xtest/test-network/systemd-networkd-tests.py4
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)