From cc73a98419f4f4dab15f4da1762f64737e68f2a2 Mon Sep 17 00:00:00 2001 From: Daniel Barlow Date: Sun, 26 Nov 2023 23:15:28 +0000 Subject: [PATCH] support setting network device names this means that net devices in devices/foo/default.nix can be specified by their sysfs paths (instead of by "eth0" and "eth1" that may change from one kernel version to the next) and given mnenomic names that are helpful for the hardware. Like "wan" and "lan[1..4]" --- devices/qemu/default.nix | 10 ++++++++-- modules/network/default.nix | 14 ++++++++++++++ modules/network/link.nix | 20 +++++++++++++++++--- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/devices/qemu/default.nix b/devices/qemu/default.nix index a53f25d..8473d38 100644 --- a/devices/qemu/default.nix +++ b/devices/qemu/default.nix @@ -77,8 +77,14 @@ networkInterfaces = let inherit (config.system.service.network) link; in { - wan = link.build { ifname = "eth0"; }; - lan = link.build { ifname = "eth1"; }; + wan = link.build { + devpath = "/devices/pci0000:00/0000:00:13.0/virtio0"; + ifname = "wan"; + }; + lan = link.build { + devpath = "/devices/pci0000:00/0000:00:14.0/virtio1"; + ifname = "lan"; + }; wlan_24 = link.build { ifname = "wlan0"; diff --git a/modules/network/default.nix b/modules/network/default.nix index ef3b95f..73650e4 100644 --- a/modules/network/default.nix +++ b/modules/network/default.nix @@ -68,7 +68,21 @@ in { ifname = mkOption { type = types.str; example = "eth0"; + description = '' + Device name as used by the kernel (as seen in "ip link" + or "ifconfig" output). If devpath is also specified, the + device will be renamed to the name provided. + ''; }; + devpath = mkOption { + type = types.nullOr types.str; + default = null; + example = "/devices/platform/soc/soc:internal-regs/f1070000.ethernet"; + description = '' + Path to the sysfs node of the device. If you provide this + and the ifname option, the device will be renamed to the + name given by ifname. + ''; }; # other "ip link add" options could go here as well mtu = mkOption { type = types.nullOr types.int; diff --git a/modules/network/link.nix b/modules/network/link.nix index d64a0d1..819d2ec 100644 --- a/modules/network/link.nix +++ b/modules/network/link.nix @@ -4,13 +4,27 @@ , serviceFns , lib }: -{ifname, mtu} : +{ + ifname +, devpath ? null +, mtu} : +# if devpath is supplied, we rename the interface at that +# path to have the specified name. let inherit (liminix.services) longrun oneshot; inherit (lib) concatStringsSep; name = "${ifname}.link"; - up = liminix.networking.ifup name ifname; + rename = if devpath != null + then '' + oldname=$(cd /sys${devpath} && cd net/ && echo *) + ip link set ''${oldname} name ${ifname} + '' + else ""; in oneshot { - inherit name up; + inherit name; + up = '' + ${rename} + ${liminix.networking.ifup name ifname} + ''; down = "ip link set down dev ${ifname}"; }