* [PATCH network] sdn: vxlan: always set local tunnel IP
@ 2026-07-02 14:33 Gabriel Goller
2026-07-02 14:37 ` Gabriel Goller
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Gabriel Goller @ 2026-07-02 14:33 UTC (permalink / raw)
To: pve-devel
Frr 10.6 changed the evpn advertise-all-vni handling and no longer
falls back to the BGP router-id to derive the local vtep address for
vxlan interfaces without an explicit local tunnel IP.
This breaks setups where an evpn controller is used together with a
vxlan zone to get plain L2VNIs. In that setup, the vxlan zone creates
the linux vxlan devices, while the evpn controller advertises them
via frr's advertise-all-vni. Without a local vxlan tunnel IP on the
interface, frr 10.6 cannot reliably determine the local vtep address and
the VNI is not advertised/handled correctly.
Explicitly emit the ifupdown2 `vxlan-local-tunnelip` stanza for vxlan
zones, using the local peer/fabric underlay address that is already
determined while generating the zone configuration. Fail generation if
no local tunnel IP can be determined, since generating such an interface
would result in a broken evpn/vxlan setup with current frr.
evpn zones already emit `vxlan-local-tunnelip` for their vxlan devices
when the local vtep address is known.
Fixes: #7766.
Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
---
src/PVE/Network/SDN/Zones/VxlanPlugin.pm | 4 ++++
src/test/zones/vxlan/basic/expected_sdn_interfaces | 1 +
src/test/zones/vxlan/ipv6/expected_sdn_interfaces | 1 +
src/test/zones/vxlan/vlanawarevnet/expected_sdn_interfaces | 1 +
src/test/zones/vxlan/vxlanport/expected_sdn_interfaces | 1 +
5 files changed, 8 insertions(+)
diff --git a/src/PVE/Network/SDN/Zones/VxlanPlugin.pm b/src/PVE/Network/SDN/Zones/VxlanPlugin.pm
index a40826153d9c..b1bd56db6ea9 100644
--- a/src/PVE/Network/SDN/Zones/VxlanPlugin.pm
+++ b/src/PVE/Network/SDN/Zones/VxlanPlugin.pm
@@ -117,6 +117,9 @@ sub generate_sdn_config {
die "neither peers nor fabric configured for VXLAN zone $plugin_config->{id}";
}
+ die "could not determine local tunnel IP for VXLAN zone $zoneid"
+ if !$ifaceip;
+
my $mtu = 1450;
if ($iface) {
$mtu = $interfaces_config->{$iface}->{mtu} - 50 if $interfaces_config->{$iface}->{mtu};
@@ -126,6 +129,7 @@ sub generate_sdn_config {
#vxlan interface
my @iface_config = ();
push @iface_config, "vxlan-id $tag";
+ push @iface_config, "vxlan-local-tunnelip $ifaceip";
for my $address (sort @peers) {
next if $address eq $ifaceip;
diff --git a/src/test/zones/vxlan/basic/expected_sdn_interfaces b/src/test/zones/vxlan/basic/expected_sdn_interfaces
index 7b73c3e3ca60..ed6869dfa9e6 100644
--- a/src/test/zones/vxlan/basic/expected_sdn_interfaces
+++ b/src/test/zones/vxlan/basic/expected_sdn_interfaces
@@ -10,6 +10,7 @@ iface myvnet
auto vxlan_myvnet
iface vxlan_myvnet
vxlan-id 100
+ vxlan-local-tunnelip 192.168.0.1
vxlan_remoteip 192.168.0.2
vxlan_remoteip 192.168.0.3
mtu 1450
diff --git a/src/test/zones/vxlan/ipv6/expected_sdn_interfaces b/src/test/zones/vxlan/ipv6/expected_sdn_interfaces
index 032ab991826c..14354f61f923 100644
--- a/src/test/zones/vxlan/ipv6/expected_sdn_interfaces
+++ b/src/test/zones/vxlan/ipv6/expected_sdn_interfaces
@@ -10,6 +10,7 @@ iface myvnet
auto vxlan_myvnet
iface vxlan_myvnet
vxlan-id 100
+ vxlan-local-tunnelip 2a08:2200:100:1::10
vxlan_remoteip 2a08:2200:100:1::11
vxlan_remoteip 2a08:2200:100:1::12
mtu 1450
diff --git a/src/test/zones/vxlan/vlanawarevnet/expected_sdn_interfaces b/src/test/zones/vxlan/vlanawarevnet/expected_sdn_interfaces
index 55cdf9cb8887..e6331d2e3807 100644
--- a/src/test/zones/vxlan/vlanawarevnet/expected_sdn_interfaces
+++ b/src/test/zones/vxlan/vlanawarevnet/expected_sdn_interfaces
@@ -12,6 +12,7 @@ iface myvnet
auto vxlan_myvnet
iface vxlan_myvnet
vxlan-id 100
+ vxlan-local-tunnelip 192.168.0.1
vxlan_remoteip 192.168.0.2
vxlan_remoteip 192.168.0.3
mtu 1450
diff --git a/src/test/zones/vxlan/vxlanport/expected_sdn_interfaces b/src/test/zones/vxlan/vxlanport/expected_sdn_interfaces
index 572550a438e7..a3147b66a9c1 100644
--- a/src/test/zones/vxlan/vxlanport/expected_sdn_interfaces
+++ b/src/test/zones/vxlan/vxlanport/expected_sdn_interfaces
@@ -10,6 +10,7 @@ iface myvnet
auto vxlan_myvnet
iface vxlan_myvnet
vxlan-id 100
+ vxlan-local-tunnelip 192.168.0.1
vxlan_remoteip 192.168.0.2
vxlan_remoteip 192.168.0.3
vxlan-port 6000
--
2.47.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH network] sdn: vxlan: always set local tunnel IP
2026-07-02 14:33 [PATCH network] sdn: vxlan: always set local tunnel IP Gabriel Goller
@ 2026-07-02 14:37 ` Gabriel Goller
2026-07-08 9:06 ` Gabriel Goller
2026-07-08 9:35 ` Gabriel Goller
2026-07-14 10:44 ` Lukas Sichert
2 siblings, 1 reply; 6+ messages in thread
From: Gabriel Goller @ 2026-07-02 14:37 UTC (permalink / raw)
To: pve-devel
Hmm maybe we could also fix this in FRR as this was not a 100% intended change.
I'll think about it and talk with Stefan when he's back.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH network] sdn: vxlan: always set local tunnel IP
2026-07-02 14:37 ` Gabriel Goller
@ 2026-07-08 9:06 ` Gabriel Goller
0 siblings, 0 replies; 6+ messages in thread
From: Gabriel Goller @ 2026-07-08 9:06 UTC (permalink / raw)
To: pve-devel
On 02.07.2026 16:37, Gabriel Goller wrote:
> Hmm maybe we could also fix this in FRR as this was not a 100% intended change.
> I'll think about it and talk with Stefan when he's back.
PR: https://github.com/FRRouting/frr/pull/22555
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH network] sdn: vxlan: always set local tunnel IP
2026-07-02 14:33 [PATCH network] sdn: vxlan: always set local tunnel IP Gabriel Goller
2026-07-02 14:37 ` Gabriel Goller
@ 2026-07-08 9:35 ` Gabriel Goller
2026-07-14 10:44 ` Lukas Sichert
2 siblings, 0 replies; 6+ messages in thread
From: Gabriel Goller @ 2026-07-08 9:35 UTC (permalink / raw)
To: pve-devel
On 02.07.2026 16:33, Gabriel Goller wrote:
> Frr 10.6 changed the evpn advertise-all-vni handling and no longer
> falls back to the BGP router-id to derive the local vtep address for
> vxlan interfaces without an explicit local tunnel IP.
>
> This breaks setups where an evpn controller is used together with a
> vxlan zone to get plain L2VNIs. In that setup, the vxlan zone creates
> the linux vxlan devices, while the evpn controller advertises them
> via frr's advertise-all-vni. Without a local vxlan tunnel IP on the
> interface, frr 10.6 cannot reliably determine the local vtep address and
> the VNI is not advertised/handled correctly.
>
> Explicitly emit the ifupdown2 `vxlan-local-tunnelip` stanza for vxlan
> zones, using the local peer/fabric underlay address that is already
> determined while generating the zone configuration. Fail generation if
> no local tunnel IP can be determined, since generating such an interface
> would result in a broken evpn/vxlan setup with current frr.
>
> evpn zones already emit `vxlan-local-tunnelip` for their vxlan devices
> when the local vtep address is known.
>
> Fixes: #7766.
> Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
> ---
> src/PVE/Network/SDN/Zones/VxlanPlugin.pm | 4 ++++
> src/test/zones/vxlan/basic/expected_sdn_interfaces | 1 +
> src/test/zones/vxlan/ipv6/expected_sdn_interfaces | 1 +
> src/test/zones/vxlan/vlanawarevnet/expected_sdn_interfaces | 1 +
> src/test/zones/vxlan/vxlanport/expected_sdn_interfaces | 1 +
> 5 files changed, 8 insertions(+)
>
> diff --git a/src/PVE/Network/SDN/Zones/VxlanPlugin.pm b/src/PVE/Network/SDN/Zones/VxlanPlugin.pm
> index a40826153d9c..b1bd56db6ea9 100644
> --- a/src/PVE/Network/SDN/Zones/VxlanPlugin.pm
> +++ b/src/PVE/Network/SDN/Zones/VxlanPlugin.pm
> @@ -117,6 +117,9 @@ sub generate_sdn_config {
> die "neither peers nor fabric configured for VXLAN zone $plugin_config->{id}";
> }
>
> + die "could not determine local tunnel IP for VXLAN zone $zoneid"
> + if !$ifaceip;
> +
> my $mtu = 1450;
> if ($iface) {
> $mtu = $interfaces_config->{$iface}->{mtu} - 50 if $interfaces_config->{$iface}->{mtu};
> @@ -126,6 +129,7 @@ sub generate_sdn_config {
> #vxlan interface
> my @iface_config = ();
> push @iface_config, "vxlan-id $tag";
> + push @iface_config, "vxlan-local-tunnelip $ifaceip";
>
> for my $address (sort @peers) {
> next if $address eq $ifaceip;
Just for completeness sake:
If we do not have the `$ifaceip` for some reason, the local ip will be inserted
into the vxlan-remote-ip list, which breaks the vxlan setup completely. So we
should be safe to assume here that any working setup has an `$ifaceip`.
Still we can either backport the frr pr, merge this, or pull in both patches.
> diff --git a/src/test/zones/vxlan/basic/expected_sdn_interfaces b/src/test/zones/vxlan/basic/expected_sdn_interfaces
> index 7b73c3e3ca60..ed6869dfa9e6 100644
> --- a/src/test/zones/vxlan/basic/expected_sdn_interfaces
> +++ b/src/test/zones/vxlan/basic/expected_sdn_interfaces
> @@ -10,6 +10,7 @@ iface myvnet
> auto vxlan_myvnet
> iface vxlan_myvnet
> vxlan-id 100
> + vxlan-local-tunnelip 192.168.0.1
> vxlan_remoteip 192.168.0.2
> vxlan_remoteip 192.168.0.3
> mtu 1450
> diff --git a/src/test/zones/vxlan/ipv6/expected_sdn_interfaces b/src/test/zones/vxlan/ipv6/expected_sdn_interfaces
> index 032ab991826c..14354f61f923 100644
> --- a/src/test/zones/vxlan/ipv6/expected_sdn_interfaces
> +++ b/src/test/zones/vxlan/ipv6/expected_sdn_interfaces
> @@ -10,6 +10,7 @@ iface myvnet
> auto vxlan_myvnet
> iface vxlan_myvnet
> vxlan-id 100
> + vxlan-local-tunnelip 2a08:2200:100:1::10
> vxlan_remoteip 2a08:2200:100:1::11
> vxlan_remoteip 2a08:2200:100:1::12
> mtu 1450
> diff --git a/src/test/zones/vxlan/vlanawarevnet/expected_sdn_interfaces b/src/test/zones/vxlan/vlanawarevnet/expected_sdn_interfaces
> index 55cdf9cb8887..e6331d2e3807 100644
> --- a/src/test/zones/vxlan/vlanawarevnet/expected_sdn_interfaces
> +++ b/src/test/zones/vxlan/vlanawarevnet/expected_sdn_interfaces
> @@ -12,6 +12,7 @@ iface myvnet
> auto vxlan_myvnet
> iface vxlan_myvnet
> vxlan-id 100
> + vxlan-local-tunnelip 192.168.0.1
> vxlan_remoteip 192.168.0.2
> vxlan_remoteip 192.168.0.3
> mtu 1450
> diff --git a/src/test/zones/vxlan/vxlanport/expected_sdn_interfaces b/src/test/zones/vxlan/vxlanport/expected_sdn_interfaces
> index 572550a438e7..a3147b66a9c1 100644
> --- a/src/test/zones/vxlan/vxlanport/expected_sdn_interfaces
> +++ b/src/test/zones/vxlan/vxlanport/expected_sdn_interfaces
> @@ -10,6 +10,7 @@ iface myvnet
> auto vxlan_myvnet
> iface vxlan_myvnet
> vxlan-id 100
> + vxlan-local-tunnelip 192.168.0.1
> vxlan_remoteip 192.168.0.2
> vxlan_remoteip 192.168.0.3
> vxlan-port 6000
> --
> 2.47.3
>
>
>
>
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH network] sdn: vxlan: always set local tunnel IP
2026-07-02 14:33 [PATCH network] sdn: vxlan: always set local tunnel IP Gabriel Goller
2026-07-02 14:37 ` Gabriel Goller
2026-07-08 9:35 ` Gabriel Goller
@ 2026-07-14 10:44 ` Lukas Sichert
2026-07-14 11:47 ` Gabriel Goller
2 siblings, 1 reply; 6+ messages in thread
From: Lukas Sichert @ 2026-07-14 10:44 UTC (permalink / raw)
To: Gabriel Goller, pve-devel
On 2026-07-02 16:33, Gabriel Goller <g.goller@proxmox.com> wrote:
> Frr 10.6 changed the evpn advertise-all-vni handling and no longer
> falls back to the BGP router-id to derive the local vtep address for
> vxlan interfaces without an explicit local tunnel IP.
>
> This breaks setups where an evpn controller is used together with a
> vxlan zone to get plain L2VNIs. In that setup, the vxlan zone creates
> the linux vxlan devices, while the evpn controller advertises them
> via frr's advertise-all-vni. Without a local vxlan tunnel IP on the
> interface, frr 10.6 cannot reliably determine the local vtep address and
> the VNI is not advertised/handled correctly.
>
> Explicitly emit the ifupdown2 `vxlan-local-tunnelip` stanza for vxlan
> zones, using the local peer/fabric underlay address that is already
> determined while generating the zone configuration. Fail generation if
> no local tunnel IP can be determined, since generating such an interface
> would result in a broken evpn/vxlan setup with current frr.
>
> evpn zones already emit `vxlan-local-tunnelip` for their vxlan devices
> when the local vtep address is known.
>
> Fixes: #7766.
> Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
I reproduced the issue on a three-node cluster using an EVPN controller
together with a plain VXLAN zone and L2 VNI 10600.
With FRR 10.4.1-1+pve1 and no vxlan-local-tunnelip on the generated
VXLAN interface, the VNI was detected and advertised:
Number of L2 VNIs: 1
* 10600 L2 172.16.0.100:2 65010:10600 65010:10600 default
After upgrading the same nodes to FRR 10.6.1-1+pve2, while keeping the
same SDN and interface configuration, the kernel VXLAN interface was
still present and `show evpn vni` listed VNI 10600, but:
show bgp l2vpn evpn vni
reported:
Number of L2 VNIs: 0
After applying this patch and regenerating the SDN configuration, the
VNI was detected and advertised again.
I think a corresponding fix has meanwhile been merged upstream in FRR[1],
so using an FRR 10.6 package containing that fix may be preferable in
the longer term. Nevertheless, this patch fixes the issue with the
currently packaged FRR version.
Tested-by: Lukas Sichert <l.sichert@proxmox.com>
[1] https://github.com/FRRouting/frr/pull/22555
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH network] sdn: vxlan: always set local tunnel IP
2026-07-14 10:44 ` Lukas Sichert
@ 2026-07-14 11:47 ` Gabriel Goller
0 siblings, 0 replies; 6+ messages in thread
From: Gabriel Goller @ 2026-07-14 11:47 UTC (permalink / raw)
To: Lukas Sichert; +Cc: pve-devel
On 14.07.2026 12:44, Lukas Sichert wrote:
> On 2026-07-02 16:33, Gabriel Goller <g.goller@proxmox.com> wrote:
>
> > Frr 10.6 changed the evpn advertise-all-vni handling and no longer
> > falls back to the BGP router-id to derive the local vtep address for
> > vxlan interfaces without an explicit local tunnel IP.
> >
> > This breaks setups where an evpn controller is used together with a
> > vxlan zone to get plain L2VNIs. In that setup, the vxlan zone creates
> > the linux vxlan devices, while the evpn controller advertises them
> > via frr's advertise-all-vni. Without a local vxlan tunnel IP on the
> > interface, frr 10.6 cannot reliably determine the local vtep address and
> > the VNI is not advertised/handled correctly.
> >
> > Explicitly emit the ifupdown2 `vxlan-local-tunnelip` stanza for vxlan
> > zones, using the local peer/fabric underlay address that is already
> > determined while generating the zone configuration. Fail generation if
> > no local tunnel IP can be determined, since generating such an interface
> > would result in a broken evpn/vxlan setup with current frr.
> >
> > evpn zones already emit `vxlan-local-tunnelip` for their vxlan devices
> > when the local vtep address is known.
> >
> > Fixes: #7766.
> > Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
>
> I reproduced the issue on a three-node cluster using an EVPN controller
> together with a plain VXLAN zone and L2 VNI 10600.
>
> With FRR 10.4.1-1+pve1 and no vxlan-local-tunnelip on the generated
> VXLAN interface, the VNI was detected and advertised:
>
> Number of L2 VNIs: 1
>
> * 10600 L2 172.16.0.100:2 65010:10600 65010:10600 default
>
> After upgrading the same nodes to FRR 10.6.1-1+pve2, while keeping the
> same SDN and interface configuration, the kernel VXLAN interface was
> still present and `show evpn vni` listed VNI 10600, but:
>
> show bgp l2vpn evpn vni
>
> reported:
>
> Number of L2 VNIs: 0
>
> After applying this patch and regenerating the SDN configuration, the
> VNI was detected and advertised again.
>
> I think a corresponding fix has meanwhile been merged upstream in FRR[1],
> so using an FRR 10.6 package containing that fix may be preferable in
> the longer term. Nevertheless, this patch fixes the issue with the
> currently packaged FRR version.
>
> Tested-by: Lukas Sichert <l.sichert@proxmox.com>
> [1] https://github.com/FRRouting/frr/pull/22555
Thanks for testing!
Backport for my PR is here:
https://lore.proxmox.com/pve-devel/20260714111858.232230-1-g.goller@proxmox.com/
The frr backport can definitely be merged. I would also recommend merging this patch, since vxlan
interfaces without a local IP address do make sense in some scenarios, but they are (1) unusual and
(2) not really needed for our use case here.
What we maybe need to test as well (for this patch):
* Receiving on multiple local addresses
* Let routing/policy choose the source address (ip route src)
These are both only possible with custom setups I think.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-07-14 11:47 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-02 14:33 [PATCH network] sdn: vxlan: always set local tunnel IP Gabriel Goller
2026-07-02 14:37 ` Gabriel Goller
2026-07-08 9:06 ` Gabriel Goller
2026-07-08 9:35 ` Gabriel Goller
2026-07-14 10:44 ` Lukas Sichert
2026-07-14 11:47 ` Gabriel Goller
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.