talos/internal/app/networkd/pkg/nic/bond_options.go
Andrey Smirnov 8560fb9662 chore: enable nlreturn linter
Most of the fixes were automatically applied.

Signed-off-by: Andrey Smirnov <smirnov.andrey@gmail.com>
2020-11-09 06:48:07 -08:00

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 },
*/