addons: Allow to set max value in --set-ring option

This makes some automation cases much easier

```
auto eth0
iface eth0 inet dhcp
  ring-rx max
  ring-tx max

Ring parameters for eth0:
Pre-set maximums:
RX:		4096
RX Mini:	n/a
RX Jumbo:	n/a
TX:		4096
Current hardware settings:
RX:		4096
RX Mini:	n/a
RX Jumbo:	n/a
TX:		4096
```

Signed-off-by: tomvil <tomas.vilemaitis@gmail.com>
This commit is contained in:
tomvil 2023-04-11 15:07:41 +03:00
parent 5876ad8a0e
commit 70bd0e86e7

View File

@ -120,13 +120,13 @@ class ethtool(Addon, moduleBase):
'ring-rx': { 'ring-rx': {
'help': 'Ring RX Parameter', 'help': 'Ring RX Parameter',
'example': ['ring-rx 512'], 'example': ['ring-rx 512'],
'validvals': ['<number>'], 'validvals': ['max', '<number>'],
'default': 'varies by interface' 'default': 'varies by interface'
}, },
'ring-tx': { 'ring-tx': {
'help': 'Ring TX Parameter', 'help': 'Ring TX Parameter',
'example': ['ring-tx 512'], 'example': ['ring-tx 512'],
'validvals': ['<number>'], 'validvals': ['max', '<number>'],
'default': 'varies by interface' 'default': 'varies by interface'
}, },
} }
@ -155,30 +155,31 @@ class ethtool(Addon, moduleBase):
ifname=ifaceobj.name, ifname=ifaceobj.name,
attr=attr_name) attr=attr_name)
# If ring options are not set, do nothing # Check which variable to use, config_val > default_val. If none are set, return.
if not config_val and not default_val: value = config_val or default_val
if not value:
return return
if value == "max":
# Get the maximum value for the specified attribute
max_val = self.get_max_attr(attr_name, ifaceobj)
if not max_val:
return
value = max_val
# Get the current running value # Get the current running value
running_val = self.get_running_attr(attr_name, ifaceobj) running_val = self.get_running_attr(attr_name, ifaceobj)
# If the configuration value is the same as the running value, do nothing
if config_val and config_val == running_val:
return
# If the configuration value is not set and the default value is the same as the running value, do nothing # If the value is the same as the running value, do nothing
if not config_val and (default_val and default_val == running_val): if value == running_val:
return return
# Generate the ethtool command # Generate the ethtool command
if config_val:
cmd = ('%s --set-ring %s %s %s' % cmd = ('%s --set-ring %s %s %s' %
(utils.ethtool_cmd, ifaceobj.name, option, config_val)) (utils.ethtool_cmd, ifaceobj.name, option, value))
elif default_val:
cmd = ('%s --set-ring %s %s %s' %
(utils.ethtool_cmd, ifaceobj.name, option, default_val))
# Execute the ethtool command # Execute the ethtool command if command is generated
if cmd: if cmd:
try: try:
utils.exec_command(cmd) utils.exec_command(cmd)
@ -487,74 +488,78 @@ class ethtool(Addon, moduleBase):
return value return value
def get_ring_setting(self, ethtool_output, setting): def get_ring_setting(self, ethtool_output, setting, get_ring_max=False):
value = None value = None
current_settings = ethtool_output.split('Current hardware settings:', 1)[1]
for line in current_settings.splitlines(): if get_ring_max:
settings = ethtool_output.split('Current hardware settings:', 1)[0]
else:
settings = ethtool_output.split('Current hardware settings:', 1)[1]
for line in settings.splitlines():
if line.startswith(setting): if line.startswith(setting):
value = line.split(':', 1)[1] value = line.split(':', 1)[1]
return value.strip() return value.strip()
return value return value
def get_running_attr(self,attr='',ifaceobj=None): def get_attr_value(self,attr='',ifaceobj=None,get_max=False):
if not ifaceobj or not attr: if not ifaceobj or not attr:
return return
running_attr = None attr_value = None
try: try:
if attr == 'autoneg': if attr == 'autoneg':
output = utils.exec_commandl([utils.ethtool_cmd, ifaceobj.name]) output = utils.exec_commandl([utils.ethtool_cmd, ifaceobj.name])
running_attr = self.get_autoneg(ethtool_output=output) attr_value = self.get_autoneg(ethtool_output=output)
elif attr == 'ring-rx': elif attr == 'ring-rx':
output = utils.exec_command('%s --show-ring %s'% output = utils.exec_command('%s --show-ring %s'%
(utils.ethtool_cmd, ifaceobj.name)) (utils.ethtool_cmd, ifaceobj.name))
running_attr = self.get_ring_setting(ethtool_output=output, setting='RX:') attr_value = self.get_ring_setting(ethtool_output=output, setting='RX:', get_ring_max=get_max)
elif attr == 'ring-tx': elif attr == 'ring-tx':
output = utils.exec_command('%s --show-ring %s'% output = utils.exec_command('%s --show-ring %s'%
(utils.ethtool_cmd, ifaceobj.name)) (utils.ethtool_cmd, ifaceobj.name))
running_attr = self.get_ring_setting(ethtool_output=output, setting='TX:') attr_value = self.get_ring_setting(ethtool_output=output, setting='TX:', get_ring_max=get_max)
elif attr == 'fec': elif attr == 'fec':
output = utils.exec_command('%s --show-fec %s'% output = utils.exec_command('%s --show-fec %s'%
(utils.ethtool_cmd, ifaceobj.name)) (utils.ethtool_cmd, ifaceobj.name))
running_attr = self.get_fec_encoding(ethtool_output=output) attr_value = self.get_fec_encoding(ethtool_output=output)
elif attr == 'gro': elif attr == 'gro':
if not self.feature_cache: if not self.feature_cache:
self.feature_cache = utils.exec_command('%s --show-features %s'% self.feature_cache = utils.exec_command('%s --show-features %s'%
(utils.ethtool_cmd, ifaceobj.name)) (utils.ethtool_cmd, ifaceobj.name))
running_attr = self.get_offload_setting(ethtool_output=self.feature_cache, setting='generic-receive-offload') attr_value = self.get_offload_setting(ethtool_output=self.feature_cache, setting='generic-receive-offload')
elif attr == 'lro': elif attr == 'lro':
if not self.feature_cache: if not self.feature_cache:
self.feature_cache = utils.exec_command('%s --show-features %s'% self.feature_cache = utils.exec_command('%s --show-features %s'%
(utils.ethtool_cmd, ifaceobj.name)) (utils.ethtool_cmd, ifaceobj.name))
running_attr = self.get_offload_setting(ethtool_output=self.feature_cache, setting='large-receive-offload') attr_value = self.get_offload_setting(ethtool_output=self.feature_cache, setting='large-receive-offload')
elif attr == 'gso': elif attr == 'gso':
if not self.feature_cache: if not self.feature_cache:
self.feature_cache = utils.exec_command('%s --show-features %s'% self.feature_cache = utils.exec_command('%s --show-features %s'%
(utils.ethtool_cmd, ifaceobj.name)) (utils.ethtool_cmd, ifaceobj.name))
running_attr = self.get_offload_setting(ethtool_output=self.feature_cache, setting='generic-segmentation-offload') attr_value = self.get_offload_setting(ethtool_output=self.feature_cache, setting='generic-segmentation-offload')
elif attr == 'tso': elif attr == 'tso':
if not self.feature_cache: if not self.feature_cache:
self.feature_cache = utils.exec_command('%s --show-features %s'% self.feature_cache = utils.exec_command('%s --show-features %s'%
(utils.ethtool_cmd, ifaceobj.name)) (utils.ethtool_cmd, ifaceobj.name))
running_attr = self.get_offload_setting(ethtool_output=self.feature_cache, setting='tcp-segmentation-offload') attr_value = self.get_offload_setting(ethtool_output=self.feature_cache, setting='tcp-segmentation-offload')
elif attr == 'ufo': elif attr == 'ufo':
if not self.feature_cache: if not self.feature_cache:
self.feature_cache = utils.exec_command('%s --show-features %s'% self.feature_cache = utils.exec_command('%s --show-features %s'%
(utils.ethtool_cmd, ifaceobj.name)) (utils.ethtool_cmd, ifaceobj.name))
running_attr = self.get_offload_setting(ethtool_output=self.feature_cache, setting='udp-fragmentation-offload') attr_value = self.get_offload_setting(ethtool_output=self.feature_cache, setting='udp-fragmentation-offload')
elif attr == 'rx': elif attr == 'rx':
if not self.feature_cache: if not self.feature_cache:
self.feature_cache = utils.exec_command('%s --show-features %s'% self.feature_cache = utils.exec_command('%s --show-features %s'%
(utils.ethtool_cmd, ifaceobj.name)) (utils.ethtool_cmd, ifaceobj.name))
running_attr = self.get_offload_setting(ethtool_output=self.feature_cache, setting='rx-checksumming') attr_value = self.get_offload_setting(ethtool_output=self.feature_cache, setting='rx-checksumming')
elif attr == 'tx': elif attr == 'tx':
if not self.feature_cache: if not self.feature_cache:
self.feature_cache = utils.exec_command('%s --show-features %s'% self.feature_cache = utils.exec_command('%s --show-features %s'%
(utils.ethtool_cmd, ifaceobj.name)) (utils.ethtool_cmd, ifaceobj.name))
running_attr = self.get_offload_setting(ethtool_output=self.feature_cache, setting='tx-checksumming') attr_value = self.get_offload_setting(ethtool_output=self.feature_cache, setting='tx-checksumming')
else: else:
running_attr = self.io.read_file_oneline('/sys/class/net/%s/%s' % \ attr_value = self.io.read_file_oneline('/sys/class/net/%s/%s' % \
(ifaceobj.name, attr)) (ifaceobj.name, attr))
except Exception as e: except Exception as e:
if not self.ethtool_ignore_errors: if not self.ethtool_ignore_errors:
@ -562,8 +567,13 @@ class ethtool(Addon, moduleBase):
self.logger.debug('ethtool: problems calling ethtool or reading' self.logger.debug('ethtool: problems calling ethtool or reading'
' /sys/class on iface %s for attr %s: %s' % ' /sys/class on iface %s for attr %s: %s' %
(ifaceobj.name, attr, str(e))) (ifaceobj.name, attr, str(e)))
return running_attr return attr_value
def get_running_attr(self,attr='',ifaceobj=None):
return self.get_attr_value(attr=attr, ifaceobj=ifaceobj, get_max=False)
def get_max_attr(self,attr='',ifaceobj=None):
return self.get_attr_value(attr=attr, ifaceobj=ifaceobj, get_max=True)
def _query_running(self, ifaceobj, ifaceobj_getfunc=None): def _query_running(self, ifaceobj, ifaceobj_getfunc=None):
""" """