From: Christoph Heiss <c.heiss@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [PATCH installer 1/2] sys: net: make routes hash always defined
Date: Wed, 10 Jun 2026 15:27:01 +0200 [thread overview]
Message-ID: <20260610132710.199825-1-c.heiss@proxmox.com> (raw)
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
next reply other threads:[~2026-06-10 13:27 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-10 13:27 Christoph Heiss [this message]
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
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=20260610132710.199825-1-c.heiss@proxmox.com \
--to=c.heiss@proxmox.com \
--cc=pve-devel@lists.proxmox.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