nixos/networkd: add MACVTAP= option for networks
Example 10. of man page of systemd.network(5) shows: ``` Example 10. MacVTap This brings up a network interface "macvtap-test" and attaches it to "enp0s25". # /usr/lib/systemd/network/25-macvtap.network [Match] Name=enp0s25 [Network] MACVTAP=macvtap-test ``` Which is a MACVTAP example and is currently unsupported in NixOS. This is useful for people using "modern" technologies with virtual machines.
This commit is contained in:
parent
fb7bba2a3f
commit
6b9e49230d
1 changed files with 242 additions and 0 deletions
|
@ -582,6 +582,7 @@ let
|
||||||
"VLAN"
|
"VLAN"
|
||||||
"IPVLAN"
|
"IPVLAN"
|
||||||
"MACVLAN"
|
"MACVLAN"
|
||||||
|
"MACVTAP"
|
||||||
"VXLAN"
|
"VXLAN"
|
||||||
"Tunnel"
|
"Tunnel"
|
||||||
"MACsec"
|
"MACsec"
|
||||||
|
@ -2504,6 +2505,15 @@ let
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
macvtap = mkOption {
|
||||||
|
default = [ ];
|
||||||
|
type = types.listOf types.str;
|
||||||
|
description = lib.mdDoc ''
|
||||||
|
A list of macvtap interfaces to be added to the network section of the
|
||||||
|
unit. See {manpage}`systemd.network(5)` for details.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
vxlan = mkOption {
|
vxlan = mkOption {
|
||||||
default = [ ];
|
default = [ ];
|
||||||
type = types.listOf types.str;
|
type = types.listOf types.str;
|
||||||
|
@ -2619,6 +2629,238 @@ let
|
||||||
${attrsToSection def.dhcpV6Config}
|
${attrsToSection def.dhcpV6Config}
|
||||||
''; };
|
''; };
|
||||||
|
|
||||||
|
networkToUnit = name: def:
|
||||||
|
{ inherit (def) enable;
|
||||||
|
text = commonMatchText def
|
||||||
|
+ optionalString (def.linkConfig != { }) ''
|
||||||
|
[Link]
|
||||||
|
${attrsToSection def.linkConfig}
|
||||||
|
''
|
||||||
|
+ ''
|
||||||
|
[Network]
|
||||||
|
''
|
||||||
|
+ attrsToSection def.networkConfig
|
||||||
|
+ optionalString (def.address != [ ]) ''
|
||||||
|
${concatStringsSep "\n" (map (s: "Address=${s}") def.address)}
|
||||||
|
''
|
||||||
|
+ optionalString (def.gateway != [ ]) ''
|
||||||
|
${concatStringsSep "\n" (map (s: "Gateway=${s}") def.gateway)}
|
||||||
|
''
|
||||||
|
+ optionalString (def.dns != [ ]) ''
|
||||||
|
${concatStringsSep "\n" (map (s: "DNS=${s}") def.dns)}
|
||||||
|
''
|
||||||
|
+ optionalString (def.ntp != [ ]) ''
|
||||||
|
${concatStringsSep "\n" (map (s: "NTP=${s}") def.ntp)}
|
||||||
|
''
|
||||||
|
+ optionalString (def.bridge != [ ]) ''
|
||||||
|
${concatStringsSep "\n" (map (s: "Bridge=${s}") def.bridge)}
|
||||||
|
''
|
||||||
|
+ optionalString (def.bond != [ ]) ''
|
||||||
|
${concatStringsSep "\n" (map (s: "Bond=${s}") def.bond)}
|
||||||
|
''
|
||||||
|
+ optionalString (def.vrf != [ ]) ''
|
||||||
|
${concatStringsSep "\n" (map (s: "VRF=${s}") def.vrf)}
|
||||||
|
''
|
||||||
|
+ optionalString (def.vlan != [ ]) ''
|
||||||
|
${concatStringsSep "\n" (map (s: "VLAN=${s}") def.vlan)}
|
||||||
|
''
|
||||||
|
+ optionalString (def.macvlan != [ ]) ''
|
||||||
|
${concatStringsSep "\n" (map (s: "MACVLAN=${s}") def.macvlan)}
|
||||||
|
''
|
||||||
|
+ optionalString (def.macvtap != [ ]) ''
|
||||||
|
${concatStringsSep "\n" (map (s: "MACVTAP=${s}") def.macvtap)}
|
||||||
|
''
|
||||||
|
+ optionalString (def.vxlan != [ ]) ''
|
||||||
|
${concatStringsSep "\n" (map (s: "VXLAN=${s}") def.vxlan)}
|
||||||
|
''
|
||||||
|
+ optionalString (def.tunnel != [ ]) ''
|
||||||
|
${concatStringsSep "\n" (map (s: "Tunnel=${s}") def.tunnel)}
|
||||||
|
''
|
||||||
|
+ optionalString (def.xfrm != [ ]) ''
|
||||||
|
${concatStringsSep "\n" (map (s: "Xfrm=${s}") def.xfrm)}
|
||||||
|
''
|
||||||
|
+ ''
|
||||||
|
|
||||||
|
''
|
||||||
|
+ flip concatMapStrings def.addresses (x: ''
|
||||||
|
[Address]
|
||||||
|
${attrsToSection x.addressConfig}
|
||||||
|
'')
|
||||||
|
+ flip concatMapStrings def.routingPolicyRules (x: ''
|
||||||
|
[RoutingPolicyRule]
|
||||||
|
${attrsToSection x.routingPolicyRuleConfig}
|
||||||
|
'')
|
||||||
|
+ flip concatMapStrings def.routes (x: ''
|
||||||
|
[Route]
|
||||||
|
${attrsToSection x.routeConfig}
|
||||||
|
'')
|
||||||
|
+ optionalString (def.dhcpV4Config != { }) ''
|
||||||
|
[DHCPv4]
|
||||||
|
${attrsToSection def.dhcpV4Config}
|
||||||
|
''
|
||||||
|
+ optionalString (def.dhcpV6Config != { }) ''
|
||||||
|
[DHCPv6]
|
||||||
|
${attrsToSection def.dhcpV6Config}
|
||||||
|
''
|
||||||
|
+ optionalString (def.dhcpPrefixDelegationConfig != { }) ''
|
||||||
|
[DHCPPrefixDelegation]
|
||||||
|
${attrsToSection def.dhcpPrefixDelegationConfig}
|
||||||
|
''
|
||||||
|
+ optionalString (def.ipv6AcceptRAConfig != { }) ''
|
||||||
|
[IPv6AcceptRA]
|
||||||
|
${attrsToSection def.ipv6AcceptRAConfig}
|
||||||
|
''
|
||||||
|
+ optionalString (def.dhcpServerConfig != { }) ''
|
||||||
|
[DHCPServer]
|
||||||
|
${attrsToSection def.dhcpServerConfig}
|
||||||
|
''
|
||||||
|
+ optionalString (def.ipv6SendRAConfig != { }) ''
|
||||||
|
[IPv6SendRA]
|
||||||
|
${attrsToSection def.ipv6SendRAConfig}
|
||||||
|
''
|
||||||
|
+ flip concatMapStrings def.ipv6Prefixes (x: ''
|
||||||
|
[IPv6Prefix]
|
||||||
|
${attrsToSection x.ipv6PrefixConfig}
|
||||||
|
'')
|
||||||
|
+ flip concatMapStrings def.ipv6RoutePrefixes (x: ''
|
||||||
|
[IPv6RoutePrefix]
|
||||||
|
${attrsToSection x.ipv6RoutePrefixConfig}
|
||||||
|
'')
|
||||||
|
+ flip concatMapStrings def.dhcpServerStaticLeases (x: ''
|
||||||
|
[DHCPServerStaticLease]
|
||||||
|
${attrsToSection x.dhcpServerStaticLeaseConfig}
|
||||||
|
'')
|
||||||
|
+ optionalString (def.bridgeConfig != { }) ''
|
||||||
|
[Bridge]
|
||||||
|
${attrsToSection def.bridgeConfig}
|
||||||
|
''
|
||||||
|
+ flip concatMapStrings def.bridgeFDBs (x: ''
|
||||||
|
[BridgeFDB]
|
||||||
|
${attrsToSection x.bridgeFDBConfig}
|
||||||
|
'')
|
||||||
|
+ flip concatMapStrings def.bridgeMDBs (x: ''
|
||||||
|
[BridgeMDB]
|
||||||
|
${attrsToSection x.bridgeMDBConfig}
|
||||||
|
'')
|
||||||
|
+ optionalString (def.lldpConfig != { }) ''
|
||||||
|
[LLDP]
|
||||||
|
${attrsToSection def.lldpConfig}
|
||||||
|
''
|
||||||
|
+ optionalString (def.canConfig != { }) ''
|
||||||
|
[CAN]
|
||||||
|
${attrsToSection def.canConfig}
|
||||||
|
''
|
||||||
|
+ optionalString (def.ipoIBConfig != { }) ''
|
||||||
|
[IPoIB]
|
||||||
|
${attrsToSection def.ipoIBConfig}
|
||||||
|
''
|
||||||
|
+ optionalString (def.qdiscConfig != { }) ''
|
||||||
|
[QDisc]
|
||||||
|
${attrsToSection def.qdiscConfig}
|
||||||
|
''
|
||||||
|
+ optionalString (def.networkEmulatorConfig != { }) ''
|
||||||
|
[NetworkEmulator]
|
||||||
|
${attrsToSection def.networkEmulatorConfig}
|
||||||
|
''
|
||||||
|
+ optionalString (def.tokenBucketFilterConfig != { }) ''
|
||||||
|
[TokenBucketFilter]
|
||||||
|
${attrsToSection def.tokenBucketFilterConfig}
|
||||||
|
''
|
||||||
|
+ optionalString (def.pieConfig != { }) ''
|
||||||
|
[PIE]
|
||||||
|
${attrsToSection def.pieConfig}
|
||||||
|
''
|
||||||
|
+ optionalString (def.flowQueuePIEConfig != { }) ''
|
||||||
|
[FlowQueuePIE]
|
||||||
|
${attrsToSection def.flowQueuePIEConfig}
|
||||||
|
''
|
||||||
|
+ optionalString (def.stochasticFairBlueConfig != { }) ''
|
||||||
|
[StochasticFairBlue]
|
||||||
|
${attrsToSection def.stochasticFairBlueConfig}
|
||||||
|
''
|
||||||
|
+ optionalString (def.stochasticFairnessQueueingConfig != { }) ''
|
||||||
|
[StochasticFairnessQueueing]
|
||||||
|
${attrsToSection def.stochasticFairnessQueueingConfig}
|
||||||
|
''
|
||||||
|
+ optionalString (def.bfifoConfig != { }) ''
|
||||||
|
[BFIFO]
|
||||||
|
${attrsToSection def.bfifoConfig}
|
||||||
|
''
|
||||||
|
+ optionalString (def.pfifoConfig != { }) ''
|
||||||
|
[PFIFO]
|
||||||
|
${attrsToSection def.pfifoConfig}
|
||||||
|
''
|
||||||
|
+ optionalString (def.pfifoHeadDropConfig != { }) ''
|
||||||
|
[PFIFOHeadDrop]
|
||||||
|
${attrsToSection def.pfifoHeadDropConfig}
|
||||||
|
''
|
||||||
|
+ optionalString (def.pfifoFastConfig != { }) ''
|
||||||
|
[PFIFOFast]
|
||||||
|
${attrsToSection def.pfifoFastConfig}
|
||||||
|
''
|
||||||
|
+ optionalString (def.cakeConfig != { }) ''
|
||||||
|
[CAKE]
|
||||||
|
${attrsToSection def.cakeConfig}
|
||||||
|
''
|
||||||
|
+ optionalString (def.controlledDelayConfig != { }) ''
|
||||||
|
[ControlledDelay]
|
||||||
|
${attrsToSection def.controlledDelayConfig}
|
||||||
|
''
|
||||||
|
+ optionalString (def.deficitRoundRobinSchedulerConfig != { }) ''
|
||||||
|
[DeficitRoundRobinScheduler]
|
||||||
|
${attrsToSection def.deficitRoundRobinSchedulerConfig}
|
||||||
|
''
|
||||||
|
+ optionalString (def.deficitRoundRobinSchedulerClassConfig != { }) ''
|
||||||
|
[DeficitRoundRobinSchedulerClass]
|
||||||
|
${attrsToSection def.deficitRoundRobinSchedulerClassConfig}
|
||||||
|
''
|
||||||
|
+ optionalString (def.enhancedTransmissionSelectionConfig != { }) ''
|
||||||
|
[EnhancedTransmissionSelection]
|
||||||
|
${attrsToSection def.enhancedTransmissionSelectionConfig}
|
||||||
|
''
|
||||||
|
+ optionalString (def.genericRandomEarlyDetectionConfig != { }) ''
|
||||||
|
[GenericRandomEarlyDetection]
|
||||||
|
${attrsToSection def.genericRandomEarlyDetectionConfig}
|
||||||
|
''
|
||||||
|
+ optionalString (def.fairQueueingControlledDelayConfig != { }) ''
|
||||||
|
[FairQueueingControlledDelay]
|
||||||
|
${attrsToSection def.fairQueueingControlledDelayConfig}
|
||||||
|
''
|
||||||
|
+ optionalString (def.fairQueueingConfig != { }) ''
|
||||||
|
[FairQueueing]
|
||||||
|
${attrsToSection def.fairQueueingConfig}
|
||||||
|
''
|
||||||
|
+ optionalString (def.trivialLinkEqualizerConfig != { }) ''
|
||||||
|
[TrivialLinkEqualizer]
|
||||||
|
${attrsToSection def.trivialLinkEqualizerConfig}
|
||||||
|
''
|
||||||
|
+ optionalString (def.hierarchyTokenBucketConfig != { }) ''
|
||||||
|
[HierarchyTokenBucket]
|
||||||
|
${attrsToSection def.hierarchyTokenBucketConfig}
|
||||||
|
''
|
||||||
|
+ optionalString (def.hierarchyTokenBucketClassConfig != { }) ''
|
||||||
|
[HierarchyTokenBucketClass]
|
||||||
|
${attrsToSection def.hierarchyTokenBucketClassConfig}
|
||||||
|
''
|
||||||
|
+ optionalString (def.heavyHitterFilterConfig != { }) ''
|
||||||
|
[HeavyHitterFilter]
|
||||||
|
${attrsToSection def.heavyHitterFilterConfig}
|
||||||
|
''
|
||||||
|
+ optionalString (def.quickFairQueueingConfig != { }) ''
|
||||||
|
[QuickFairQueueing]
|
||||||
|
${attrsToSection def.quickFairQueueingConfig}
|
||||||
|
''
|
||||||
|
+ optionalString (def.quickFairQueueingConfigClass != { }) ''
|
||||||
|
[QuickFairQueueingClass]
|
||||||
|
${attrsToSection def.quickFairQueueingConfigClass}
|
||||||
|
''
|
||||||
|
+ flip concatMapStrings def.bridgeVLANs (x: ''
|
||||||
|
[BridgeVLAN]
|
||||||
|
${attrsToSection x.bridgeVLANConfig}
|
||||||
|
'')
|
||||||
|
+ def.extraConfig;
|
||||||
|
};
|
||||||
|
|
||||||
mkUnitFiles = prefix: cfg: listToAttrs (map (name: {
|
mkUnitFiles = prefix: cfg: listToAttrs (map (name: {
|
||||||
name = "${prefix}systemd/network/${name}";
|
name = "${prefix}systemd/network/${name}";
|
||||||
value.source = "${cfg.units.${name}.unit}/${name}";
|
value.source = "${cfg.units.${name}.unit}/${name}";
|
||||||
|
|
Loading…
Reference in a new issue