mirror of
https://github.com/siderolabs/talos.git
synced 2025-08-24 08:01:10 +02:00
Most of the fixes were automatically applied. Signed-off-by: Andrey Smirnov <smirnov.andrey@gmail.com>
374 lines
9.1 KiB
Go
374 lines
9.1 KiB
Go
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
// Additional information can be found
|
|
// https://www.kernel.org/doc/Documentation/networking/bonding.txt.
|
|
|
|
package nic
|
|
|
|
import (
|
|
"net"
|
|
)
|
|
|
|
// WithBond defines if the interface should be bonded.
|
|
func WithBond(o bool) Option {
|
|
return func(n *NetworkInterface) (err error) {
|
|
n.Bonded = o
|
|
|
|
return nil
|
|
}
|
|
}
|
|
|
|
// WithSubInterface defines which interfaces make up the bond.
|
|
func WithSubInterface(o ...string) Option {
|
|
return func(n *NetworkInterface) (err error) {
|
|
var found bool
|
|
|
|
for _, ifname := range o {
|
|
found = false
|
|
|
|
for _, subif := range n.SubInterfaces {
|
|
if ifname == subif.Name {
|
|
found = true
|
|
|
|
break
|
|
}
|
|
}
|
|
|
|
if found {
|
|
continue
|
|
}
|
|
|
|
var iface *net.Interface
|
|
|
|
iface, err = net.InterfaceByName(ifname)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
n.SubInterfaces = append(n.SubInterfaces, iface)
|
|
}
|
|
|
|
return err
|
|
}
|
|
}
|
|
|
|
// WithBondMode sets the mode the bond should operate in.
|
|
func WithBondMode(o string) Option {
|
|
return func(n *NetworkInterface) (err error) {
|
|
var mode BondMode
|
|
|
|
if mode, err = BondModeByName(o); err != nil {
|
|
return err
|
|
}
|
|
|
|
n.BondSettings.Uint8(uint16(IFLA_BOND_MODE), uint8(mode))
|
|
|
|
return err
|
|
}
|
|
}
|
|
|
|
// WithHashPolicy configures the transmit hash policy for the bonded interface.
|
|
func WithHashPolicy(o string) Option {
|
|
return func(n *NetworkInterface) (err error) {
|
|
var policy BondXmitHashPolicy
|
|
|
|
if policy, err = BondXmitHashPolicyByName(o); err != nil {
|
|
return err
|
|
}
|
|
|
|
n.BondSettings.Uint8(uint16(IFLA_BOND_XMIT_HASH_POLICY), uint8(policy))
|
|
|
|
return err
|
|
}
|
|
}
|
|
|
|
// WithLACPRate configures the bond LACP rate.
|
|
func WithLACPRate(o string) Option {
|
|
return func(n *NetworkInterface) (err error) {
|
|
var rate LACPRate
|
|
|
|
if rate, err = LACPRateByName(o); err != nil {
|
|
return err
|
|
}
|
|
|
|
n.BondSettings.Uint8(uint16(IFLA_BOND_AD_LACP_RATE), uint8(rate))
|
|
|
|
return err
|
|
}
|
|
}
|
|
|
|
// WithUpDelay configures the up delay for interfaces that makes up a bond.
|
|
// The value is given in ms.
|
|
func WithUpDelay(o uint32) Option {
|
|
return func(n *NetworkInterface) (err error) {
|
|
n.BondSettings.Uint32(uint16(IFLA_BOND_UPDELAY), o)
|
|
|
|
return err
|
|
}
|
|
}
|
|
|
|
// WithDownDelay configures the down delay for interfaces that makes up a bond.
|
|
// The value is given in ms.
|
|
func WithDownDelay(o uint32) Option {
|
|
return func(n *NetworkInterface) (err error) {
|
|
n.BondSettings.Uint32(uint16(IFLA_BOND_DOWNDELAY), o)
|
|
|
|
return err
|
|
}
|
|
}
|
|
|
|
// WithMIIMon configures the miimon interval for a bond.
|
|
// The value is given in ms.
|
|
func WithMIIMon(o uint32) Option {
|
|
return func(n *NetworkInterface) (err error) {
|
|
n.BondSettings.Uint32(uint16(IFLA_BOND_MIIMON), o)
|
|
|
|
return err
|
|
}
|
|
}
|
|
|
|
// WithUseCarrier configures how miimon will determine the link status.
|
|
func WithUseCarrier(o bool) Option {
|
|
return func(n *NetworkInterface) (err error) {
|
|
// default to 1
|
|
var carrier uint8 = 1
|
|
|
|
if !o {
|
|
carrier = 0
|
|
}
|
|
|
|
n.BondSettings.Uint8(uint16(IFLA_BOND_USE_CARRIER), carrier)
|
|
|
|
return err
|
|
}
|
|
}
|
|
|
|
// WithARPInterval specifies the ARP link monitoring frequency in milliseconds.
|
|
func WithARPInterval(o uint32) Option {
|
|
return func(n *NetworkInterface) (err error) {
|
|
n.BondSettings.Uint32(uint16(IFLA_BOND_ARP_INTERVAL), o)
|
|
|
|
return err
|
|
}
|
|
}
|
|
|
|
// WithARPValidate specifies whether or not ARP probes and replies should be
|
|
// validated.
|
|
func WithARPValidate(o string) Option {
|
|
return func(n *NetworkInterface) (err error) {
|
|
var valid ARPValidate
|
|
|
|
if valid, err = ARPValidateByName(o); err != nil {
|
|
return err
|
|
}
|
|
|
|
n.BondSettings.Uint32(uint16(IFLA_BOND_ARP_VALIDATE), uint32(valid))
|
|
|
|
return err
|
|
}
|
|
}
|
|
|
|
// WithARPAllTargets specifies the quantity of arp_ip_targets that must be
|
|
// reachable in order for the ARP monitor to consider a slave as being up.
|
|
func WithARPAllTargets(o string) Option {
|
|
return func(n *NetworkInterface) (err error) {
|
|
var target ARPAllTargets
|
|
|
|
if target, err = ARPAllTargetsByName(o); err != nil {
|
|
return err
|
|
}
|
|
|
|
n.BondSettings.Uint32(uint16(IFLA_BOND_ARP_ALL_TARGETS), uint32(target))
|
|
|
|
return err
|
|
}
|
|
}
|
|
|
|
// WithPrimary specifies which slave is the primary device.
|
|
func WithPrimary(o string) Option {
|
|
return func(n *NetworkInterface) (err error) {
|
|
var iface *net.Interface
|
|
|
|
if iface, err = net.InterfaceByName(o); err != nil {
|
|
return err
|
|
}
|
|
|
|
n.BondSettings.Uint8(uint16(IFLA_BOND_PRIMARY_RESELECT), uint8(iface.Index))
|
|
|
|
return err
|
|
}
|
|
}
|
|
|
|
// WithPrimaryReselect specifies the reselection policy for the primary slave.
|
|
func WithPrimaryReselect(o string) Option {
|
|
return func(n *NetworkInterface) (err error) {
|
|
var primary PrimaryReselect
|
|
|
|
if primary, err = PrimaryReselectByName(o); err != nil {
|
|
return err
|
|
}
|
|
|
|
n.BondSettings.Uint8(uint16(IFLA_BOND_PRIMARY_RESELECT), uint8(primary))
|
|
|
|
return err
|
|
}
|
|
}
|
|
|
|
// WithFailOverMAC specifies whether active-backup mode should set all
|
|
// slaves to the same MAC address.
|
|
func WithFailOverMAC(o string) Option {
|
|
return func(n *NetworkInterface) (err error) {
|
|
var fo FailOverMAC
|
|
|
|
if fo, err = FailOverMACByName(o); err != nil {
|
|
return err
|
|
}
|
|
|
|
n.BondSettings.Uint8(uint16(IFLA_BOND_FAIL_OVER_MAC), uint8(fo))
|
|
|
|
return err
|
|
}
|
|
}
|
|
|
|
// WithResendIGMP specifies the number of IGMP membership reports to be issued
|
|
// after a failover event.
|
|
func WithResendIGMP(o uint32) Option {
|
|
return func(n *NetworkInterface) (err error) {
|
|
n.BondSettings.Uint32(uint16(IFLA_BOND_RESEND_IGMP), o)
|
|
|
|
return err
|
|
}
|
|
}
|
|
|
|
// WithNumPeerNotif specifies the number of peer notifications (gratuitous ARPs and
|
|
// unsolicited IPv6 Neighbor Advertisements) to be issued after a failover event.
|
|
func WithNumPeerNotif(o uint8) Option {
|
|
return func(n *NetworkInterface) (err error) {
|
|
n.BondSettings.Uint8(uint16(IFLA_BOND_NUM_PEER_NOTIF), o)
|
|
|
|
return err
|
|
}
|
|
}
|
|
|
|
// WithAllSlavesActive specifies that duplicate frames (received on inactive
|
|
// ports) should be dropped (0) or delivered (1).
|
|
func WithAllSlavesActive(o uint8) Option {
|
|
return func(n *NetworkInterface) (err error) {
|
|
n.BondSettings.Uint8(uint16(IFLA_BOND_ALL_SLAVES_ACTIVE), o)
|
|
|
|
return err
|
|
}
|
|
}
|
|
|
|
// WithMinLinks specifies the minimum number of links that must be active
|
|
// before asserting carrier.
|
|
func WithMinLinks(o uint32) Option {
|
|
return func(n *NetworkInterface) (err error) {
|
|
n.BondSettings.Uint32(uint16(IFLA_BOND_MIN_LINKS), o)
|
|
|
|
return err
|
|
}
|
|
}
|
|
|
|
// WithLPInterval specifies the number of seconds between instances where
|
|
// the bonding driver sends learning packets to each slaves peer switch.
|
|
func WithLPInterval(o uint32) Option {
|
|
return func(n *NetworkInterface) (err error) {
|
|
n.BondSettings.Uint32(uint16(IFLA_BOND_LP_INTERVAL), o)
|
|
|
|
return err
|
|
}
|
|
}
|
|
|
|
// WithPacketsPerSlave specify the number of packets to transmit through
|
|
// a slave before moving to the next one.
|
|
func WithPacketsPerSlave(o uint32) Option {
|
|
return func(n *NetworkInterface) (err error) {
|
|
n.BondSettings.Uint32(uint16(IFLA_BOND_PACKETS_PER_SLAVE), o)
|
|
|
|
return err
|
|
}
|
|
}
|
|
|
|
// WithADSelect specifies the 802.3ad aggregation selection logic to use.
|
|
func WithADSelect(o string) Option {
|
|
return func(n *NetworkInterface) (err error) {
|
|
var sel ADSelect
|
|
|
|
if sel, err = ADSelectByName(o); err != nil {
|
|
return err
|
|
}
|
|
|
|
n.BondSettings.Uint8(uint16(IFLA_BOND_AD_SELECT), uint8(sel))
|
|
|
|
return err
|
|
}
|
|
}
|
|
|
|
// WithADActorSysPrio in an AD system, this specifies the system priority.
|
|
func WithADActorSysPrio(o uint16) Option {
|
|
return func(n *NetworkInterface) (err error) {
|
|
n.BondSettings.Uint16(uint16(IFLA_BOND_AD_ACTOR_SYS_PRIO), o)
|
|
|
|
return err
|
|
}
|
|
}
|
|
|
|
// WithADUserPortKey specifies the upper 10 bits of the port key.
|
|
func WithADUserPortKey(o uint16) Option {
|
|
return func(n *NetworkInterface) (err error) {
|
|
n.BondSettings.Uint16(uint16(IFLA_BOND_AD_USER_PORT_KEY), o)
|
|
|
|
return err
|
|
}
|
|
}
|
|
|
|
// WithTLBDynamicLB specifies if dynamic shuffling of flows is enabled in
|
|
// tlb mode.
|
|
func WithTLBDynamicLB(o uint8) Option {
|
|
return func(n *NetworkInterface) (err error) {
|
|
n.BondSettings.Uint8(uint16(IFLA_BOND_TLB_DYNAMIC_LB), o)
|
|
|
|
return err
|
|
}
|
|
}
|
|
|
|
// WithPeerNotifyDelay specifies the delay between each peer notification
|
|
// (gratuitous ARP and unsolicited IPv6 Neighbor Advertisement) when they
|
|
// are issued after a failover event.
|
|
// The value is given in ms.
|
|
func WithPeerNotifyDelay(o uint32) Option {
|
|
return func(n *NetworkInterface) (err error) {
|
|
n.BondSettings.Uint32(uint16(IFLA_BOND_PEER_NOTIF_DELAY), o)
|
|
|
|
return err
|
|
}
|
|
}
|
|
|
|
/*
|
|
// o = mac addr
|
|
// [IFLA_BOND_AD_ACTOR_SYSTEM] = { .type = NLA_BINARY, .len = ETH_ALEN },
|
|
func WithADActorSystem(o string) Option {
|
|
return func(n *NetworkInterface) (err error) {
|
|
return err
|
|
}
|
|
}
|
|
|
|
// Not sure this is the right way to do nested attributes
|
|
func WithARPIPTarget(o []string) Option {
|
|
return func(n *NetworkInterface) (err error) {
|
|
n.BondSettings.Nested(uint16(IFLA_BOND_ARP_IP_TARGET), netlink.NewAttributeEncoder().String(uint16(IFLA_BOND_ARP_IP_TARGET), strings.Join(",", o)))
|
|
return err
|
|
}
|
|
}
|
|
|
|
// [IFLA_BOND_AD_INFO] = { .type = NLA_NESTED },
|
|
// func WithInfo(o []string) Option {
|
|
|
|
// Not adding Active Slave since this is more of a
|
|
// runtime adjustment versus config
|
|
// [IFLA_BOND_ACTIVE_SLAVE] = { .type = NLA_U32 },
|
|
*/
|