diff options
| author | Nataliia Solomko <natalirs1985@gmail.com> | 2026-02-27 16:51:46 +0200 |
|---|---|---|
| committer | Nataliia Solomko <natalirs1985@gmail.com> | 2026-03-02 18:52:09 +0200 |
| commit | c5c5021aed8ac1baaaf0896193e1c89f125c2103 (patch) | |
| tree | b69e3c45e9d4e5b7c7b9d2429ac9be4ca41bddd2 /python | |
| parent | 00361b88005948802344adbe6184057cee91cde4 (diff) | |
| download | vyos-1x-c5c5021aed8ac1baaaf0896193e1c89f125c2103.tar.gz vyos-1x-c5c5021aed8ac1baaaf0896193e1c89f125c2103.zip | |
vpp: T8325: Migrate gre interface to 'interfaces vpp gre'
Diffstat (limited to 'python')
| -rw-r--r-- | python/vyos/ifconfig/vpp/__init__.py | 2 | ||||
| -rw-r--r-- | python/vyos/ifconfig/vpp/gre.py | 138 | ||||
| -rw-r--r-- | python/vyos/vpp/interface/__init__.py | 2 | ||||
| -rw-r--r-- | python/vyos/vpp/interface/gre.py | 140 | ||||
| -rw-r--r-- | python/vyos/vpp/interface/xconnect.py | 4 |
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..e281574a2 --- /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.get(config.get('mode'), 0) + + 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' |
