diff options
| author | Nataliia Solomko <natalirs1985@gmail.com> | 2025-10-23 13:21:57 +0300 |
|---|---|---|
| committer | Nataliia Solomko <natalirs1985@gmail.com> | 2025-10-23 13:22:57 +0300 |
| commit | 3b6f7ea3406a22dcc6fd4bb50b1febfac7eab907 (patch) | |
| tree | 692a6c425b822aa750ff79d81cb35a712ee200e7 /src | |
| parent | d272b2509836403682c6c8ab4096ccf4be003bcb (diff) | |
| download | vyos-1x-3b6f7ea3406a22dcc6fd4bb50b1febfac7eab907.tar.gz vyos-1x-3b6f7ea3406a22dcc6fd4bb50b1febfac7eab907.zip | |
T7949: VPP add the ability to configure bond subinterfaces for NAT
Diffstat (limited to 'src')
| -rw-r--r-- | src/conf_mode/vpp_kernel-interfaces.py | 2 | ||||
| -rw-r--r-- | src/conf_mode/vpp_nat.py | 32 | ||||
| -rw-r--r-- | src/conf_mode/vpp_nat_cgnat.py | 15 |
3 files changed, 24 insertions, 25 deletions
diff --git a/src/conf_mode/vpp_kernel-interfaces.py b/src/conf_mode/vpp_kernel-interfaces.py index d10449eec..fcbc8ecc0 100644 --- a/src/conf_mode/vpp_kernel-interfaces.py +++ b/src/conf_mode/vpp_kernel-interfaces.py @@ -82,6 +82,8 @@ def get_config(config=None) -> dict: if conf.exists(['vpp', 'nat', 'cgnat']): set_dependents('vpp_nat_cgnat', conf) + if conf.exists(['vpp', 'nat44']): + set_dependents('vpp_nat', conf) config['ifname'] = ifname diff --git a/src/conf_mode/vpp_nat.py b/src/conf_mode/vpp_nat.py index 0425159b4..468424016 100644 --- a/src/conf_mode/vpp_nat.py +++ b/src/conf_mode/vpp_nat.py @@ -26,7 +26,9 @@ from vyos.config import Config from vyos.utils.network import get_interface_address from vyos.vpp.utils import cli_ifaces_list +from vyos.vpp.utils import vpp_iface_name_transform from vyos.vpp.nat.nat44 import Nat44 +from vyos.vpp.control_vpp import VPPControl protocol_map = { @@ -155,16 +157,14 @@ def verify(config): f'Both inside and outside interfaces must be configured. Please add: {", ".join(missing_keys)}' ) - for interface in config['interface']['inside']: - if interface not in config['vpp_ifaces']: - raise ConfigError( - f'{interface} must be a VPP interface for inside NAT interface' - ) - for interface in config['interface']['outside']: - if interface not in config['vpp_ifaces']: - raise ConfigError( - f'{interface} must be a VPP interface for outside NAT interface' - ) + vpp = VPPControl() + for direction in ['inside', 'outside']: + for interface in config['interface'][direction]: + vpp_iface_name = vpp_iface_name_transform(interface) + if vpp.get_sw_if_index(vpp_iface_name) is None: + raise ConfigError( + f'{interface} must be a VPP interface for {direction} NAT interface' + ) if not config.get('address_pool', {}).get('translation') and not config.get( 'static', {} @@ -371,11 +371,13 @@ def apply(config): # Delete inside interfaces for interface in remove_config['interface']['inside']: if interface not in config.get('interface', {}).get('inside', []): - n.delete_nat44_interface_inside(interface) + vpp_iface_name = vpp_iface_name_transform(interface) + n.delete_nat44_interface_inside(vpp_iface_name) # Delete outside interfaces for interface in remove_config['interface']['outside']: if interface not in config.get('interface', {}).get('outside', []): - n.delete_nat44_interface_outside(interface) + vpp_iface_name = vpp_iface_name_transform(interface) + n.delete_nat44_interface_outside(vpp_iface_name) # Delete address pool address_pool = config.get('address_pool', {}) for address in ( @@ -445,10 +447,12 @@ def apply(config): # Add inside interfaces for interface in config['interface']['inside']: - n.add_nat44_interface_inside(interface) + vpp_iface_name = vpp_iface_name_transform(interface) + n.add_nat44_interface_inside(vpp_iface_name) # Add outside interfaces for interface in config['interface']['outside']: - n.add_nat44_interface_outside(interface) + vpp_iface_name = vpp_iface_name_transform(interface) + n.add_nat44_interface_outside(vpp_iface_name) # Add translation pool for address in ( config.get('address_pool', {}).get('translation', {}).get('address', []) diff --git a/src/conf_mode/vpp_nat_cgnat.py b/src/conf_mode/vpp_nat_cgnat.py index 56d11b5a1..cd38d8697 100644 --- a/src/conf_mode/vpp_nat_cgnat.py +++ b/src/conf_mode/vpp_nat_cgnat.py @@ -21,19 +21,12 @@ from vyos.config import Config, config_dict_merge from vyos.configdict import node_changed from vyos.configdiff import Diff from vyos.vpp.utils import cli_ifaces_list +from vyos.vpp.utils import vpp_iface_name_transform from vyos.vpp.nat.det44 import Det44 from vyos.vpp.control_vpp import VPPControl -def _vpp_iface_name_transform(iface_name): - vpp_iface_name = iface_name - if vpp_iface_name.startswith('bond'): - # interface name in VPP is BondEthernetX - vpp_iface_name = vpp_iface_name.replace('bond', 'BondEthernet') - return vpp_iface_name - - def get_config(config=None) -> dict: if config: conf = config @@ -132,7 +125,7 @@ def verify(config): vpp = VPPControl() for direction in ['inside', 'outside']: for interface in config['interface'][direction]: - vpp_iface_name = _vpp_iface_name_transform(interface) + vpp_iface_name = vpp_iface_name_transform(interface) if vpp.get_sw_if_index(vpp_iface_name) is None: raise ConfigError( f'{interface} must be a VPP interface for {direction} CGNAT interface' @@ -187,11 +180,11 @@ def apply(config): cgnat.enable_det44_plugin() # Add inside interfaces for interface in config['interface']['inside']: - vpp_iface_name = _vpp_iface_name_transform(interface) + vpp_iface_name = vpp_iface_name_transform(interface) cgnat.add_det44_interface_inside(vpp_iface_name) # Add outside interfaces for interface in config['interface']['outside']: - vpp_iface_name = _vpp_iface_name_transform(interface) + vpp_iface_name = vpp_iface_name_transform(interface) cgnat.add_det44_interface_outside(vpp_iface_name) # Add CGNAT rules for rule in config['changed_rules']: |
