summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorNataliia S. <81954790+natali-rs1985@users.noreply.github.com>2025-04-01 17:30:12 +0300
committerGitHub <noreply@github.com>2025-04-01 15:30:12 +0100
commit07a3b0f5ae87a2ab400390c9fa0ca632d7815e15 (patch)
treedd6c549c9694e14d31c4c47f0649f187d36863b3 /python
parentaf6751ecdf44bde0c6dfb397e5ad128561f93112 (diff)
downloadvyos-1x-07a3b0f5ae87a2ab400390c9fa0ca632d7815e15.tar.gz
vyos-1x-07a3b0f5ae87a2ab400390c9fa0ca632d7815e15.zip
T7283: VPP add static NAT support (#24)
* T7283: VPP add static NAT support Add static mapping NAT implementation ``` set vpp nat44 static rule 10 outbound-interface 'eth0' set vpp nat44 static rule 10 inbound-interface 'eth1' set vpp nat44 static rule 10 destination address 192.168.122.10 # optional, if not set outbound interface ip address is used set vpp nat44 static rule 10 destination port 6545 # optional set vpp nat44 static rule 10 protocol tcp|udp|icmp|all # optional, defaults to "all" set vpp nat44 static rule 10 translation address 100.64.0.10 set vpp nat44 static rule 10 translation port 64010 # optional ``` * Improve help strings (Daniil Baturin) --------- Co-authored-by: Daniil Baturin <daniil@baturin.org>
Diffstat (limited to 'python')
-rw-r--r--python/vyos/vpp/control_vpp.py15
-rw-r--r--python/vyos/vpp/nat/nat44.py81
2 files changed, 88 insertions, 8 deletions
diff --git a/python/vyos/vpp/control_vpp.py b/python/vyos/vpp/control_vpp.py
index 2c81b2db2..9d45bbd91 100644
--- a/python/vyos/vpp/control_vpp.py
+++ b/python/vyos/vpp/control_vpp.py
@@ -160,6 +160,21 @@ class VPPControl:
return iface.sw_if_index
return None
+ @_Decorators.api_call
+ def get_interface_name(self, index: int) -> str | None:
+ """Find interface name by interface index in VPP
+
+ Args:
+ index (int): interface index inside VPP
+
+ Returns:
+ str | None: Interface name or None (if was not found)
+ """
+ for iface in self.__vpp_api_client.api.sw_interface_dump():
+ if iface.sw_if_index == index:
+ return iface.interface_name
+ return None
+
@_Decorators.check_retval
@_Decorators.api_call
def lcp_pair_add(
diff --git a/python/vyos/vpp/nat/nat44.py b/python/vyos/vpp/nat/nat44.py
index 47d0ced1d..985e5a583 100644
--- a/python/vyos/vpp/nat/nat44.py
+++ b/python/vyos/vpp/nat/nat44.py
@@ -86,38 +86,34 @@ class Nat44:
is_add=False,
)
- # needs to check
def add_nat44_interface_inside(self):
"""Add NAT44 interface"""
self.vpp.api.nat44_interface_add_del_feature(
- flags=1,
+ flags=0x20,
sw_if_index=self.vpp.get_sw_if_index(self.interface_in),
is_add=True,
)
- # needs to check
def delete_nat44_interface_inside(self):
"""Delete NAT44 interface"""
self.vpp.api.nat44_interface_add_del_feature(
- flags=1,
+ flags=0x20,
sw_if_index=self.vpp.get_sw_if_index(self.interface_in),
is_add=False,
)
- # needs to check
def add_nat44_interface_outside(self):
"""Add NAT44 interface"""
self.vpp.api.nat44_interface_add_del_feature(
- flags=0,
+ flags=0x10,
sw_if_index=self.vpp.get_sw_if_index(self.interface_out),
is_add=True,
)
- # needs to check
def delete_nat44_interface_outside(self):
"""Delete NAT44 interface"""
self.vpp.api.nat44_interface_add_del_feature(
- flags=0,
+ flags=0x10,
sw_if_index=self.vpp.get_sw_if_index(self.interface_out),
is_add=False,
)
@@ -149,3 +145,72 @@ class Nat44:
def enable_ipfix(self):
"""Enable NAT44 IPFIX logging"""
self.vpp.api.nat44_ei_ipfix_enable_disable(enable=True)
+
+
+class Nat44Static(Nat44):
+ def __init__(self):
+ self.vpp = VPPControl()
+
+ def add_inbound_interface(self, interface_in):
+ self.interface_in = interface_in
+ self.add_nat44_interface_inside()
+
+ def delete_inbound_interface(self, interface_in):
+ self.interface_in = interface_in
+ self.delete_nat44_interface_inside()
+
+ def add_outbound_interface(self, interface_out):
+ self.interface_out = interface_out
+ self.add_nat44_interface_outside()
+
+ def delete_outbound_interface(self, interface_out):
+ self.interface_out = interface_out
+ self.delete_nat44_interface_outside()
+
+ def add_nat44_static_mapping(
+ self,
+ iface_out,
+ local_ip,
+ external_ip,
+ local_port,
+ external_port,
+ protocol,
+ use_iface,
+ ):
+ """Add NAT44 static mapping"""
+ self.vpp.api.nat44_add_del_static_mapping_v2(
+ local_ip_address=local_ip,
+ external_ip_address=external_ip,
+ protocol=protocol,
+ local_port=local_port,
+ external_port=external_port,
+ flags=0x08 if not (protocol or local_port) else 0x00,
+ external_sw_if_index=(
+ self.vpp.get_sw_if_index(iface_out) if use_iface else 0xFFFFFFFF
+ ),
+ is_add=True,
+ )
+
+ def delete_nat44_static_mapping(
+ self,
+ iface_out,
+ local_ip,
+ external_ip,
+ local_port,
+ external_port,
+ protocol,
+ use_iface,
+ ):
+ """Delete NAT44 static mapping"""
+ self.vpp.api.nat44_add_del_static_mapping_v2(
+ local_ip_address=local_ip,
+ external_ip_address=external_ip,
+ protocol=protocol,
+ local_port=local_port,
+ external_port=external_port,
+ flags=0x08 if not (protocol or local_port) else 0x00,
+ external_sw_if_index=(
+ self.vpp.get_sw_if_index(iface_out) if use_iface else 0xFFFFFFFF
+ ),
+ is_add=False,
+ )