diff options
Diffstat (limited to 'src/network/networkd-link.c')
-rw-r--r-- | src/network/networkd-link.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 906267764e..91de2be61f 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -43,6 +43,7 @@ #include "tmpfile-util.h" #include "udev-util.h" #include "util.h" +#include "tc/qdisc.h" #include "virt.h" uint32_t link_get_vrf_table(Link *link) { @@ -1094,6 +1095,9 @@ void link_check_ready(Link *link) { if (!link->routing_policy_rules_configured) return; + if (!link->qdiscs_configured) + return; + if (link_has_carrier(link) || !link->network->configure_without_carrier) { if (link_ipv4ll_enabled(link, ADDRESS_FAMILY_IPV4) && !link->ipv4ll_address) @@ -2580,6 +2584,28 @@ static int link_drop_config(Link *link) { return 0; } +static int link_configure_qdiscs(Link *link) { + QDiscs *qdisc; + Iterator i; + int r; + + link->qdiscs_configured = false; + link->qdisc_messages = 0; + + ORDERED_HASHMAP_FOREACH(qdisc, link->network->qdiscs_by_section, i) { + r = qdisc_configure(link, qdisc); + if (r < 0) + return r; + } + + if (link->qdisc_messages == 0) + link->qdiscs_configured = true; + else + log_link_debug(link, "Configuring QDiscs"); + + return 0; +} + static int link_configure(Link *link) { int r; @@ -2587,6 +2613,10 @@ static int link_configure(Link *link) { assert(link->network); assert(link->state == LINK_STATE_INITIALIZED); + r = link_configure_qdiscs(link); + if (r < 0) + return r; + if (link->iftype == ARPHRD_CAN) return link_configure_can(link); |