summaryrefslogtreecommitdiff
path: root/sys/net/vsock.nix
blob: c6b0ad6457d7a0716f36bc7afa1bae601b440793 (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
{
  lib,
  config,
  pkgs,
  ...
}:
with lib; let
  cfg = config.local.net.vsock;
in {
  options.local.net.vsock = {
    connect = mkOption {
      default = {};
      type = with lib.types;
        attrsOf (submodule ({name, ...}: {
          options = {
            enable = mkEnableOption "vsock connect '${name}'";

            cid = mkOption {
              type = ints.u32;
              default = 2;
            };

            localPort = mkOption {
              type = port;
            };

            vsockPort = mkOption {
              type = port;
            };
          };
        }));
    };
  };

  config = {
    systemd = let
      connects =
        mapAttrs
        (_: connect: {
          service.serviceConfig = {
            Type = "simple";
            ExecStart = "${getExe pkgs.socat} - VSOCK:${toString connect.cid}:${toString connect.vsockPort}";
            StandardInput = "socket";
          };

          socket = {
            wantedBy = ["sockets.target"];

            socketConfig = {
              Accept = true;
              ListenStream = "[::1]:${toString connect.localPort}";
            };

            unitConfig.ConditionVirtualization = "kvm";
          };
        })
        cfg.connect;
    in {
      sockets = mapAttrs' (name: connect: nameValuePair "vsock-${name}" connect.socket) connects;
      services = mapAttrs' (name: connect: nameValuePair "vsock-${name}@" connect.service) connects;
    };
  };
}