nixos: configure Nic uplinks for genode.init.children
…not just genode.core.children.post-mortem
parent
4d1d37a1ed
commit
291cde7b4a
@ -1,108 +1,132 @@
|
||||
{ config, pkgs, lib, ... }:
|
||||
|
||||
with lib;
|
||||
let
|
||||
mkUplinkDriver = { name, policyPrefix, driver, verbose }: {
|
||||
package = with pkgs.genodePackages;
|
||||
{
|
||||
ipxe = ipxe_nic_drv;
|
||||
virtio = virtio_nic_drv;
|
||||
}.${driver};
|
||||
configFile = pkgs.writeText "${name}.dhall" ''
|
||||
let Sigil = env:DHALL_SIGIL
|
||||
|
||||
{
|
||||
let Init = Sigil.Init
|
||||
|
||||
config =
|
||||
# TODO: create drivers in both the first and second level inits
|
||||
{
|
||||
hardware.genode.platform.policies = let
|
||||
mkPolicy = { name, platformPolicy }:
|
||||
pkgs.writeText "${name}.policy.dhall" ''${platformPolicy} "${name}"'';
|
||||
in λ(binary : Text) →
|
||||
Init.Child.flat
|
||||
Init.Child.Attributes::{
|
||||
, binary
|
||||
, resources = Init.Resources::{ caps = 128, ram = Sigil.units.MiB 4 }
|
||||
, routes = [ Init.ServiceRoute.parent "IO_MEM" ]
|
||||
, config = Init.Config::{
|
||||
, attributes = toMap { verbose = "${
|
||||
if verbose then "yes" else "no"
|
||||
}" }
|
||||
, policies =
|
||||
[ Init.Config.Policy::{
|
||||
, service = "Nic"
|
||||
, label = Init.LabelSelector.prefix "${policyPrefix}"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
'';
|
||||
};
|
||||
|
||||
childPolicies = builtins.concatLists (lib.attrsets.mapAttrsToList
|
||||
(child: childAttrs:
|
||||
lib.attrsets.mapAttrsToList (uplink: uplinkAttrs:
|
||||
mkPolicy {
|
||||
name = "${child}-${uplink}-driver";
|
||||
inherit (uplinkAttrs) platformPolicy;
|
||||
}) childAttrs.uplinks) config.genode.core.children);
|
||||
mkUplinkDump = { name, childName, policyPrefix }: {
|
||||
package = pkgs.genodePackages.nic_dump;
|
||||
configFile = pkgs.writeText "${name}.dhall" ''
|
||||
let Sigil = env:DHALL_SIGIL
|
||||
|
||||
in childPolicies;
|
||||
let Init = Sigil.Init
|
||||
|
||||
genode.core.supportChildren = let
|
||||
in λ(binary : Text) →
|
||||
Init.Child.flat
|
||||
Init.Child.Attributes::{
|
||||
, binary
|
||||
, resources = Init.Resources::{ caps = 128, ram = Sigil.units.MiB 6 }
|
||||
, config = Init.Config::{
|
||||
, attributes = toMap { downlink = "${childName}", uplink = "driver" }
|
||||
, policies =
|
||||
[ Init.Config.Policy::{
|
||||
, service = "Nic"
|
||||
, label = Init.LabelSelector.prefix "${policyPrefix}"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
'';
|
||||
};
|
||||
|
||||
mkUplinkDriver = { name, policyPrefix, driver, verbose }: {
|
||||
package = with pkgs.genodePackages;
|
||||
{
|
||||
ipxe = ipxe_nic_drv;
|
||||
virtio = virtio_nic_drv;
|
||||
}.${driver};
|
||||
configFile = pkgs.writeText "${name}.dhall" ''
|
||||
let Sigil = env:DHALL_SIGIL
|
||||
nicDriversFor = children:
|
||||
builtins.listToAttrs (lib.lists.flatten (lib.attrsets.mapAttrsToList
|
||||
(childName:
|
||||
{ uplinks, ... }:
|
||||
lib.attrsets.mapAttrsToList (uplink:
|
||||
let
|
||||
childLabel = "${childName} -> ${uplink}";
|
||||
driverName = "${childName}-${uplink}-driver";
|
||||
dumpName = "${childName}-${uplink}-dump";
|
||||
in { driver, dump, verbose, ... }:
|
||||
[(rec {
|
||||
name = driverName;
|
||||
value = mkUplinkDriver {
|
||||
inherit name driver verbose;
|
||||
policyPrefix = if dump then dumpName else childLabel;
|
||||
};
|
||||
})] ++ lib.lists.optional dump (rec {
|
||||
name = dumpName;
|
||||
value = mkUplinkDump {
|
||||
inherit name childName;
|
||||
policyPrefix = childLabel;
|
||||
};
|
||||
})) uplinks) children));
|
||||
|
||||
let Init = Sigil.Init
|
||||
qemuNicsFor = children:
|
||||
builtins.listToAttrs (lib.lists.flatten (lib.attrsets.mapAttrsToList
|
||||
(childName:
|
||||
{ uplinks, ... }:
|
||||
lib.attrsets.mapAttrsToList (uplink:
|
||||
{ driver, ... }: {
|
||||
name = "${childName}-${uplink}";
|
||||
value = {
|
||||
netdev = {
|
||||
kind = "user";
|
||||
settings = { ipv6 = "off"; };
|
||||
};
|
||||
device = {
|
||||
kind = {
|
||||
ipxe = "e1000";
|
||||
virtio = "virtio";
|
||||
}.${driver};
|
||||
};
|
||||
};
|
||||
}) uplinks) children));
|
||||
|
||||
in λ(binary : Text) →
|
||||
Init.Child.flat
|
||||
Init.Child.Attributes::{
|
||||
, binary
|
||||
, resources = Init.Resources::{ caps = 128, ram = Sigil.units.MiB 4 }
|
||||
, routes = [ Init.ServiceRoute.parent "IO_MEM" ]
|
||||
, config = Init.Config::{
|
||||
, attributes = toMap { verbose = "${
|
||||
if verbose then "yes" else "no"
|
||||
}" }
|
||||
, policies =
|
||||
[ Init.Config.Policy::{
|
||||
, service = "Nic"
|
||||
, label = Init.LabelSelector.prefix "${policyPrefix}"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
'';
|
||||
};
|
||||
in {
|
||||
|
||||
mkUplinkDump = { name, childName, policyPrefix }: {
|
||||
package = pkgs.genodePackages.nic_dump;
|
||||
configFile = pkgs.writeText "${name}.dhall" ''
|
||||
let Sigil = env:DHALL_SIGIL
|
||||
config = {
|
||||
hardware.genode.platform.policies = let
|
||||
mkPolicy = { name, platformPolicy }:
|
||||
pkgs.writeText "${name}.policy.dhall" ''${platformPolicy} "${name}"'';
|
||||
|
||||
let Init = Sigil.Init
|
||||
childPolicies = prefix: children:
|
||||
builtins.concatLists (lib.attrsets.mapAttrsToList (child: childAttrs:
|
||||
lib.attrsets.mapAttrsToList (uplink: uplinkAttrs:
|
||||
mkPolicy {
|
||||
name = "${prefix}${child}-${uplink}-driver";
|
||||
inherit (uplinkAttrs) platformPolicy;
|
||||
}) childAttrs.uplinks) children);
|
||||
|
||||
in λ(binary : Text) →
|
||||
Init.Child.flat
|
||||
Init.Child.Attributes::{
|
||||
, binary
|
||||
, resources = Init.Resources::{ caps = 128, ram = Sigil.units.MiB 6 }
|
||||
, config = Init.Config::{
|
||||
, attributes = toMap { downlink = "${childName}", uplink = "driver" }
|
||||
, policies =
|
||||
[ Init.Config.Policy::{
|
||||
, service = "Nic"
|
||||
, label = Init.LabelSelector.prefix "${policyPrefix}"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
'';
|
||||
};
|
||||
corePolicies = childPolicies "" config.genode.core.children;
|
||||
initPolicies = childPolicies "nixos -> " config.genode.init.children;
|
||||
in corePolicies ++ initPolicies;
|
||||
|
||||
genode.core.auxiliaryChildren = nicDriversFor config.genode.core.children;
|
||||
genode.init.auxiliaryChildren = nicDriversFor config.genode.init.children;
|
||||
|
||||
otherDrivers = lib.lists.flatten (lib.attrsets.mapAttrsToList
|
||||
(childName:
|
||||
{ uplinks, ... }:
|
||||
lib.attrsets.mapAttrsToList (uplink:
|
||||
let
|
||||
childLabel = "${childName} -> ${uplink}";
|
||||
driverName = "${childName}-${uplink}-driver";
|
||||
dumpName = "${childName}-${uplink}-dump";
|
||||
in { driver, dump, verbose, ... }:
|
||||
[(rec {
|
||||
name = driverName;
|
||||
value = mkUplinkDriver {
|
||||
inherit name driver verbose;
|
||||
policyPrefix = if dump then dumpName else childLabel;
|
||||
};
|
||||
})] ++ lib.lists.optional dump (rec {
|
||||
name = dumpName;
|
||||
value = mkUplinkDump {
|
||||
inherit name childName;
|
||||
policyPrefix = childLabel;
|
||||
};
|
||||
})) uplinks) config.genode.core.children);
|
||||
virtualisation.qemu.nics =
|
||||
qemuNicsFor (config.genode.core.children // config.genode.init.children);
|
||||
|
||||
in builtins.listToAttrs otherDrivers;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
Loading…
Reference in New Issue