summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNataliia Solomko <natalirs1985@gmail.com>2025-10-23 13:21:57 +0300
committerNataliia Solomko <natalirs1985@gmail.com>2025-10-23 13:22:57 +0300
commit3b6f7ea3406a22dcc6fd4bb50b1febfac7eab907 (patch)
tree692a6c425b822aa750ff79d81cb35a712ee200e7 /src
parentd272b2509836403682c6c8ab4096ccf4be003bcb (diff)
downloadvyos-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.py2
-rw-r--r--src/conf_mode/vpp_nat.py32
-rw-r--r--src/conf_mode/vpp_nat_cgnat.py15
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']: