29027fd1e1
Using pkgs.lib on the spine of module evaluation is problematic because the pkgs argument depends on the result of module evaluation. To prevent an infinite recursion, pkgs and some of the modules are evaluated twice, which is inefficient. Using ‘with lib’ prevents this problem.
78 lines
1.6 KiB
Nix
78 lines
1.6 KiB
Nix
# Module for the IPv6 Router Advertisement Daemon.
|
|
|
|
{ config, lib, pkgs, ... }:
|
|
|
|
with lib;
|
|
|
|
let
|
|
|
|
cfg = config.services.radvd;
|
|
|
|
confFile = pkgs.writeText "radvd.conf" cfg.config;
|
|
|
|
in
|
|
|
|
{
|
|
|
|
###### interface
|
|
|
|
options = {
|
|
|
|
services.radvd.enable = mkOption {
|
|
default = false;
|
|
description =
|
|
''
|
|
Whether to enable the Router Advertisement Daemon
|
|
(<command>radvd</command>), which provides link-local
|
|
advertisements of IPv6 router addresses and prefixes using
|
|
the Neighbor Discovery Protocol (NDP). This enables
|
|
stateless address autoconfiguration in IPv6 clients on the
|
|
network.
|
|
'';
|
|
};
|
|
|
|
services.radvd.config = mkOption {
|
|
example =
|
|
''
|
|
interface eth0 {
|
|
AdvSendAdvert on;
|
|
prefix 2001:db8:1234:5678::/64 { };
|
|
};
|
|
'';
|
|
description =
|
|
''
|
|
The contents of the radvd configuration file.
|
|
'';
|
|
};
|
|
|
|
};
|
|
|
|
|
|
###### implementation
|
|
|
|
config = mkIf cfg.enable {
|
|
|
|
environment.systemPackages = [ pkgs.radvd ];
|
|
|
|
jobs.radvd =
|
|
{ description = "IPv6 Router Advertisement Daemon";
|
|
|
|
startOn = "started network-interfaces";
|
|
|
|
preStart =
|
|
''
|
|
# !!! Radvd only works if IPv6 forwarding is enabled. But
|
|
# this should probably be done somewhere else (and not
|
|
# necessarily for all interfaces).
|
|
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
|
|
'';
|
|
|
|
exec = "${pkgs.radvd}/sbin/radvd -m syslog -s -C ${confFile}";
|
|
|
|
daemonType = "fork";
|
|
};
|
|
|
|
};
|
|
|
|
}
|