summaryrefslogtreecommitdiffstats
path: root/nixos/modules/services/networking/radvd.nix
blob: 19a0b293095d11e561922554e34917df4b32e678 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# 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 {
      type = types.bool;
      default = false;
      description = ''
        Whether to enable the Router Advertisement Daemon
        ({command}`radvd`), 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.
      '';
    };

    package = mkPackageOption pkgs "radvd" { };

    debugLevel = mkOption {
      type = types.ints.between 0 5;
      default = 0;
      example = 5;
      description = ''
        The debugging level is an integer in the range from 1 to 5,
        from quiet to very verbose. A debugging level of 0 completely
        turns off debugging.
      '';
    };

    config = mkOption {
      type = types.lines;
      example = ''
        interface eth0 {
          AdvSendAdvert on;
          prefix 2001:db8:1234:5678::/64 { };
        };
      '';
      description = ''
        The contents of the radvd configuration file.
      '';
    };

  };

  ###### implementation

  config = mkIf cfg.enable {

    users.users.radvd = {
      isSystemUser = true;
      group = "radvd";
      description = "Router Advertisement Daemon User";
    };
    users.groups.radvd = { };

    systemd.services.radvd = {
      description = "IPv6 Router Advertisement Daemon";
      wantedBy = [ "multi-user.target" ];
      after = [ "network.target" ];
      serviceConfig = {
        ExecStart = "@${cfg.package}/bin/radvd radvd -n -u radvd -d ${toString cfg.debugLevel} -C ${confFile}";
        Restart = "always";
      };
    };

  };

}