feat(machines/ap01): add default VLAN and admin VLAN

Put DHCPv4 on the default VLAN now.

Signed-off-by: Ryan Lahfa <ryan@dgnum.eu>
This commit is contained in:
Ryan Lahfa 2024-12-08 23:18:08 +01:00
parent 25eee32a22
commit e5f31469ee
4 changed files with 44 additions and 37 deletions

View file

@ -3,16 +3,18 @@ let
svc = config.system.service; svc = config.system.service;
in in
{ {
services.dhcpv4 = svc.network.dhcp.client.build { services.init-dhcpv4 = svc.network.dhcp.client.build {
interface = config.services.int; interface = config.services.int;
dependencies = [ dependencies = [
config.services.bridge.components.lan config.services.bridge.components.lan
]; ];
}; };
services.defaultroute4 = svc.network.route.build { services.init-defaultroute4 = svc.network.route.build {
via = "$(output ${config.services.dhcpv4} router)"; via = "$(output ${config.services.init-dhcpv4} router)";
target = "default"; target = "default";
dependencies = [ config.services.dhcpv4 ]; dependencies = [ config.services.init-dhcpv4 ];
}; };
# TODO: ensure SLAAC for admin-vlan.
} }

View file

@ -8,17 +8,18 @@ in
# TODO: support dynamic reconfiguration once we are in the target VLAN? # TODO: support dynamic reconfiguration once we are in the target VLAN?
services.resolvconf = oneshot rec { services.resolvconf = oneshot rec {
name = "resolvconf"; name = "resolvconf";
# TODO: imho, DNS should be static and provided by the router?
up = '' up = ''
. ${serviceFns} . ${serviceFns}
( in_outputs ${name} ( in_outputs ${name}
for i in $(output ${config.services.dhcpv4} dns); do for i in $(output ${config.services.init-dhcpv4} dns); do
echo "nameserver $i" >> resolv.conf echo "nameserver $i" >> resolv.conf
done done
) )
''; '';
dependencies = [ dependencies = [
config.services.dhcpv4 config.services.init-dhcpv4
]; ];
}; };

View file

@ -3,37 +3,41 @@ let
svc = config.system.service; svc = config.system.service;
in in
{ {
services.int = svc.bridge.primary.build { # Our bridging is a bit complicated, therefore, we need iproute2.
ifname = "int"; programs.iproute2.enable = true;
macAddressFromInterface = config.hardware.networkInterfaces.lan;
};
services.bridge = svc.bridge.members.build { services = {
primary = config.services.int; int = svc.bridge.primary.build {
members = { ifname = "int";
lan.member = config.hardware.networkInterfaces.lan; macAddressFromInterface = config.hardware.networkInterfaces.lan;
wlan0 = { untagged = {
member = config.hardware.networkInterfaces.wlan0; enable = true;
# Bridge only once hostapd is ready. pvid = 1;
dependencies = [ config.services.hostap-1-ready ]; default-pvid = 1;
};
wlan1 = {
member = config.hardware.networkInterfaces.wlan1;
# Bridge only once hostapd is ready.
dependencies = [ config.services.hostap-2-ready ];
}; };
}; };
bridge = svc.bridge.members.build {
primary = config.services.int;
members = {
lan.member = config.hardware.networkInterfaces.lan;
wlan0 = {
member = config.hardware.networkInterfaces.wlan0;
# Bridge only once hostapd is ready.
dependencies = [ config.services.hostap-1-ready ];
};
wlan1 = {
member = config.hardware.networkInterfaces.wlan1;
# Bridge only once hostapd is ready.
dependencies = [ config.services.hostap-2-ready ];
};
};
};
admin-vlan = svc.vlan.build {
ifname = "admin";
primary = config.services.int;
vid = "3001";
};
}; };
# Default VLAN
# services.vlan-apro = svc.vlan.build {
# vlanId = 0;
# interface = config.services.int;
# };
# # Administration VLAN
# services.vlan-admin = svc.vlan.build {
# vlan = 3001;
# interface = config.services.int;
# };
} }

View file

@ -131,9 +131,9 @@
"url": "https://git.dgnum.eu/DGNum/liminix" "url": "https://git.dgnum.eu/DGNum/liminix"
}, },
"branch": "main", "branch": "main",
"revision": "473d6acc3de70bd6dbbb4a77af54f508f25c3c9c", "revision": "1322de1ee0cdb19fead79e12ab279ee0b575019a",
"url": null, "url": null,
"hash": "00slsh0yqd8n8jcx3sbxgcmw1z28bnszy87pfs0ynfkl3bldzs3d" "hash": "07nk6nik97k8a57cf17dcj3gn2lbhw1myymrxpqc2aqa3haj754k"
}, },
"linkal": { "linkal": {
"type": "Git", "type": "Git",