@ -115,17 +115,65 @@ in
Name = name ;
Kind = " b o n d " ;
} ;
bondConfig =
( optionalAttrs ( bond . lacp_rate != null ) {
LACPTransmitRate = bond . lacp_rate ;
} ) // ( optionalAttrs ( bond . miimon != null ) {
MIIMonitorSec = bond . miimon ;
} ) // ( optionalAttrs ( bond . mode != null ) {
Mode = bond . mode ;
} ) // ( optionalAttrs ( bond . xmit_hash_policy != null ) {
TransmitHashPolicy = bond . xmit_hash_policy ;
} ) ;
bondConfig = let
# manual mapping as of 2017-02-03
# man 5 systemd.netdev [BOND]
# to https://www.kernel.org/doc/Documentation/networking/bonding.txt
# driver options.
driverOptionMapping = let
trans = f : optName : { valTransform = f ; optNames = [ optName ] ; } ;
simp = trans id ;
ms = trans ( v : v + " m s " ) ;
in {
Mode = simp " m o d e " ;
TransmitHashPolixy = simp " x m i t _ h a s h _ p o l i c y " ;
LACPTransmitRate = simp " l a c p _ r a t e " ;
MIIMonitorSec = ms " m i i m o n " ;
UpDelaySec = ms " u p d e l a y " ;
DownDelaySec = ms " d o w n d e l a y " ;
LearnPacketIntervalSec = simp " l p _ i n t e r v a l " ;
AdSelect = simp " a d _ s e l e c t " ;
FailOverMACPolicy = simp " f a i l _ o v e r _ m a c " ;
ARPValidate = simp " a r p _ v a l i d a t e " ;
# apparently in ms for this value?! Upstream bug?
ARPIntervalSec = simp " a r p _ i n t e r v a l " ;
ARPIPTargets = simp " a r p _ i p _ t a r g e t " ;
ARPAllTargets = simp " a r p _ a l l _ t a r g e t s " ;
PrimaryReselectPolicy = simp " p r i m a r y _ r e s e l e c t " ;
ResendIGMP = simp " r e s e n d _ i g m p " ;
PacketsPerSlave = simp " p a c k e t s _ p e r _ s l a v e " ;
GratuitousARP = { valTransform = id ;
optNames = [ " n u m _ g r a t _ a r p " " n u m _ u n s o l _ n a " ] ; } ;
AllSlavesActive = simp " a l l _ s l a v e s _ a c t i v e " ;
MinLinks = simp " m i n _ l i n k s " ;
} ;
do = bond . driverOptions ;
assertNoUnknownOption = let
knownOptions = flatten ( mapAttrsToList ( _ : kOpts : kOpts . optNames )
driverOptionMapping ) ;
# options that apparently don’t exist in the networkd config
unknownOptions = [ " p r i m a r y " ] ;
assertTrace = bool : msg : if bool then true else builtins . trace msg false ;
in assert all ( driverOpt : assertTrace
( elem driverOpt ( knownOptions ++ unknownOptions ) )
" T h e b o n d . d r i v e r O p t i o n ` ${ driverOpt } ` c a n n o t b e m a p p e d t o t h e l i s t o f k n o w n n e t w o r k d b o n d o p t i o n s . P l e a s e a d d i t t o t h e m a p p i n g a b o v e t h e a s s e r t o r t o ` u n k n o w n O p t i o n s ` s h o u l d i t n o t e x i s t i n n e t w o r k d . " )
( mapAttrsToList ( k : _ : k ) do ) ; " " ;
# get those driverOptions that have been set
filterSystemdOptions = filterAttrs ( sysDOpt : kOpts :
any ( kOpt : do ? " ${ kOpt } " ) kOpts . optNames ) ;
# build final set of systemd options to bond values
buildOptionSet = mapAttrs ( _ : kOpts : with kOpts ;
# we simply take the first set kernel bond option
# (one option has multiple names, which is silly)
head ( map ( optN : valTransform ( do . " ${ optN } " ) )
# only map those that exist
( filter ( o : do ? " ${ o } " ) optNames ) ) ) ;
in seq assertNoUnknownOption
( buildOptionSet ( filterSystemdOptions driverOptionMapping ) ) ;
} ;
networks = listToAttrs ( flip map bond . interfaces ( bi :
nameValuePair " 4 0 - ${ bi } " ( mkMerge [ ( genericNetwork ( mkOverride 999 ) ) {
DHCP = mkOverride 0 ( dhcpStr false ) ;