public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
* [PATCH installer 1/2] sys: net: make routes hash always defined
@ 2026-06-10 13:27 Christoph Heiss
  2026-06-10 13:27 ` [PATCH installer 2/2] install: do not force gateway to IPv6 RA-received on non-bridged setups Christoph Heiss
  2026-06-10 19:41 ` applied: [PATCH installer 1/2] sys: net: make routes hash always defined Thomas Lamprecht
  0 siblings, 2 replies; 5+ messages in thread
From: Christoph Heiss @ 2026-06-10 13:27 UTC (permalink / raw)
  To: pve-devel

The 'dst' key was never set or used, so drop from subroutine
documentation.

This especially simplifies the network setup in Rust, dropping an
additional (and unneeded) level of `Option<>`.

No functional changes.

Signed-off-by: Christoph Heiss <c.heiss@proxmox.com>
---
Small cleanup patch.

Optional, can be skipped if desired, i.e. the second patch does not
depend on it.

 Proxmox/Sys/Net.pm                            | 12 +---
 proxinstall                                   |  2 +-
 proxmox-auto-installer/tests/parse-answer.rs  |  1 +
 .../resources/parse_answer/no_network.json    | 19 +++++
 .../parse_answer/no_network.run-env.json      | 45 ++++++++++++
 .../resources/parse_answer/no_network.toml    | 14 ++++
 proxmox-installer-common/src/options.rs       | 69 +++++++++----------
 proxmox-installer-common/src/setup.rs         |  2 +-
 8 files changed, 118 insertions(+), 46 deletions(-)
 create mode 100644 proxmox-auto-installer/tests/resources/parse_answer/no_network.json
 create mode 100644 proxmox-auto-installer/tests/resources/parse_answer/no_network.run-env.json
 create mode 100644 proxmox-auto-installer/tests/resources/parse_answer/no_network.toml

diff --git a/Proxmox/Sys/Net.pm b/Proxmox/Sys/Net.pm
index ed7744b..d175742 100644
--- a/Proxmox/Sys/Net.pm
+++ b/Proxmox/Sys/Net.pm
@@ -277,24 +277,22 @@ sub query_netdevs : prototype() {
 #
 # {
 #     gateway4 => {
-#         dst => "default",
 #         gateway => <ipv4>,
 #         dev => <ifname>,
 #     },
 #     gateway6 => {
-#         dst => "default",
 #         gateway => <ipv6>,
 #         dev => <ifname>,
 #     },
 # }
 sub query_routes : prototype() {
-    my ($gateway4, $gateway6);
+    my $routes = {};
 
     log_info("query routes");
     my $route4 = from_json(qx/ip -4 --json route show/, { utf8 => 1 });
     for my $route (@$route4) {
         if ($route->{dst} eq 'default') {
-            $gateway4 = {
+            $routes->{gateway4} = {
                 dev => $route->{dev},
                 gateway => $route->{gateway},
             };
@@ -305,7 +303,7 @@ sub query_routes : prototype() {
     my $route6 = from_json(qx/ip -6 --json route show/, { utf8 => 1 });
     for my $route (@$route6) {
         if ($route->{dst} eq 'default') {
-            $gateway6 = {
+            $routes->{gateway6} = {
                 dev => $route->{dev},
                 gateway => $route->{gateway},
             };
@@ -313,10 +311,6 @@ sub query_routes : prototype() {
         }
     }
 
-    my $routes;
-    $routes->{gateway4} = $gateway4 if $gateway4;
-    $routes->{gateway6} = $gateway6 if $gateway6;
-
     return $routes;
 }
 
diff --git a/proxinstall b/proxinstall
index db95b8a..49b1612 100755
--- a/proxinstall
+++ b/proxinstall
@@ -435,7 +435,7 @@ sub create_ipconf_view {
     my $network = $run_env->{network};
 
     # prefer ipv4 gateway and fallback to ipv6
-    my $routes = $network->{routes} // {};
+    my $routes = $network->{routes};
     my $default_gateway = $routes->{gateway4} // $routes->{gateway6};
 
     my $default_gateway_ipversion;
diff --git a/proxmox-auto-installer/tests/parse-answer.rs b/proxmox-auto-installer/tests/parse-answer.rs
index 675678a..8b0bae7 100644
--- a/proxmox-auto-installer/tests/parse-answer.rs
+++ b/proxmox-auto-installer/tests/parse-answer.rs
@@ -130,6 +130,7 @@ mod tests {
             network_interface_pinning,
             network_interface_pinning_uppercase_mac_address,
             nic_matching,
+            no_network,
             specific_nic,
             zfs,
             zfs_raid_level_uppercase,
diff --git a/proxmox-auto-installer/tests/resources/parse_answer/no_network.json b/proxmox-auto-installer/tests/resources/parse_answer/no_network.json
new file mode 100644
index 0000000..de5f263
--- /dev/null
+++ b/proxmox-auto-installer/tests/resources/parse_answer/no_network.json
@@ -0,0 +1,19 @@
+{
+  "autoreboot": 1,
+  "cidr": "192.168.100.2/24",
+  "country": "at",
+  "dns": "192.168.100.1",
+  "domain": "test",
+  "filesys": "ext4",
+  "gateway": "192.168.100.1",
+  "hdsize": 223.57088470458984,
+  "existing_storage_auto_rename": 1,
+  "hostname": "no-gateways",
+  "keymap": "de",
+  "mailto": "mail@no.invalid",
+  "mngmt_nic": "eno1",
+  "root_password": { "plain": "12345678" },
+  "target_hd": "/dev/sda",
+  "timezone": "Europe/Vienna",
+  "first_boot": { "enabled": 0 }
+}
diff --git a/proxmox-auto-installer/tests/resources/parse_answer/no_network.run-env.json b/proxmox-auto-installer/tests/resources/parse_answer/no_network.run-env.json
new file mode 100644
index 0000000..9c7d2e3
--- /dev/null
+++ b/proxmox-auto-installer/tests/resources/parse_answer/no_network.run-env.json
@@ -0,0 +1,45 @@
+{
+  "boot_type": "efi",
+  "country": "at",
+  "disks": [
+    [
+      0,
+      "/dev/sda",
+      468862128,
+      "SAMSUNG MZ7KM240",
+      512,
+      "/sys/block/sda"
+    ]
+  ],
+  "hvm_supported": 1,
+  "kernel_cmdline": "BOOT_IMAGE=/boot/linux26 ro ramdisk_size=16777216 rw splash=verbose proxdebug vga=788",
+  "network": {
+    "hostname": "no-gateways.test",
+    "dns": {
+      "dns": [],
+      "domain": "test.local"
+    },
+    "interfaces": {
+      "eno1": {
+        "addresses": [],
+        "index": 4,
+        "mac": "b4:2e:99:ac:ad:b4",
+        "name": "eno1",
+        "state": "UP",
+        "driver": "igb",
+        "pinned_id": "0"
+      },
+      "eno2": {
+        "index": 6,
+        "mac": "b4:2e:99:ac:ad:b5",
+        "name": "eno2",
+        "state": "UP",
+        "driver": "igb",
+        "pinned_id": "1"
+      }
+    },
+    "routes": {}
+  },
+  "total_memory": 257597,
+  "default_zfs_arc_max": 128798
+}
diff --git a/proxmox-auto-installer/tests/resources/parse_answer/no_network.toml b/proxmox-auto-installer/tests/resources/parse_answer/no_network.toml
new file mode 100644
index 0000000..dc434fa
--- /dev/null
+++ b/proxmox-auto-installer/tests/resources/parse_answer/no_network.toml
@@ -0,0 +1,14 @@
+[global]
+keyboard = "de"
+country = "at"
+fqdn = "no-gateways.test"
+mailto = "mail@no.invalid"
+timezone = "Europe/Vienna"
+root-password = "12345678"
+
+[network]
+source = "from-dhcp"
+
+[disk-setup]
+filesystem = "ext4"
+disk-list = ["sda"]
diff --git a/proxmox-installer-common/src/options.rs b/proxmox-installer-common/src/options.rs
index 69ad217..c7f0baf 100644
--- a/proxmox-installer-common/src/options.rs
+++ b/proxmox-installer-common/src/options.rs
@@ -425,38 +425,34 @@ impl NetworkOptions {
             pinning_opts: pinning_opts.cloned(),
         };
 
-        let iface = if let Some(routes) = &network.routes {
-            if let Some(gw) = &routes.gateway4
-                && let Some(iface) = network.interfaces.get(&gw.dev)
-            {
-                this.gateway = gw.gateway;
+        let iface = if let Some(gw) = &network.routes.gateway4
+            && let Some(iface) = network.interfaces.get(&gw.dev)
+        {
+            this.gateway = gw.gateway;
 
-                if let Some(addr) = iface.addresses.iter().find(|addr| addr.is_ipv4()) {
-                    this.address = *addr;
-                }
-
-                if let Some(addr) = network.dns.dns.iter().find(|addr| addr.is_ipv4()) {
-                    this.dns_server = *addr;
-                }
-
-                Some(iface)
-            } else if let Some(gw) = &routes.gateway6
-                && let Some(iface) = network.interfaces.get(&gw.dev)
-            {
-                this.gateway = gw.gateway;
-
-                if let Some(addr) = iface.addresses.iter().find(|addr| addr.is_ipv6()) {
-                    this.address = *addr;
-                }
-
-                if let Some(addr) = network.dns.dns.iter().find(|addr| addr.is_ipv6()) {
-                    this.dns_server = *addr;
-                }
-
-                Some(iface)
-            } else {
-                None
+            if let Some(addr) = iface.addresses.iter().find(|addr| addr.is_ipv4()) {
+                this.address = *addr;
             }
+
+            if let Some(addr) = network.dns.dns.iter().find(|addr| addr.is_ipv4()) {
+                this.dns_server = *addr;
+            }
+
+            Some(iface)
+        } else if let Some(gw) = &network.routes.gateway6
+            && let Some(iface) = network.interfaces.get(&gw.dev)
+        {
+            this.gateway = gw.gateway;
+
+            if let Some(addr) = iface.addresses.iter().find(|addr| addr.is_ipv6()) {
+                this.address = *addr;
+            }
+
+            if let Some(addr) = network.dns.dns.iter().find(|addr| addr.is_ipv6()) {
+                this.dns_server = *addr;
+            }
+
+            Some(iface)
         } else {
             None
         }
@@ -623,13 +619,13 @@ mod tests {
                 domain: Some("bar.com".to_owned()),
                 dns: Vec::new(),
             },
-            routes: Some(Routes {
+            routes: Routes {
                 gateway4: Some(Gateway {
                     dev: "eth0".to_owned(),
                     gateway: IpAddr::V4(Ipv4Addr::new(192, 168, 0, 1)),
                 }),
                 gateway6: None,
-            }),
+            },
             interfaces,
             hostname: Some("foo".to_owned()),
         };
@@ -717,13 +713,13 @@ mod tests {
                     0x2001, 0xdb8, 0, 0, 0, 0, 0, 0x53,
                 ))],
             },
-            routes: Some(Routes {
+            routes: Routes {
                 gateway4: None,
                 gateway6: Some(Gateway {
                     dev: "eth0".to_owned(),
                     gateway: IpAddr::V6(Ipv6Addr::new(0x2001, 0xdb8, 0, 0, 0, 0, 0, 1)),
                 }),
-            }),
+            },
             interfaces,
             hostname: Some("foo".to_owned()),
         };
@@ -812,7 +808,10 @@ mod tests {
                 domain: None,
                 dns: vec![],
             },
-            routes: None,
+            routes: Routes {
+                gateway4: None,
+                gateway6: None,
+            },
             interfaces,
             hostname: None,
         };
diff --git a/proxmox-installer-common/src/setup.rs b/proxmox-installer-common/src/setup.rs
index 4249794..b8af4e3 100644
--- a/proxmox-installer-common/src/setup.rs
+++ b/proxmox-installer-common/src/setup.rs
@@ -324,7 +324,7 @@ pub struct RuntimeInfo {
 #[derive(Clone, Deserialize)]
 pub struct NetworkInfo {
     pub dns: Dns,
-    pub routes: Option<Routes>,
+    pub routes: Routes,
 
     /// Maps devices to their configuration, if it has a usable configuration.
     /// (Contains no entries for devices with only link-local addresses.)
-- 
2.54.0





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

* [PATCH installer 2/2] install: do not force gateway to IPv6 RA-received on non-bridged setups
  2026-06-10 13:27 [PATCH installer 1/2] sys: net: make routes hash always defined Christoph Heiss
@ 2026-06-10 13:27 ` Christoph Heiss
  2026-06-10 14:38   ` Gabriel Goller
  2026-06-10 14:46   ` Gabriel Goller
  2026-06-10 19:41 ` applied: [PATCH installer 1/2] sys: net: make routes hash always defined Thomas Lamprecht
  1 sibling, 2 replies; 5+ messages in thread
From: Christoph Heiss @ 2026-06-10 13:27 UTC (permalink / raw)
  To: pve-devel

Skip writing the default gateway for the management interface to
/etc/network/interfaces if it was originally received through an IPv6
RA.

Otherwise, fresh, non-bridged (aka. anything other than PVE)
installations will repeatedly, i.e. on every received RA advertising a
different SLAAC-capable prefix, report an error in the journal that a
default gateway already exists.

The Rust struct definitions are not touched, as the information is not
needed there (yet).

Suggested-by: Gabriel Goller <g.goller@proxmox.com>
Signed-off-by: Christoph Heiss <c.heiss@proxmox.com>
---
 Proxmox/Install.pm                             | 18 +++++++++++++-----
 Proxmox/Sys/Net.pm                             |  6 ++++++
 ...dn_from_dhcp_no_default_domain.run-env.json |  3 ++-
 .../no_fqdn_from_dhcp.run-env.json             |  3 ++-
 .../tests/resources/run-env-info.json          |  3 ++-
 5 files changed, 25 insertions(+), 8 deletions(-)

diff --git a/Proxmox/Install.pm b/Proxmox/Install.pm
index 5f748d6..d025360 100644
--- a/Proxmox/Install.pm
+++ b/Proxmox/Install.pm
@@ -1182,6 +1182,12 @@ sub extract_data {
             }
         }
 
+        my $routes = $run_env->{network}->{routes};
+        my $is_gateway6_from_ra =
+            defined($routes->{gateway6})
+            && $routes->{gateway6}->{gateway} eq $gateway
+            && $routes->{gateway6}->{protocol} eq 'ra';
+
         if ($iso_env->{cfg}->{bridged_network}) {
             $ifaces .= "iface $ethdev $ntype manual\n";
 
@@ -1193,11 +1199,13 @@ sub extract_data {
                 . "\tbridge-stp off\n"
                 . "\tbridge-fd 0\n";
         } else {
-            $ifaces .=
-                "auto $ethdev\n"
-                . "iface $ethdev $ntype static\n"
-                . "\taddress $cidr\n"
-                . "\tgateway $gateway\n";
+            $ifaces .= "auto $ethdev\n" . #
+                "iface $ethdev $ntype static\n" . #
+                "\taddress $cidr\n";
+
+            if (!$is_gateway6_from_ra) {
+                $ifaces .= "\tgateway $gateway\n";
+            }
         }
 
         my $interfaces = $run_env->{network}->{interfaces};
diff --git a/Proxmox/Sys/Net.pm b/Proxmox/Sys/Net.pm
index d175742..c4fdd7b 100644
--- a/Proxmox/Sys/Net.pm
+++ b/Proxmox/Sys/Net.pm
@@ -279,12 +279,16 @@ sub query_netdevs : prototype() {
 #     gateway4 => {
 #         gateway => <ipv4>,
 #         dev => <ifname>,
+#         protocol => <protocol>,
 #     },
 #     gateway6 => {
 #         gateway => <ipv6>,
 #         dev => <ifname>,
+#         protocol => <protocol>,
 #     },
 # }
+#
+# <protocol> can be one of: "kernel", "ra"
 sub query_routes : prototype() {
     my $routes = {};
 
@@ -295,6 +299,7 @@ sub query_routes : prototype() {
             $routes->{gateway4} = {
                 dev => $route->{dev},
                 gateway => $route->{gateway},
+                protocol => $route->{protocol},
             };
             last;
         }
@@ -306,6 +311,7 @@ sub query_routes : prototype() {
             $routes->{gateway6} = {
                 dev => $route->{dev},
                 gateway => $route->{gateway},
+                protocol => $route->{protocol},
             };
             last;
         }
diff --git a/proxmox-auto-installer/tests/resources/parse_answer_fail/fqdn_from_dhcp_no_default_domain.run-env.json b/proxmox-auto-installer/tests/resources/parse_answer_fail/fqdn_from_dhcp_no_default_domain.run-env.json
index 566e261..3fbf2aa 100644
--- a/proxmox-auto-installer/tests/resources/parse_answer_fail/fqdn_from_dhcp_no_default_domain.run-env.json
+++ b/proxmox-auto-installer/tests/resources/parse_answer_fail/fqdn_from_dhcp_no_default_domain.run-env.json
@@ -177,7 +177,8 @@
     "routes": {
       "gateway4": {
         "dev": "eno1",
-        "gateway": "192.168.1.1"
+        "gateway": "192.168.1.1",
+        "protocol": "kernel"
       }
     }
   },
diff --git a/proxmox-auto-installer/tests/resources/parse_answer_fail/no_fqdn_from_dhcp.run-env.json b/proxmox-auto-installer/tests/resources/parse_answer_fail/no_fqdn_from_dhcp.run-env.json
index 909cd7c..58cd634 100644
--- a/proxmox-auto-installer/tests/resources/parse_answer_fail/no_fqdn_from_dhcp.run-env.json
+++ b/proxmox-auto-installer/tests/resources/parse_answer_fail/no_fqdn_from_dhcp.run-env.json
@@ -176,7 +176,8 @@
     "routes": {
       "gateway4": {
         "dev": "eno1",
-        "gateway": "192.168.1.1"
+        "gateway": "192.168.1.1",
+        "protocol": "kernel"
       }
     }
   },
diff --git a/proxmox-auto-installer/tests/resources/run-env-info.json b/proxmox-auto-installer/tests/resources/run-env-info.json
index 55c4fe0..321e7e8 100644
--- a/proxmox-auto-installer/tests/resources/run-env-info.json
+++ b/proxmox-auto-installer/tests/resources/run-env-info.json
@@ -177,7 +177,8 @@
     "routes": {
       "gateway4": {
         "dev": "eno1",
-        "gateway": "192.168.1.1"
+        "gateway": "192.168.1.1",
+        "protocol": "kernel"
       }
     }
   },
-- 
2.54.0





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

* Re: [PATCH installer 2/2] install: do not force gateway to IPv6 RA-received on non-bridged setups
  2026-06-10 13:27 ` [PATCH installer 2/2] install: do not force gateway to IPv6 RA-received on non-bridged setups Christoph Heiss
@ 2026-06-10 14:38   ` Gabriel Goller
  2026-06-10 14:46   ` Gabriel Goller
  1 sibling, 0 replies; 5+ messages in thread
From: Gabriel Goller @ 2026-06-10 14:38 UTC (permalink / raw)
  To: Christoph Heiss; +Cc: pve-devel

On Wed, 10 Jun 2026 15:27:02 +0200, Christoph Heiss <c.heiss@proxmox.com> wrote:
> diff --git a/Proxmox/Install.pm b/Proxmox/Install.pm
> index 5f748d66f4ad..d0253600a8f7 100644
> --- a/Proxmox/Install.pm
> +++ b/Proxmox/Install.pm
> @@ -1182,6 +1182,12 @@ sub extract_data {
>              }
>          }
>  
> +        my $routes = $run_env->{network}->{routes};
> +        my $is_gateway6_from_ra =
> +            defined($routes->{gateway6})
> +            && $routes->{gateway6}->{gateway} eq $gateway
> +            && $routes->{gateway6}->{protocol} eq 'ra';

Aah, this is weird thought because we can have multiple default routes when the
proto is "ra". Is $routes->{gateway6} also the same route inserted in the ui? If
yes, then maybe it's ok if we just select the first default route we find.
Either way we need to ensure that `query_routes` is only called once so that we
always have the same default route.

We could also add support for multiple default routes, but not sure if it's
worth, as we only show one anyway.

-- 
Gabriel Goller <g.goller@proxmox.com>




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

* Re: [PATCH installer 2/2] install: do not force gateway to IPv6 RA-received on non-bridged setups
  2026-06-10 13:27 ` [PATCH installer 2/2] install: do not force gateway to IPv6 RA-received on non-bridged setups Christoph Heiss
  2026-06-10 14:38   ` Gabriel Goller
@ 2026-06-10 14:46   ` Gabriel Goller
  1 sibling, 0 replies; 5+ messages in thread
From: Gabriel Goller @ 2026-06-10 14:46 UTC (permalink / raw)
  To: Christoph Heiss; +Cc: pve-devel

On 10.06.2026 15:27, Christoph Heiss wrote:
> Skip writing the default gateway for the management interface to
> /etc/network/interfaces if it was originally received through an IPv6
> RA.
> 
> Otherwise, fresh, non-bridged (aka. anything other than PVE)
> installations will repeatedly, i.e. on every received RA advertising a
> different SLAAC-capable prefix, report an error in the journal that a
> default gateway already exists.
> 
> The Rust struct definitions are not touched, as the information is not
> needed there (yet).
> 
> Suggested-by: Gabriel Goller <g.goller@proxmox.com>
> Signed-off-by: Christoph Heiss <c.heiss@proxmox.com>

Also for the record, because we talked about it:

This only affects pmg, pbs and pdm, because there we set the ip address directly
on the physical interface. In pve the physical interface is enslaved on the
default vmbr0 bridge and the bridge has an ip address. When
ifupdown2 creates a bridge with an ip address, then automatically
adds net.ipv6.conf.vmbr0.forwarding=1 (the bridge also has the default
net.ipv6.conf.vmbr0.accept_ra=1), which means it will drop every RA. So maybe we
should set accept_ra=2 so that the bridge can accept RAs?

Anyway, we can defer the pve problem for later -- pbs,pmg,pdm are more important
because there we get a kernel error every few seconds.

We also thought more generally about if we should disable RAs on the physical
(or management) nics, because we always want to have a static address on our
installations and dhcp/slaac are actually just "autofills" in the installer?

Note: Search "accept_ra" on https://docs.kernel.org/networking/ip-sysctl.html.





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

* applied: [PATCH installer 1/2] sys: net: make routes hash always defined
  2026-06-10 13:27 [PATCH installer 1/2] sys: net: make routes hash always defined Christoph Heiss
  2026-06-10 13:27 ` [PATCH installer 2/2] install: do not force gateway to IPv6 RA-received on non-bridged setups Christoph Heiss
@ 2026-06-10 19:41 ` Thomas Lamprecht
  1 sibling, 0 replies; 5+ messages in thread
From: Thomas Lamprecht @ 2026-06-10 19:41 UTC (permalink / raw)
  To: pve-devel, Christoph Heiss

On Wed, 10 Jun 2026 15:27:01 +0200, Christoph Heiss wrote:
> The 'dst' key was never set or used, so drop from subroutine
> documentation.
> 
> This especially simplifies the network setup in Rust, dropping an
> additional (and unneeded) level of `Option<>`.
> 
> No functional changes.
> 
> [...]

Applied, thanks!

I added two follow-ups on top, as there can be multiple RA default
routes, one per receiving interface, like Gabriel mentioned:

- record all IPv6 default routes in the run-env, as query_routes()
  kept only the first one per IP version, so consumers could not tell
  whether a specific interface received its default route through an
  RA.

- skip the RA-received gateway only if the management interface itself
  got it, as a same-gateway RA route seen only on another interface
  would otherwise suppress the static gateway for an interface that
  never receives RAs itself, for example with RA guard active on its
  switch port, leaving the installed system without an IPv6 default
  route.

[1/2] sys: net: make routes hash always defined
      commit: 08754aec9d206ba3ab81d040ffee6df2a98c8b74
[2/2] install: do not force gateway to IPv6 RA-received on non-bridged setups
      commit: e27228ad22f223f1b5f43e4dc7481f397d87d342




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

end of thread, other threads:[~2026-06-10 19:42 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-10 13:27 [PATCH installer 1/2] sys: net: make routes hash always defined Christoph Heiss
2026-06-10 13:27 ` [PATCH installer 2/2] install: do not force gateway to IPv6 RA-received on non-bridged setups Christoph Heiss
2026-06-10 14:38   ` Gabriel Goller
2026-06-10 14:46   ` Gabriel Goller
2026-06-10 19:41 ` applied: [PATCH installer 1/2] sys: net: make routes hash always defined Thomas Lamprecht

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