summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--interface-definitions/vpp.xml.in21
-rw-r--r--python/vyos/vpp/interface/gre.py16
-rw-r--r--src/conf_mode/vpp_interfaces_gre.py19
3 files changed, 51 insertions, 5 deletions
diff --git a/interface-definitions/vpp.xml.in b/interface-definitions/vpp.xml.in
index c946839db..e3a2f9aff 100644
--- a/interface-definitions/vpp.xml.in
+++ b/interface-definitions/vpp.xml.in
@@ -180,6 +180,27 @@
</valueHelp>
</properties>
<children>
+ <leafNode name="mode">
+ <properties>
+ <help>GRE tunnel mode</help>
+ <completionHelp>
+ <list>point-to-point point-to-multipoint</list>
+ </completionHelp>
+ <valueHelp>
+ <format>point-to-point</format>
+ <description>Point to point mode</description>
+ </valueHelp>
+ <valueHelp>
+ <format>point-to-multipoint</format>
+ <description>Point to multipoint mode</description>
+ </valueHelp>
+ <constraint>
+ <regex>(point-to-point|point-to-multipoint)</regex>
+ </constraint>
+ <constraintErrorMessage>Invalid mode, must be one of: point-to-point or point-to-multipoint</constraintErrorMessage>
+ </properties>
+ <defaultValue>point-to-point</defaultValue>
+ </leafNode>
<leafNode name="tunnel-type">
<properties>
<help>GRE tunnel type</help>
diff --git a/python/vyos/vpp/interface/gre.py b/python/vyos/vpp/interface/gre.py
index 65559f294..8f3dbebae 100644
--- a/python/vyos/vpp/interface/gre.py
+++ b/python/vyos/vpp/interface/gre.py
@@ -38,6 +38,7 @@ class GREInterface:
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.
@@ -45,9 +46,14 @@ class GREInterface:
# 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,
+ 'l3': 0,
+ 'teb': 1,
+ 'erspan': 2,
+ }
+
+ MODE_MAP = {
+ 'point-to-point': 0,
+ 'point-to-multipoint': 1,
}
def __init__(
@@ -56,6 +62,7 @@ class GREInterface:
source_address,
remote,
tunnel_type: str = 'l3',
+ mode: str = 'point-to-point',
kernel_interface: str = '',
):
"""
@@ -65,6 +72,7 @@ class GREInterface:
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.
"""
@@ -73,6 +81,7 @@ class GREInterface:
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.vpp = VPPControl()
@@ -90,6 +99,7 @@ class GREInterface:
'src': self.src_address,
'dst': self.dst_address,
'instance': self.instance,
+ 'mode': self.mode,
'type': self.tunnel_type,
},
)
diff --git a/src/conf_mode/vpp_interfaces_gre.py b/src/conf_mode/vpp_interfaces_gre.py
index 4cb1a71ea..334725994 100644
--- a/src/conf_mode/vpp_interfaces_gre.py
+++ b/src/conf_mode/vpp_interfaces_gre.py
@@ -124,13 +124,27 @@ def verify(config):
return None
# source-address and remote are mandatory options
- required_keys = {'source_address', 'remote', 'tunnel_type'}
+ required_keys = {'source_address', 'remote', 'mode', 'tunnel_type'}
if not all(key in config for key in required_keys):
missing_keys = required_keys - set(config.keys())
raise ConfigError(
f"Required options are missing: {', '.join(missing_keys).replace('_', '-')}"
)
+ # check multipoint mode
+ if config.get('mode') == 'point-to-multipoint':
+ # For multipoint mode, remote IP must be 0.0.0.0
+ if config.get('remote') != '0.0.0.0':
+ raise ConfigError('For point-to-multipoint mode, remote must be 0.0.0.0')
+ # Only one multipoint GRE tunnel is allowed from the same source address
+ for ifname, iface in config.get('vpp_interfaces', {}).items():
+ if iface.get('mode') == 'point-to-multipoint' and iface.get(
+ 'source_address'
+ ) == config.get('source_address'):
+ raise ConfigError(
+ 'Only one multipoint GRE tunnel is allowed from the same source address'
+ )
+
# Change 'vpp interfaces gre greX kernel-interface vpp-tunX'
# => 'vpp interfaces gre greX kernel-interface vpp-tunY'
# check if we have kernel interface config 'vpp kernel-interface vpp-tunX'
@@ -159,8 +173,9 @@ def apply(config):
src_addr = config.get('source_address')
dst_addr = config.get('remote')
kernel_interface = config.get('kernel_interface', '')
+ mode = config.get('mode')
tunnel_type = config.get('tunnel_type')
- i = GREInterface(ifname, src_addr, dst_addr, tunnel_type, kernel_interface)
+ i = GREInterface(ifname, src_addr, dst_addr, tunnel_type, mode, kernel_interface)
i.add()
# Add kernel-interface (LCP) if interface is not exist