summaryrefslogtreecommitdiff
path: root/src/conf_mode
diff options
context:
space:
mode:
authorViacheslav Hletenko <v.gletenko@vyos.io>2026-06-23 13:33:21 +0300
committerGitHub <noreply@github.com>2026-06-23 13:33:21 +0300
commitd935b5a83b0fa81e3fc9d727cedbda7575f60d85 (patch)
tree6e4dc71ec908c24130c2ac17a0f72e586992218d /src/conf_mode
parent02f8c17a56518157e48048fb39b69f373ee9c829 (diff)
parent50ffc690fdeaaa30a9f353bc76fe87d748cc2e58 (diff)
downloadvyos-1x-d935b5a83b0fa81e3fc9d727cedbda7575f60d85.tar.gz
vyos-1x-d935b5a83b0fa81e3fc9d727cedbda7575f60d85.zip
Merge pull request #5220 from opswill/current
qos: T7965: Fix qos fails to reapply on dynamic interfaces after reconnection
Diffstat (limited to 'src/conf_mode')
-rwxr-xr-xsrc/conf_mode/qos.py43
1 files changed, 28 insertions, 15 deletions
diff --git a/src/conf_mode/qos.py b/src/conf_mode/qos.py
index e31c6b931..1e6797c60 100755
--- a/src/conf_mode/qos.py
+++ b/src/conf_mode/qos.py
@@ -349,6 +349,32 @@ def generate(qos):
return None
+def apply_interface(qos, ifname):
+ """ Clear and re-apply QoS for a single interface only. """
+ run(f'tc qdisc del dev {ifname} parent ffff:')
+ run(f'tc qdisc del dev {ifname} root')
+
+ if not qos or 'interface' not in qos or ifname not in qos['interface']:
+ return None
+
+ interface_config = qos['interface'][ifname]
+ if not verify_interface_exists(qos, ifname, state_required=True, warning_only=True):
+ # When shaper is bound to a dialup (e.g. PPPoE) interface it is
+ # possible that it is yet not available when the QoS code runs.
+ # Skip the configuration and inform the user via warning_only=True
+ return None
+
+ for direction in ['egress', 'ingress']:
+ # bail out early if shaper for given direction is not used at all
+ if direction not in interface_config:
+ continue
+
+ shaper_type, shaper_config = get_shaper(qos, interface_config, direction)
+ shaper_type(ifname).update(shaper_config, direction)
+
+ return None
+
+
def apply(qos):
# Always delete "old" shapers first
for interface in interfaces():
@@ -361,21 +387,8 @@ def apply(qos):
if not qos or 'interface' not in qos:
return None
- for interface, interface_config in qos['interface'].items():
- if not verify_interface_exists(qos, interface, state_required=True, warning_only=True):
- # When shaper is bound to a dialup (e.g. PPPoE) interface it is
- # possible that it is yet not available when to QoS code runs.
- # Skip the configuration and inform the user via warning_only=True
- continue
-
- for direction in ['egress', 'ingress']:
- # bail out early if shaper for given direction is not used at all
- if direction not in interface_config:
- continue
-
- shaper_type, shaper_config = get_shaper(qos, interface_config, direction)
- tmp = shaper_type(interface)
- tmp.update(shaper_config, direction)
+ for ifname in qos['interface']:
+ apply_interface(qos, ifname)
return None