public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Robin Christ <robin@rchrist.io>
To: pve-devel@lists.proxmox.com
Cc: Robin Christ <r.christ@partimus.com>
Subject: [PATCH ifupdown2 4/4] bridge: Fix multiple Single VXLAN Devices in bridge not having tunnel_info applied on first run
Date: Mon, 30 Mar 2026 23:39:21 +0200	[thread overview]
Message-ID: <20260330213921.533853-5-robin@rchrist.io> (raw)
In-Reply-To: <20260330213921.533853-1-robin@rchrist.io>

From: Robin Christ <r.christ@partimus.com>

If you add multiple Single VXLAN Devices to a bridge, only the last one would get the proper
tunnel_info applied, ultimately resulting in a non-functional network setup.
This could be fixed by a second execution of ifupdown2.

The reason for this was that the original code was not written with multiple Single VXLAN Devices
in a single bridge in mind, thus it had only the variable single_vxlan_device_ifaceobj storing
a single interface that would control the application of tunnel_info the bridge's SVDs.
Replacing the variable against a list single_vxlan_device_ifaceobjs and adding another little
loop fixes the issue.

Additionally, some very exhaustive, clarifying information has been added

Signed-off-by: Robin Christ <r.christ@partimus.com>
---
 ...tiple-single-vxlan-devices-in-bridge.patch | 101 ++++++++++++++++++
 debian/patches/series                         |   1 +
 2 files changed, 102 insertions(+)
 create mode 100644 debian/patches/pve/0019-bridge-fix-multiple-single-vxlan-devices-in-bridge.patch

diff --git a/debian/patches/pve/0019-bridge-fix-multiple-single-vxlan-devices-in-bridge.patch b/debian/patches/pve/0019-bridge-fix-multiple-single-vxlan-devices-in-bridge.patch
new file mode 100644
index 0000000..1374426
--- /dev/null
+++ b/debian/patches/pve/0019-bridge-fix-multiple-single-vxlan-devices-in-bridge.patch
@@ -0,0 +1,101 @@
+From: Robin Christ <r.christ@partimus.com>
+Date: Mon, 30 Mar 2026 21:07:41 +0200
+Subject: bridge: Fix multiple Single VXLAN Devices in bridge not having
+ tunnel_info applied on first run
+
+If you add multiple Single VXLAN Devices to a bridge, only the last one would get the proper
+tunnel_info applied, ultimately resulting in a non-functional network setup.
+This could be fixed by a second execution of ifupdown2.
+
+The reason for this was that the original code was not written with multiple Single VXLAN Devices
+in a single bridge in mind, thus it had only the variable single_vxlan_device_ifaceobj storing
+a single interface that would control the application of tunnel_info the bridge's SVDs.
+Replacing the variable against a list single_vxlan_device_ifaceobjs and adding another little
+loop fixes the issue.
+
+Additionally, some very exhaustive, clarifying information has been added
+
+Signed-off-by: Robin Christ <r.christ@partimus.com>
+---
+ ifupdown2/addons/bridge.py | 54 +++++++++++++++++++++++++++++++++++++++++++---
+ 1 file changed, 51 insertions(+), 3 deletions(-)
+
+diff --git a/ifupdown2/addons/bridge.py b/ifupdown2/addons/bridge.py
+index dee6f7b..5918c94 100644
+--- a/ifupdown2/addons/bridge.py
++++ b/ifupdown2/addons/bridge.py
+@@ -2145,7 +2145,51 @@ class bridge(Bridge, moduleBase):
+ 
+     def up_apply_brports_attributes(self, ifaceobj, ifaceobj_getfunc, bridge_vlan_aware, target_ports=[], newly_enslaved_ports=[]):
+         ifname = ifaceobj.name
+-        single_vxlan_device_ifaceobj = None
++        # Historically, "Single VXLAN Device" was chosen to name the concept of having
++        # a single VXLAN interface with "external" flag in ip link (Kernel VXLAN_F_COLLECT_METADATA)
++        # that is also the only VXLAN interface slave of the bridge. This VXLAN interface
++        # would terminate all the VNIs for the bridge, improving scalability a lot, as now you
++        # don't have to create a VXLAN interface for each VNI.
++        # In the beginning, you could only ONE Single VXLAN device per UDP-Port on the entire system.
++        # However, it was recognized that there may be the need to have multiple "Single VXLAN Devices"
++        # on your system, and in kernel commit f9c4bb0b245cee35ef66f75bf409c9573d934cf9 the possibility
++        # to have multiple SVD's was added, but it requires the "vnifilter" flag (kernel VXLAN_F_VNIFILTER)
++        #
++        # But even with Single VXLAN Devices at hand, there are valid scenarios where you may want to have multiple
++        # Single VXLAN Devices on the same bridge! One scenario could be traffic steering in BGP-to-the-host
++        # setups, where you don't want separate bridges per VXLAN interface (e.g. because customer VMs don't
++        # want a single trunk port that terminates in different VXLAN interface depending on the VLAN)
++        #
++        # Addendum: A little explanation how "Single VXLAN Device" works in kernel:
++        # In the beginning, a VXLAN interface could only have a single VNI assigned. You had to create one
++        # VXLAN device per VNI, which didn't scale. Therefore, the following flags were added:
++        #
++        # 1. link add dev <ifname> type vxlan external
++        # This flag is what makes a VXLAN interface a "Single VXLAN Device"!
++        # The "external" flag is very oddly and cryptically named. While technically the naming is correct, as it
++        # indicates "whether an external control plane (e.g. ip route encap) or the internal FDB should be used"
++        # it doesn't really help you as a user.
++        # It was added in kernel commit ee122c79d4227f6ec642157834b6a90fcffa4382 ("vxlan: Flow based tunneling")
++        # and is called VXLAN_F_COLLECT_METADATA
++        # What this flag essentially does it that a VXLAN interface with "external" flag
++        # **will receive traffic for all VNIs** on the entire system, and there can be only ONE of them (unless
++        # you add the "vnifilter" flag!)
++        # With this flag active, you must do 'bridge vlan add dev <ifname> vid <vid> tunnel_info id <vni>'!
++        #
++        # 2. link add dev <ifname> type vxlan vnifilter
++        # As mentioned above, at some point it was recognized that there may be the need
++        # to have multiple "Single VXLAN Devices".
++        # Therefore in kernel commit f9c4bb0b245cee35ef66f75bf409c9573d934cf9
++        # ("vxlan: vni filtering support on collect metadata device") the possibility
++        # to have multiple SVD's was added, using the "vnifilter" flag (kernel VXLAN_F_VNIFILTER)
++        # This flag limits which VNIs are received on a "Single VXLAN Device", ultimately
++        # allowing you to have multiple "Single VXLAN Devices" on the same system...
++        # and even on the same bridge!
++        # With this flag active, you must do 'bridge vni add dev <ifname> vni <vni>'
++        # yes, even though this uses the bridge command, this is not really related to bridges
++        # at all and <ifname> is the name of a VXLAN interface!
++
++        single_vxlan_device_ifaceobjs = []
+ 
+         try:
+             brports_ifla_info_slave_data    = dict()
+@@ -2471,7 +2515,7 @@ class bridge(Bridge, moduleBase):
+                     #
+ 
+                     if brport_ifaceobj.link_privflags & ifaceLinkPrivFlags.SINGLE_VXLAN:
+-                        single_vxlan_device_ifaceobj = brport_ifaceobj
++                        single_vxlan_device_ifaceobjs.append(brport_ifaceobj)
+                         brport_vlan_tunnel_cached_value = self.cache.get_link_info_slave_data_attribute(
+                             brport_name,
+                             Link.IFLA_BRPORT_VLAN_TUNNEL
+@@ -2501,7 +2545,11 @@ class bridge(Bridge, moduleBase):
+         except Exception as e:
+             self.log_error(str(e), ifaceobj)
+ 
+-        if single_vxlan_device_ifaceobj:
++        # As explained at the top of the function, we have have multiple SVD's enslaved to our bridge
++        # If we don't handle them all here, we will have the scenario where only the FIRST enslaved
++        # VXLAN interface gets the tunnel_info applied, and the other ones don't... Leading to the
++        # scenario that the network config is only correctly applied after another ifreload...
++        for single_vxlan_device_ifaceobj in single_vxlan_device_ifaceobjs:
+             self.apply_bridge_port_vlan_vni_map(single_vxlan_device_ifaceobj)
+ 
+     @staticmethod
diff --git a/debian/patches/series b/debian/patches/series
index 1dc2fc6..a059c38 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -19,3 +19,4 @@ pve/0015-revert-addons-bond-warn-if-sub-interface-is-detected-on-bond-slave.patc
 pve/0016-nlcache-fix-missing-nodad-option-in-addr_add_dry_run.patch
 pve/0017-nlcache-add-missing-link_set_mtu_dry_run-method.patch
 pve/0018-iproute2-fix-bridge_link_update_vni_filter-for-dry-run.patch
+pve/0019-bridge-fix-multiple-single-vxlan-Devices-in-bridge.patch
-- 
2.47.3




  parent reply	other threads:[~2026-03-30 21:48 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-30 21:39 [PATCH ifupdown2 0/4] Fix multiple Single VXLAN Devices in bridge and some dry-run fixes Robin Christ
2026-03-30 21:39 ` [PATCH ifupdown2 1/4] nlcache: Fix missing nodad option in addr_add_dry_run Robin Christ
2026-03-30 21:39 ` [PATCH ifupdown2 2/4] nlcache: Add missing link_set_mtu_dry_run method Robin Christ
2026-03-30 21:39 ` [PATCH ifupdown2 3/4] iproute2: Fix bridge_link_update_vni_filter for dry-run Robin Christ
2026-03-30 21:39 ` Robin Christ [this message]
2026-03-31  8:18   ` [PATCH ifupdown2 4/4] bridge: Fix multiple Single VXLAN Devices in bridge not having tunnel_info applied on first run Gabriel Goller
2026-03-31 11:45     ` Robin Christ

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260330213921.533853-5-robin@rchrist.io \
    --to=robin@rchrist.io \
    --cc=pve-devel@lists.proxmox.com \
    --cc=r.christ@partimus.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal