liminix

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit cc73a98419f4f4dab15f4da1762f64737e68f2a2
parent e2ea145ce56064571d9b40ddd6ddfd6e0750051c
Author: Daniel Barlow <dan@telent.net>
Date:   Sun, 26 Nov 2023 23:15:28 +0000

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]"

Diffstat:
Mdevices/qemu/default.nix | 10++++++++--
Mmodules/network/default.nix | 14++++++++++++++
Mmodules/network/link.nix | 20+++++++++++++++++---
3 files changed, 39 insertions(+), 5 deletions(-)

diff --git 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 @@ -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 @@ -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}"; }