cake traffic shaping
This commit is contained in:
parent
9a519432b0
commit
3e5ed906bc
5 changed files with 57 additions and 1 deletions
16
bundles/network/items.py
Normal file
16
bundles/network/items.py
Normal 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',
|
||||||
|
},
|
||||||
|
}
|
|
@ -94,6 +94,11 @@ def units(metadata):
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# cake WIP
|
||||||
|
|
||||||
|
# if 'cake' in network_conf:
|
||||||
|
# units[f'{network_name}.network']['CAKE'] = network_conf['cake']
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'systemd': {
|
'systemd': {
|
||||||
'units': units,
|
'units': units,
|
||||||
|
@ -101,3 +106,35 @@ def units(metadata):
|
||||||
}
|
}
|
||||||
else:
|
else:
|
||||||
return {}
|
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 {}
|
||||||
|
|
|
@ -8,4 +8,5 @@ examples
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
nft add rule inet filter input tcp dport 5201 accept
|
nft add rule inet filter input tcp dport 5201 accept
|
||||||
|
nft add rule inet filter input udp dport 5201 accept
|
||||||
```
|
```
|
||||||
|
|
|
@ -26,7 +26,8 @@ def units(metadata):
|
||||||
type = name.split('.')[-1]
|
type = name.split('.')[-1]
|
||||||
|
|
||||||
if type == 'service':
|
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':
|
elif type == 'timer':
|
||||||
units.setdefault(name, {}).setdefault('Install', {}).setdefault('WantedBy', {'timers.target'})
|
units.setdefault(name, {}).setdefault('Install', {}).setdefault('WantedBy', {'timers.target'})
|
||||||
elif type == 'mount':
|
elif type == 'mount':
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
'id': 3,
|
'id': 3,
|
||||||
'ipv4': '10.0.99.126/24',
|
'ipv4': '10.0.99.126/24',
|
||||||
'gateway4': '10.0.99.1',
|
'gateway4': '10.0.99.1',
|
||||||
|
'qdisc': 'cake bandwidth 40Mbit diffserv4',
|
||||||
},
|
},
|
||||||
'proxmox': {
|
'proxmox': {
|
||||||
'type': 'vlan',
|
'type': 'vlan',
|
||||||
|
|
Loading…
Reference in a new issue