cake traffic shaping

This commit is contained in:
CroneKorkN 2025-07-10 20:39:24 +02:00
parent 9a519432b0
commit 3e5ed906bc
Signed by: cronekorkn
SSH key fingerprint: SHA256:v0410ZKfuO1QHdgKBsdQNF64xmTxOF8osF1LIqwTcVw
5 changed files with 57 additions and 1 deletions

16
bundles/network/items.py Normal file
View file

@ -0,0 +1,16 @@
for network_name, network_conf in node.metadata.get('network').items():
if 'qdisc' in network_conf:
svc_systemd[f'qdisc-{network_name}.service'] = {
'enabled': True,
'running': None,
}
actions[f'qdisc-{network_name}.service_restart_workaround'] = {
'command': 'true',
'triggered': True,
'triggered_by': {
f'file:/usr/local/lib/systemd/system/qdisc-{network_name}.service',
},
'triggers': {
f'svc_systemd:qdisc-{network_name}.service:restart',
},
}

View file

@ -94,6 +94,11 @@ def units(metadata):
}
}
# cake WIP
# if 'cake' in network_conf:
# units[f'{network_name}.network']['CAKE'] = network_conf['cake']
return {
'systemd': {
'units': units,
@ -101,3 +106,35 @@ def units(metadata):
}
else:
return {}
@metadata_reactor.provides(
'systemd/units',
)
def queuing_disciplines(metadata):
if node.has_bundle('systemd-networkd'):
return {
'systemd': {
'units': {
f'qdisc-{network_name}.service': {
'Unit': {
'Description': f'setup queuing discipline for interface {network_name}',
'Wants': 'network.target',
'After': 'network.target',
'BindsTo': 'network.target',
},
'Service': {
'Type': 'oneshot',
'ExecStart': f'/sbin/tc qdisc replace root dev {network_name} {network_conf["qdisc"]}',
},
'Install': {
'WantedBy': 'network-online.target',
},
}
for network_name, network_conf in metadata.get('network').items()
if 'qdisc' in network_conf
},
},
}
else:
return {}

View file

@ -8,4 +8,5 @@ examples
```sh
nft add rule inet filter input tcp dport 5201 accept
nft add rule inet filter input udp dport 5201 accept
```

View file

@ -26,7 +26,8 @@ def units(metadata):
type = name.split('.')[-1]
if type == 'service':
units.setdefault(name, {}).setdefault('Install', {}).setdefault('WantedBy', {'multi-user.target'})
if not config.get('Install', {}).get('WantedBy', set()):
units.setdefault(name, {}).setdefault('Install', {}).setdefault('WantedBy', {'multi-user.target'})
elif type == 'timer':
units.setdefault(name, {}).setdefault('Install', {}).setdefault('WantedBy', {'timers.target'})
elif type == 'mount':

View file

@ -33,6 +33,7 @@
'id': 3,
'ipv4': '10.0.99.126/24',
'gateway4': '10.0.99.1',
'qdisc': 'cake bandwidth 40Mbit diffserv4',
},
'proxmox': {
'type': 'vlan',