summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorOleksandr Kuchmystyi <o.kuchmystyi@vyos.io>2026-02-16 17:41:38 +0300
committerOleksandr Kuchmystyi <o.kuchmystyi@vyos.io>2026-02-18 13:30:02 +0300
commited20c353e8e1a7fd9d47bb6020f40815285ef2f9 (patch)
tree682994117719758c842b6b265cc4b054e5ad5797 /src
parent0f4b6c0d892ea35c947643ab8d6e0f84e51c6191 (diff)
downloadvyos-1x-ed20c353e8e1a7fd9d47bb6020f40815285ef2f9.tar.gz
vyos-1x-ed20c353e8e1a7fd9d47bb6020f40815285ef2f9.zip
vpp: T8266: Add global `interfaces-rx-mode` setting and remove per-interface commands
Add `set vpp settings interfaces-rx-mode <polling|interrupt|adaptive>` to configure RX mode for all interfaces. Raise error if any interface does not support the selected mode. Also remove per-interface rx-mode commands: - `set vpp settings interface <name> rx-mode` - `set vpp kernel-interfaces <name> rx-mode`
Diffstat (limited to 'src')
-rwxr-xr-xsrc/conf_mode/vpp.py12
-rw-r--r--src/conf_mode/vpp_kernel-interfaces.py13
-rw-r--r--src/migration-scripts/vpp/7-to-850
3 files changed, 71 insertions, 4 deletions
diff --git a/src/conf_mode/vpp.py b/src/conf_mode/vpp.py
index c961132d8..08eba8a45 100755
--- a/src/conf_mode/vpp.py
+++ b/src/conf_mode/vpp.py
@@ -334,6 +334,8 @@ def get_config(config=None):
if 'settings' in config:
if 'interface' in config['settings']:
+ interface_rx_mode = config['settings'].get('interface_rx_mode')
+
for iface, iface_config in config['settings']['interface'].items():
iface_config['driver'] = 'dpdk'
@@ -400,7 +402,7 @@ def get_config(config=None):
if 'zero-copy' in iface_config['xdp_options']:
xdp_api_params['mode'] = 'zero-copy'
if (
- iface_config.get('rx_mode') in ('interrupt', 'adaptive')
+ interface_rx_mode in ('interrupt', 'adaptive')
and int(config['settings']['resource_allocation']['cpu_cores'])
> 1
):
@@ -524,6 +526,8 @@ def verify(config):
# Check if available memory is enough for current VPP config
verify_vpp_memory(config)
+ interface_rx_mode = config['settings'].get('interface_rx_mode')
+
# ensure DPDK/XDP settings are properly configured
for iface, iface_config in config['settings']['interface'].items():
# check if selected driver is supported, but only for new interfaces
@@ -570,7 +574,7 @@ def verify(config):
)
# RX-mode verification
- rx_mode = iface_config.get('rx_mode')
+ rx_mode = interface_rx_mode
if rx_mode and rx_mode != 'polling':
# By default drivers operate in polling mode. Not all NIC drivers support
# RX mode interrupt and adaptive
@@ -759,6 +763,8 @@ def apply(config):
del config['persist_config'][iface['iface_name']]
if 'settings' in config and 'interface' in config.get('settings'):
+ interface_rx_mode = config['settings'].get('interface_rx_mode')
+
# connect to VPP
try:
# Bail out early if VPP service is not running
@@ -840,7 +846,7 @@ def apply(config):
iproute.link('set', index=dev_index, state='up')
# Set rx-mode. Should be configured after interface state set to UP
- rx_mode = iface_config.get('rx_mode')
+ rx_mode = interface_rx_mode
if rx_mode:
# to hardware side
vpp_control.iface_rxmode(iface, rx_mode)
diff --git a/src/conf_mode/vpp_kernel-interfaces.py b/src/conf_mode/vpp_kernel-interfaces.py
index 2e0e630e5..d18a5d3e5 100644
--- a/src/conf_mode/vpp_kernel-interfaces.py
+++ b/src/conf_mode/vpp_kernel-interfaces.py
@@ -36,6 +36,7 @@ def get_config(config=None) -> dict:
conf = Config()
base = ['vpp', 'kernel-interfaces']
+ base_settings = ['vpp', 'settings']
ifname = os.environ['VYOS_TAGNODE_VALUE']
@@ -52,6 +53,16 @@ def get_config(config=None) -> dict:
config['remove_vpp'] = True
return config
+ # Get 'vpp settings' config with default values
+ config_settings = conf.get_config_dict(
+ base_settings,
+ key_mangling=('-', '_'),
+ get_first_key=True,
+ no_tag_node_value_mangle=True,
+ with_defaults=True,
+ )
+ config['vpp_settings'] = config_settings
+
# Get effective config as we need full dicitonary per interface delete
if __name__ == '__main__':
effective_config = conf.get_config_dict(
@@ -185,7 +196,7 @@ def apply(config):
v.set_admin_state('up')
# Set rx-mode
- rx_mode = config.get('rx_mode')
+ rx_mode = config['vpp_settings'].get('interface_rx_mode')
if rx_mode:
vpp_control = VPPControl()
lcp_name = vpp_control.lcp_pair_find(kernel_name=ifname).get('vpp_name_kernel')
diff --git a/src/migration-scripts/vpp/7-to-8 b/src/migration-scripts/vpp/7-to-8
index 0b2f81b4c..122456e1f 100644
--- a/src/migration-scripts/vpp/7-to-8
+++ b/src/migration-scripts/vpp/7-to-8
@@ -22,6 +22,10 @@
# Delete 'ipsec' node and all settings and replace it with single 'ipsec-acceleration' flag (T8262)
#
# Unify CPU settings into a single 'cpu-cores' node under 'resource-allocation' (T8268)
+#
+# Convert `vpp settings interface <name> rx-mode` and `vpp kernel-interfaces <name> rx-mode`
+# to `vpp settings interfaces-rx-mode` by choose the worst value from all nodes (T8266)
+#
from vyos.configtree import ConfigTree
@@ -106,6 +110,51 @@ def _migrate_vpp_cpu(config: ConfigTree) -> None:
config.delete(cpu_path)
+def _migrate_vpp_interface_rx_mode(config: ConfigTree) -> None:
+ # Per-interface rx-mode commands
+ external_interface_path = ['vpp', 'settings', 'interface']
+ kernel_interface_path = ['vpp', 'kernel-interfaces']
+
+ # New global interface rx-mode command
+ new_rx_mode_path = ['vpp', 'settings', 'interface-rx-mode']
+
+ def _iter_by_rx_modes(base_path: list):
+ if config.exists(base_path):
+ for iface_name in config.list_nodes(base_path):
+ rx_mode_path = base_path + [iface_name, 'rx-mode']
+ if config.exists(rx_mode_path):
+ rx_mode = config.return_value(rx_mode_path)
+ yield rx_mode, rx_mode_path
+
+ rx_modes = set()
+
+ def _collect_rx_modes(base_path: list):
+ for rx_mode, _ in _iter_by_rx_modes(base_path):
+ rx_modes.add(rx_mode)
+
+ _collect_rx_modes(external_interface_path)
+ _collect_rx_modes(kernel_interface_path)
+
+ if not rx_modes:
+ return
+
+ if 'interrupt' in rx_modes:
+ rx_mode = 'interrupt'
+ elif 'adaptive' in rx_modes:
+ rx_mode = 'adaptive'
+ else:
+ rx_mode = 'polling'
+
+ config.set(new_rx_mode_path, value=rx_mode)
+
+ def _delete_rx_modes(base_path: list):
+ for _, rx_mode_path in _iter_by_rx_modes(base_path):
+ config.delete(rx_mode_path)
+
+ _delete_rx_modes(external_interface_path)
+ _delete_rx_modes(kernel_interface_path)
+
+
def migrate(config: ConfigTree) -> None:
if not config.exists(['vpp']):
# Nothing to do
@@ -116,3 +165,4 @@ def migrate(config: ConfigTree) -> None:
_migrate_vpp_nat44(config)
_migrate_vpp_ipsec(config)
_migrate_vpp_cpu(config)
+ _migrate_vpp_interface_rx_mode(config)