diff options
| author | Oleksandr Kuchmystyi <o.kuchmystyi@vyos.io> | 2026-02-16 17:41:38 +0300 |
|---|---|---|
| committer | Oleksandr Kuchmystyi <o.kuchmystyi@vyos.io> | 2026-02-18 13:30:02 +0300 |
| commit | ed20c353e8e1a7fd9d47bb6020f40815285ef2f9 (patch) | |
| tree | 682994117719758c842b6b265cc4b054e5ad5797 /src | |
| parent | 0f4b6c0d892ea35c947643ab8d6e0f84e51c6191 (diff) | |
| download | vyos-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-x | src/conf_mode/vpp.py | 12 | ||||
| -rw-r--r-- | src/conf_mode/vpp_kernel-interfaces.py | 13 | ||||
| -rw-r--r-- | src/migration-scripts/vpp/7-to-8 | 50 |
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) |
