fix(bridge): pick up MAC from another interface

This avoids the OPERSTATE unknown when the bridge is brought up but the
members are not ready yet.

This will make OPERSTATE to down, enabling us to wait until we have
brought up completely all the members.

Signed-off-by: Raito Bezarius <masterancpp@gmail.com>
This commit is contained in:
Raito Bezarius 2024-09-01 14:56:08 +02:00 committed by Ryan Lahfa
parent f0b4e826cb
commit 21ff11503e
3 changed files with 15 additions and 3 deletions

View file

@ -28,6 +28,12 @@ in
type = types.str;
description = "bridge interface name to create";
};
macAddressFromInterface = mkOption {
type = types.nullOr liminix.lib.types.service;
default = null;
description = "reuse mac address from an existing interface service";
};
};
members = config.system.callService ./members.nix {
primary = mkOption {

View file

@ -3,15 +3,20 @@
, ifwait
, lib
}:
{ ifname } :
{ ifname, macAddressFromInterface ? null } :
let
inherit (liminix.services) bundle oneshot;
inherit (lib) mkOption types;
inherit (lib) mkOption types optional;
in oneshot rec {
name = "${ifname}.link";
up = ''
ip link add name ${ifname} type bridge
${if macAddressFromInterface == null then
"ip link add name ${ifname} type bridge"
else
"ip link add name ${ifname} address $(output ${macAddressFromInterface} ether) type bridge"}
${liminix.networking.ifup name ifname}
'';
down = "ip link set down dev ${ifname}";
dependencies = optional (macAddressFromInterface != null) macAddressFromInterface;
}

View file

@ -9,6 +9,7 @@
ip link set up dev ${ifname}
(in_outputs ${name}
echo ${ifname} > ifname
cat /sys/class/net/${ifname}/address > ether
)
'';
}