public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
* [PATCH docs/network/perl-rs 0/4] sdn: enable force_forwarding for ipv6 forwarding
@ 2026-06-01 15:15 Lukas Sichert
  2026-06-01 15:15 ` [PATCH network 1/4] sdn: evpn: enable force_forwarding for ipv6 forwarding to subnets Lukas Sichert
                   ` (4 more replies)
  0 siblings, 5 replies; 9+ messages in thread
From: Lukas Sichert @ 2026-06-01 15:15 UTC (permalink / raw)
  To: pve-devel; +Cc: Lukas Sichert

Gabriel's upstream kernel patch [1] added
net.ipv6.conf.<iface>.force_forwarding. This allows enabling IPv6
forwarding on selected interfaces without requiring
net.ipv6.conf.all.forwarding.

This is useful for SDN setups because all.forwarding has host-wide side
effects. In particular, it disables Router Advertisement processing by
default, which can break SLAAC on unrelated interfaces. SDN only needs
forwarding on the VNet, exit-node, or fabric interfaces that participate
in routed IPv6 traffic.

This series generates ifupdown post-up/post-down commands for those
interfaces so force_forwarding is enabled when the interface is brought
up and reset when it is brought down.
The tests are adjusted for the generated /etc/network/interfaces.d/sdn
output.
Also the series rewrite the documenation to reflect the updated
behaviour.


[1] lkml.org/lkml/2025/7/7/577


network:

Lukas Sichert (2):
  sdn: evpn: enable force_forwarding for ipv6 forwarding to subnets
  sdn: simple: enable force_forwarding for ipv6 forwarding to subnets

 src/PVE/Network/SDN/Zones/EvpnPlugin.pm       | 20 +++++++++++++++----
 src/PVE/Network/SDN/Zones/SimplePlugin.pm     | 20 +++++++++++++++----
 .../expected_sdn_interfaces                   |  4 ++++
 .../exitnode_snat/expected_sdn_interfaces     |  4 ++++
 .../exitnodenullroute/expected_sdn_interfaces |  4 ++++
 .../evpn/ipv4ipv6/expected_sdn_interfaces     |  4 ++++
 .../zones/evpn/ipv6/expected_sdn_interfaces   |  4 ++++
 .../evpn/ipv6underlay/expected_sdn_interfaces |  4 ++++
 .../simple/ipv4v6/expected_sdn_interfaces     |  4 ++++
 .../simple/ipv6snat/expected_sdn_interfaces   |  4 ++++
 10 files changed, 64 insertions(+), 8 deletions(-)


perl-rs:

Lukas Sichert (1):
  fabrics: openfabric: enable force_forwarding for ipv6 transit traffic

 pve-rs/src/bindings/sdn/fabrics.rs | 10 ++++++++++
 1 file changed, 10 insertions(+)


docs:

Lukas Sichert (1):
  sdn: drop global IPv6 forwarding workaround from OpenFabric docs

 pvesdn.adoc | 18 +++---------------
 1 file changed, 3 insertions(+), 15 deletions(-)


Summary over all repositories:
  12 files changed, 77 insertions(+), 23 deletions(-)

-- 
Generated by murpp 0.12.0




^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH network 1/4] sdn: evpn: enable force_forwarding for ipv6 forwarding to subnets
  2026-06-01 15:15 [PATCH docs/network/perl-rs 0/4] sdn: enable force_forwarding for ipv6 forwarding Lukas Sichert
@ 2026-06-01 15:15 ` Lukas Sichert
  2026-06-01 15:15 ` [PATCH network 2/4] sdn: simple: " Lukas Sichert
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 9+ messages in thread
From: Lukas Sichert @ 2026-06-01 15:15 UTC (permalink / raw)
  To: pve-devel; +Cc: Lukas Sichert

EVPN zones can route IPv6 subnet traffic through a VNet and an outgoing
interface. Until now, this depended on global IPv6 forwarding state,
which also changes Router Advertisement handling for the whole host.

Use the per-interface 'force_forwarding' setting instead. For IPv6
subnets that need forwarding, generate post-up/post-down commands for
both the VNet interface and the outgoing interface. Track interfaces
that already received 'force_forwarding' commands to avoid duplicates
when multiple subnets share the same outgoing path. Update the expected
SDN interface output in the zone tests accordingly.

Signed-off-by: Lukas Sichert <l.sichert@proxmox.com>
---
 src/PVE/Network/SDN/Zones/EvpnPlugin.pm       | 20 +++++++++++++++----
 .../expected_sdn_interfaces                   |  4 ++++
 .../exitnode_snat/expected_sdn_interfaces     |  4 ++++
 .../exitnodenullroute/expected_sdn_interfaces |  4 ++++
 .../evpn/ipv4ipv6/expected_sdn_interfaces     |  4 ++++
 .../zones/evpn/ipv6/expected_sdn_interfaces   |  4 ++++
 .../evpn/ipv6underlay/expected_sdn_interfaces |  4 ++++
 7 files changed, 40 insertions(+), 4 deletions(-)

diff --git a/src/PVE/Network/SDN/Zones/EvpnPlugin.pm b/src/PVE/Network/SDN/Zones/EvpnPlugin.pm
index dfbd7e9..7622457 100644
--- a/src/PVE/Network/SDN/Zones/EvpnPlugin.pm
+++ b/src/PVE/Network/SDN/Zones/EvpnPlugin.pm
@@ -238,11 +238,13 @@ sub generate_sdn_config {
     my $ipv6 = undef;
     my $enable_forward_v4 = undef;
     my $enable_forward_v6 = undef;
+    my $force_forward_enabled = {};
     my $subnets = PVE::Network::SDN::Vnets::get_subnets($vnetid, 1);
     foreach my $subnetid (sort keys %{$subnets}) {
         my $subnet = $subnets->{$subnetid};
         my $cidr = $subnet->{cidr};
         my $mask = $subnet->{mask};
+        my $vnet = $subnet->{vnet};
 
         my $gateway = $subnet->{gateway};
         if ($gateway) {
@@ -266,11 +268,21 @@ sub generate_sdn_config {
             $enable_forward_v4 = 1 if $gateway;
         }
 
-        if ($subnet->{snat}) {
+        #find outgoing interface
+        my ($outip, $outiface) =
+            PVE::Network::SDN::Zones::Plugin::get_local_route_ip($checkrouteip);
+
+        if ($outiface && $enable_forward_v6 && !($force_forward_enabled->{$outiface})) {
+            push @iface_config,
+                "post-up echo 1 > /proc/sys/net/ipv6/conf/$outiface/force_forwarding";
+            push @iface_config,
+                "post-down echo 0 > /proc/sys/net/ipv6/conf/$outiface/force_forwarding";
+            push @iface_config, "post-up echo 1 > /proc/sys/net/ipv6/conf/$vnet/force_forwarding";
+            push @iface_config, "post-down echo 0 > /proc/sys/net/ipv6/conf/$vnet/force_forwarding";
+            $force_forward_enabled->{$outiface} = 1;
+        }
 
-            #find outgoing interface
-            my ($outip, $outiface) =
-                PVE::Network::SDN::Zones::Plugin::get_local_route_ip($checkrouteip);
+        if ($subnet->{snat}) {
             if ($outip && $outiface && $is_evpn_gateway) {
                 #use snat, faster than masquerade
                 push @iface_config,
diff --git a/src/test/zones/evpn/exitnode_local_routing_ipv6/expected_sdn_interfaces b/src/test/zones/evpn/exitnode_local_routing_ipv6/expected_sdn_interfaces
index b46d4e7..e620e15 100644
--- a/src/test/zones/evpn/exitnode_local_routing_ipv6/expected_sdn_interfaces
+++ b/src/test/zones/evpn/exitnode_local_routing_ipv6/expected_sdn_interfaces
@@ -3,6 +3,10 @@
 auto myvnet
 iface myvnet
 	address 2a08:2142:302:3::1/64
+	post-up echo 1 > /proc/sys/net/ipv6/conf/vmbr0/force_forwarding
+	post-down echo 0 > /proc/sys/net/ipv6/conf/vmbr0/force_forwarding
+	post-up echo 1 > /proc/sys/net/ipv6/conf/myvnet/force_forwarding
+	post-down echo 0 > /proc/sys/net/ipv6/conf/myvnet/force_forwarding
 	bridge_ports vxlan_myvnet
 	bridge_stp off
 	bridge_fd 0
diff --git a/src/test/zones/evpn/exitnode_snat/expected_sdn_interfaces b/src/test/zones/evpn/exitnode_snat/expected_sdn_interfaces
index 0d7d174..bdd6dd3 100644
--- a/src/test/zones/evpn/exitnode_snat/expected_sdn_interfaces
+++ b/src/test/zones/evpn/exitnode_snat/expected_sdn_interfaces
@@ -18,6 +18,10 @@ iface myvnet
 auto myvnet2
 iface myvnet2
 	address 2a08:2142:302:3::1/64
+	post-up echo 1 > /proc/sys/net/ipv6/conf/vmbr0/force_forwarding
+	post-down echo 0 > /proc/sys/net/ipv6/conf/vmbr0/force_forwarding
+	post-up echo 1 > /proc/sys/net/ipv6/conf/myvnet2/force_forwarding
+	post-down echo 0 > /proc/sys/net/ipv6/conf/myvnet2/force_forwarding
 	post-up ip6tables -t nat -A POSTROUTING -s '2a08:2142:302:3::/64' -o vmbr0 -j SNAT --to-source 2001:db8::2
 	post-down ip6tables -t nat -D POSTROUTING -s '2a08:2142:302:3::/64' -o vmbr0 -j SNAT --to-source 2001:db8::2
 	post-up ip6tables -t raw -I PREROUTING -i fwbr+ -j CT --zone 1
diff --git a/src/test/zones/evpn/exitnodenullroute/expected_sdn_interfaces b/src/test/zones/evpn/exitnodenullroute/expected_sdn_interfaces
index 4bf5ccf..557ccd3 100644
--- a/src/test/zones/evpn/exitnodenullroute/expected_sdn_interfaces
+++ b/src/test/zones/evpn/exitnodenullroute/expected_sdn_interfaces
@@ -6,6 +6,10 @@ iface myvnet
 	address 192.168.0.1/24
 	address 192.168.10.1/24
 	address 2b0f:1480:4000:6000::1/64
+	post-up echo 1 > /proc/sys/net/ipv6/conf/vmbr0/force_forwarding
+	post-down echo 0 > /proc/sys/net/ipv6/conf/vmbr0/force_forwarding
+	post-up echo 1 > /proc/sys/net/ipv6/conf/myvnet/force_forwarding
+	post-down echo 0 > /proc/sys/net/ipv6/conf/myvnet/force_forwarding
 	address 2b0f:1480:4000:8000::1/64
 	address 2b0f:1480::1/64
 	bridge_ports vxlan_myvnet
diff --git a/src/test/zones/evpn/ipv4ipv6/expected_sdn_interfaces b/src/test/zones/evpn/ipv4ipv6/expected_sdn_interfaces
index 7a5d741..fcff2ba 100644
--- a/src/test/zones/evpn/ipv4ipv6/expected_sdn_interfaces
+++ b/src/test/zones/evpn/ipv4ipv6/expected_sdn_interfaces
@@ -4,6 +4,10 @@ auto myvnet
 iface myvnet
 	address 10.0.0.1/24
 	address 2a08:2142:302:3::1/64
+	post-up echo 1 > /proc/sys/net/ipv6/conf/vmbr0/force_forwarding
+	post-down echo 0 > /proc/sys/net/ipv6/conf/vmbr0/force_forwarding
+	post-up echo 1 > /proc/sys/net/ipv6/conf/myvnet/force_forwarding
+	post-down echo 0 > /proc/sys/net/ipv6/conf/myvnet/force_forwarding
 	hwaddress A2:1D:CB:1A:C0:8B
 	bridge_ports vxlan_myvnet
 	bridge_stp off
diff --git a/src/test/zones/evpn/ipv6/expected_sdn_interfaces b/src/test/zones/evpn/ipv6/expected_sdn_interfaces
index b2bdbfe..2ab9bf9 100644
--- a/src/test/zones/evpn/ipv6/expected_sdn_interfaces
+++ b/src/test/zones/evpn/ipv6/expected_sdn_interfaces
@@ -3,6 +3,10 @@
 auto myvnet
 iface myvnet
 	address 2a08:2142:302:3::1/64
+	post-up echo 1 > /proc/sys/net/ipv6/conf/vmbr0/force_forwarding
+	post-down echo 0 > /proc/sys/net/ipv6/conf/vmbr0/force_forwarding
+	post-up echo 1 > /proc/sys/net/ipv6/conf/myvnet/force_forwarding
+	post-down echo 0 > /proc/sys/net/ipv6/conf/myvnet/force_forwarding
 	hwaddress A2:1D:CB:1A:C0:8B
 	bridge_ports vxlan_myvnet
 	bridge_stp off
diff --git a/src/test/zones/evpn/ipv6underlay/expected_sdn_interfaces b/src/test/zones/evpn/ipv6underlay/expected_sdn_interfaces
index 3b91f75..624f38a 100644
--- a/src/test/zones/evpn/ipv6underlay/expected_sdn_interfaces
+++ b/src/test/zones/evpn/ipv6underlay/expected_sdn_interfaces
@@ -3,6 +3,10 @@
 auto myvnet
 iface myvnet
 	address 2a08:2142:302:3::1/64
+	post-up echo 1 > /proc/sys/net/ipv6/conf/vmbr0/force_forwarding
+	post-down echo 0 > /proc/sys/net/ipv6/conf/vmbr0/force_forwarding
+	post-up echo 1 > /proc/sys/net/ipv6/conf/myvnet/force_forwarding
+	post-down echo 0 > /proc/sys/net/ipv6/conf/myvnet/force_forwarding
 	hwaddress A2:1D:CB:1A:C0:8B
 	bridge_ports vxlan_myvnet
 	bridge_stp off
-- 
2.47.3





^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH network 2/4] sdn: simple: enable force_forwarding for ipv6 forwarding to subnets
  2026-06-01 15:15 [PATCH docs/network/perl-rs 0/4] sdn: enable force_forwarding for ipv6 forwarding Lukas Sichert
  2026-06-01 15:15 ` [PATCH network 1/4] sdn: evpn: enable force_forwarding for ipv6 forwarding to subnets Lukas Sichert
@ 2026-06-01 15:15 ` Lukas Sichert
  2026-06-01 15:15 ` [PATCH perl-rs 3/4] fabrics: openfabric: enable force_forwarding for ipv6 transit traffic Lukas Sichert
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 9+ messages in thread
From: Lukas Sichert @ 2026-06-01 15:15 UTC (permalink / raw)
  To: pve-devel; +Cc: Lukas Sichert

Simple zones can route ipv6 subnet traffic through a VNet bridge. Until
now, this depended on global ipv6 forwarding state, which also changes
Router Advertisement handling for the whole host.

Use the per-interface 'force_forwarding' setting instead. For ipv6
subnets that need forwarding, generate post-up/post-down commands for
both the VNet interface and the outgoing interface. Track interfaces
that already received 'force_forwarding' commands to avoid duplicates
when multiple subnets share the same outgoing path.
Update the expected SDN interface output in the zone tests accordingly.

Signed-off-by: Lukas Sichert <l.sichert@proxmox.com>
---
 src/PVE/Network/SDN/Zones/SimplePlugin.pm     | 20 +++++++++++++++----
 .../simple/ipv4v6/expected_sdn_interfaces     |  4 ++++
 .../simple/ipv6snat/expected_sdn_interfaces   |  4 ++++
 3 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/src/PVE/Network/SDN/Zones/SimplePlugin.pm b/src/PVE/Network/SDN/Zones/SimplePlugin.pm
index f5cd18e..acc482c 100644
--- a/src/PVE/Network/SDN/Zones/SimplePlugin.pm
+++ b/src/PVE/Network/SDN/Zones/SimplePlugin.pm
@@ -80,11 +80,13 @@ sub generate_sdn_config {
     my $ipv6 = undef;
     my $enable_forward_v4 = undef;
     my $enable_forward_v6 = undef;
+    my $force_forward_enabled = {};
 
     foreach my $subnetid (sort keys %{$subnets}) {
         my $subnet = $subnets->{$subnetid};
         my $cidr = $subnet->{cidr};
         my $mask = $subnet->{mask};
+        my $vnet = $subnet->{vnet};
 
         my $gateway = $subnet->{gateway};
         if ($gateway) {
@@ -108,12 +110,23 @@ sub generate_sdn_config {
             $enable_forward_v4 = 1 if $gateway;
         }
 
+        #find outgoing interface
+        my ($outip, $outiface) =
+            PVE::Network::SDN::Zones::Plugin::get_local_route_ip($checkrouteip);
+
+        if ($outiface && $enable_forward_v6 && !($force_forward_enabled->{$outiface})) {
+            push @iface_config,
+                "post-up echo 1 > /proc/sys/net/ipv6/conf/$outiface/force_forwarding";
+            push @iface_config,
+                "post-down echo 0 > /proc/sys/net/ipv6/conf/$outiface/force_forwarding";
+            push @iface_config, "post-up echo 1 > /proc/sys/net/ipv6/conf/$vnet/force_forwarding";
+            push @iface_config, "post-down echo 0 > /proc/sys/net/ipv6/conf/$vnet/force_forwarding";
+            $force_forward_enabled->{$outiface} = 1;
+        }
+
         #add route for /32 pointtopoint
         push @iface_config, "up ip route add $cidr dev $vnetid" if $mask == 32 && $ipversion == 4;
         if ($subnet->{snat}) {
-            #find outgoing interface
-            my ($outip, $outiface) =
-                PVE::Network::SDN::Zones::Plugin::get_local_route_ip($checkrouteip);
             if ($outip && $outiface) {
                 #use snat, faster than masquerade
                 push @iface_config,
@@ -141,7 +154,6 @@ sub generate_sdn_config {
     push @iface_config, "alias $alias" if $alias;
     push @iface_config, "ip-forward on" if $enable_forward_v4;
     push @iface_config, "ip6-forward on" if $enable_forward_v6;
-
     push @{ $config->{$vnetid} }, @iface_config;
 
     return $config;
diff --git a/src/test/zones/simple/ipv4v6/expected_sdn_interfaces b/src/test/zones/simple/ipv4v6/expected_sdn_interfaces
index 34ed5db..cd19fda 100644
--- a/src/test/zones/simple/ipv4v6/expected_sdn_interfaces
+++ b/src/test/zones/simple/ipv4v6/expected_sdn_interfaces
@@ -4,6 +4,10 @@ auto myvnet
 iface myvnet
 	address 192.168.0.1/24
 	address 2a08:2142:302:3::1/64
+	post-up echo 1 > /proc/sys/net/ipv6/conf/vmbr0/force_forwarding
+	post-down echo 0 > /proc/sys/net/ipv6/conf/vmbr0/force_forwarding
+	post-up echo 1 > /proc/sys/net/ipv6/conf/myvnet/force_forwarding
+	post-down echo 0 > /proc/sys/net/ipv6/conf/myvnet/force_forwarding
 	bridge_ports none
 	bridge_stp off
 	bridge_fd 0
diff --git a/src/test/zones/simple/ipv6snat/expected_sdn_interfaces b/src/test/zones/simple/ipv6snat/expected_sdn_interfaces
index 5f6d40b..f426774 100644
--- a/src/test/zones/simple/ipv6snat/expected_sdn_interfaces
+++ b/src/test/zones/simple/ipv6snat/expected_sdn_interfaces
@@ -3,6 +3,10 @@
 auto myvnet
 iface myvnet
 	address 2a08:2142:302:3::1/64
+	post-up echo 1 > /proc/sys/net/ipv6/conf/vmbr0/force_forwarding
+	post-down echo 0 > /proc/sys/net/ipv6/conf/vmbr0/force_forwarding
+	post-up echo 1 > /proc/sys/net/ipv6/conf/myvnet/force_forwarding
+	post-down echo 0 > /proc/sys/net/ipv6/conf/myvnet/force_forwarding
 	post-up ip6tables -t nat -A POSTROUTING -s '2a08:2142:302:3::/64' -o vmbr0 -j SNAT --to-source 2001:db8::2
 	post-down ip6tables -t nat -D POSTROUTING -s '2a08:2142:302:3::/64' -o vmbr0 -j SNAT --to-source 2001:db8::2
 	post-up ip6tables -t raw -I PREROUTING -i fwbr+ -j CT --zone 1
-- 
2.47.3





^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH perl-rs 3/4] fabrics: openfabric: enable force_forwarding for ipv6 transit traffic
  2026-06-01 15:15 [PATCH docs/network/perl-rs 0/4] sdn: enable force_forwarding for ipv6 forwarding Lukas Sichert
  2026-06-01 15:15 ` [PATCH network 1/4] sdn: evpn: enable force_forwarding for ipv6 forwarding to subnets Lukas Sichert
  2026-06-01 15:15 ` [PATCH network 2/4] sdn: simple: " Lukas Sichert
@ 2026-06-01 15:15 ` Lukas Sichert
  2026-06-02  9:03   ` Gabriel Goller
  2026-06-01 15:15 ` [PATCH docs 4/4] sdn: drop global IPv6 forwarding workaround from OpenFabric docs Lukas Sichert
  2026-06-03 15:25 ` superseded: [PATCH docs/network/perl-rs 0/4] sdn: enable force_forwarding for ipv6 forwarding Lukas Sichert
  4 siblings, 1 reply; 9+ messages in thread
From: Lukas Sichert @ 2026-06-01 15:15 UTC (permalink / raw)
  To: pve-devel; +Cc: Lukas Sichert

In a non-full-mesh OpenFabric setup, nodes may need to relay traffic
between peers that are not directly connected. This requires forwarding
ipv6 packets between fabric bridges. With the addition of
'force_forwarding' to the Linux kernel, this can be done without
enabling 'all.forwarding', which disables Router Advertisements.

Configure fabric bridges with the required 'post-up'/'post-down'
commands to enable 'force_forwarding'.

Signed-off-by: Lukas Sichert <l.sichert@proxmox.com>
---
 pve-rs/src/bindings/sdn/fabrics.rs | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/pve-rs/src/bindings/sdn/fabrics.rs b/pve-rs/src/bindings/sdn/fabrics.rs
index f96b6b1..785b537 100644
--- a/pve-rs/src/bindings/sdn/fabrics.rs
+++ b/pve-rs/src/bindings/sdn/fabrics.rs
@@ -596,6 +596,16 @@ pub mod pve_rs_sdn_fabrics {
             writeln!(interface, "\tlink-type {link_type}")?;
         }
         writeln!(interface, "\tip-forward 1")?;
+        if cidr.is_ipv6() {
+            writeln!(
+                interface,
+                "\tpost-up echo 1 > /proc/sys/net/ipv6/conf/{name}/force_forwarding"
+            )?;
+            writeln!(
+                interface,
+                "\tpost-down echo 0 > /proc/sys/net/ipv6/conf/{name}/force_forwarding"
+            )?;
+        }
 
         Ok(interface)
     }
-- 
2.47.3





^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH docs 4/4] sdn: drop global IPv6 forwarding workaround from OpenFabric docs
  2026-06-01 15:15 [PATCH docs/network/perl-rs 0/4] sdn: enable force_forwarding for ipv6 forwarding Lukas Sichert
                   ` (2 preceding siblings ...)
  2026-06-01 15:15 ` [PATCH perl-rs 3/4] fabrics: openfabric: enable force_forwarding for ipv6 transit traffic Lukas Sichert
@ 2026-06-01 15:15 ` Lukas Sichert
  2026-06-02  9:01   ` Gabriel Goller
  2026-06-03 15:25 ` superseded: [PATCH docs/network/perl-rs 0/4] sdn: enable force_forwarding for ipv6 forwarding Lukas Sichert
  4 siblings, 1 reply; 9+ messages in thread
From: Lukas Sichert @ 2026-06-01 15:15 UTC (permalink / raw)
  To: pve-devel; +Cc: Lukas Sichert

OpenFabric fabrics with IPv6 need forwarding on transit nodes so packets
can be relayed between peers that are not directly connected.

Drop the old recommendation to enable host-wide
net.ipv6.conf.all.forwarding from the documentation. The generated fabric
interface configuration now handles the required forwarding setup, so the
manual global forwarding workaround is no longer needed.

Signed-off-by: Lukas Sichert <l.sichert@proxmox.com>
---
 pvesdn.adoc | 18 +++---------------
 1 file changed, 3 insertions(+), 15 deletions(-)

diff --git a/pvesdn.adoc b/pvesdn.adoc
index d20a0eb..ac7240c 100644
--- a/pvesdn.adoc
+++ b/pvesdn.adoc
@@ -605,22 +605,10 @@ Notes on IPv6
 ^^^^^^^^^^^^^
 
 IPv6 is currently only usable on OpenFabric fabrics. These IPv6 Fabrics need
-global IPv6 forwarding enabled on all nodes contained in the fabric. Without
+IPv6 forwarding enabled on all transit nodes contained in the fabric. Without
 IPv6 forwarding, non-full-mesh fabrics won't work because the transit nodes
-don't forward packets to the outer nodes. Currently there isn't an easy way to
-enable IPv6 forwarding per-interface like with IPv4, so it has to be enabled
-globally. This can be accomplished by appending this line:
-
-----
-post-up sysctl -w net.ipv6.conf.all.forwarding=1
-----
-
-to a fabric interface in the `/etc/network/interfaces` file. This will enable
-IPv6 forwarding globally once that interface comes up. Note that this affects
-how your interfaces handle automatic IPv6 setup (SLAAC), Neighbour
-Advertisements, Router Solicitations, and Router Advertisements. More details
-here: https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt under
-`net.ipv6.conf.all.forwarding`.
+don't forward packets to the outer nodes. IPv6 fowarding is enabled per default
+on the necessary interfaces.
 
 [[pvesdn_openfabric]]
 OpenFabric
-- 
2.47.3





^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH docs 4/4] sdn: drop global IPv6 forwarding workaround from OpenFabric docs
  2026-06-01 15:15 ` [PATCH docs 4/4] sdn: drop global IPv6 forwarding workaround from OpenFabric docs Lukas Sichert
@ 2026-06-02  9:01   ` Gabriel Goller
  0 siblings, 0 replies; 9+ messages in thread
From: Gabriel Goller @ 2026-06-02  9:01 UTC (permalink / raw)
  To: Lukas Sichert; +Cc: pve-devel

On 01.06.2026 17:15, Lukas Sichert wrote:
> OpenFabric fabrics with IPv6 need forwarding on transit nodes so packets
> can be relayed between peers that are not directly connected.
> 
> Drop the old recommendation to enable host-wide
> net.ipv6.conf.all.forwarding from the documentation. The generated fabric
> interface configuration now handles the required forwarding setup, so the
> manual global forwarding workaround is no longer needed.
> 
> Signed-off-by: Lukas Sichert <l.sichert@proxmox.com>
> ---
>  pvesdn.adoc | 18 +++---------------
>  1 file changed, 3 insertions(+), 15 deletions(-)
> 
> diff --git a/pvesdn.adoc b/pvesdn.adoc
> index d20a0eb..ac7240c 100644
> --- a/pvesdn.adoc
> +++ b/pvesdn.adoc
> @@ -605,22 +605,10 @@ Notes on IPv6
>  ^^^^^^^^^^^^^
>  
>  IPv6 is currently only usable on OpenFabric fabrics. These IPv6 Fabrics need
> -global IPv6 forwarding enabled on all nodes contained in the fabric. Without
> +IPv6 forwarding enabled on all transit nodes contained in the fabric. Without
>  IPv6 forwarding, non-full-mesh fabrics won't work because the transit nodes
> -don't forward packets to the outer nodes. Currently there isn't an easy way to
> -enable IPv6 forwarding per-interface like with IPv4, so it has to be enabled
> -globally. This can be accomplished by appending this line:
> -
> -----
> -post-up sysctl -w net.ipv6.conf.all.forwarding=1
> -----
> -
> -to a fabric interface in the `/etc/network/interfaces` file. This will enable
> -IPv6 forwarding globally once that interface comes up. Note that this affects
> -how your interfaces handle automatic IPv6 setup (SLAAC), Neighbour
> -Advertisements, Router Solicitations, and Router Advertisements. More details
> -here: https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt under
> -`net.ipv6.conf.all.forwarding`.
> +don't forward packets to the outer nodes. IPv6 fowarding is enabled per default
> +on the necessary interfaces.
>  
>  [[pvesdn_openfabric]]
>  OpenFabric
> -- 

I'd mention here somewhere that `force_forwarding` is used (and maybe link to
the kernel docs).




^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH perl-rs 3/4] fabrics: openfabric: enable force_forwarding for ipv6 transit traffic
  2026-06-01 15:15 ` [PATCH perl-rs 3/4] fabrics: openfabric: enable force_forwarding for ipv6 transit traffic Lukas Sichert
@ 2026-06-02  9:03   ` Gabriel Goller
  2026-06-02  9:11     ` Hannes Laimer
  0 siblings, 1 reply; 9+ messages in thread
From: Gabriel Goller @ 2026-06-02  9:03 UTC (permalink / raw)
  To: Lukas Sichert; +Cc: pve-devel

On 01.06.2026 17:15, Lukas Sichert wrote:
> In a non-full-mesh OpenFabric setup, nodes may need to relay traffic
> between peers that are not directly connected. This requires forwarding
> ipv6 packets between fabric bridges. With the addition of
> 'force_forwarding' to the Linux kernel, this can be done without
> enabling 'all.forwarding', which disables Router Advertisements.
> 
> Configure fabric bridges with the required 'post-up'/'post-down'
> commands to enable 'force_forwarding'.
> 
> Signed-off-by: Lukas Sichert <l.sichert@proxmox.com>
> ---
>  pve-rs/src/bindings/sdn/fabrics.rs | 10 ++++++++++
>  1 file changed, 10 insertions(+)
> 
> diff --git a/pve-rs/src/bindings/sdn/fabrics.rs b/pve-rs/src/bindings/sdn/fabrics.rs
> index f96b6b1..785b537 100644
> --- a/pve-rs/src/bindings/sdn/fabrics.rs
> +++ b/pve-rs/src/bindings/sdn/fabrics.rs
> @@ -596,6 +596,16 @@ pub mod pve_rs_sdn_fabrics {
>              writeln!(interface, "\tlink-type {link_type}")?;
>          }
>          writeln!(interface, "\tip-forward 1")?;
> +        if cidr.is_ipv6() {
> +            writeln!(
> +                interface,
> +                "\tpost-up echo 1 > /proc/sys/net/ipv6/conf/{name}/force_forwarding"
> +            )?;
> +            writeln!(
> +                interface,
> +                "\tpost-down echo 0 > /proc/sys/net/ipv6/conf/{name}/force_forwarding"
> +            )?;
> +        }
>  
>          Ok(interface)
>      }

The bgp fabric also needs force_forwarding AFAIK. @Hannes?

Also I just noticed on the bgp fabric we put ipv6 addresses in ifupdown2 inet
blocks (instead of inet6) -- shouldn't cause any problems though.




^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH perl-rs 3/4] fabrics: openfabric: enable force_forwarding for ipv6 transit traffic
  2026-06-02  9:03   ` Gabriel Goller
@ 2026-06-02  9:11     ` Hannes Laimer
  0 siblings, 0 replies; 9+ messages in thread
From: Hannes Laimer @ 2026-06-02  9:11 UTC (permalink / raw)
  To: Lukas Sichert, pve-devel

On 2026-06-02 11:02, Gabriel Goller wrote:
> On 01.06.2026 17:15, Lukas Sichert wrote:
>> In a non-full-mesh OpenFabric setup, nodes may need to relay traffic
>> between peers that are not directly connected. This requires forwarding
>> ipv6 packets between fabric bridges. With the addition of
>> 'force_forwarding' to the Linux kernel, this can be done without
>> enabling 'all.forwarding', which disables Router Advertisements.
>>
>> Configure fabric bridges with the required 'post-up'/'post-down'
>> commands to enable 'force_forwarding'.
>>
>> Signed-off-by: Lukas Sichert <l.sichert@proxmox.com>
>> ---
>>  pve-rs/src/bindings/sdn/fabrics.rs | 10 ++++++++++
>>  1 file changed, 10 insertions(+)
>>
>> diff --git a/pve-rs/src/bindings/sdn/fabrics.rs b/pve-rs/src/bindings/sdn/fabrics.rs
>> index f96b6b1..785b537 100644
>> --- a/pve-rs/src/bindings/sdn/fabrics.rs
>> +++ b/pve-rs/src/bindings/sdn/fabrics.rs
>> @@ -596,6 +596,16 @@ pub mod pve_rs_sdn_fabrics {
>>              writeln!(interface, "\tlink-type {link_type}")?;
>>          }
>>          writeln!(interface, "\tip-forward 1")?;
>> +        if cidr.is_ipv6() {
>> +            writeln!(
>> +                interface,
>> +                "\tpost-up echo 1 > /proc/sys/net/ipv6/conf/{name}/force_forwarding"
>> +            )?;
>> +            writeln!(
>> +                interface,
>> +                "\tpost-down echo 0 > /proc/sys/net/ipv6/conf/{name}/force_forwarding"
>> +            )?;
>> +        }
>>  
>>          Ok(interface)
>>      }
> 
> The bgp fabric also needs force_forwarding AFAIK. @Hannes?

yes, we also need it there, same thing

> 
> Also I just noticed on the bgp fabric we put ipv6 addresses in ifupdown2 inet
> blocks (instead of inet6) -- shouldn't cause any problems though.





^ permalink raw reply	[flat|nested] 9+ messages in thread

* superseded: [PATCH docs/network/perl-rs 0/4] sdn: enable force_forwarding for ipv6 forwarding
  2026-06-01 15:15 [PATCH docs/network/perl-rs 0/4] sdn: enable force_forwarding for ipv6 forwarding Lukas Sichert
                   ` (3 preceding siblings ...)
  2026-06-01 15:15 ` [PATCH docs 4/4] sdn: drop global IPv6 forwarding workaround from OpenFabric docs Lukas Sichert
@ 2026-06-03 15:25 ` Lukas Sichert
  4 siblings, 0 replies; 9+ messages in thread
From: Lukas Sichert @ 2026-06-03 15:25 UTC (permalink / raw)
  To: Lukas Sichert, pve-devel

superseded-by v2:
https://lore.proxmox.com/all/20260603142921.91174-1-l.sichert@proxmox.com/




^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2026-06-03 15:26 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-01 15:15 [PATCH docs/network/perl-rs 0/4] sdn: enable force_forwarding for ipv6 forwarding Lukas Sichert
2026-06-01 15:15 ` [PATCH network 1/4] sdn: evpn: enable force_forwarding for ipv6 forwarding to subnets Lukas Sichert
2026-06-01 15:15 ` [PATCH network 2/4] sdn: simple: " Lukas Sichert
2026-06-01 15:15 ` [PATCH perl-rs 3/4] fabrics: openfabric: enable force_forwarding for ipv6 transit traffic Lukas Sichert
2026-06-02  9:03   ` Gabriel Goller
2026-06-02  9:11     ` Hannes Laimer
2026-06-01 15:15 ` [PATCH docs 4/4] sdn: drop global IPv6 forwarding workaround from OpenFabric docs Lukas Sichert
2026-06-02  9:01   ` Gabriel Goller
2026-06-03 15:25 ` superseded: [PATCH docs/network/perl-rs 0/4] sdn: enable force_forwarding for ipv6 forwarding Lukas Sichert

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