summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorChristian Breunig <christian@breunig.cc>2026-03-03 13:28:20 +0100
committerGitHub <noreply@github.com>2026-03-03 13:28:20 +0100
commitd47be4a8e2119e2be0be5fe9d7c29d7d8eaf24d9 (patch)
tree9101e996fd134a83cb2708e104bcdd7a85caa197 /python
parent00361b88005948802344adbe6184057cee91cde4 (diff)
parent99f617c88e57453315ee97cba88d3de1a24a5f01 (diff)
downloadvyos-1x-d47be4a8e2119e2be0be5fe9d7c29d7d8eaf24d9.tar.gz
vyos-1x-d47be4a8e2119e2be0be5fe9d7c29d7d8eaf24d9.zip
Merge pull request #5020 from natali-rs1985/T8325
vpp: T8325: Migrate gre interface to 'interfaces vpp gre'
Diffstat (limited to 'python')
-rw-r--r--python/vyos/ifconfig/vpp/__init__.py2
-rw-r--r--python/vyos/ifconfig/vpp/gre.py138
-rw-r--r--python/vyos/vpp/interface/__init__.py2
-rw-r--r--python/vyos/vpp/interface/gre.py140
-rw-r--r--python/vyos/vpp/interface/xconnect.py4
5 files changed, 142 insertions, 144 deletions
diff --git a/python/vyos/ifconfig/vpp/__init__.py b/python/vyos/ifconfig/vpp/__init__.py
index b0a477c28..7abe402c6 100644
--- a/python/vyos/ifconfig/vpp/__init__.py
+++ b/python/vyos/ifconfig/vpp/__init__.py
@@ -16,6 +16,7 @@
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
from .bond import VPPBondInterface
+from .gre import VPPGREInterface
from .interface import VPPInterface
from .ipip import VPPIPIPInterface
from .loopback import VPPLoopbackInterface
@@ -23,6 +24,7 @@ from .vxlan import VPPVXLANInterface
__all__ = [
'VPPBondInterface',
+ 'VPPGREInterface',
'VPPInterface',
'VPPIPIPInterface',
'VPPLoopbackInterface',
diff --git a/python/vyos/ifconfig/vpp/gre.py b/python/vyos/ifconfig/vpp/gre.py
new file mode 100644
index 000000000..7ab600998
--- /dev/null
+++ b/python/vyos/ifconfig/vpp/gre.py
@@ -0,0 +1,138 @@
+# VyOS implementation of VPP GRE interface
+#
+# Copyright (C) VyOS Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+from vyos.ifconfig import Interface
+from vyos.ifconfig.vpp.interface import VPPInterface
+
+
+class VPPGREInterface(Interface, VPPInterface):
+ """
+ Class representing a GRE (Generic Routing Encapsulation) interface.
+ """
+
+ # Mapping of tunnel types https://github.com/FDio/vpp/blob/stable/2406/src/plugins/gre/gre.api#L25-L35
+ TUNNEL_TYPE_MAP = {
+ 'l3': 0,
+ 'teb': 1,
+ 'erspan': 2,
+ }
+
+ MODE_MAP = {
+ 'point-to-point': 0,
+ # 'point-to-multipoint': 1,
+ }
+
+ def __init__(self, ifname, config):
+ self.ifname = ifname
+ self.instance = int(ifname.removeprefix('vppgre'))
+ self.vpp_ifname = f'gre{self.instance}'
+
+ # Initialize Interface (kernel) and VPP part
+ super().__init__(ifname)
+ VPPInterface.__init__(self, self.vpp_ifname)
+
+ self.index = self.vpp.get_sw_if_index(self.vpp_ifname)
+ self.state = 'up' if 'disable' not in config else 'down'
+ self.src_address = config.get('source_address')
+ self.dst_address = config.get('remote')
+ self.tunnel_type = self.TUNNEL_TYPE_MAP.get(config.get('tunnel_type'), 0)
+ self.mode = self.MODE_MAP['point-to-point']
+
+ def _create(self):
+ pass
+
+ def get_gre(self):
+ tunnels = self.vpp.api.gre_tunnel_dump(sw_if_index=self.index)
+ return tunnels if tunnels else None
+
+ def add_gre(self):
+ """Create GRE interface
+ https://github.com/FDio/vpp/blob/stable/2406/src/plugins/gre/gre.api
+ Example:
+ from vyos.ifconfig.vpp import VPPGREInterface
+ a = VPPGREInterface(ifname='vppgre0', config)
+ a.add_gre()
+ """
+ self.vpp.api.gre_tunnel_add_del(
+ is_add=True,
+ tunnel={
+ 'src': self.src_address,
+ 'dst': self.dst_address,
+ 'instance': self.instance,
+ 'mode': self.mode,
+ 'type': self.tunnel_type,
+ },
+ )
+ # Add LCP pair (kernel) interface
+ self.kernel_add()
+ # Set interface state
+ self.set_state(self.state)
+ self.set_admin_state(self.state)
+ self.index = self.vpp.get_sw_if_index(self.vpp_ifname)
+
+ def delete_gre(self):
+ """Delete GRE interface
+ Example:
+ from vyos.ifconfig.vpp import VPPGREInterface
+ a = VPPGREInterface(ifname='vppgre0', config)
+ a.delete_gre()
+ """
+ gre = self.get_gre()
+ if gre:
+ return self.vpp.api.gre_tunnel_add_del(
+ is_add=False,
+ tunnel={'src': gre.tunnel.src, 'dst': gre.tunnel.dst},
+ )
+
+ def kernel_add(self):
+ """Add LCP pair
+ Example:
+ from vyos.ifconfig.vpp import VPPGREInterface
+ a = VPPGREInterface(ifname='vppgre0', config)
+ a.kernel_add()
+ """
+ self.vpp.lcp_pair_add(self.vpp_ifname, self.ifname, 'tun')
+
+ def kernel_delete(self):
+ """Delete LCP pair
+ Example:
+ from vyos.ifconfig.vpp import VPPGREInterface
+ a = VPPGREInterface(ifname='vppgre0', config)
+ a.kernel_delete()
+ """
+ self.vpp.lcp_pair_del(self.vpp_ifname, self.ifname)
+
+ def remove(self):
+ if self.index:
+ # Delete lcp pair interface
+ if self.vpp.lcp_pair_find(vpp_name_hw=self.vpp_ifname):
+ self.kernel_delete()
+
+ # Delete gre interface
+ self.delete_gre()
+
+ def update(self, config):
+ # Add gre interface
+ self.add_gre()
+
+ # Set rx-mode
+ rx_mode = config.get('vpp_settings', {}).get('interface_rx_mode')
+ if rx_mode:
+ self.set_rx_mode(rx_mode)
+
+ super().update(config)
diff --git a/python/vyos/vpp/interface/__init__.py b/python/vyos/vpp/interface/__init__.py
index 4ae96f486..cdfb0c0b8 100644
--- a/python/vyos/vpp/interface/__init__.py
+++ b/python/vyos/vpp/interface/__init__.py
@@ -18,7 +18,6 @@
from .bridge import BridgeInterface
from .ethernet import EthernetInterface
from .geneve import GeneveInterface
-from .gre import GREInterface
from .interface import Interface
from .wireguard import WireguardInterface
from .xconnect import XconnectInterface
@@ -27,7 +26,6 @@ __all__ = [
'BridgeInterface',
'EthernetInterface',
'GeneveInterface',
- 'GREInterface',
'Interface',
'WireguardInterface',
'XconnectInterface',
diff --git a/python/vyos/vpp/interface/gre.py b/python/vyos/vpp/interface/gre.py
deleted file mode 100644
index bc278d2a0..000000000
--- a/python/vyos/vpp/interface/gre.py
+++ /dev/null
@@ -1,140 +0,0 @@
-# VyOS implementation of VPP GRE interface
-#
-# Copyright (C) VyOS Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-from vyos.vpp import VPPControl
-from vyos.vpp.interface.interface import Interface
-
-
-def show():
- """Show GRE interface
- Example:
- from vyos.vpp.interface import gre
- gre.show()
- """
- vpp = VPPControl()
- return vpp.api.gre_tunnel_dump()
-
-
-class GREInterface(Interface):
- """
- Class representing a GRE (Generic Routing Encapsulation) interface.
-
- Attributes:
- ifname (str): The interface name.
- source_address (str): The source IP address for the GRE tunnel.
- remote (str): The remote IP address for the GRE tunnel.
- tunnel_type (str): The type of GRE tunnel. Defaults to 'l3'.
- mode (str): The mode of the GRE tunnel. Options are 'point-to-point' and 'point-to-multipoint'. Defaults to 'point-to-point'.
- kernel_interface (str): The associated kernel interface. Defaults to an empty string.
- instance (int): The instance number derived from the interface name.
- vpp (VPPControl): An instance of the VPPControl class for interacting with the VPP API.
- """
-
- # Mapping of tunnel types https://github.com/FDio/vpp/blob/stable/2406/src/plugins/gre/gre.api#L25-L35
- TUNNEL_TYPE_MAP = {
- 'l3': 0,
- 'teb': 1,
- 'erspan': 2,
- }
-
- MODE_MAP = {
- 'point-to-point': 0,
- 'point-to-multipoint': 1,
- }
-
- def __init__(
- self,
- ifname,
- source_address,
- remote,
- tunnel_type: str = 'l3',
- mode: str = 'point-to-point',
- kernel_interface: str = '',
- state: str = 'up',
- ):
- """
- Initialize a GREInterface instance.
-
- Args:
- ifname (str): The interface name.
- source_address (str): The source IP address for the GRE tunnel.
- remote (str): The remote IP address for the GRE tunnel.
- mode (str): The mode of the GRE tunnel. Options are 'point-to-point' and 'point-to-multipoint'. Defaults to 'point-to-point'.
- tunnel_type (str): The type of GRE tunnel. Defaults to 'l3'.
- kernel_interface (str): The associated kernel interface. Defaults to an empty string.
- state (str): The state of the interface. Defaults to 'up'.
- """
- super().__init__(ifname)
- self.instance = int(ifname.removeprefix('gre'))
- self.ifname = ifname
- self.src_address = source_address
- self.dst_address = remote
- self.tunnel_type = self.TUNNEL_TYPE_MAP[tunnel_type]
- self.mode = self.MODE_MAP[mode]
- self.kernel_interface = kernel_interface
- self.initial_state = state
-
- def add(self):
- """Create GRE interface
- https://github.com/FDio/vpp/blob/stable/2406/src/plugins/gre/gre.api
- Example:
- from vyos.vpp.interface import GREInterface
- a = GREInterface(ifname='gre0', source_address='192.0.2.1', remote='203.0.113.25', tunnel_type='l3')
- a.add()
- """
- self.vpp.api.gre_tunnel_add_del(
- is_add=True,
- tunnel={
- 'src': self.src_address,
- 'dst': self.dst_address,
- 'instance': self.instance,
- 'mode': self.mode,
- 'type': self.tunnel_type,
- },
- )
- # Set interface state
- self.set_state(self.initial_state)
-
- def delete(self):
- """Delete GRE interface
- Example:
- from vyos.vpp.interface import GREInterface
- a = GREInterface(ifname='gre0', source_address='192.0.2.1', remote='203.0.113.25')
- a.delete()
- """
- return self.vpp.api.gre_tunnel_add_del(
- is_add=False, tunnel={'src': self.src_address, 'dst': self.dst_address}
- )
-
- def kernel_add(self):
- """Add LCP pair
- Example:
- from vyos.vpp.interface import GREInterface
- a = GREInterface(ifname='gre0', source_address='192.0.2.1', remote='203.0.113.25')
- a.kernel_add()
- """
- self.vpp.lcp_pair_add(self.ifname, self.kernel_interface, 'tun')
-
- def kernel_delete(self):
- """Delete LCP pair
- Example:
- from vyos.vpp.interface import GREInterface
- a = GREInterface(ifname='gre0', source_address='192.0.2.1', remote='203.0.113.25')
- a.kernel_delete()
- """
- self.vpp.lcp_pair_del(self.ifname, self.kernel_interface)
diff --git a/python/vyos/vpp/interface/xconnect.py b/python/vyos/vpp/interface/xconnect.py
index 603f7f90b..dd61d7146 100644
--- a/python/vyos/vpp/interface/xconnect.py
+++ b/python/vyos/vpp/interface/xconnect.py
@@ -41,7 +41,7 @@ class XconnectInterface:
a = XconnectInterface(ifname='xcon0', members=['eth0', 'vxlan0'])
a.add_l2_xconnect()
"""
- interface_transform_filter = ('vxlan', 'gre')
+ interface_transform_filter = ('vxlan', 'geneve')
first_member = self.members[0].removeprefix('vpp')
second_member = self.members[1].removeprefix('vpp')
# Check if member in required filter to transform 'vxlanX' => 'vxlan_tunnelX'
@@ -72,7 +72,7 @@ class XconnectInterface:
a = XconnectInterface(ifname='xcon0', members=['eth0', 'vxlan0'])
a.del_l2_xconnect()
"""
- interface_transform_filter = ('vxlan', 'gre')
+ interface_transform_filter = ('vxlan', 'geneve')
first_member = self.members[0].removeprefix('vpp')
second_member = self.members[1].removeprefix('vpp')
# Check if member in required filter to transform 'vxlanX' => 'vxlan_tunnelX'